赞
踩
DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度5~95%RH, 温度-20~+60℃。
该传感器包含一个电阻湿度感元件和一个NTC温度测量设备。
3个引脚+、-分别接VCC与GND,中间引脚DATA是一条数据线,通过它可以向传感器发送应答信号并返回40位的温湿度数据。
供电电压 | DC:3.3-5.5V |
---|---|
工作范围(温度) | -20~+60℃ |
量程范围(湿度) | 5~95%RH |
温度精度 | ±2℃ |
湿度精度 | ±5%RH |
重复性 | 温度:±1℃ ;湿度:±1%RH |
迟滞(温度) | ±0.3℃ |
迟滞(湿度) | ±0.3%RH |
pin | 名称 | 注释 |
---|---|---|
1 | VDD | 供电 3-5.5VDC |
2 | DATA | 串行数据,单总线 |
3 | NC | 空脚 |
4 | GND | 接地,电源负极 |
首先由树莓派将数据拉高进入空闲状态(IdleState)
然后再把数据线拉低至少18ms通知DHT11需要进行数据采集(Star MCU),然后放弃总线的控制权
随后数据线会被DHT11拉高(20-40us),然后DHT11将发送一个80us的低电平与80us的高电平数据开始信号通知树莓派接收数据
随后将发送40位的0,1脉冲信号
其中0脉冲包括50us低电平,26us高电平
而1脉冲由50us低电平与70us的高电平组成
数据发送完毕之后数据总线被拉长时间拉高,总线又进入空闲模式
引脚图
本次连接选用的引脚为:
BCM18 ——>pi 12
VCC5V ——>pi 4
GND GND ——>pi 6
DHT11连接:
黑线——VCC——面包板-极
白线——GND——面包板+极
红线——DATA——面包板e口
树莓派连接
黑线——VCC 5V——树莓派Pi4——面包板-极
白线——GND GND——树莓派Pi6——面包板+极
紫线——BCM 18——树莓派Pi12——面包板a口
树莓派与DHT11合并
测试代码:
- import RPi.GPIO as GPIO
- import time
-
- #温湿度
- def delayMicrosecond(t): # 微秒级延时函数
- start,end=0,0 # 声明变量
- start=time.time() # 记录开始时间
- t=(t-3)/1000000 # 将输入t的单位转换为秒,-3是时间补偿
- while end-start<t: # 循环至时间差值大于或等于设定值时
- end=time.time() # 记录结束时间
-
- tmp=[] # 用来存放读取到的数据
-
- data = 18 # DHT11的data引脚连接到的树莓派的GPIO引脚,使用BCM编号
-
- a,b=0,0
-
- def DHT11():
- GPIO.setup(data, GPIO.OUT) # 设置GPIO口为输出模式
- GPIO.output(data,GPIO.HIGH) # 设置GPIO输出高电平
- delayMicrosecond(10*1000) # 延时10毫秒
- GPIO.output(data,GPIO.LOW) # 设置GPIO输出低电平
- delayMicrosecond(25*1000) # 延时25毫秒
- GPIO.output(data,GPIO.HIGH) # 设置GPIO输出高电平
- GPIO.setup(data, GPIO.IN) # 设置GPIO口为输入模式
-
- a=time.time() # 记录循环开始时间
- while GPIO.input(data): # 一直循环至输入为低电平
- b=time.time() # 记录结束时间
- if (b-a)>0.1: # 判断循环时间是否超过0.1秒,避免程序进入死循环卡死
- break # 跳出循环
-
- a=time.time()
- while GPIO.input(data)==0: # 一直循环至输入为高电平
- b=time.time()
- if (b-a)>0.1:
- break
-
- a=time.time()
- while GPIO.input(data): # 一直循环至输入为低电平
- b=time.time()
- if (b-a)>=0.1:
- break
-
- for i in range(40): # 循环40次,接收温湿度数据
- a=time.time()
- while GPIO.input(data)==0: #一直循环至输入为高电平
- b=time.time()
- if (b-a)>0.1:
- break
- delayMicrosecond(28) # 延时28微秒
-
- if GPIO.input(data): # 超过28微秒后判断是否还处于高电平
- tmp.append(1) # 记录接收到的bit为1
-
- a=time.time()
- while GPIO.input(data): # 一直循环至输入为低电平
- b=time.time()
- if (b-a)>0.1:
- break
- else:
- tmp.append(0) # 记录接收到的bit为0
-
- #while True循环输出
- while True:
- GPIO.setmode(GPIO.BCM) # 设置为BCM编号模式
- GPIO.setwarnings(False)
- del tmp[0:] # 删除列表
- time.sleep(1) # 延时1秒
- DHT11()
-
- humidity_bit=tmp[0:8] # 分隔列表,第0到7位是湿度整数数据
- humidity_point_bit=tmp[8:16]# 湿度小数
- temperature_bit=tmp[16:24] # 温度整数
- temperature_point_bit=tmp[24:32] # 温度小数
- check_bit=tmp[32:40] # 校验数据
-
- humidity_int=0
- humidity_point=0
- temperature_int=0
- temperature_point=0
- check=0
- for i in range(8): # 二进制转换为十进制
- humidity_int+=humidity_bit[i]*2**(7-i)
- humidity_point+=humidity_point_bit[i]*2**(7-i)
- temperature_int+=temperature_bit[i]*2**(7-i)
- temperature_point+=temperature_point_bit[i]*2**(7-i)
- check+=check_bit[i]*2**(7-i)
-
- humidity=humidity_int+humidity_point/10
- temperature=temperature_int+temperature_point/10
-
- check_tmp=humidity_int+humidity_point+temperature_int+temperature_point
-
- if check==check_tmp and temperature!=0 and temperature!=0: # 判断数据是否正常
- print("Temperature is ", temperature,"C\nHumidity is ",humidity,"%")# 打印温湿度数据
- a={"Temperature":temperature,"Humidity":humidity}
-
- else:
- print("error")
-
- time.sleep(1)
- GPIO.cleanup()
测试结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。