DHT11温湿度传感器共有四个引脚
1个VCC高电平,1个GND接地低电平,1个数据输出引脚,一个空引脚
工作时候,通过out引脚可以向传感器传递应答信号并返回40位的温湿度数据,也就是5个字节
前2个字节表示温度的整数位和小数位,后面两个字节是湿度的整数位和小数位,最后一个字节是校验用
1.引脚
- 4根引脚,名称与功能如下;
- vdd 供电 3-5.5VDC
- GND 接地,电源负极
- DATA 串行数据,单总线
- NC 空脚
2.温湿度测量范围
- 温度范围为: 测量范围为-20~+60℃, 精度±2℃
- 湿度范围为:测量范围为5~95%RH, 精度为±5%RH
3.工作时序阶段图
接受数据通过0101010脉冲,数据进行高低电平的不断发送接收,直至40位数据发送完之后,
数据引脚将长时间处于一个高电平状态
python代码----
#!/usr/bin/python
# -*- coding:utf-8 -*-
import RPi.GPIO as GPIO
import time
channel = 7 # 引脚号Pin7
data = [] # 温湿度值
j = 0 # 计数器
GPIO.setmode(GPIO.BOARD) # 以BOARD编码格式
time.sleep(1) # 时延一秒
GPIO.setup(channel, GPIO.OUT)
GPIO.output(channel, GPIO.LOW) #输出低电平
time.sleep(0.02) # 给信号提示传感器开始工作
GPIO.output(channel, GPIO.HIGH)
GPIO.setup(channel, GPIO.IN) #进入输入阶段----放弃总线控制权
while GPIO.input(channel) == GPIO.LOW:
continue
while GPIO.input(channel) == GPIO.HIGH: #跳出本次循环
continue
while j < 40:
k = 0
while GPIO.input(channel) == GPIO.LOW:
continue
while GPIO.input(channel) == GPIO.HIGH:
k += 1
if k > 100:
break #持续信号不变情况则,开始读取数据
if k < 8: # 通过计数的方式判断是数据位高电平长短,以置0或1。(此方式有待商榷)
data.append(0) #append函数 列表末端添加新对象
else:
data.append(1)
j += 1 #直至40位数据传输完毕跳出循环
print("sensor is working.")
print(data) # 输出初始数据高低电平01010101
humidity_bit = data[0:8] # 分组40位就是5个字节分段
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) # 转换成十进制数据加权-----1X2n次幂
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, ", humidity : ", humidity)
else: # 错误输出错误信息,和校验数据
print("wrong")
print("temperature : ", temperature, ", humidity : ", humidity, " check : ", check, " tmp : ", tmp)
GPIO.cleanup() # 重置针脚