最近买了一个DHT11传感器,用来测量温度和湿度。这里备份下代码和资料:
CONTENTS
DHT11资料
转自《DHT11传感器资料.pdf》
这里就简单的把pdf贴上来,下面分析。
通讯说明:
数据解析:
时序图:
读取步骤:
代码实现:
通过阅读上述pdf文档,可以发现该传感器的工作时间都是以us级别的,时间非常短。如果我们使用python进行实现,就需要考虑到python的代码执行时间,这里参考了【 http://www.cnblogs.com/colipso/p/3535901.html 】文章,尽量将所有的操作都省掉,避免因为python的代码执行时间错过了GPIO的变化。
工作代码:
import time import RPi.GPIO as GPIO #//http://www.cnpythoner.com/wiki/string.html #//http://www.pythontab.com/html/2013/pythonjichu_0102/86.html def getIntVal(binayList): idx = 0; binaryStr = ''; while idx < len(binayList): binaryStr += str(binayList[idx]); idx += 1; return int(binaryStr ,2); def getHumidity(): GPIO_DATA = 23; GPIO_HIGH = GPIO.HIGH; GPIO_LOW = GPIO.LOW; GPIO.setmode(GPIO.BCM); #步骤2 GPIO.setup(GPIO_DATA,GPIO.OUT); GPIO.output(GPIO_DATA, GPIO.LOW); time.sleep(0.02);#0.018 GPIO.setup(GPIO_DATA,GPIO.IN); #上拉电阻导致GPIO为高 while GPIO.input(GPIO_DATA)== GPIO_HIGH: pass; #应答 while GPIO.input(GPIO_DATA)== GPIO_LOW: pass; #准备接受数据 while GPIO.input(GPIO_DATA)== GPIO_HIGH: pass; data = []; cnt = 40; while cnt > 0: cnt = cnt - 1; while GPIO.input(GPIO_DATA)== GPIO_LOW: pass; k = 0; while GPIO.input(GPIO_DATA)== GPIO_HIGH: k += 1; if k>100:break; if k < 3: data.append(0); else: data.append(1); val1 = getIntVal(data[0:8]); val2 = getIntVal(data[8:16]); val3 = getIntVal(data[16:24]); val4 = getIntVal(data[24:32]); val5 = getIntVal(data[32:40]); #校验 if(val5 == val1 + val2 + val3 + val4): return [val1, val3]; else: return [-1,-1]; GPIO.cleanup(); if __name__ == '__main__': hum = getHumidity(); print("hum:", hum[0], " temp:", hum[1]);
时间测试代码:
略,后面要测试print,k= k+1,continue,pass的工作时间。
发表评论