友情提示:380元/半年,儿童学编程,就上码丁实验室。
在上一节中,我们认识了一个发声元件——蜂鸣器,也做了一个简单的小报警器。是不是还不过瘾呢?这次我们要做一个更实际的应用——温度报警器。当温度到达我们设定的限定值时,报警器就会响。我们可以用于厨房温度检测报警等等,各种需要检测温度的场合。这个项目中,除了要用到蜂鸣器外,还需要一个LM35温度传感器。我们这里将头一回接触传感器,传感器是什么?简单的从字面上的理解就是,一种能感知周围环境,并把感知到的信号转换为电信号的感应元件。感应元件再把电信号传递给控制器。就好比人的各个感官,感知周围环境后,再信息传递给大脑是一样的道理。
- 1× 蜂鸣器
- 1× LM35温度传感器
STEP 1:硬件连接
在接LM35温度传感器时,注意三个引脚的位置,从左至右依次接5V、Analog 0、GND,如我们下图所示。
完成硬件连接后,打开Arduino IDE,输入下面这段代码。
- 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一个
- tone(8, toneVal);
- delay(2);
- }
- } else { // 如果温度小于27,关闭蜂鸣器
- noTone(8); //关闭蜂鸣器
- }
- if(millis() – tepTimer > 500){ // 每500ms,串口输出一次温度值
- tepTimer = millis();
- Serial.print(“temperature: “); // 串口输出“温度”
- Serial.print(data); // 串口输出温度值
- Serial.println(“C”); // 串口输出温度单位
- }
- }
复制代码
成功下载完程序后,打开Arduino IDE的串口监视器。
- Serial.begin(9600);
复制代码
- val=analogRead(0);
复制代码
这里用到了一个新函数——analogRead(pin)。
Arduino官方:analogRead(pin)
DFRobot 中文版:analogRead(pin)
我们这里读到的是温度的电压值,是以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(val);
- Serial.println(val);
复制代码
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不是字符串吗?怎么输出是数字呢?不要忘了,这是我们前面定义的变量,它其实就是代表数字,输出当然就是数字啦!
STEP 4: 硬件回顾
LM35
LM35是一种常见的温度传感器,使用简便,不需要额外的校准处理就可以达到+ 1/4℃的准确率。
我们看一下LM35引脚示意图,Vs接入电源,Vout是电压输出,GND接地。
比如:温度小于10 或者大于35,亮红灯,蜂鸣器发出比较急促的声音。
温度在25~35之间,亮黄灯,蜂鸣器伴随相对缓和的声音。
温度在10~25之间,亮绿灯,关闭蜂鸣器。