Jugando con Raspberry Pi (23) - Práctica del sensor de temperatura y humedad DHT11

Jugando con Raspberry Pi (23) - Práctica del sensor de temperatura y humedad DHT11

I. Introducción

DHT11 es un poderoso sensor compuesto que admite la medición de la temperatura y la humedad ambientales. Es relativamente simple en sí mismo, pero debido a que usa sincronización en serie para leer y escribir datos, es muy adecuado para que practiquemos la programación de sincronización. El módulo de sensor que usamos en este experimento se muestra en la siguiente figura.

Se puede ver que este módulo de sensor tiene 3 pines, además de los pines de alimentación y tierra, solo se usa un pin de salida para generar datos y transmitir comandos de control. Permítanos presentarle cómo usar este módulo sensor.

2. Acerca del módulo sensor DHT11

Dado que el elemento sensor DHT11 tiene solo un pin de comunicación, tanto su entrada como su salida deben usar el mismo pin. Es decir, este pin es un pin bidireccional de un solo cable en serie. El llamado bidireccional de una sola línea significa que tiene una sola línea de transmisión de señal, pero puede comunicarse en ambas direcciones. Es un poco como los walkie-talkies que usamos, donde un lado solo puede escuchar cuando un lado habla. La dirección completa del manual de usuario de DHT11 es la siguiente:

https://www.dfrobot.com.cn/image/data/DFR0067/DFR0067_DS_10.pdf

En primer lugar, veamos el formato de los datos de información transmitidos por DHT11. Según el documento, una comunicación completa de DHT11 transmitirá 40 bits de datos, que incluyen temperatura, humedad y datos para la verificación de corrección. Por lo tanto, cuando leemos los datos de DHT11, necesitamos leer 40 bits de datos por completo antes de calcular. El formato específico de los datos de 40 bits es:

[datos de parte entera de humedad de 8 bits]+[datos de parte fraccionaria de humedad de 8 bits]+[datos de parte entera de temperatura de 8 bits]+[datos de parte fraccionaria de temperatura de 8 bits]+datos de verificación de 8 bits

La suma de [datos de parte entera de humedad de 8 bits] y [datos de parte fraccionaria de humedad de 8 bits] y [datos de parte entera de temperatura de 8 bits] y [datos de parte fraccionaria de temperatura de 8 bits] deben ser datos de verificación de 8 bits, si el resultado no es etc. indica que el los datos obtenidos esta vez son anormales y deben descartarse y obtenerse nuevamente.

El formato de los datos obtenidos del propio sensor es relativamente simple, y el punto más complicado radica en su proceso de comunicación. En general, el proceso de comunicación entre Raspberry Pi y el sensor DHT11 se divide en tres etapas:

1. El Raspberry Pi envía una señal de inicio y luego comienza a esperar la respuesta del módulo del sensor.

2. Después de que el módulo del sensor recibe la señal de inicio de Raspberry Pi, devuelve una señal de respuesta.

3. Después de que Raspberry Pi recibe la señal de respuesta, comienza a recibir datos de 40 bits.

Se proporciona un diagrama esquemático en el manual general del proceso de comunicación, de la siguiente manera:

Después del encendido, el bus del módulo sensor siempre estará en estado inactivo o estado de comunicación. Define el nivel alto de entrada de bus cuando está inactivo. Para la primera etapa del proceso de comunicación anterior, la Raspberry Pi primero baja el nivel del bus y debe transcurrir más de 18 milisegundos para que el módulo del sensor detecte esta señal baja. Después de eso, la Raspberry Pi eleva el bus nuevamente, lo que indica que la Raspberry Pi ha enviado una señal de inicio de comunicación y la primera etapa ha terminado.

Después de que el módulo del sensor detecta la señal de inicio iniciada por la Raspberry Pi, la Raspberry Pi eleva el nivel del bus en este momento. El módulo del sensor envía una señal de bajo nivel durante 80 microsegundos a través del bus, lo que indica que responde a la señal de inicio de la Raspberry Pi. Después de eso, el módulo del sensor sube el nivel del bus durante otros 80 microsegundos, lo que indica que la Raspberry Pi está listo para comenzar a recibir datos y finaliza la fase 2. .

Un diagrama esquemático más detallado de la Fase 1 y la Fase 2 es el siguiente:

La etapa 3 es la etapa en la que el módulo del sensor envía datos y la Raspberry Pi recibe los datos. Cada bit de datos se envía en dos estados: 0 y 1. Cada vez que el sensor envía una señal de nivel bajo de 50 microsegundos, significa que se transmitirán datos de 1 bit. Después de eso, si el sensor envía un nivel alto de 26 microsegundos a 28 microsegundos, significa que se envía el bit 0 de datos, y si se envía un nivel alto de 70 microsegundos, significa que se envía el bit 1 de datos. Después de eso, se envía el siguiente bit de datos. En la operación de programación real, es posible que no podamos medir con precisión el tiempo de alto nivel, pero dado que el tiempo de alto nivel del bit de datos 0 y el bit de datos 1 es muy diferente, podemos obtener una transmisión aproximadamente probando el conteo del bucle. variable El número aproximado de ciclos cuando los datos son 0 y el número aproximado de ciclos cuando se transmiten los datos 1. El número de ciclos se utiliza para determinar si los datos son 0 o 1.

El diagrama de señal del bit de datos 0 es el siguiente:

El diagrama de señal del bit de datos 1 es el siguiente:

Cabe señalar que el intervalo de tiempo entre cada medición es preferiblemente superior a 1 segundo, y después del encendido, espere 1 segundo para estabilizarse antes de medir.

Si no ha estado expuesto a la programación de temporización de bus único de componente, la descripción de texto anterior sigue siendo algo abstracta en general, y la practicaremos a través del código a continuación.

3. Codificación de conexión

El módulo del sensor DHT11 tiene solo 3 pines, podemos elegir cualquier pin GPIO de la Raspberry Pi para conectar el pin de salida en el medio, aquí elegimos el pin GPIO cuyo código físico es 11. De acuerdo con el método de uso del módulo DHT11 que presentamos anteriormente, escriba el código de la siguiente manera:

#coding:utf-8
import RPi.GPIO as GPIO
import time
import math

# 使用物理编码为11的引脚做总线
P = 11

GPIO.setmode(GPIO.BOARD)

print("开始进行DHT11测量数据获取\n")
# 等待1s后再进行逻辑
time.sleep(1)


def readData():
	print("readData")
	# 先将总线引脚设置为输出模式
	GPIO.setup(P, GPIO.OUT)
	# 将总线电平拉低,发出开始信号
	GPIO.output(P, GPIO.LOW)
	# 手册要求至少保持18ms的低电平,我们这里保持20ms
	time.sleep(0.02)
	# 拉高电平
	GPIO.output(P, GPIO.HIGH)
	# 之后将引脚设为输入模式,等待传感器响应
	GPIO.setup(P, GPIO.IN)

	# 先等待80us的低电平信号
	while GPIO.input(P) == GPIO.LOW:
        continue
	# 再等待80us的高电平信号 
	while GPIO.input(P) == GPIO.HIGH:
		continue

	# 开始接收数据

	# 循环计数
	i = 0
 	# 存放二进制位数据
	data = []
	# 存放中间数据
	kdata = []
	# 每次读取40位数据
	while i < 40:
		j = 0
		# 50us的低电平表示准备传输一位数据
		while GPIO.input(P) == GPIO.LOW:
			continue
		# 开始检测高电平的时间
		while GPIO.input(P) == GPIO.HIGH:
			j+=1
			if j > 100:
                    return [False, 0, 0]
		kdata.append(j)
		i+=1

	
	print("--------临时数据----------\n")
	print(kdata)
	print("--------临时数据----------\n")
	
	# 开始整理数据
	i = 0
	while i < 40:
		tmp = kdata[i]
		if tmp > 7:
			data.append(1)
		else:
			data.append(0)
		i+=1
	print("--------临时数据2----------\n")
	print(data)
	print("--------临时数据2----------\n")
	# 解析湿度整数部分
	t1 = data[0:8]
	c1 = 0
	i = 7
	for n in t1:
		c1 += n * math.pow(2, i)
		i-=1

	# 解析湿度整数部分
	t2 = data[8:16]
	c2 = 0
	i = 7
	for n in t2:
		c2 += n * math.pow(2, i)
		i-=1

	# 解析温度整数部分
	t3 = data[16:24]
	c3 = 0
	i = 7
	for n in t3:
		c3 += n * math.pow(2, i)
		i-=1

	# 解析温度整数部分
	t4 = data[24:32]
	c4 = 0
	i = 7
	for n in t4:
		c4 += n * math.pow(2, i)
		i-=1

	# 解析校验
	t5 = data[32:40]
	c5 = 0
	i = 7
	for n in t5:
		c5 += n * math.pow(2, i)
		i-=1
	
	# 进行校验
	va = True
	print("c1:%d\n2c:%d\n3c:%d\n4c:%d\n5:%d\n"%(c1,c2,c3,c4,c5))
	if c1 + c2 + c3 +c4 == c5:
		va = True
	else:
		va = False

	return [va, "%d.%d"%(c1, c2), "%d.%d"%(c3, c4)]


while True:
	time.sleep(1)
	result = readData()
	if result[0]:
		hum = result[1]
		temp = result[2]
		print("当前环境湿度: %s %%, 当前环境温度:%s℃\n" % (hum, temp))
	else:
		print("此次数据无效,已被丢弃\n")
	time.sleep(1)

Hay comentarios más detallados en el código anterior, y todavía podemos explicar algunos lugares. En primer lugar, el proceso de emitir el comando de inicio desde Raspberry Pi es relativamente simple y no requiere mucha explicación. El problema es repetir 40 veces para obtener 40 bits de datos binarios. Al adquirir datos, usamos una variable de bucle para registrar la proporción de tiempo de alto nivel, de modo que podamos analizar si los datos transmitidos son 0 o 1. Cabe señalar que es posible que diferentes dispositivos no realicen ciclos al mismo tiempo. Primero podemos probar los datos almacenados en la variable kdata en el código anterior. El código de ejecución es el siguiente:

Se puede ver que si los datos de transmisión son 0, el conteo de bucles es básicamente 3 o 4. Y si se transmiten los datos 1, el recuento de bucles es de alrededor de 11. En el código, lo dividimos por 7. Durante el análisis, cuando el recuento de bucles es mayor que 7, se considera que los datos de transmisión actuales son 1, de lo contrario, son 0.

Después de obtener los datos binarios completos de 40 bits, conviértalos en un valor numérico para su verificación. El efecto final de ejecución del código se muestra en la siguiente figura.

Concéntrese en la tecnología, comprenda el amor, esté dispuesto a compartir, sea un amigo

Pregunta rápida: 316045346

{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/2340880/blog/5379214
Recomendado
Clasificación