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

DHT11_Pins

时序图参考厂家说明书:DHT11数字湿温度传感器的原理和应用范例

四个阵脚连接:VCC接3.3伏电源,Dout接GPIO口,我接的是物理12针脚,NC留空,GND接地。

波折1:电阻被错接进了VCC,于是看了无数遍时序图,改了无数遍的驱动无论怎么改都是读不出数据。

波折2:偶然看了网上的DHT11上拉电阻电路图才发现错误,于是果断去掉电阻。但为了显示传感器工作正常在电源和VCC间接了个发光二极管进去,数据倒是读出来了,但各种错误。(原因不明)

去掉了电阻,去掉了led,优化了写的python,读数正常。再一次赞一个python。

写DHT11的驱动需要注意时序之间很紧密,python执行任何程序都要花费时间,在获取时序时需要注意所写调试用的代码也是占用时序的,在这一点上也走了一点弯路。

# -*- coding: utf-8 -*-
"""
Created on Sun Jan 26 14:24:43 2014

@author: pi
"""

import RPi.GPIO as gpio
import time
gpio.setwarnings(False)
gpio.setmode(gpio.BOARD)
time.sleep(1)
data=[]
def delay(i): #20*i usdelay
    a=0
    for j in range(i):
        a+1
j=0
#start work
gpio.setup(12,gpio.OUT)
#gpio.output(12,gpio.HIGH)
#delay(10)
gpio.output(12,gpio.LOW)
time.sleep(0.02)
gpio.output(12,gpio.HIGH)
i=1
i=1
 
#wait to response
gpio.setup(12,gpio.IN)


while gpio.input(12)==1:
    continue


while gpio.input(12)==0:
    continue

while gpio.input(12)==1:
        continue
#get data

while j<40:
    k=0
    while gpio.input(12)==0:
        continue
    
    while gpio.input(12)==1:
        k+=1
        if k>100:break
    if k<3:
        data.append(0)
    else:
        data.append(1)
    j+=1

print "Sensor is working"
#get temperature
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 is ", temperature,"wet is ",humidity,"%"
else:
    print "something is worong the humidity,humidity_point,temperature,temperature_point,check is",humidity,humidity_point,temperature,temperature_point,check

测试python程序时间代码

# -*- coding: utf-8 -*-
"""
Created on Sun Jan 26 16:01:59 2014

@author: pi
"""

import time
def delay(i):
    k=0
    for j in range(i):
        k+=1
n=5000
j=0

a=time.time()
i=1
c=time.time()
d=c-a
print d

a=time.time()
for i in range(n):
    j+=1
c=time.time()
d=c-a
print d

a=time.time()
delay(n)
c=time.time()
d=c-a
print d

via

这是一篇发布于 10年 前的文章,其中的信息可能已经有所发展或是发生改变,请了解。


7 评论

  1. 作者好,我运行该代码时,一直会报CRC不对,是不是时间的问题?我测试时间的结果如下:
    root@raspberrypi:/home/pi/sensor# python testTime.py
    1.69277191162e-05
    0.0209360122681
    0.00726008415222

    我的RPi是B+,从上面的数据看执行一次i=1,大约是17us,两次就是34us应该是在主机高电平20~40us的要求内,问题大概出现在哪呢?
    多谢!

  2. C 的程序是调通了,但是每次的结果都不一样,主要是温度的误差较大,三次温度的结果分别是24,5,20,但是现在室内不可能有20°的,这款传感器的可靠吗?

发表评论

你的邮件地址不会公开


*