温湿度传感器(DHT11)简易使用

DHT11数字温湿度传感器是一款数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术。

传感器包括一个电阻式感湿元件和一个NTC热敏元件,以及一个高性能的8位芯片。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。

每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。

在本例中,您将学习如何将传感器与Stduino UNO一起使用,从而监测室温和湿度。

引脚说明

DHT11封装有4个引脚,各个引脚的说明如下:

Pin 名称 注释
1 VDD 供电 3-5.5 VDC
2 DATA 串行数据,单总线
3 NC 空脚
4 GND 接地,电源负极

一般从网上买的传感器套件版本的DHT11,会是一个带LED的模块,上面有三个接线引脚,接线方式如下:

模块引脚 Stduino 开发板管脚
VCC 5V
GND GND
DATA D8

技术细节

电源 3.3-5.5V
最大电流 1.0mA
采样周期 >2秒每次
相对湿度测量范围 5%-95%RH 精度(25°C时) ±5%RH
温度 -20℃ ~ 60°C 精确度 ±2°C(25℃下测试)

组件

你将需要以下组件:

  • 1×面包板
  • 1×Stduino Uno
  • 1×DHT11模块

连接

按照电路图连接面包主板的组件,如下图所示。
(补图)

数据传输

单总线说明

DHT11器件采用简化的单总线通信,利用一根数据线与系统进行数据交换。设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线;单总线通常要求外接一个约4.7kΩ的上拉电阻,这样,当总线闲置时,其状态为高电平。由于它们是主从结构,只有主机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线序列,如果出现序列混乱,器件将不响应主机。

数据格式

DHT11与主设备只见那的通讯,一次传输40位数据,高位先出。
数据格式:

湿度整数位数据(8bit) 湿度小数位数据(8bit) 温度整数位数据(8bit) 温度小数位数据(8bit) 校验位(8bit)

8bit校验位等于湿度整数位数据、湿度小数位数据、温度整数位数据、温度小数位数据之和的末八位(二进制)。

单总线格式定义

序列 描述
起始信号 微处理器把数据总线(SDA)拉低一段时间至少18ms(最大不得超过30ms),通知传感器准备数据。
响应信号 传感器把数据总线(SDA)拉低83µs,再接高87µs以响应主机的起始信号。
数据格式 收到主机起始信号后,传感器一次性从数据总线(SDA)串出40位数据,高位先出
湿度 湿度高位为湿度整数部分数据,湿度低位为湿度小数部分数据
温度 温度高位为温度整数部分数据,温度低位为温度小数部分数据,且温度低位Bit8 为1则表示负温度,否则为正温度
校验位 校验位=湿度高位+湿度低位+温度高位+温度低位

示例:接收到的40位数据为:

0011 0101 0000 0000 0001 1000 0000 0100 0101 0001
湿度高8位 湿度低8位 温度高8位 温度低8位 校验位

计算:
00110101+00000000+00011000+00000100=01010001
因此,接收数据正确,那么:

  • 湿度:00110101(整数)= 35H = 53%RH 00000000(小数) = 00H = 0.0%RH => 53%RH+0.0%RH = 53.0%RH
  • 温度:00011000(整数)=18H=24℃ 00000100(小数)=04H=0.4℃=>24℃+0.4℃=24.4℃

注意

当温度低于0℃时,温度数据的低8位最高位置为1。
示例:-10.1℃表示为0000101010000001

时序

主设备发送一次“开始”信号后,DHT11从低功耗模式转换到高速模式。
待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据(上一次采集的数据),并触发一次新的数据采集。

读取数据步骤

  • 步骤一:DHT11上电后等待稳定
    DHT11上电后(DHT11上电后要等待1S以稳定状态,在此期间不应发送任何指令),开始测试环境温湿度数据,并记录数据。
    同时DHT11的DATA数据线由上拉电阻拉高一直保持高电平;此时DHT11的DATA引脚处于输入状态,时刻检测外部信号。

  • 步骤二:微处理器发出开始信号
    微处理器发出开始信号:微处理器IO输出低电平,且保持时间不小于18ms(最大不得超过30ms),然后微处理器的I/O设置为输入状态,由于上拉电阻,微处理器的IO即DHT11的DATA数据线也随之变高,等待DHT11作出回答信号。发送信号如下图:

  • 步骤三:DHT11发出应答信号
    DHT11的DATA引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后DHT11的DATA引脚输出83微秒的低电平作为应答信号,紧接着输出87微秒的高电平通知外设准备接收数据。微处理器的IO此时处于输入状态,检测到IO有低电平(DHT11回应信号)后,等待87微秒的高电平后的数据接收。信号如下图所示:

  • 步骤四:DHT11输出40位数据
    由DHT11的DATA引脚输出40位数据,微处理器根据I/O电平的变化接收40位数据。位数据“0”的格式为:54微秒的低电平和23-27微秒的高电平。位数据“1”的格式为:54微秒的低电平加68-74微秒的高电平。位数据“0”、“1”格式信号如图下图所示:

  • 结束信号:
    DHT11的DATA引脚输出40位数据后,继续输出低电平54微秒后转为输入状态,由于上拉电阻随之变为高电平。但DHT11内部重测环境温湿度数据,并记录数据,等待外部信号的到来。

信号控制时间表:

注意需要按照下列步骤先进行安装DHTlib库后才可正常运行下列程序

代码

#include <Arduino.h>
#include <dht.h>

dht DHT;

#define DHT11_PIN 5

void setup()
{
  Serial.begin(115200);
  Serial.println("DHT TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT_LIB_VERSION);
  Serial.println();
  Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
}

void loop()
{
  // READ DATA
  Serial.print("DHT11, \t");
  int chk = DHT.read11(DHT11_PIN);
  switch (chk)
  {
    case DHTLIB_OK:  
        Serial.print("OK,\t"); 
        break;
    case DHTLIB_ERROR_CHECKSUM: 
        Serial.print("Checksum error,\t"); 
        break;
    case DHTLIB_ERROR_TIMEOUT: 
        Serial.print("Time out error,\t"); 
        break;
    case DHTLIB_ERROR_CONNECT:
        Serial.print("Connect error,\t");
        break;
    case DHTLIB_ERROR_ACK_L:
        Serial.print("Ack Low error,\t");
        break;
    case DHTLIB_ERROR_ACK_H:
        Serial.print("Ack High error,\t");
        break;
    default: 
        Serial.print("Unknown error,\t"); 
        break;
  }
  // DISPLAY DATA
  Serial.print(DHT.humidity, 1);
  Serial.print(",\t");
  Serial.println(DHT.temperature, 1);

  delay(2000);
}

结果

程序编写完成后,上传到Stduino UNO/Nano,再在 Stduino IDE的串口监视器中可以看到测量数据。

固件原理

文档更新时间: 2021-06-19 18:41   作者:Astilbe