点击上方“蘑菇云创造”可以关注我们哦
在上一节中,我们认识了一个发声元件——蜂鸣器,也做了一个简单的小报警器。是不是还不过瘾呢?这次我们要做一个更实际的应用——温度报警器。当温度到达我们设定的限定值时,报警器就会响。我们可以用于厨房温度检测报警等等,各种需要检测温度的场合。这个项目中,除了要用到蜂鸣器外,还需要一个LM35温度传感器。
我们这里将头一回接触传感器,传感器是什么?简单的从字面上的理解就是,一种能感知周围环境,并把感知到的信号转换为电信号的感应元件。感应元件再把电信号传递给控制器。就好比人的各个感官,感知周围环境后,再信息传递给大脑是一样的道理。
所需元件
■ 1× 蜂鸣器
■ 1× LM35温度传感器
硬件连接
蜂鸣器和项目六的接法相同。在接LM35温度传感器时,注意三个引脚的位置,有LM35字样的一面面向自己,从左至右依次接5V、Analog 0、GND,如我们下图所示。
图 7-1 温度报警器连线图
代码编程
从这个项目开始,我们将彻底转为代码编程。有了之前项目手动输入代码的练习,我们能够很快适应纯代码的编程。
相信拥有探索精神的你已经发现如何选择代码风格以及怎样调整字体的大小,通过右键单击跳出的菜单里有诸多操作。
样例程序 7-1:
//项目七 – 温度报警器
#include
// 创建对象
DFRobot_Tone DFTone;
float sinVal;
int toneVal;
unsigned long tepTimer ;
void setup(){
pinMode(8, OUTPUT); // 蜂鸣器引脚设置
Serial.begin(9600); //设置波特率为9600 bps
}
void loop(){
int val; //用于存储LM35读到的值
double data; //用于存储已转换的温度值
val=analogRead(0); //LM35连到模拟口,并从模拟口读值
data = (double) val * (5/10.24); // 得到电压值,通过公式换成温度
if(data>27){ // 如果温度大于27,蜂鸣器响
for(int x=0; x<180; x++){ //将sin函数角度转化为弧度
sinVal = (sin(x*(3.1412/180))); //用sin函数值产生声音的频率
toneVal = 2000+(int(sinVal*1000)); //给引脚8一个蜂鸣器发声信号
DFTone.play(8,toneVal,2);
}
} else { // 如果温度小于27,关闭蜂鸣器
DFTone.play(8,0,2); //关闭蜂鸣器
}
if(millis() - tepTimer > 500){ // 每500ms,串口输出一次温度值
tepTimer = millis();
Serial.print("temperature: "); // 串口输出“温度”
Serial.print(data); // 串口输出温度值
Serial.println("℃"); // 串口输出温度单位
}
}
成功下载完程序后,右键单击框选处,并设置串口监视器的波特率为9600。
单击框选处,打开Mind+的串口。
然后就可以从串口监视器中,看到LM35监测到的温度值输出在屏幕上。
代码学习
这段代码与我们项目六的大部分内容是相同的,代码中的大部分语法在前几项目中已经说过了,现在看起来是不是有点头绪了呢?
程序开始载入了两个库并创建对象,这两者将会在第十课中做详细讲解。
#include
// 创建对象
DFRobot_LM35 LM35;
#include
// 创建对象
DFRobot_Tone DFTone;
随后设置了三个变量:
float sinVal;
int toneVal;
unsigned long tepTimer ;
第一、二个变量就不说了,项目六中代码回顾中已作解释,第三个变量tepTimer,是一个无符号的长整型(unsigned long)用于存放机器时间,便于定时在串口输出温度值,由于机器运行时间较长,所以选用一个长整型,又由于时间不为负,则选用无符号长整型,对于变量类型不明确的,可以再回看下项目三相关解释。
setup()函数的第一句,我们想必已经很熟了,设置蜂鸣器为输出模式,有人可能会问为什么LM35不用设置呢?LM35是个模拟量,模拟量不需要设置引脚模式。pinMode只用于数字引脚。
第二句是我们即将学习的新内容:串口,其中的相关语句。
Serial.begin(9600); //设置波特率为9600 bps
Arduino的通信伙伴——串口
串口是Arduino和外界进行通信的一个简单的方法。每个Arduino都至少有一个串口,UNO分别与数字引脚0(RX)和数字引脚1(TX)相连。所以如果要用到串口通信的,数字0和1不能用于输入输出功能。
Arduino下载程序也是通过串口来完成的。所以,当下载程序的过程中,USB将占用了数字引脚0(RX)和数字引脚1(TX)。此时,RX和TX引脚不能接任何东西,否则会产生冲突。可以下载完之后,再接上。
在以后的使用过程中,需要注意,特别是一些无线通信模块,通常会用到TX、RX。所以下载程序时,需将模块先取下。避免造成程序下载不进去的情况。
串口可用的函数也有好多,可用查看语法手册。我们这里就先介绍几个常用的:
Serial.begin(9600); //设置波特率为9600 bps
例如代码中的这个函数,它用于初始化串口波特率,也就是数据传输的速率,是使用串口必不可少的函数。直接输入相应设定的数值就可以了,如果不是一些特定的无线模块对波特率有特殊要求的话,波特率设置只需和串口监视器保持一致即可。
再到loop()函数内部,开始部分又声明了两个变量val和data,注释中已对这两个变量进行说明了,这两个变量与前面声明的两个变量不同的是,这两个是局部变量,只在loop()函数内部起作用。关于全局变量和局部变量的区别,可以参看一下项目二中说明。
val=analogRead(0); //LM35连到模拟口,并从模拟口读值
这里用到了一个新函数——analogRead(pin)。
这个函数用于从模拟引脚读值,pin是指连接的模拟引脚。Arduino的模拟引脚连接到一个了10位A/D转换,输入0~5V的电压对应读到0~1023的数值,每个读到的数值对应的都是一个电压值。
我们这里读到的是温度的电压值,是以0~1023的方式输出。而我们LM35温度传感器每10mV对应1摄氏度。
data = (double) val * (5/10.24); // 得到电压值,通过公式换成温度
从传感器中读到的电压值,它的范围在0~1023,将该值分成1024份,再把结果乘以5,映射到0~5V,因为每度10mV,需要再乘以100得到一个double型温度值,最后赋给data变量。
后面进入一个if语句,对温度值进行判断。这里的if语句与之前讲的有所不同。if…else用于对两种情况进行判断的时候。
if…else语句格式:
if(表达式){
语句1;
} else{
语句2;
}
表达式结果为真时,执行语句1,放弃语句2的执行,接着跳过if语句,执行if语句的下一条语句;如果表达式结果为假时,执行语句2,放弃语句1的执行,接着跳过if语句,执行if语句的下一条语句。无论如何,对于一次条件的判断,语句1和语句2只能有一个被执行,不能同时被执行。
回到我们的代码, if中的语句就省略不说了,不明白的可以回看项目六:
if(data>27){
for(int x=0; x<180; x++){
...
}
} else {
...
}
进入if判断,对data也就是温度值进行判断,如果大于27,进入if前半段,蜂鸣器鸣响。否则,进入else后的语句,关闭蜂鸣器。
除了不断检测温度进行报警,我们还需要代码在串口实时显示温度。这里又用到millis()函数(项目三中有说明),利用固定的机器时间,每隔500ms定时向串口发出数据。
那串口收到数据后,如何在串口监视器上显示呢?就要用到下面的两句语句:
Serial.print(data); // 串口输出温度值
Serial.println("C"); // 串口输出温度单位
print()的解释是,以我们可读的ASCII形式从串口输出。
这条命令有多种形式:
(1)数字则是以位形式输出(例1)
(2)浮点型数据输出时只保留小数点后两位(例2)
(3)字符和字符串则原样输出,字符需要加单引号(例3),字符串需要加双引号(例4)。
例如:
(1)Serial.print(78); 输出“78”
(2)Serial.print(1.23456); 输出“1.23”
(3)Serial.print(‘N’); 输出“N”
(4)Serial.print(“Hello world.”); 输出“Hello world.”
不仅有我们上面这种形式输出,还可以以进制形式输出,可以参看语法手册。
println()与print()区别就是,println()比print()多了回车换行,其他完全相同。
串口监视器输出还有一条语句比较常见的是Serial.write(),它不是以ASCII形式输出,而是以字节形式输出,感兴趣的可以查看语法手册。
代码中,可能有一处会不太明白:
Serial.print(data); // 串口输出温度值
有人会问,data不是字符串吗?怎么输出是数字呢?不要忘了,这是我们前面定义的变量,它其实就是代表数字,输出当然就是数字啦!
硬件回顾
LM35
LM35是一种常见的温度传感器,使用简便,不需要额外的校准处理就可以达到+ 1/4℃的准确率。
我们看一下LM35引脚示意图,Vs接入电源,Vout是电压输出,GND接地。
图 7-2 LM35引脚示意图(从下往上看,引脚朝向身体)
计算公式:
Vout = 10mV/℃ * T℃(温度范围在+2℃~40℃)
这个公式哪里来的呢?如果我们换做其他的温度传感器该怎么改换算呢?可以网上搜索ALLDATASHEET网站来查芯片的使用说明书(也叫做datasheet)。Datasheet会提供出厂芯片所有的性能参数,以及一些简单典型电路的搭建也会告诉你。以后碰到其他的传感器,不同的芯片就能通过这个方法来得到计算公式。
我们试一下搜索LM35,下图公式就是截取自LM35的datasheet中。图7-3显示的就是LM35的计算公式。
图7-3 LM35计算公式
课后作业
1. 在手动编辑中,输入本项目代码。
2. 将我们上面的温度报警器再结合LED灯。在不同的温度范围设置不同颜色灯,并伴随不同频率的声音。
比如:温度小于10 或者大于35,亮红灯,蜂鸣器发出比较急促的声音。
温度在25~35之间,亮黄灯,蜂鸣器伴随相对缓和的声音。
温度在10~25之间,亮绿灯,关闭蜂鸣器。
温度报警器可以用于植物种植等对环境温度有要求的一些东西。发挥你的想象,看看还能玩出什么好玩的东西?
——————— 正文完 ———————
教育的目的是为了培养学生协作能力、沟通能力、批判思维以及创造力,其中最核心的是创造力,蘑菇云创客教育作为国内为数不多的一站式创客教育服务供应商旨在培养孩子的创造力。
为让学生们在课堂上学习到的知识更好地连接现实世界,蘑菇云将指导学校规划、建立、运营自己的创客空间。并根据学生年龄段的不同,在设计与布局上进行了区分
小学创客空间注重趣味性,
强调互动场景;
初中创客空间注重实用性,
强调学习场景;
高中创客空间注重技术性,
强调应用场景;
在内容上, 蘑菇云和国内一线创客名师联手,编纂了一系列适合国内创客教育的教材。并拥有一套完整的创客教育课程体系,包括课程内容及教具,课程培训,技术答疑。同样根据学生年龄段的不同,在课程分类与设计上也会有所区别。
小学通过游戏化和体验化的方式来开展,要以“玩中学”为主。
初中引导学生在实际动手过程中进行探究式学习,促进“做中学”。
高中基于问题和设计的学习,需要教师为学生创设相关的真实情境,使高中生在“思中学”。
推荐阅读:
【报警器】基于mind+Arduino入门教程06
【炫彩 RGB LED】基于Mind+Arduino入门教程05
【呼吸灯】基于Mind+Arduino入门教程04
【互动交通信号灯】基于Mind+Arduino入门教程03
【S.O.S求救信号】基于Mind+ Ardunio入门教程02
【LED闪烁】基于Mind+Arduino入门教程01
【初识Arduino & Mind+】基于mind+ Arduino入门教程00
我知道你在看呦