[项目]温度报警器

8992浏览
查看: 8992|回复: 6

[项目] 温度报警器

[复制链接]
本帖最后由 丄帝De咗臂 于 2015-8-31 17:57 编辑

【简介】本项目中我们使用四位数码管、温度传感器和蜂鸣器,通过Arduino程序制作温度报警器,使温度超过30度时自动报警。最后完成图如下
温度报警器图2

【器材】Arduino Nano,四位数码管,蜂鸣器,LM35温度传感器,面包板,导线若干。
【原理】电路原理图如下


温度报警器图3
【接线】接线示意图如下

温度报警器图4
【程序】代码程序如下
  1. /*
  2. 功能:显示0-70℃范围室内温度,分辨0.5℃
  3. 采用红色超高亮度共阳的4位数码管,以及输出平衡程序代码,使得数码管之间亮度基本平衡
  4. 温度计随着电源电压波动会产生较大误差,按照USB口输出电池电压4.7V设计;如果脱机使用3节5号电池供电,电压4.0-4.5V,这时温度显示会偏高
  5. */
  6. //把部分模拟口改成数字口:A0~A5对应D15~D19
  7. int a = 15;//设置A1口连接数码管a段
  8. int b = 19;//设置A5口连接数码b段
  9. int c = 7;//设置D7口连接数码管c段
  10. int d = 5;//设置D5口连接数码管d段
  11. int e = 4;//设置D4口连接数码管e段
  12. int f = 16;//设置A2口连接数码管f段
  13. int g = 8;//设置D8口连接数码管g段
  14. int dp = 6;//设置D6口连接数码管dp段
  15. int tempPin = 7;//lm35信号端连接A7
  16. int d1 = 14;//设置A0口连接第一个数码管公共阴极
  17. int d2 = 17;//设置A3口连接第二个数码管公共阴极
  18. int d3 = 18;//设置A4口连接第三个数码管公共阴极
  19. int d4 = 9;//设置D9口连接第四个数码管公共阴极
  20. //设置变量
  21. int n = 0;//设置温度的变量
  22. int del = 2; //此处数值对各位数码管之间的亮度进行微调,越大该位数码管越亮
  23. unsigned long m=0;//设置一个消除数码管频繁闪亮的计时器变量
  24. //以下用数组给数码管的管脚赋值,程序很简洁
  25. byte segs[7] = { a, b, c, d, e, f, g };//将除了小数点外的7段笔划作为一个数组
  26. byte seven_seg_digits[10][7] = { { 1,1,1,1,1,1,0 },//设置数码管显示0的数组
  27.                                { 0,1,1,0,0,0,0 },//设置数码管显示1的数组
  28.                                { 1,1,0,1,1,0,1 },//设置数码管显示2的数组
  29.                                { 1,1,1,1,0,0,1 },//设置数码管显示3的数组
  30.                                { 0,1,1,0,0,1,1 },//设置数码管显示4的数组
  31.                                { 1,0,1,1,0,1,1 },//设置数码管显示5的数组
  32.                                { 1,0,1,1,1,1,1 },//设置数码管显示6的数组
  33.                                { 1,1,1,0,0,0,0 },//设置数码管显示7的数组
  34.                                { 1,1,1,1,1,1,1 },//设置数码管显示8的数组
  35.                                { 1,1,1,1,0,1,1 }//设置数码管显示9的数组
  36.                                };
  37. /****************************初始化设置函数****************************/
  38. void setup()
  39. {
  40.   pinMode(d1, OUTPUT); //设置引脚为输出状态
  41.   pinMode(d2, OUTPUT); //同上
  42.   pinMode(d3, OUTPUT); //同上
  43.   pinMode(d4, OUTPUT); //同上
  44.   pinMode(a, OUTPUT); //同上
  45.   pinMode(b, OUTPUT);// 同上
  46.   pinMode(c, OUTPUT);// 同上
  47.   pinMode(d, OUTPUT);// 同上
  48.   pinMode(e, OUTPUT);// 同上
  49.   pinMode(f, OUTPUT);// 同上
  50.   pinMode(g, OUTPUT);// 同上
  51.   pinMode(dp, OUTPUT);// 同上
  52.   pinMode(11, OUTPUT);//设置蜂鸣器输出状态
  53.   digitalWrite(11, LOW);//蜂鸣器关闭
  54.   Serial.begin(9600);//设置模拟口的采样频率
  55. }
  56. /***************************主程序(循环)******************************/
  57. void loop()//运行程序
  58. {
  59. //float tempval= (3.5* analogRead(tempPin))*1000/1024;//将温度传感器获得的电压模拟量赋值给变量temval
  60. //从模拟口A0输入温度传感器LM35的温度转换电压,0℃:0V,+1℃:+10mV
  61. //float tempval=analogRead(tempPin)* 4.88;//5V电压,是理想的电源电压
  62. float tempval=analogRead(tempPin)* 4.6;//4.7V,是电脑USB口输出的实测电压
  63. //float tempval=analogRead(tempPin)* 4.0;//4.1V,3节5号电池电压
  64. //  float tempval=map(10*analogRead(tempPin),0,460,0,220);//数值区间影射函数,把一个区间的数值,线性地影射到另一个区间;这里把模拟输出采集的数值0-300(应该是0-200左右),影射到0℃-100℃,因为有一位小数,故乘以10
  65. if (m%30==0) n=int(tempval); //设定温度的刷新时间为0.3秒,也可消除数码管闪烁的语句
  66. /*数码管闪烁的原因是因为采样速率高达9600,所以温度数值变化很快,而数据处理产生近似值不是连续的,导致显示数值经常闪烁,影响读数。
  67. 如果用延时方法,则数码管的最右边数字特别亮,其他数字亮度很低,所以采用自设的计时器“m”,用求余数除法,过30个计时单位才采集一次显示温度数值,有效地消除了闪烁现象,并且不影响程序的正常运行*/
  68.       if (n>300)  digitalWrite(11, HIGH);//大于30度时,蜂鸣器报警
  69.       if (n<=300)  digitalWrite(11, LOW);//小于30度时,蜂鸣器停止鸣叫
  70. //以下显示温度的数值,可显示xxx.x℃
  71.   clearLEDs();//数码管数字显示清屏
  72.   delay(del);//延时2ms(为什么是2ms)
  73.   lightSegments(n/1000%10);//显示百位数值
  74.   //如果到100度,这位数码管点亮
  75.   pickDigit((n/1000%10>0));//如果不到100度,则这位数码管熄灭
  76.   
  77. clearLEDs();//数码管数字显示清屏
  78.   delay(del);//延时2sm
  79.   pickDigit(2); //点亮第二个数码管
  80.   lightSegments(n/100%10);//显示十位数值
  81.   delay(del+2);//延时增加50%,以增加这个数码管的亮度
  82.   clearLEDs();//数码管数字显示清屏
  83.   pickDigit(3);//左边第三个数码管点亮
  84.   lightSegments(n/10%10);//显示个位数值
  85.   dispDec(3);//这个数码管要有小数点(哪个?)
  86.   delay(del+2);//这个数码管增加亮度
  87.   
  88.   clearLEDs();//数码管数字显示清屏
  89.   delay(del);//这个数码管亮度减弱
  90.   pickDigit(4);//点亮左边第四个数码管
  91.   lightSegments(n%10);//显示十分位数值
  92.   delay(del-1);//这个数码管减少亮度
  93.   m++;//消除数码管闪烁的计时器变量
  94.   
  95. //发送到串口监视窗口,以便观察变量数值
  96. Serial.println(analogRead(tempPin));//串口调试器显示A7引脚读取数值        
  97. Serial.println(n);//串口调试器显示温度数值
  98. }
  99. /*实测结果表明,这个温度计受电源电压的影响较大,原因是LM35自带稳压,工作电压:4V-20V,输出电压稳定;当电池电压降低后,这个稳定的电压在模拟口的输出数值就会增大,导致误差;此外,由于模拟口的分别率只有1024级,温度数值的误差也大*/
  100. /*****************************打开数码管子函数**************************/
  101. void pickDigit(int x)  //定义pickDigit(x),轮流打开4位数码管中的一个
  102. {
  103.   digitalWrite(d1, LOW);//共阳极数码管,LOW则关闭
  104.   digitalWrite(d2, LOW);//共阳极数码管,LOW则关闭
  105.   digitalWrite(d3, LOW);//共阳极数码管,LOW则关闭
  106.   digitalWrite(d4, LOW);//共阳极数码管,LOW则关闭
  107.   switch(x)
  108.   {
  109.   case 1:
  110.     digitalWrite(d1, HIGH); //打开最左边的高位数码管,即数码管的百位
  111.     break;
  112.   case 2:
  113.     digitalWrite(d2, HIGH); //打开最左边的高位数码管,即数码管的十位
  114.     break;
  115.   case 3:
  116.     digitalWrite(d3, HIGH); //打开最左边的高位数码管,即数码管的个位
  117.     break;
  118.   case 4:// default: //打开最左边的高位数码管,十分位
  119. digitalWrite(d4, (m%100>=30)); //用余数的区间产生数字闪烁,周期大概是1秒,30%的时间熄灭
  120. //这样便于观察结果,特别是温度保持不变的时候,给人以设备正常运行的感觉
  121. //这个方法也可用在时钟里,可产生闪烁的效果,通过模的数值和条件的改变,得到各种闪烁效果
  122.     break;
  123.   }
  124. }
  125. /*****************************点亮小数点子函数*************************/
  126. void dispDec(int x)
  127. {
  128. digitalWrite(dp, LOW);//点亮小数点
  129. }
  130. /******************************清屏子函数******************************/
  131. void clearLEDs()
  132. {
  133.     for (int i = 0; i < 7; i++) //变量i在0到6直接变化
  134. {
  135.     digitalWrite(segs[i], HIGH);//共阳数码管,笔画段高电平熄灭
  136.      }  
  137.     digitalWrite(dp, HIGH);//小数点熄灭
  138. }
  139. /***********************点亮对应数字的数码管*************************/
  140. void lightSegments(int x) //数码管显示数字子函数
  141. {
  142. for (int i = 0; i < 7; i++) //变量在0到6之间变化
  143. {
  144. digitalWrite(segs[i], 1-seven_seg_digits[x][i]);//由于笔画字段是按照共阴级数码管编写的,这里要用算术转换成共阳极数码管的输出结果
  145.   }
  146. }
复制代码

【效果】最终效果图如下

温度报警器图1



大连林海  初级技神

发表于 2015-8-31 18:12:27

这可以好多应用
回复

使用道具 举报

丄帝De咗臂  高级技匠
 楼主|

发表于 2015-8-31 18:22:54


什么应用,开开脑洞洞
回复

使用道具 举报

大连林海  初级技神

发表于 2015-8-31 19:48:25

丄帝De咗臂 发表于 2015-8-31 18:22
什么应用,开开脑洞洞

让陈老师给你大写不同的壳子
回复

使用道具 举报

丄帝De咗臂  高级技匠
 楼主|

发表于 2015-8-31 21:00:10

大连林海 发表于 2015-8-31 19:48
让陈老师给你大写不同的壳子

不错的想法,但是打什么样子的呢
回复

使用道具 举报

大连林海  初级技神

发表于 2015-8-31 21:11:07

丄帝De咗臂 发表于 2015-8-31 21:00
不错的想法,但是打什么样子的呢

滚动的 奔跑的 飞的 剩下的靠你了
回复

使用道具 举报

20060606  高级技匠

发表于 2020-8-22 19:16:33

电路图被df标识挡住了,建议以后df不要再加这个标识了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail