Raspberry Pi 4: Leer datos de un sensor DHT11 de temperatura y humedad mediante Python y GPIO
Introducción
El DHT11 es un sensor de temperatura y humedad con salida digital calibrada. Su precisión es de ±5% RH para humedad y ±2 °C para temperatura, con un rango de medición de 20-90% RH para humedad y 0-50 °C para temperatura. Aunque su precisión no es alta, es muy económico. El DHT11 utiliza comunicación de un solo hilo (bus unidireccional) y opera con un voltaje de alimentación de 3.3 a 5 V.
Lectura de datos de temperatura y humedad de DHT11, DHT22 y SHTC3 con Arduino: https://blog.zeruns.com/archives/527.html
Método para implementar retardos en microsegundos con Python: https://blog.zeruns.com/archives/623.html
Descarga del datasheet del DHT11: https://url.zeruns.com/DHT11 Código de extracción: qefk
Código fuente
Conexión de cables:
Utilizo una Raspberry Pi 4; para otras versiones, consulte y ajuste según corresponda.
Descripción de los pines GPIO de la Raspberry Pi 4: https://url.zeruns.com/RPI4_GPIO
DHT11 Raspberry Pi
VCC---------5V (pin 2)
DATA-------BCM18 (pin BCM 18, equivalente al pin físico 12)
GND--------Ground (pin 6)
Código fuente:
import RPi.GPIO as GPIO
import time
def delayMicrosecond(t): # Función de retardo en microsegundos
start, end = 0, 0 # Declarar variables
start = time.time() # Registrar tiempo de inicio
t = (t - 3) / 1000000 # Convertir t a segundos, -3 es compensación de tiempo
while end - start < t: # Ciclar hasta que la diferencia de tiempo sea mayor o igual al valor establecido
end = time.time() # Registrar tiempo de finalización
tmp = [] # Almacenar los datos leídos
data = 18 # Pin GPIO de la Raspberry Pi al que está conectado el pin DATA del DHT11 (modo BCM)
# https://blog.zeruns.com
a, b = 0, 0
def DHT11():
GPIO.setup(data, GPIO.OUT) # Configurar el pin GPIO como salida
GPIO.output(data, GPIO.HIGH) # Establecer salida en nivel alto
delayMicrosecond(10 * 1000) # Retraso de 10 milisegundos
GPIO.output(data, GPIO.LOW) # Establecer salida en nivel bajo
delayMicrosecond(25 * 1000) # Retraso de 25 milisegundos
GPIO.output(data, GPIO.HIGH) # Establecer salida en nivel alto
GPIO.setup(data, GPIO.IN) # Configurar el pin GPIO como entrada
# https://blog.zeruns.com
a = time.time() # Registrar tiempo de inicio del ciclo
while GPIO.input(data): # Ciclar hasta que la entrada sea baja
b = time.time() # Registrar tiempo de finalización
if (b - a) > 0.1: # Verificar si el ciclo excede 0.1 segundos para evitar bloqueo
break # Salir del ciclo
a = time.time()
while GPIO.input(data) == 0: # Ciclar hasta que la entrada sea alta
b = time.time()
if (b - a) > 0.1:
break
a = time.time()
while GPIO.input(data): # Ciclar hasta que la entrada sea baja
b = time.time()
if (b - a) >= 0.1:
break
for i in range(40): # Repetir 40 veces para recibir datos de temperatura y humedad
a = time.time()
while GPIO.input(data) == 0: # Ciclar hasta que la entrada sea alta
b = time.time()
if (b - a) > 0.1:
break
# https://blog.zeruns.com
delayMicrosecond(28) # Retraso de 28 microsegundos
if GPIO.input(data): # Después de 28 µs, verificar si sigue en nivel alto
tmp.append(1) # Registrar bit recibido como 1
a = time.time()
while GPIO.input(data): # Ciclar hasta que la entrada sea baja
b = time.time()
if (b - a) > 0.1:
break
else:
tmp.append(0) # Registrar bit recibido como 0
while True:
GPIO.setmode(GPIO.BCM) # Configurar modo BCM
GPIO.setwarnings(False)
del tmp[0:] # Limpiar lista
time.sleep(1) # Retraso de 1 segundo
# https://blog.zeruns.com
DHT11()
humidity_bit = tmp[0:8] # Separar datos: bits 0-7 son la parte entera de la humedad
humidity_point_bit = tmp[8:16]# Parte decimal de la humedad
temperature_bit = tmp[16:24] # Parte entera de la temperatura
temperature_point_bit = tmp[24:32] # Parte decimal de la temperatura
check_bit = tmp[32:40] # Datos de verificación
humidity_int = 0
humidity_point = 0
temperature_int = 0
temperature_point = 0
check = 0
# https://blog.zeruns.com
for i in range(8): # Convertir binario a decimal
humidity_int += humidity_bit[i] * 2 ** (7 - i)
humidity_point += humidity_point_bit[i] * 2 ** (7 - i)
temperature_int += temperature_bit[i] * 2 ** (7 - i)
temperature_point += temperature_point_bit[i] * 2 ** (7 - i)
check += check_bit[i] * 2 ** (7 - i)
humidity = humidity_int + humidity_point / 10
temperature = temperature_int + temperature_point / 10
check_tmp = humidity_int + humidity_point + temperature_int + temperature_point
if check == check_tmp and temperature != 0 and humidity != 0: # Verificar si los datos son válidos
print("Temperatura es ", temperature, "°C\nHumedad es ", humidity, "%") # Imprimir datos de temperatura y humedad
print("https://blog.zeruns.com")
else:
print("error")
time.sleep(1)
GPIO.cleanup()
Resultado
Lecturas recomendadas
- VPS/ servidor en la nube de alto rendimiento y bajo costo recomendado: https://blog.zeruns.com/archives/383.html
- Artículos sobre Python: https://blog.zeruns.com/category/Python/
- Lectura de datos de temperatura y humedad de DHT11, DHT22, SHTC3 con Arduino: https://blog.zeruns.com/archives/527.html
- Beneficios exclusivos para estudiantes: descuentos educativos: https://blog.zeruns.com/archives/557.html
- Cómo crear un blog personal: https://blog.zeruns.com/archives/218.html
- Configuración del entorno de desarrollo ESP8266 y demostraciones de proyectos: https://blog.zeruns.com/archives/526.html


