Arduino基础入门之十三 温湿度传感器DHT11

一 硬件

        DHT11这款温湿度传感器,精度湿度±5%RH, 温度±2℃,如下图所示【1】

Arduino基础入门之十三 温湿度传感器DHT11

        4个引脚接线一目了然,2号data用于传感器与微控制器之间的通信,接UNO的某数字引脚,3号NC空置即可。目前我对新引入的硬件都是知道表面功能和连线方式就行了,硬件内部的一些机制还不求甚解。比如搜索DHT11就发现其他博主写的都是通信过程、高低电平时序图什么的【2,3】,看不懂呀!

       另外参见【3】,是将2号Data外接上拉电阻,保证总线空闲时是高电平,接线如下图

Arduino基础入门之十三 温湿度传感器DHT11

 我就是将2号引脚直接外接UNO数字引脚了,目前没问题,就不改动了,上图留作以后参考。

二 代码

1.实现功能,就是让DHT11读取的温湿度数据在LCD1602上面显示出来,LCD1602的设置和连线和之前的内容一致【4】

2.具体代码,其中闪烁和滚动出屏的部分参考了【5】

//LCD显示温湿度传感器DHT11读取的值
//LCD字符闪烁和滚动
#include <dht.h> //声明调用dht库
dht DHT;//创建一个对象
#define DHT_pin 9//DHT11接的数字引脚
#include <LiquidCrystal.h>//声明调用LCD的相关库
const int rs=12,en=11,d4=5,d5=4,d6=3,d7=2;//LCD引脚
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);//创建一个名为lcd的实例(对象)这里是4线法
void setup() {
  lcd.begin(16,2);//初始化LCD的宽度和高度,设置16列cols 2行rows,先列后行  
}

void loop() {
  // 显示“Rick,What's the weather like?”,闪烁三次并消失再显示温度和湿度

    DHT.read11(DHT_pin);//从DHT传感器引脚读取
    lcd.clear();
    lcd.print("Rick, What's the");//
    lcd.setCursor(0,1);//把光标设置在0列1行(第2行开头)上
    lcd.print("weather like?");
    delay(2000);
    //字符闪烁3次
    for(int i=0;i<3;i++){
      lcd.noDisplay();
      delay(500);
      lcd.display();
      delay(500);
      }

    //问句消失再显示湿度和温度

      lcd.clear();//清屏,光标回到左上角
      lcd.print("Humidity(%):");//共12个字符
      lcd.setCursor(12,0);//光标定位到上面字符的后面,即第1行第13列
      lcd.print(DHT.humidity,1);//显示采集到湿度值,保留小数点后1位
      lcd.setCursor(0,1);//光标定位到第1列第2行
      lcd.print("Temp(C):");//8个字符
      lcd.setCursor(8,1);//光标定位到第9列第2行
      lcd.print(DHT.temperature,1);显示采集到温度值,保留小数点后1位
      delay(2000);

    //向左滚动出屏
      
     for(int j=0;j<16;j++){
        lcd.scrollDisplayLeft();
        delay(500);//这个延迟时间可以调节滚动速度,越小滚动越快
        }
}

3. 知识点

1)关于DHT11的使用,首先需要加载dht.h这个库,卖家发的源码里面有个dht的文件夹,里面有两个文件dht.h和dht.cpp.我就把这个文件夹拷进\libraries里面,结合#include 语句,实现库的加载。

2)通过搜索发现关于DHT11并不是只有dht.h这个库,还有一种dht11.h。若是引用后一种库,代码中读取数据的语句也不一样了,卖家发给我的资料里面在不同的地方居然两种库都有,害得我一直不知哪里错了。我引用库是#include <dht.h>  后续语句应该是dht对象.read11(pin),而有的网页搜出来的结果是对象.read(),原因就是代码开头引用的库不一样,估计只有我这种小白才会在这个问题上晕圈半天吧!另外可以自己写dht头文件和cpp文件,这样自定义更加方便,但这个离我有点远。

3)有了read11()这个语句后,再写对象.temperature 对象.humidity就能得到温度和湿度值了,我也试了下不写read11(),直接对象.temperature 对象.humidity,结果一直是0.唉,反正这个库文件我也不会查阅,就感觉规定成这个形式有点奇怪,为啥不是read11()这句直接得到值呢?就像UNO的digitalRead()语句那样,而要分开写,还是用三句代码哩!?以后我能自己改库文件了,我就试试自定义!不知这种能不能改?

4)LCD屏幕的初步显示功能在【4】里面写了,所以这回就让显示效果更多一些,当然这就需要查找一下LIquidCrystal库里面有哪些函数和哪些对应功能了,这个参考还是比较多的【6,7】。具体实现的功能我在代码里面都标注了,目前我也是照搬而已。问题和之前一样,如果这个库函数不是这么普遍易搜,能不能通过查看库文件我就知道有哪些函数和功能呢?应该是可以的,只不过我目前还看不懂头文件和cpp文件而已。

最后结果见下图

Arduino基础入门之十三 温湿度传感器DHT11

视频和动图太大,就不传了,还有一个问题,就是摄氏度这个符号没有打全。

 【1】DHT11 DHT22温度、湿度传感器如何与Arduino配合使用及其接口 - 知乎

【2】DHT11温湿度传感器(详细)_做个疯狂的程序员的博客-CSDN博客_dht11

【3】Arduino实验——DHT11读取温湿度_R先生一天不学习就浑身难受-CSDN博客

【4】Arduino基础入门之十二 LCD1602A初步显示_u013978070的专栏-CSDN博客

【5】Arduino学习笔记:基于LiquidCrystal库运行LCD1602_echobox的博客-CSDN博客

【6】LiquidCrystal库函数 - Dumblidor - 博客园

【7】Arduino - LiquidCrystal

上一篇:艾美捷 MyBioSource丨MBS266250检测原理


下一篇:【P2P网络】BitTorrent的DHT协议(译自官方版本)