树莓派4使用Python通过GPIO从DHT11温湿度传感器读取数据
原文地址:https://blog.zeruns.tech/archives/625.html
介绍
DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度±5%RH, 温度±2℃,量程湿度20-90%RH, 温度0~ 50℃。精度不高,但价格低廉。DHT11使用单总线通信。供电电压3.3~5V。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f1GTckNG-1618292584878)(https://tc.zeruns.tech/images//05/06/DHT11…jpg)]
Arduino读取DHT11,DHT22,SHTC3温湿度数据:https://blog.zeruns.tech/archives/527.html
Python实现微秒级延时的方法:https://blog.zeruns.tech/archives/623.html
DHT11数据手册下载地址:https://url.zeruns.tech/DHT11 提取码: qefk
源码
线路连接:
我使用的是树莓派4,其他版本请自行查询更改。
树莓派4GPIO接口介绍:https://url.zeruns.tech/RPI4_GPIO
DHT11树莓派VCC---------5V(第2引脚)DATA-------BCM18(CM编号的18号引脚,也就是第12号引脚)GND--------Ground(第6引脚)
源码:
import RPi.GPIO as GPIOimport timedef 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编号# https://blog.zeruns.tech a,b=0,0def 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口为输入模式# https://blog.zeruns.tech 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:breaka=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# https://blog.zeruns.tech delayMicrosecond(28) # 延时28微秒if GPIO.input(data): # 超过28微秒后判断是否还处于高电平tmp.append(1) # 记录接收到的bit为1a=time.time()while GPIO.input(data): # 一直循环至输入为低电平b=time.time()if (b-a)>0.1:breakelse:tmp.append(0) # 记录接收到的bit为0while True:GPIO.setmode(GPIO.BCM)# 设置为BCM编号模式GPIO.setwarnings(False)del tmp[0:] # 删除列表time.sleep(1)# 延时1秒# https://blog.zeruns.tech 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=0humidity_point=0temperature_int=0temperature_point=0check=0# https://blog.zeruns.tech 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/10temperature=temperature_int+temperature_point/10check_tmp=humidity_int+humidity_point+temperature_int+temperature_pointif check==check_tmp and temperature!=0 and temperature!=0: # 判断数据是否正常print("Temperature is ", temperature,"C\nHumidity is ",humidity,"%")# 打印温湿度数据print("https://blog.zeruns.tech")else:print("error")time.sleep(1)GPIO.cleanup()