DHT温湿度传感器的基本探究
扫描二维码
随时随地手机看文章
作为物联网IOT的Things,温湿度传感器也是一个重要的研究对象。本文以DHT11为主要的研究对象,通过对该传感器的研究,分析一下具体的使用方法。
1. 说明
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器
采集范围:温度0-50°±2°,湿度:20-90%RH。
供电电压:5V。
外观如下图所示:

2. 工作原理
对于DHT11传感器的工作原理,首先需要从典型的应用电路说起

数字温湿度传感器采用单数据格式,单个数据引脚完成输入输出单向传输。
2.1 工作时序
由于DHT11需要与主控进行通信,所以必须要涉及到通信时序。也就是约定好通信规则。那么对于DHT11温湿度传感器的通信时序又是怎样的呢?
该传感器通信是通过奥松电子有限公司开发的单总线协议和主控进行数据通信。可以分为以下四个步骤
(1)主机发起开始信号
(2)主机等待接收DHT11响应信号
(3)主机连续接收40Bit数据和校验和
(4)主机进行数据处理

从上图可以看到,当主机首先需要将DATA线上的信号拉低至少18ms,以保证DHT能够正常检测到起始信号,当主机拉高20-40us后,主机起始信号结束。此时,主机引脚作为输入,检测传感器输出过来的数据。
传感器也需要回应数据,首先将DATA线上的信号拉低40-50us,然后再拉高40-50us。主控接收到准备信号后,再开始接收数据。
数据”0“的表示

数据“0”,首先DHT把总线拉低12-14us然后拉高,高电平保持在26-28us这个范围。表示“0”。
数据“1”的表示

数字“1”,首先DHT把总线拉低12-14us然后拉高,高电平保持在116-118us这个范围。表示“1”。
2.2 数据格式
DHT单向数据传输的数据量大小为5Byte(40bit)。一次通信时长约为3ms。
湿度整数 | 湿度小数 | 温度整数 | 温度小数 | 校验和(数据相加) |
---|---|---|---|---|
8bit | 8bit | 8bit | 8bit | 8bit |
数据处理
传感器的数据从高位到低位传输

那么从上述的数据可以得到计算公式如下

3. 代码实现
因为采用STM32的主控作为测试,所以需要选定特定的引脚做输入输出。这里可以采用位带操作的方式。
3.1 DHT初始化
初始化其实就是配置GPIO引脚功能的作用
可以将引脚先配置为输出即可。
3.2 向DHT1发出起始信号
void DHT11_Rst(void) {
DHT11_IO_OUT(); //SET OUTPUT DHT11_DQ_OUT=0; //GPIOA.0=0 Delay_ms(20); //Pull down Least 18ms DHT11_DQ_OUT=1; //GPIOA.0=1 Delay_us(30); //Pull up 20~40us }
3.3 读1 bit的数据
u8 DHT11_Read_Bit(void) {
u8 retry=0; while(DHT11_DQ_IN&&retry<100) //wait become Low level {
retry++;
Delay_us(1);
}
retry=0; while(!DHT11_DQ_IN&&retry<100) //wait become High level {
retry++;
Delay_us(1);
}
Delay_us(40);//wait 40us if(DHT11_DQ_IN) return 1; else return 0;
}
3.4 读一个字节的数据
u8 DHT11_Read_Byte(void) {
u8 i,dat;
dat=0; for (i=0;i<8;i++)
{
dat<<=1;
dat|=DHT11_Read_Bit();
} return dat;
}
3.4 读温湿度数据
u8 DHT11_Read_Data(u8 *temperature,u8 *humidity) {
u8 buf[5];
u8 i;
DHT11_Rst(); if(DHT11_Check()==0)
{ for(i=0;i<5;i++)
{
buf[i]=DHT11_Read_Byte();
} if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
{
*humidity=buf[0];
*temperature=buf[2];
}
} else return 1; return 0;
}
4.效果演示
我在main函数中通过每1ms采集一次数据通过串口打印出来,在串口调试助手上可以看到温湿度的信息。

上述演示中,并未取小数部分数据。
5.调试心得
在调试过程中也遇到一些问题,特别的留意一下。
(1)配置gpio时,不要忘记开启相应的时钟,否则不起作用。
(2)对于有引脚复用的模式,比如JTAG,需要先禁止掉JTAG模式接口
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE); // 改变指定管脚的映射 GPIO_Remap_SWJ_Disable SWJ 完全禁用(JTAG+SW-DP) GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); // 改变指定管脚的映射 GPIO_Remap_SWJ_JTAGDisable ,JTAG-DP 禁用 + SW-DP 使能
(3)DHT的数据引脚,主控这边输出的时候,就配置成推挽输出模式,当配置为输入的时候,就配置成上拉输入模式。
(4)准守下面的原则基本不会出错
1.复位的时候,主机向程序发送数据,也就是MCU会发送一定的指令到dht11上
2.检测状态,这里就是从机的应答状态,这里的应答状态会直接看出是否该引脚有效
3.数据的读出
4.Bit位的组合状态