Using a Raspberry Pi build their own smart home (a) --- DHT11 using temperature and humidity sensors

Introduction of the temperature and humidity sensor DHT11

It works as follows:
the host to send a start signal DHT11 sensor, after a series of interactions, the sensor 40 transmits a binary number, wherein the first eight bits represent the integer part of the humidity humidity_int, 9-16 bits represent the fractional part humidity humidity_decimal, 17- 24 represents the temperature of the integer part temperature_int, 25-32 indicates fractional temperature temperature_decimal; last 8 bits are check digits check_num, when check_num = (humidity_int + humidity_decimal + temperature_int + temperature_decimal)
, the transmission of this data is valid, otherwise invalid.

Sensor initialization DHT11

Raspberry sent via the GPIO pin outputs a low level, for at least 18ms, and then outputs a high level, this sensor operates as a trigger signal DHT11;
after DHT11 is successfully initialized, the output will be low via the GPIO pins 80us then pulled 80us, this signal indicates to the raspberry Pi: I have been successfully initialized, it will start transmitting data;
then, DHT11 starts sending 40 binary digits to the raspberry Pi, where "0" 50us low level plus 26 ~ 28us high level "1" corresponding to a high level 70us 50us low level of plus.
Here Insert Picture Description

Raspberry Pi Pin Description

     树莓派有多种编码格式,常用的是物理引脚的BOARD编码和BCM编码。


Here we will DHT11 the DATA pin to the GPIO.0, that is, under 18 BCM coding.
Here Insert Picture Description

Programming DHT11 temperature and humidity sensor temperature and humidity to give

 
import RPi.GPIO as GPIO
import time
 
channel = 18			#引脚号4
data = []			#温湿度值
j = 0				#计数器
 
GPIO.setmode(GPIO.BCM)		#以BCM编码格式
 
time.sleep(1)			#时延一秒
 
GPIO.setup(channel, GPIO.OUT)
 
GPIO.output(channel, GPIO.LOW)
time.sleep(0.02)		#给信号提示传感器开始工作
GPIO.output(channel, GPIO.HIGH)
 
GPIO.setup(channel, GPIO.IN)
 
while GPIO.input(channel) == GPIO.LOW:
	continue
 
while GPIO.input(channel) == GPIO.HIGH:
	continue
 
while j < 40:
	k = 0
	while GPIO.input(channel) == GPIO.LOW:
		continue
	
	while GPIO.input(channel) == GPIO.HIGH:
		k += 1
		if k > 100:
			break
	
	if k < 8:
		data.append(0)
	else:
		data.append(1)
 
	j += 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, ", humidity : " , humidity)
else:										#错误输出错误信息,和校验数据
	print ("wrong")
	print ("temperature : ", temperature, ", humidity : " , humidity, " check : ", check, " tmp : ", tmp)
 
GPIO.cleanup()	

Run temperature and humidity to give

Original Go: https://blog.csdn.net/Vancl_Wang/article/details/84948152?utm_source=app

Released seven original articles · won praise 2 · Views 549

Guess you like

Origin blog.csdn.net/qq_41744697/article/details/103907582