一 硬件
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 - 博客园