Arduino实验十:DHT11温湿度传感器实验
来自丢石头百科
目录
模块介绍
模块说明
DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,内部由一个8位单片机控制一个电阻式感湿元件和一个 NTC 测温元件。与DS18B20数字型温度传感器相比,DHT11 既能检测温度又能检测湿度。DHT11传感器采用单线制串行接口,其Dout引脚接上一个5K的上拉电阻后可直接与单片机的I/O口连接。信号传输距离可达20米以上,具有抗干扰能力强、性价比极高、响应速度快等优点。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
参数说明
- 工作电压:3V-5.5V
- 工作电流 :平均 0.5mA
- 湿度测量范围:20-90%RH
- 湿度测量精度:±5%RH
- 湿度分辨率 :1%RH 8位
- 温度测量范围:0-50℃
- 温度测量精度:±2℃
- 温度分辨率 :1℃ 8位
- 采样周期 :≥1s
数据结构
DHT11数字温湿度传感器采用单总线数据格式,即单个数据引脚端口完成输入输出双向传输。一次通讯时间大约为4ms左右,一次完整的数据包是由5Byte(40Bit)组成。其中数据分小数部分和整数部分,按照高位在前,低位在后的传输顺序。具体格式如下:
- 数据格式为:8bit湿度整数数据+8bit 湿度小数数据+8bit 温度整数数据+8bit 温度小数数据+8bit 校验和
其中由于DHT11分辨率只能精确到个位,所以小数部分是数据全为0。校验和为前4个字节数据相加,校验的目的是为了保证数据传输的准确性。
另因为传感器输出的数据是未编码的二进制数据,因此在进行数据处理时,温度、湿度、整数、小数部分应分开处理。
例如:当某次传感器传出的40bit数据为由上述数值可以得出: 湿度 = byte1.byte2 = 00111101.00000000 = 61.0%RH 温度 = byte3.byte4 = 00011110.00000000 = 30.0℃ 校验和 = 01011011 = byte1+byte2+byte3+byte4+byte5 = 00111101+00000000+00011110+00000000(取相加结果的末8位,若相等,则校验正确)
控制时序
- DHT11采用单总线协议与单片机通信,主机发送一次复位信号后,DHT11从低功耗模式转换到高速模式,等待主机复位结束后,DHT11发送响应信号,并拉高总线准备传输数据,用户可选择读取部分数据。DHT11只有在接收到复位信号后才触发一次温湿度采集,如果没有接收到主机发送复位信号,DHT11不主动进行温湿度采集。当数据采集完毕且无开始信号后,DHT11自动切换到低速模式。
- 整个通讯过程可分为一下几步:
- 1、DHT11初始化—触发DHT11采集数据
- 主机发送复位信号
- DHT11发送响应信号
- 2、DHT11发送采集数据
DHT11初始化
- 主机发送复位信号
- 总线空闲状态为高电平,主机将总线拉低等待DHT11响应,拉低时间必须大于18ms,保证DHT11能检测到复位信号。
- 主机在发送复位信号结束后,将总线拉高或切换为输入模式,延时时间为20~40us,此时复位信号发送完毕,主机等待接收DHT11的响应信号。
- DHT11发送响应信号
- DHT11检测到复位信号后,触发一次采样,并拉低总线80us表示响应信号,告诉主机数据已经准备好了。
- DHT11发送80us响应信号后会拉高总线80us,之后开始传输数据。
数据传输
DHT11在拉高总线80us后开始传输数据。每1bit数据都以50us低电平时隙开始,告诉主机开始传输一位数据了。以高电平的长短定义数据位是0还是1,如果检测到响应信号为高电平,则DHT11初始化失败,请检查线路是否连接正常。当最后1bit数据传送完毕后,DHT11 拉低总线 50us,表示数据传输完毕,随后总线由上拉电阻拉高进入空闲状态。
- 数据‘0’时序
- 当DHT11发送50us低电平时隙过后拉高总线,高电平持续26~28us,则表示数据“0”。
- 数据‘1’时序
- 当DHT11发送50us低电平时隙过后拉高总线,高电平持续70us,则表示数据“1”。
总时序
- 主机把总线拉低大于18ms,保证DHT11能检测到起始信号;
- 主机发送复位信号结束后,将总线拉高或改为输入模式,延时等待20-40us后,读取DHT11的响应信号;
- 主机检测到总线被拉低时(DHT11发送的起始信号),每隔1us计数一次,直至总线拉高,计算低电平时间是否为80us。若读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常;
- 主机检测总线被拉高后,重新计数检测高电平时间,如果检测到响应信号之后的高电平时间为80us,则准备开始接收数据。
- 主机接收的每一bit数据都是以50us低电平时隙开始的,高电平的长短定了数据位是0还是1。
- 当主机接收完最后一bit数据后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。
- 注意:
- 实际上DHT11的响应时间并不是标准的80us,往往存在误差,当响应时间处于 20~100us 之间时就可以认定响应成功。
- 由于 DHT11 时序要求非常严格,所以在操作时序的时候,为了防止中断干扰总线时序,先关闭总中断,操作完毕后再打开总中断。
- DHT11只有在接收到复位信号后才触发一次温湿度采集,如果没有接收到主机发送复位信号,DHT11不主动进行温湿度采集。
0/1时序区分
- DHT11发送数据数据“0”和数据‘1’主要是通过高电平的时间区分的,数据‘0’的高电平持续 26~28us,数据“1”的高电平持续70us,每一位数据前都有50us的起始时隙。
- 如果取一个中间值40us来区分数据“0”和数据“1”。当数据位之前的50us低电平时隙过后,总线会被拉高,此时延时40us后检测总线状态,如果为高,说明此时处于70us的时隙,则数据为“1”;如果为低,说明此时处于下一位数据50us的开始时隙,那么上一位数据肯定是“0”。
- 由于误差的原因,数据“0”时隙并不是准确26~28us,可能比这短,也可能比这长。当数据“0”时隙大于26~28us时,如果延时太短,无法判断当前处于数据“0”的时隙还是数据“1”的时隙;如果延时太长,则会错过下一位数据前的开始时隙,导致检测不到后面的数据。
实验说明
实验现象
- 串口输出DHT11传感器的测量数据
电路连接
主要程序
myDHT11.DHT11_Read(); //读取温湿度值 Serial.print("HUMI = "); Serial.print(myDHT11.HUMI_Buffer_Int); Serial.println(" %RH"); Serial.print("TMEP = "); Serial.print(myDHT11.TEM_Buffer_Int); Serial.println(" C"); delay(1000); //延时1s