DHT11集成了温度和湿度传感器,通过度娘能找到一大堆关于树莓派+DHT11进行温湿度监控的文章,其中代码不乏C系列的,Python系统的,我基本上也编辑实践了。C系列的程序基本上没有读取成功的,Python系列的也基本上没有成功的,在不断实践中终于发现一个好用的Python代码,记录下来以备后用。
-
#! /usr/bin/env python3
-
# encoding=utf-8
-
# power by : FUNCO_小风
-
-
import RPi.GPIO as GPIO
-
import time
-
-
# 延时函数
-
def delay(i):
-
while i:
-
i -= 1
-
-
# 初始化dht11连接引脚
-
# dht11_pin - dht11连接的引脚号
-
def init_dht11(dht11_pin):
-
# 输出模式 初始状态给高电平
-
GPIO.setup(dht11_pin, GPIO.OUT)
-
GPIO.output(dht11_pin, 1)
-
-
# 用于获取
-
# dht11_pin - dht11连接的引脚号
-
# 返回二元组 [ 湿度 , 温度 ]
-
def get_dht11(dht11_pin):
-
buff=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
-
-
GPIO.output(dht11_pin,0)
-
time.sleep(0.02) # 拉低20ms
-
-
GPIO.output(dht11_pin,1)
-
-
GPIO.setup(dht11_pin,GPIO.IN) # 这里需要拉高20-40us,但更改模式需要50us,因此不调用延时
-
-
-
while not GPIO.input(dht11_pin): # 检测返回信号 检测到启示信号的高电平结束
-
pass
-
-
-
while GPIO.input(dht11_pin): # 检测到启示信号的高电平则循环
-
pass
-
-
i=40
-
-
while i:
-
start=time.time()*1000000 # 为了严格时序 循环开始便计时
-
i-=1
-
while not GPIO.input(dht11_pin):
-
pass
-
while GPIO.input(dht11_pin):
-
pass
-
buff[i]=time.time()*1000000-start# 为了严格时序 每次测得数据后都不马上处理 先存储
-
-
GPIO.setup(dht11_pin,GPIO.OUT) # 读取结束 复位引脚
-
GPIO.output(dht11_pin,1)
-
-
# print "buff - ",buff
-
-
# 开始处理数据
-
for i in range(len(buff)): # 将时间转换为 0 1
-
if buff[i]>100: # 上方测试时是测试整个位的时间
-
# 因此是与100比较 大于100为1(位周期中 低电平50us)
-
buff[i]=1
-
else:
-
buff[i]=0
-
# print "After - ",buff
-
-
i=40
-
hum_int=0
-
while i>32: # 湿度整数部分
-
i-=1
-
hum_int<<=1
-
hum_int+=buff[i]
-
# print "hum - ",hum_int
-
-
tmp_int=0
-
i=24
-
while i>16: # 温度整数部分
-
i-=1
-
tmp_int<<=1
-
tmp_int+=buff[i]
-
# print "tmp - ",tmp_int
-
return [hum_int,tmp_int]
-
-
GPIO.setmode(GPIO.BOARD)
-
init_dht11(7)
-
print get_dht11(7)
-
GPIO.cleanup()
-
-
# 注意
-
# 若非连续测量 可以不延时 但连续测量时建议每次测量间间隔0.2s以上再调用get_dht11(dht11_pin)获取数据(树莓派不稳定)
-
# DHT11虽然有40位 实际温度和湿度的小数部分读数总为0
-
# 如果程序无法正常读取,可以考虑是否起始部分的延时不准确,可以参考注释以及实际环境的测量结果调整延时
-
# 程序测试环境为 $树莓派3代B+$ $python2.7.9 $Raspbian GNU/Linux 8$
阅读(2952) | 评论(0) | 转发(0) |