摘要:本文介绍如何使用DHT11进行温度和湿度的测量
前面介绍了如何使用DS18B20芯片进行温度的测量。本文将介绍另一款含有已校准数字信号输出的温湿度复合传感器——DHT11。
DHT11使用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。DHT11包含了一个电阻式感湿元件、一个NTC测温元件和一个高性能的8位单片机。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。同前边介绍的DS18B20一样,DHT11也采用了单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。
DHT11的样子如下图所示:
DHT11的引脚说明如下:
pin |
名称 |
注释 |
1 |
VDD |
供电 3-5.5VDC |
2 |
DATA |
串行数据,单总线 |
3 |
NC |
空脚 |
4 |
GND |
接地,电源负极 |
DHT11与单片机的连接方法与DS18B20是一样的,除了VDD接电源正极、GND接电源地、DATA直接与GPIO相连之外,还需要在DATA数据线上连接一个上拉电阻,如下图所示:
DHT11的性能参数如下所示:
供电电压: 3.3~5.5V DC
输出: 单总线数字信号
测量范围: 湿度5~95%RH,温度-20~+60℃
测量精度: 湿度±5%RH,温度±2℃
分辨率: 湿度1%RH, 温度0.1℃
DHT11同DS18B20一样,也是采用单总线数据传输,也就是只利用一根总线完成数据和指令的发送和接收工作。
读取DHT11的测量数据包括以下三个步骤:
1. 主机发送开始信号
DHT11的单总线在平时也是保持高电平状态,当主机需要获得DHT11的测量数据时,需要首先发送开始信号。主机需要先拉低数据线,并保持至少18ms的时间,然后再拉高数据线20-40us的时间。
2. DHT11回复响应信号
当DHT11收到主机发来的开始信号后,DHT11需要做出响应,回复响应信号。DHT11需要先拉低数据线,保持80us的时间,作为响应信号,然后再拉高数据线,保持80us的时间。
3. DHT11发送测量数据
DHT11回复主机的响应之后,就可以发送数据了。在这里需要注意的是,DHT11的单总线通信发送数据的方法与之前的不同,并不是约定了固定的传输速率,然后按照高电平代表1、低电平代表0的方式串行发送数据的。而是使用宽度不同的脉冲来分别代表0和1进行发送数据的。每个脉冲前有一个50us的低电平,来表示一位数据的开始。而后的高电平持续的不同时间,则表示了不同的含义,当高电平持续的时间是26-28us时,表示这一位的数据是“0”,当高电平持续的时间是大于70us时,表示这一位的数据是“1”。
DHT11每次返回的数据是5个字节(40位),包括:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验和。其中的校验和为前面4个字节相加。下面来看一个返回数据的示例:
假如接收到的40位数据为:
0011 0110 |
0000 0000 |
0001 1001 |
0000 0000 |
0100 1111 |
湿度高8位 |
湿度低8位 |
温度高8位 |
温度低8位 |
校验字节 |
湿度整数部分 |
湿度小数部分 |
温度整数部分 |
温度小数部分 |
校验和的计算:
0011 0110 + 0000 0000 + 0001 1001 + 0000 0000 = 0100 1111
前4个字节之和与第5个校验字节相同,表示接收数据的校验和正确,数据传输无误。
湿度:0011 0110.0000 0000=54.0%RH
温度:0001 1001.0000 0000=25.0℃
好了,关于DHT11的基本知识就介绍到这里了。下面来看一下如何在Mixly中用程序读取DHT11的测量数据。
在这里,使用的是DHT11温湿度模块,而不是原始器件,好处就是不用我们自己再外接上拉电阻了,而且还有了电源指示LED,可以直观的判断出电源的连接是否正确。如下图所示:
接线就是VCC接+5V电源,DATA接GPIO,GND接电源地。在这里,我将DHT11连接到了ESP32开发板的33引脚。下面就打开Mixly软件,选择“Arduino ESP32”开发板,然后利用串口输出DHT11模块的温度和湿度。DHT11采集功能在“传感器”功能模块中。完成后如下图所示:
编译、上传就可以在COM端口看到DHT11的测量结果了,如下图所示:
下面来看一下Mixly生成程序的源代码,如下所示:
#include DHT dht33(33, 11); void setup(){ Serial.begin(115200); dht33.begin(); } void loop(){ Serial.println(String("温度:") + String(dht33.readTemperature())); Serial.println(String("湿度:") + String(dht33.readHumidity())); delay(1000); } |
在源代码中,完全看不到复杂的协议过程,这是因为已经有人把整个协议进行了封装。用DHT类包含了全部与DHT11有关的操作。其中主要的处理如下:
dht33(33, 11):生成DHT对象的实例,这个对象使用的GPIO引脚是33,温湿度芯片是DHT11。
begin():完成DHT11对象的初始化工作,准备读取检测数据。
readTemperature():读取温度。
readHumidity():读取湿度。
好了,DHT11芯片的基本功能就介绍到这里了。对于不是从事底层驱动开发的人来说,了解其基本原理、可以用程序正确的获得测量数据就可以了。