一、DHT11硬件
1.1 硬件介绍
1.2 工作原理及时序图
二、DHT11代码(python)
2.1 python代码
**Tips:**该python代码转载,注释为本人理解实验后注释,初学python,有错误请不吝赐教
#Toggle Comment By wuxulong,1324483661@qq.com
import RPi.GPIO as GPIO
import time
channel =16 #传感器输出口接BCM模式 GPIO16
data = []
j = 0
GPIO.setmode(GPIO.BCM)
time.sleep(1)
/*MCU向DCT发射启动信号*/
GPIO.setup(channel, GPIO.OUT)
GPIO.output(channel, GPIO.LOW)#数据总线空闲状态为高电平,通信开始时,将电平拉低
time.sleep(0.02)#此过程至少需要18ms才能确保DHT检测到MCU信号
GPIO.output(channel, GPIO.HIGH)#上拉电压20us~40us回应DHT
GPIO.setup(channel, GPIO.IN)
/*DHT响应MCU*/
while GPIO.input(channel) == GPIO.LOW:#DHT检测到启动信号,发出持续80us的低电平响应信号
continue
while GPIO.input(channel) == GPIO.HIGH:#DHT程序准备向数据总线拉高保持80us,以便DHT准备发送数据
continue
/*DHT传送数据*/
while j < 40:#单线串行发送数据,共40位数据
k = 0
while GPIO.input(channel) == GPIO.LOW:#每个数据位都以50us低电平开始,后续高电平信号长度决定0或1
continue
while GPIO.input(channel) == GPIO.HIGH:#判断高电平信号长度
k += 1
if k > 100:#始终高电平,代表DHT未正确响应
break
if k < 8:
data.append(0)#高电平信号持续为26~28us,写0
else:
data.append(1)#高电平持续信号为70us左右,写1
j += 1#读取一位数据成功
print ("sensor is working.")
print (data)#打印读出的40位数据
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 check == tmp:#代表检测成功,输出温度和湿度
print ("temperature :", temperature, "*C, humidity :", humidity, "%")
else:
print ("wrong")#检测失败,输出错误数据
print ("temperature :", temperature, "*C, humidity :", humidity, "% check :", check, ", tmp :", tmp)
GPIO.cleanup()