ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-10-31 15:03:19  阅读:483  来源: 互联网

标签:引脚 温湿度 Arduino LCD lcd dht DHT11


一 硬件

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

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

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

 我就是将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文件而已。

最后结果见下图

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

 【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

标签:引脚,温湿度,Arduino,LCD,lcd,dht,DHT11
来源: https://blog.csdn.net/u013978070/article/details/121046152

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有