94980| 55
|
[入门教程] Arduino教程08 温度报警器「DFR0100 」 |
项目七 温度报警器在上一节中,我们认识了一个发声元件——蜂鸣器,也做了一个简单的小报警器。是不是还不过瘾呢?这次我们要做一个更实际的应用——温度报警器。当温度到达我们设定的限定值时,报警器就会响。我们可以用于厨房温度检测报警等等,各种需要检测温度的场合。这个项目中,除了要用到蜂鸣器外,还需要一个LM35温度传感器。 我们这里将头一回接触传感器,传感器是什么?简单的从字面上的理解就是,一种能感知周围环境,并把感知到的信号转换为电信号的感应元件。感应元件再把电信号传递给控制器。就好比人的各个感官,感知周围环境后,再信息传递给大脑是一样的道理。 所需元件1× 蜂鸣器 硬件连接蜂鸣器和项目六的接法相同。在接LM35温度传感器时,注意三个引脚的位置,有LM35字样的一面面向自己,从左至右依次接5V、Analog 0、GND,如我们下图所示。 输入代码样例代码7-1:
成功下载完程序后,打开Arduino IDE的串口监视器。 设置串口监视器的波特率为9600。 代码回顾这段代码与我们项目六的大部分内容是相同的,代码中的大部分语法在前几项目中已经说过了,现在看起来是不是有点头绪了呢?
第一二个变量就不说了,项目六中代码回顾中已作解释,第三个变量tepTimer,是一个无符号的长整型(unsigned long)用于存放机器时间,便于定时在串口输出温度值,由于机器运行时间较长,所以选用一个长整型,又由于时间不为负,则选用无符号长整型,对于变量类型不明确的,可以再回看下项目三相关解释。 setup()函数的第一句,我们想必已经很熟了,设置蜂鸣器为输出模式,有人可能会问为什么LM35不用设置呢?LM35是个模拟量,模拟量不需要设置引脚模式。pinMode只用于数字引脚。 串口可用的函数也有好多,可用查看语法手册。我们这里就先介绍几个常用的:
这个函数用于初始化串口波特率,也就是数据传输的速率,是使用串口必不可少的函数。直接输入相应设定的数值就可以了,如果不是一些特定的无线模块对波特率有特殊要求的话,波特率设置只需和串口监视器保持一致即可。我们这里就只是用于串口监视器。 再到loop()函数内部,开始部分又声明了两个变量val和data,注释中已对这两个变量进行说明了,这两个变量与前面声明的两个变量不同的是,这两个是局部变量,只在loop()函数内部起作用。关于全局变量和局部变量的区别,可以参看一下项目二中说明。
这里用到了一个新函数
这个函数用于从模拟引脚读值,pin是指连接的模拟引脚。Arduino的模拟引脚连接到一个了10位A/D转换,输入0~5V的电压对应读到0~1023的数值,每个读到的数值对应的都是一个电压值。 我们这里读到的是温度的电压值,是以0~1023的方式输出。而我们LM35温度传感器每10mV对应1摄氏度。
从传感器中读到的电压值,它的范围在0~1023,将该值分成1024份,再把结果乘以5,映射到0~5V,因为每度10mV,需要再乘以100得到一个double型温度值,最后赋给data变量。
后面进入一个if语句,对温度值进行判断。这里的if语句与之前讲的有所不同。if…else用于对两种情况进行判断的时候。 if…else语句格式:
表达式结果为真时,执行语句1,放弃语句2的执行,接着跳过if语句,执行if语句的下一条语句;如果表达式结果为假时,执行语句2,放弃语句1的执行,接着跳过if语句,执行if语句的下一条语句。无论如何,对于一次条件的判断,语句1和语句2只能有一个被执行,不能同时被执行。 回到我们的代码, if中的语句就省略不说了,不明白的可以回看项目六:
} else { 进入if判断,对data也就是温度值进行判断,如果大于27,进入if前半段,蜂鸣器鸣响。否则,进入else后的语句,关闭蜂鸣器。 除了不断检测温度进行报警,我们还需要代码在串口实时显示温度。这里又用到millis()函数(项目三中有说明),利用固定的机器时间,每隔500ms定时向串口发出数据。 那串口收到数据后,如何在串口监视器上显示呢?就要用到下面的两句语句:
print()的解释是,以我们可读的ASCII形式从串口输出。 这条命令有多种形式: 例如: 不仅有我们上面这种形式输出,还可以以进制形式输出,可以参看语法手册。 println()与print()区别就是,println()比print()多了回车换行,其他完全相同。 串口监视器输出还有一条语句比较常见的是Serial.write(),它不是以ASCII形式输出,而是以字节形式输出,感兴趣的可以查看语法手册。 代码中,可能有一处会不太明白:
有人会问,data不是字符串吗?怎么输出是数字呢?不要忘了,这是我们前面定义的变量,它其实就是代表数字,输出当然就是数字啦! 硬件回顾LM35LM35是一种常见的温度传感器,使用简便,不需要额外的校准处理就可以达到+ 1/4℃的准确率。 我们看一下LM35引脚示意图,Vs接入电源,Vout是电压输出,GND接地。 计算公式:Vout = 10mV/℃ * T℃(温度范围在+2℃~40℃) 这个公式哪里来的呢?如果我们换做其他的温度传感器该怎么改换算呢?这里提供一个网址,专门用来查芯片的使用说明书,也叫做datasheet。 Datasheet会提供出厂芯片所有的性能参数,以及一些简单典型电路的搭建也会告诉你。以后碰到其他的传感器,不同的芯片就能通过这个方法来得到计算公式。 ALLDATASHEET: https://www.alldatasheet.com/ 我们试一下搜索LM35,下图公式就是截取自LM35的datasheet中。图中显示的就是LM35的计算公式。 课后作业将我们上面的温度报警器再结合LED灯。在不同的温度范围设置不同颜色灯,并伴随不同频率的声音。 比如:温度小于10 或者大于35,亮红灯,蜂鸣器发出比较急促的声音。 温度报警器可以用于植物种植,对环境温度有要求的一些东西。发挥你的想象,看看还能玩出什么好玩的东西?
|
本帖最后由 粒子 于 2022-1-5 16:43 编辑 小弟刚弄arduino,复制贴主的代码加多一个三基色LED灯进去,结果代码报错 求解 |
课后作业中,还碰到一个没法解释的现象,详情各位前辈指点。 具体现象:绿灯和红灯亮起时,串口监视器的数据刷新基本是500ms一次,但黄灯亮起时,串口监视器的刷新速率变为>1000ms一次。(目测) 不明白其中的原理。代码如下:
|
Jane 发表于 2015-2-3 10:15 完整的错误信息如下: This report would have more information with "Show verbose output during compilation" enabled in File > Preferences. Arduino: 1.0.6 (Mac OS X), Board: "Arduino Uno" Binary sketch size: 6,712 bytes (of a 32,256 byte maximum) avrdude: stk500_recv(): programmer is not responding 我看了一下教程,串口应该选择的是正确的。 我买的是Beginner Kit for Arduino的套件,IDE用的是1.0.6版本,Board选择的是UNO,串口选择的是/dev/tty.usbmodern1412 这个驱动也装了,不行 https://www.ftdichip.com/Drivers/VCP/MacOSX/FTDIUSBSerialDriver_v2_2_14.dmg |
本帖最后由 snakeqx 于 2014-6-26 20:46 编辑 谢谢分享。但是我发现一个问题,一旦报警开始,温度的采样率就变了。;P 于是我稍微修改了一下程序,边报警边采样。代码如下:
然后发现,报警的时候老实有破音,于是我想,可能是CPU在算sin()的时候占用了大量资源,于是我吧公式用excel推导出来放在一个数组里。 于是有了以下代码
可是还是有破音,请问一下高手,到底是哪里速度慢了?现在已经没有什么计算了,只有一次读值*0.488 :'(:'(:'( |
本帖最后由 sfyugg@163.com 于 2015-3-14 19:14 编辑 为什么我串口监视出现了这种情况: temperature: 347.17C temperature: 347.17C temperature: 346.68C temperature: 346.19C temperature: 344.73C 用手一摸,很烫很烫 |
sfyugg@163.com 发表于 2015-3-14 19:13 原来是自己接反了,重新接回来,居然还好用,dfrobot的东西质量不错 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed