Raspberry Pi lee datos de temperatura y humedad DHT11 con Python

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

2 Me gusta