资讯详情

Raspberry Pi Pico搭载DHT11测量温湿度

DHT11数字温湿度传感器是一种含有校准数字信号输出的温湿度复合传感器。采用特殊的数字模块采集技术和温湿度传感技术,确保产品具有高可靠性和优异的长期稳定性。

01

DHT11简介

DHT11数字温湿度传感器是一种含有校准数字信号输出的温湿度复合传感器。采用特殊的数字模块采集技术和温湿度传感技术,确保产品具有高可靠性和优异的长期稳定性。传感器包括电容式感湿元件和NTC 与高性能8位单片机连接的测温元件。

基本参数:

1、相对湿度

2、温度

02

串行通信协议

1.单总线说明:

DHT11装置采用简化的单总线通信。单总线只有一条数据线,系统中的数据交换和控制由单总线完成。设备(主机或从机)通过漏极开路或三态端口连接到数据线,允许设备在不发送数据的情况下释放总线,并允许其他设备使用总线;单总线通常需要外接约一条 4.7kΩ的上拉电阻,这样,当总线闲置时,其状态为高电平。由于它们是主从结构,只有在主机呼叫时才能响应,因此主机访问设备必须严格遵循单总线序列。如果序列混乱,设备将不响应主机。

单总线传输数据位定义:

DATA用于微处理器和DHT通信单总线数据格式,一次传输40位数据,高位先出。

数据格式: 8bit湿度数据 8bit湿度小数据 8bit温度整数据 8bit温度小数据 8bit校验位。

注:湿度小数为0。

定义验证位数据 “8bit湿度数据 8bit湿度小数据 8bit温度整数据 8bit温度小数据

8bit验证位置等于所得结果的最后8位。

3.单总线格式定义:

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

0011 0101 0000 0000 0001 1000 0000 0100 0101 0001

湿度高8位 湿度低8位 温度高8位 温度低8位 校验位

计算:0011 0101 0000 0000 0001 1000 0000 0100= 0101 0001

正确的接收数据:

湿度:0011 0101(整数)=35H=53%RH 0000 0000(小数)=00H=0.0%RH =>53%RH 0.0%RH = 53.0%RH

温度:0001 1000(整数)=18H=24℃ 0000 0100(小数)=04H=0.4℃ =>24℃ 0.4℃ = 24.4℃

当温度低于 0 ℃ 8位低温数据的最高位置为1。

示例:-10.1 ℃ 表示为 0000 1010 1000 0001

温度:0000 1010(整数)=0AH=10℃,0000 0001(小数)=01H=0.1℃ ,最后

-(10℃ 0.1℃)= -10.1℃

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

0011 0101 0000 0000 0001 1000 0000 0100 0100 1001

湿度高8位 湿度低8位 温度高8位 温度低8位 校验位

计算:0011 0101 0000 0000 0001 1000 0000 0100= 0101 0001 0101 0001不等于0100 1001 接收数据不正确,放弃,重新接收数据。

4.数据时序图

数据时序图 用户主机(MCU)发送开始信号后,DHT11从低功耗模式到高速模式,主机开始信号结束后,DHT11发送响应信号40bit信号发送如图所示。

注:主机从DHT11读取的温湿度数据总是以前的测量值。如果两次测量间隔时间长,请连续读取两次以第二次获得的值为实时温湿度值。

03

读取数据步骤

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

步骤二: 微处理器的I/O设置为输出同时输出低电平,低电平的小于18ms(最大不超过30ms),然后是微处理器I/O由于上拉电阻,微处理器设置为输入状态I/O即DHT11的DATA数据线也变高了,等待DHT11发出答复信号,如图所示:

步骤三: DHT11的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微秒高电平。如图所示:

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

03

实现数据协议代码

1、DHT11数据读取处理

class DHT11:     def __init__(self,pin_name):         #DHT11上电后(DHT11上电后等待 1S 在此期间,以越过不稳定状态不能发送任何指令。         time.sleep(1)         self.N1 = Pin(pin_name, Pin.OUT)         self.PinName=pin_name         time.sleep(1)     def read_data(self):         self.__init__(self.PinName)         data=[]         j=0         N1=self.N1         N1.low()         #微处理器I/O设置为输出同时输出低电平,低电平保持时间不小于18ms(最大不超过30ms)         time.sleep(0.03)         N1.high()         N1 = Pin(self.PinName, Pin.IN)         while N1.value()==1:             continue 等待外部信号低电平结束         while N1.value()==0:             continue 等待外部信号高电平结束         while N1.value()==1:             continue #一次接受40bit数据         while j<40:             k=0             while N1.value()==0:                continue
            while N1.value()==1:
                k+=1
                if k>100:break
            if k<3:
                data.append(0)
            else:
                data.append(1)
            j=j+1
        
        j=0
        humidity_bit=data[0:8]
        humidity_point_bit=data[8:16]
        temperature_bit=data[16:24]
        temperature_point_bit=data[24:32]
        check_bit=data[32:40]
        humidity=0
        humidity_point=0
        temperature=0
        temperature_point=0
        check=0
        #温度、湿度、校验位计算
        for i in range(8):
            #湿度计算
            humidity+=humidity_bit[i]*2**(7-i)
            humidity_point+=humidity_point_bit[i]*2**(7-i)
            #温度计算
            temperature+=temperature_bit[i]*2**(7-i)
            temperature_point+=temperature_point_bit[i]*2**(7-i)
            #校验位计算
            check+=check_bit[i]*2**(7-i)
        tmp=humidity+humidity_point+temperature+temperature_point
        if tmp == check:
            return [temperature,temperature_point,humidity,humidity_point,tmp,check]
        else:
            return [0,0,0,0,0,0]

2、DHT11数据读取显示,这里我们结合之前的SSD1315 OLED来进行显示

OLED屏幕初始化

i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=100000)    # Init I2C using I2C0 defaults, SCL=Pin(GP9), SDA=Pin(GP8), freq=100000


oled = SSD1315_I2C(WIDTH, HEIGHT, i2c)                  # Init oled display

DHT11测量值获取以及OLED show

while True:
    dht=DHT11(10)
    data = dht.read_data()#读取温湿度的值
    oled.fill(0)
    oled.text("IoT Inn",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()

最后结果显示如下:

将传感器置于笔记本风扇出风口,可以看到比较明显的变化:

temp 28.9 degree humidity 93.0RH%
temp 29.8 degree humidity 88.0RH%
temp 30.6 degree humidity 84.0RH%
temp 31.6 degree humidity 80.0RH%
temp 32.3 degree humidity 76.0RH%
temp 33.0 degree humidity 73.0RH%

标签: 外接电源型温湿度变送器gp电容式压力变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台