好记性不如铅笔头

linux, 操作系统, 树莓派

树莓派学习笔记:使用DHT11测量温度湿度

最近买了一个DHT11传感器,用来测量温度和湿度。这里备份下代码和资料:

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的工作时间。

Leave a Reply

4 + 4 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据