查看: 5610|回复: 0

【入门教程】DFR0100 Arduino教程08--- 温度报警器

[复制链接]
  • TA的每日心情

    2018-1-11 13:58
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2016-12-5 16:52 | 显示全部楼层 |阅读模式
    本帖最后由 dfrobot 于 2016-12-5 16:54 编辑

    该教程实验平台:Arduino入门套件
    上一篇教程:
    Arduino教程 Lesson 7 -- 报警器

    在上一节中,我们认识了一个发声元件——蜂鸣器,也做了一个简单的小报警器。是不是还不过瘾呢?这次我们要做一个更实际的应用——温度报警器。当温度到达我们设定的限定值时,报警器就会响。我们可以用于厨房温度检测报警等等,各种需要检测温度的场合。这个项目中,除了要用到蜂鸣器外,还需要一个LM35温度传感器。

    我们这里将头一回接触传感器,传感器是什么?简单的从字面上的理解就是,一种能感知周围环境,并把感知到的信号转换为电信号的感应元件。感应元件再把电信号传递给控制器。就好比人的各个感官,感知周围环境后,再信息传递给大脑是一样的道理。

    所需元件
    • 1×  蜂鸣器
    • 1×  LM35温度传感器

    STEP 1:硬件连接
    在接LM35温度传感器时,注意三个引脚的位置,从左至右依次接5V、Analog 0、GND,如我们下图所示。



    STEP 2:输入代码
    完成硬件连接后,打开Arduino IDE,输入下面这段代码。

    kittenblock中小学创客名师推荐的图形化编程软件

    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的串口监视器。


    设置串口监视器的波特率为9600。


    就可以直接从串口中读取温度值,并尝试升高周围环境温度,或者用手直接接触LM35使其升温,串口可以很直观的看到温度有明显的变化。

    蜂鸣器工作的条件是,一旦检测到环境温度大于27度,蜂鸣器鸣响,环境温度小于27度,则关闭蜂鸣器。

    STEP 3: 代码回顾
    这段代码与报警器一节的大部分内容是相同的,就直接讲讲不同的吧!

    setup()函数的第一句,我们想必已经很熟了,设置蜂鸣器为输出模式,有人可能会问为什么LM35不用设置呢?LM35是个模拟量,模拟量不需要设置引脚模式。pinMode只用于数字引脚。

    Arduino的通信伙伴——串口
    串口是Arduino和外界进行通信的一个简单的方法。每个Arduino都至少有一个串口,UNO分别与数字引脚0(RX)和数字引脚1(TX)相连。所以如果要用到串口通信的,数字0和1不能用于输入输出功能。

    串口可用的函数也有好多,可用查看语法手册。我们这里就先介绍几个常用的:

    这个函数用于初始化串口波特率,也就是数据传输的速率,是使用串口必不可少的函数。直接输入相应设定的数值就可以了,如果不是一些特定的无线模块对波特率有特殊要求的话,波特率设置只需和串口监视器保持一致即可。我们这里就只是用于串口监视器。

    这里用到了一个新函数——analogRead(pin)

    这个函数用于从模拟引脚读值,pin是指连接的模拟引脚。Arduino的模拟引脚连接到一个了10位A/D转换,输入0~5V的电压对应读到0~1023的数值,每个读到的数值对应的都是一个电压值。

    Arduino官方:analogRead(pin)
    DFRobot 中文版:analogRead(pin)

    我们这里读到的是温度的电压值,是以0~1023的方式输出。而我们LM35温度传感器每10mV对应1摄氏度。



    从传感器中读到的电压值,它的范围在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定时向串口发出数据。

    那串口收到数据后,如何在串口监视器上显示呢?就要用到下面的两句语句:

    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形式输出,而是以字节形式输出,感兴趣的可以查看语法手册。

    代码中,可能有一处会不太明白:


    有人会问,data不是字符串吗?怎么输出是数字呢?不要忘了,这是我们前面定义的变量,它其实就是代表数字,输出当然就是数字啦!



    STEP 4: 硬件回顾
    LM35
    LM35是一种常见的温度传感器,使用简便,不需要额外的校准处理就可以达到+ 1/4℃的准确率。

    我们看一下LM35引脚示意图,Vs接入电源,Vout是电压输出,GND接地。



    计算公式:Vout = 10mV/℃ * T℃(温度范围在+2℃~40℃)


    可以做些其他的事
    将我们上面的温度报警器再结合LED灯。在不同的温度范围设置不同颜色灯,并伴随不同频率的声音。
          比如:温度小于10 或者大于35,亮红灯,蜂鸣器发出比较急促的声音。
                    温度在25~35之间,亮黄灯,蜂鸣器伴随相对缓和的声音。
                    温度在10~25之间,亮绿灯,关闭蜂鸣器。

    打赏作者鼓励一下!
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    KittenBot杯第六届开源硬件开发大赛启动啦
    KittenBot杯第六届开源硬
    大赛简介: 第六届开源硬件开发大赛由Arduino中文社区发起 由KittenBot冠名赞助
    关于arduino编译问题
    关于arduino编译问题
    编译示例程序老是这个问题,换了电脑都不行
    莫名乱码 —— Arduino+RFID-RC522 读写实验
    莫名乱码 —— Arduino+RF
    目标:想把自己房间门改成感应门锁 器材:Arduino Uno (淘宝七星虫LY-F2)、RFID-RC
    [blinker开发实战2]数据反馈
    [blinker开发实战2]数据反
    [md] ### 添加DIY组件 在编辑模式下,点击按键进入编辑组件页面,可以看到 **按键
    用Arduino控制PS2无线手柄为什么一直连接不上
    用Arduino控制PS2无线手柄
    用Arduino UNO板 连接PS2手柄接收器,为什么指示灯已经显示对接上了,但是打开串口监
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表