DHT11温湿度传感器
产品概述
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。
单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,信号传输距离可达20米以上,使其成为各类应用甚至最为苛刻的应用场合的最佳选则。
特点
- 相对湿度和温度测量
- 全部校准,数字输出
- 长期稳定性
- 超长的信号传输距离:20米
- 超低能耗:休眠
- 4 引脚安装:可以买封装好的
- 完全互换 : 直接出结果,不用转化
引脚定义及接线
DHT11的供电电压为 3-5.5V。传感器上电后,要等待 1s 以越过不稳定状态在此期间无需发送任何指令。电源引脚(VDD,GND)之间可增加一个100nF 的电容,用以去耦滤波。
串行接口 (单线双向)
DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,
一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,
当前小数部分用于以后扩展,现读出为零.操作流程如下:一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据 +8bit温度整数数据+8bit温度小数数据 +8bit校验和
数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据 +8bit温度整数数据+8bit温度小数数据”所得结果的末8位。
通信时序图
用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集。采集数据后转换到低速模式。
初始化时序
总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号。DHT11接收到主机的开始信号后,,等待主机开始信号结束,然后发送80us低电平响应信号。主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可,总线由上拉电阻拉高。
时序分析:
DATA = 1
DATA = 0
延时30ms(至少18ms)
DATA = 1
在60us后读取DATA的状态,如果为低电平(被从机拉低),说明从机产生了响应
/**
* @brief 检测DHT11模块是否响应
* @param无
* @retval无
*/
void DHT11_Init()
{
DATA = 1;
DATA = 0;
Delay1ms(30);
DATA = 1;
Delay60us();
if(DATA == 0) //读取数据线的电平,如果是0,表示从机响应
{
LED1 = 0; //点亮LED1
}
}
数字0信号表示方法:
数字1信息表示方法:
数据0和数据1只是高电平持续的时间不同,因为DHT11发送的数据一共40bit,每8位组成一个有效的信息,每次读取的1bit,所以每一次读8位,共读5轮才能把所有数据读出来
char rec[5]; //接收全部温湿度数据
/**
* @brief DHT11读取温湿度
* @param 无
* @retval无
*/
void DHT11_ReadByte()
{
unsigned int i,j;
unsigned char temp = 0;
unsigned char flag;
DHT11_Start(); //最后时序电平为高
while(DATA);
for(i = 0; i < 5; i++) //读5轮,共读40bit
{
for(j = 0; j < 8; j++) //读温湿度整数或小数值,每次读8bit
{
while(!DATA);
Delay50us(); //延时50us后再去读DATA的电平
if(DATA == 1)
{
flag = 1;
}
else
{
flag = 0;
}
temp <<= 1;
temp |= flag;
}
rec[i] = temp; //每获得8bit数据后放入rec数据中
}
}
读出来后,数据都存在了rec数组中,然后就可以往串口上打印输出
/**
* @brief 数据处理以及通过串口显示
* @param 无
* @retval 无
*/
void Data_Dispose()
{
unsigned char i;
DHT11_ReadByte();
Delay1ms(1000);
for(i = 0; i < 4; i++)
{
if(i == 0){Uart_SendString("湿度:");}
if(i == 2){Uart_SendString("温度:");}
Uart_SendChar(rec[i]/10+0x30); //+0x30是为了转为字符显示
Uart_SendChar(rec[i]%10+0x30);
if(i == 0 || i == 2){Uart_SendChar('.');}
}
Uart_SendString("\r\n");
}