XuQi's Blog

  • 首页

  • 归档

树莓派从DHT11温度湿度传感器读取数据

发表于 2018-02-01 更新于 2019-10-20

运行效果:

参照:
http://shumeipai.nxez.com/2014/10/10/raspberry-dht11-get-temperature-data.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
 # -*- coding:utf8 -*-
import RPi.GPIO as GPIO
import time

class Sense_DHT11():
def __init__(self,out_pin):

self.pin = out_pin
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(out_pin,GPIO.OUT)
GPIO.output(out_pin,GPIO.HIGH)
self.temperature = None
self.humidity = None

def start(self):
while True:
self.temperature = None
self.humidity = None
# 主机复位信号
#发送开始信号
GPIO.setup(self.pin,GPIO.OUT)
GPIO.output(self.pin,GPIO.LOW)
#至少等待18us
time.sleep(0.01)

#拉高20-40 us
GPIO.output(self.pin,GPIO.HIGH)

GPIO.setup(self.pin,GPIO.IN)


# 等待低电平
while GPIO.input(self.pin)==1:
continue
# 等待高电平
while GPIO.input(self.pin)==0:
continue

# 等待低电平,数据开始
while GPIO.input(self.pin)==1:
continue
# 数据位
j = 0
data = []
# 前40位是数据位
while j < 40:
k = 0
# 所有数据位都是以低电平开始的
while GPIO.input(self.pin) == 0:
continue

while GPIO.input(self.pin) == 1:
k+=1
# 这个20 也要根据实际情况修正
if k > 20:break;


# 可能时间会不一样,所以可以改一下3这个值
if k < 10:
# 数字1表示的时间为26-28us
data.append(0)
else:
# 数字0表示的时间为116-118us
data.append(1)

j += 1
# 湿度整数位
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
# 转成10进制
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:
self.temperature = "%s.%s" % (temperature,temperature_point)
self.humidity = "%s.%s" % (humidity,humidity_point)
print "温度:" + self.temperature + "湿度:" + self.humidity
return (self.temperature,self.humidity)
else:
time.sleep(0.5)
print "please wait"

def __del__(self):
pass

注意点:

  1. 连续采样不能间隔太短,我是500ms
  2. 判断采样是0,还是1是通过循环次数,所以这个需要自己调整
  3. 判断1的最大循环次数不能太多,太多会导致在跳不出循环。

树莓派连接方法:

# 树莓派
Python计算机视觉编程第一章
TCP reset及原因

XuQi

44 日志
30 标签
© 2019 XuQi
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Muse v7.3.0