设为首页收藏本站

[教程] DIY海盗船系列 第6话 --- 温湿度检测功能

Jane 发表于 2016-6-12 10:17:40 | 显示全部楼层 [复制链接]
2 484
DIY海盗船系列 第6话 --- 温湿度检测功能
海盗船现在不仅具备基本的行动技能外,现在再给它增加环境检测功能,让它“内心”更强大。我们这里给它增加的功能是环境检测中的一种--温湿度检测。温湿度与我们生活息息相关。再各式各样的场景下,都需要用到它。我们这里选用的DHT11温湿度传感器,好用,简单,试试吧!

硬件材料:
  • DHT11温湿度传感器 × 1
dht11.png
  • 数字触摸开关 × 1
触摸开关.png
  • I2CLCD1602液晶模块 × 1
LCD.png
  • M3*6尼龙柱、尼龙扎带 × 若干
尼龙柱.png 尼龙带.png

组装步骤:
准备完以上这些材料,就开始组装了,组装不难,更着操作就行。
STEP1: 安装触摸传感器
尼龙柱是用来固定传感器的,先将尼龙柱固定到触摸传感器的两个固定孔上。注意不要拧的过紧。

固定.png

完成后,再将传感器固定到车身前端的传感器板上。下图为正反面。

正面.png 反面.png
STEP 2: 安装LCD屏
取出4根尼龙扎带,依次将LCD屏上的4个固定孔和小车的支撑柱固定在一起。将多余的线减去即可。

屏幕固定.png

STEP 3: 安装DHT11传感器
还是先将尼龙柱固定到DHT11传感器上,如下图所示。

尼龙柱DHT11.png

再用螺母将其固定到小车的顶板上,完成后,建议不要急于将顶板固定在小车上。因为我们下一步就需要电路连接了。

电路.png 电路1.png   

STEP 4: 完整效果图

完整.png

硬件连接:
安装完成后,我们就要开始电路连接了,参照我们下图的硬件连接图。只需将传感器的3Pin引脚直接连接到Romeo BLE上即可。
注意线序:传感器的绿色为信号线,红色为VCC,黑色为GND。LCD显示屏依次接VCC,GND,SCL,SDA。



连线.png

输入代码:
插上USB线,下载代码。由于代码较长,所以这里就不全部显示出来,你可在软件包中找到 DHT11_Display.ino的代码,下载进去后即可。不要忘记加载LiquidCrystal_I2C和dht11的库。
如果一切都顺利的话,下载成功后,用手轻触两下触摸传感器,你就可以在LCD屏上看到实时显示的温湿度的值了。触摸传感器在这里起到两个作用。
第一个作用: LCD背光灯的开关作用,轻按触摸传感器,背光灯会打开,长时间不按,又会自己关闭,节约电源。
第二个作用:屏幕切换作用,当你用到多个环境传感器的时候,触摸传感器就能起到很好的屏幕切换的作用。通过切换可查看多个环境监测数据。


ino.png

代码回顾:
代码开始还是一些库函数的声明,库很重要,工程师已经将一些很复杂的数据处理部分写在库中了,你没有必要理解这么深奥的理论知识,只需要会使用就可以了。所以,如果没有库,也就没有看上去那么容易理解的代码了。
  1. #include <Wire.h>
  2. #include <LiquidCrystal_I2C.h>
  3. LiquidCrystal_I2C lcd(0x20,16,2);  
  4. #include <dht11.h>
  5. dht11 DHT;
复制代码
这里你需要了解一下DHT11Pin,这个变量是用来声明传感器引脚的:
  1. int DHT11Pin = 3;
复制代码
这里的意思就是说,DHT11Pin代表的3号数字引脚。换言之,我们的DHT11传感器是接到数字口3。
如果说,你想用数字口4来控制DHT11传感器的话,代码可以如何修改呢?
  1. int DHT11Pin = 4;
复制代码
将3替换成4就可了。如何变化引脚,你是需要学会的,应该不难。
下面这串是一些时间变量的声明,下面会有说明。touchPin对应的就是触摸传感器,13号数字引脚。
  1. long currentMillis=0;                  
  2. long previousMillis;
  3. long Interval=4000;
  4. int count=0;       //counting numbers
  5. int touchPin = 13;
复制代码
进入setup()函数,是一些初始化设置
  1. pinMode(touchPin,INPUT);
复制代码
将触摸传感器设置为输入模式,具体可参看Arduino语法手册pinMode()函数介绍。      
接下来,初始化LCD屏,并且打开一次LCD灯的背光灯,表示LCD上电开始运作。
  1. lcd.init();              
  2. lcd.backlight();
复制代码
接着进入loop()函数中,首先需要读取触摸传感器的值,用touchState这个变量来存储读到的值。
  1. int touchState = digitalRead(touchPin);
复制代码
紧接着就是判断,是不是有手触碰传感器,如果有手触碰传感器,也就是说控制器会读到HIGH这个信号。那么count就会加1(可查看自加++用法)。
  1. if (touchState == HIGH){
  2.     count++;
  3.     previousMillis= millis();
  4. }
复制代码
这里count是用来记录按下的次数的。并且,每按下一次,就用millis()函数记录下时间。通过if语句,不断和前一次按下的时间做比较。Interval,在这里就是设置的时间点,4000ms(也就是4s)。如果4秒内有手接触触摸传感器,那么执行些什么动作。超过4s又执行些什么动作。
  1. if(currentMillis - previousMillis < Interval) {
  2.       //4秒内,执行些什么
  3. else{
  4.       //超过4秒,执行些什么        
  5. }
复制代码
我们先看超过4秒的,比较容易理解:
  1. lcd.setBacklight(0);
复制代码
setBacklight()这个函数是用来关闭LCD背光灯的。
超过4秒,我们知道可以关闭LCD背光灯。
那么不超过4秒呢?执行些什么动作?
  1. if (count==1){  
  2.    // 按下一次 LCD屏幕不做任何反应            
  3. }
  4. else if (count==2){   
  5.    // 连按二次 LCD屏幕才显示温湿度的值      
  6. }
复制代码
如果4秒内,传感器被按下一次,那么屏幕仍然保持关闭状态。只有当被连按两次的时候,LCD背光灯才被开启,显示温湿度传感器的值。
这里有一点需要注意,再最后一次按下后,count要被清零,那么下次监测的时候才能又从0开始计数了。
  1. count=0;
复制代码
所以对应的完整代码就是:
  1. if (count==1){                    
  2.    lcd.setBacklight(0);
  3. }
  4. else if (count==2){                  
  5.    lcd.backlight();
  6.    DHT11Show();
  7.    count=0;
  8. }
复制代码
这里数据读取完之后,需要记录下当前的时间(currentMillis),可与前面的时间(previousMillis)做个比较,这一点也很重要。     
  1. currentMillis = millis();
复制代码
这里还涉及一个函数DHT11Show(),可以从函数的名字上猜出,这个函数是用来显示DHT11传感器的数值的。依次来看下:
  1. int value = DHT.read(DHT11Pin);
复制代码
DHT.read(pin)函数是用来从DHT11传感器引脚上读取传感器的数据。
下面这部分全部是LCD屏的一些相关用法:
  1. lcd.setCursor(0,0);
  2. lcd.setCursor(0,1);
复制代码
setCursor(column,row)函数是用来设置光标显示的行与列的位置,从0开始计算。
比如说(0,1)也就是说,从第一列,第二行开始显示数据。
  1. lcd.print(DHT.humidity,1);   // 显示湿度
  2. lcd.print(DHT.temperature,1);   //显示温度
复制代码
print()函数可直接在屏幕上显示该数据。
  1. lcd.print("      ");  
复制代码
上面这句语句表示在屏幕上输出”空格”,作用是用来清屏的。

多传感器结合:
可能你在选购的时候,用到了多个传感器环境监测的传感器,那该如何将它们全部结合起来呢?
不用担心,我们提供给你一个多传感器检测的代码模板,你可参照模板来进行修改。其实原理和单个传感器是一样的,只是中间LCD屏幕切换部分多增加了几个环节。
如下所示的代码,红色标注的部分就是需要修改的部分。在前面代码回顾中讲到,count是用来手指触摸传感器的次数的,所以count=2表示按下两次,让它显示第一个传感器的数值。那么如果增加一个传感器,我们就记count=3,被按下第三次的时候,让它显示第二个传感器的数值。依次类推……不要忘记再最后一个传感器显示结束之后,需要将count清零。
样例代码:
  1. if(currentMillis - previousMillis < Interval) {
  2.     if (count==1){
  3.       lcd.setBacklight(0);
  4.     }
  5. else if (count==2){     //No.1 Sensor
  6. Sensor1Show();
  7. lcd.backlight();
  8.     else if(count==3){      //No.2 Sensor
  9.       Sensor2Show();
  10.       lcd.backlight();
  11.       count = 0;
  12. }
  13. }
复制代码
当然,传感器的一些初始化设置不能少,也就是代码开始的变量声明,以及独立的Show()函数。否则控制器无法读取到传感器的数值。
如果还不是很清楚如何修改你的代码,可查看我们提供的WeatherStation.ino的样例代码。

Code.zip

24.06 KB, 下载次数: 2, 下载积分: 创造力 -1

发表于 2016-6-12 10:59:00 | 显示全部楼层
好详细的教程
回复 支持 反对

使用道具 举报

发表于 2016-6-12 11:35:33 | 显示全部楼层
管理员存货很足
回复 支持 反对

使用道具 举报

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

本版积分规则 允许回帖同步到新浪微博  

  • 管理员
  • 4079
  • 103
  • 活跃会员

    活跃会员

  • 版主限定

    版主限定

  • 特邀作者

    特邀作者

  • 牛X认证

    牛X认证

  • 小蘑菇勋章

    小蘑菇勋章

  • 蘑菇人勋章

    蘑菇人勋章

  • 教师荣誉徽章

    教师荣誉徽章

  • 蘑菇老人勋章

    蘑菇老人勋章

推荐阅读

精华导读




公司简介| 联系我们| 小黑屋| 加入我们| 微博| 优酷| 英文网站| DF创客社区 ( 沪ICP备09038501号-4  
友情链接| 硬创邦| 花生壳社区| 模友之吧| 电子发烧友社区| 创客星球| 云汉电子社区| 电子工程网| 与非网| Arduino中文社区| 南极熊3D打印网|

上海智位机器人有限公司  沪ICP备09038501号-4   

Powered by Discuz! X3.1

Licensed Comsenz Inc.

返回顶部 返回列表