树莓派控制DHT11温度湿度传感
作为最常见的传感器,本篇实现温度/湿度传感的交互:
1. 首先把树莓派GPIO结构图放上来:
图一 树莓派GPIO结构图2. 接线图:
图二 树莓派GPIO对DHT11传感器接线图这里需要说明的是:红线,黑线和蓝线分别代表传感器的VCC/DATA/GND,实际操作中只要把红线接在任意一个3.3V正极,黑线接在任意一个GPIO输出输出极,蓝线接在地线就可以了,不过在脚本的编写时要注意DATA接的是哪一根GPIO,上图接的是pin 21。
3. 写脚本:
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
def DHT11(pin):
data = []
GPIO.setmode(GPIO.BCM)
time.sleep(1)
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)
time.sleep(0.02)
GPIO.output(pin, GPIO.HIGH)
GPIO.setup(pin, GPIO.IN)
while GPIO.input(pin) == GPIO.LOW:
continue
while GPIO.input(pin) == GPIO.HIGH:
continue
i = 0
while i < 40:
j = 0
while GPIO.input(pin) == GPIO.LOW:
continue
while GPIO.input(pin) == GPIO.HIGH:
j += 1
if j> 100:
break
if j < 8:
data.append(0)
else:
data.append(1)
i += 1
print "sensor is working"
#print data
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, "%"
return(temperature,humidity)
else:
print("wrong")
return(False,False)
GPIO.cleanup()
if __name__=='__main__':
pin =21
T,H = DHT11(pin)
执行命令只需要在python 环境下引入DHT11模块:
>>>import DHT11
>>>DHT11.DHT11(21)
重点学习BCM针脚编码的写法,更接近于底层。还有传感器高低电平的处理。
程序是从网络上借鉴的,原理还没有学的很清楚,但是已经能实现温度湿度的传感,只不过有少许的错误数据产生,需要测一段时间取平均。结合定时脚本,和数据库能实现每天固定时间获取温湿度数据并写入数据库,非常实用的程序。