“DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。”
01
—
DHT11简介
DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
产品实物图
产品外形尺寸图
基本参数:
1、相对湿度
2、温度
02
—
串行通信协议
1、单总线说明:
DHT11器件采用简化的单总线通信。单总线即只有一根数据线,系统中的数据交换、控制均由单总线完成。设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线;单总线通常要求外接一个约4.7kΩ的上拉电阻,这样,当总线闲置时,其状态为高电平。由于它们是主从结构,只有主机呼叫从机时,从机才能应答,因此主机访问器件都必须严格遵循单总线序列,如果出现序列混乱,器件将不响应主机。
2、单总线传送数据位定义:
DATA用于微处理器与DHT11之间的通讯和同步,采用单总线数据格式,一次传送40位数据,高位先出。
数据格式bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据+8bit校验位。
注:其中湿度小数部分为0。
校验位数据定义“8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit温度小数数据”
8bit校验位等于所得结果的末8位。
3、单总线格式定义:
示例一:接收到的40位数据为:
湿度高8位湿度低8位温度高8位温度低8位校验位
计算:++0+0000=0101
接收数据正确:
湿度:(整数)=35H=53%RH(小数)=00H=0.0%RH=53%RH+0.0%RH=53.0%RH
温度:0(整数)=18H=24℃0000(小数)=04H=0.4℃=24℃+0.4℃=24.4℃
当温度低于0℃时温度数据的低8位的最高位置为1。
示例:-10.1℃表示为00100
温度:0010(整数)=0AH=10℃,0000(小数)=01H=0.1℃,最后
-(10℃+0.1℃)=-10.1℃
示例二:接收到的40位数据为:
湿度高8位湿度低8位温度高8位温度低8位校验位
计算:++0+0000=01010101不等于本次接收的数据不正确,放弃,重新接收数据。
4、数据时序图
数据时序图用户主机(MCU)发送一次开始信号后,DHT11从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信采集。信号发送如图所示。
注:主机从DHT11读取的温湿度数据总是前一次的测量值,如两次测间隔时间很长,请连续读两次以第二次获得的值为实时温湿度值。
03
—
读取数据步骤
步骤一HT11上电后(DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令),测试环境温湿度数据,并记录数据,同时DHT11的DATA数据线由上拉电阻拉高一直保持高电平;此时DHT11的DATA引脚处于输入状态,时刻检测外部信号。
步骤二:微处理器的I/O设置为输出同时输出低电平,且低电平保持时间不能小于18ms(最大不得超过30ms),然后微处理器的I/O设置为输入状态,由于上拉电阻,微处理器的I/O即DHT11的DATA数据线也随之变高,等待DHT11作出回答信号,发送信号如图所示:
步骤三HT11的DATA引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后DHT11的DATA引脚处于输出状态,输出83微秒的低电平作为应答信号,紧接着输出87微秒的高电平通知外设准备接收数据,微处理器的I/O此时处于输入状态,检测到I/O有低电平(DHT11回应信号)后,等待87微秒的高电平后的数据接收,发送信号如图所示:
步骤四:由DHT11的DATA引脚输出40位数据,微处理器根据I/O电平的变化接收40位数据,位数据“0”的格式为:54微秒的低电平和23-27微秒的高电平,位数据“1”的格式为:54微秒的低电平加68-74微秒的高电平。位数据“0”、“1”格式信号如图所示:
结束信号:DHT11的DATA引脚输出40位数据后,继续输出低电平54微秒后转为输入状态,由于上拉电阻随之变为高电平。但DHT11内部重测环境温湿度数据,并记录数据,等待外部信号的到来。
03
—
数据协议代码实现
1、DHT11数据读取处理
classDHT11ef__init__(self,pin_name)DHT11上电后(DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令)time.sleep(1)self.N1=Pin(pin_name,Pin.OUT)self.PinName=pin_nametime.sleep(1)defread_data(self):self.__init__(self.PinName)data=[]j=0N1=self.N1N1.low()#微处理器的I/O设置为输出同时输出低电平,且低电平保持时间不能小于18ms(最大不得超过30ms)time.sleep(0.03)N1.high()N1=Pin(self.PinName,Pin.IN)whileN1.value()==1:continue#等待外部信号低电平结束whileN1.value()==0:continue#等待外部信号高电平结束whileN1.value()==1:continue#一次接受40bit数据whilej40:k=0whileN1.value()==0:continuewhileN1.value()==1:k+=1ifk:breakifk3ata.append(0)elseata.append(1)j=j+1j=0humidity_bit=data[0]humidity_point_bit=data[8:16]temperature_bit=data[16:24]temperature_point_bit=data[24:32]check_bit=data[32:40]humidity=0humidity_point=0temperature=0temperature_point=0check=0#温度、湿度、校验位计算foriinrange(8)湿度计算humidity+=humidity_bit*2**(7-i)humidity_point+=humidity_point_bit*2**(7-i)#温度计算temperature+=temperature_bit*2**(7-i)temperature_point+=temperature_point_bit*2**(7-i)#校验位计算check+=check_bit*2**(7-i)tmp=humidity+humidity_point+temperature+temperature_pointiftmp==check:return[temperature,temperature_point,humidity,humidity_point,tmp,check]else:return[0,0,0,0,0,0]
2、DHT11数据读取显示,这里我们结合之前的SSDOLED来进行显示
OLED屏幕初始化
i2c=I2C(0,scl=Pin(9),sda=Pin(8),freq=000)#InitI2CusingI2C0defaults,SCL=Pin(GP9),SDA=Pin(GP8),freq=000oled=SSD_I2C(WIDTH,HEIGHT,i2c)#Initoleddisplay
DHT11测量值获取以及OLEDshow
whileTrueht=DHT11(10)data=dht.read_data()#读取温湿度的值oled.fill(0)oled.text("IoTInn",32,0)oled.text("temp{}.{}degree".format(data[0],data[1]),0,16)oled.text("humidity{}.{}RH%".format(data[2],data[3]),0,32)oled.show()
最后结果显示如下:
将传感器置于笔记本风扇出风口,可以看到比较明显的变化/p>
temp28.9degreehumidity93.0RH%temp29.8degreehumidity88.0RH%temp30.6degreehumidity84.0RH%temp31.6degreehumidity80.0RH%temp32.3degreehumidity76.0RH%temp33.0degreehumidity73.0RH%物联全栈