Los sensores digitales como DHT o DS18B20 son dispositivos que entregan la medida ya convertida en datos digitales.
Cuando necesitamos medir el mundo físico con cierta fiabilidad, los sensores analógicos se quedan cortos. El ruido eléctrico, la longitud de los cables y la resolución del ADC pueden falsear los datos.
La solución son los sensores digitales. Estos pequeños dispositivos integran su propio conversor y nos envían el dato ya “cocinado” mediante una secuencia de unos y ceros.
Hoy vamos a ver los dos más populares: la familia DHT (para aire) y el robusto DS18B20 (para todo lo demás).
Familia DHT: temperatura y humedad
El DHT11 (azul) y el DHT22 (blanco, también llamado AM2302) son sensores muy comunes que miden tanto temperatura como humedad relativa.
- DHT11: Es el hermano barato. Rango corto (0-50°C), menor precisión y solo devuelve enteros.
- DHT22: El hermano listo. Mayor rango (-40 a 80°C), mejor precisión y devuelve decimales.
Protocolo y conexión
Aunque tienen 3 o 4 pines, la comunicación se hace por un solo cable de datos. Ojo, NO es OneWire estándar, es un protocolo propietario muy sensible a los tiempos.
La conexión es simple:
- VCC: 3.3V o 5V.
- GND: Tierra.
- DATA: A un pin GPIO cualquiera.
La resistencia Pull-Up es obligatoria Para que la señal sea limpia, necesitamos una resistencia de 4.7kΩ o 10kΩ entre VCC y DATA. Si usas el sensor suelto (el cuadradito de plástico), tienes que ponerla. Si usas un módulo montado en PCB, suele traerla soldada.
Código en MicroPython
MicroPython incluye el driver oficial dht en el firmware, así que es muy fácil de usar.
import dht
from machine import Pin
import time
# Inicializamos el sensor.
# Cambia dht.DHT11 por dht.DHT22 según tu modelo
# Usamos el GPIO 15 para los datos
sensor = dht.DHT22(Pin(15))
while True:
try:
# 1. Medimos (Esto puede tardar hasta 2 segundos)
sensor.measure()
# 2. Leemos los valores calculados
temp = sensor.temperature()
hum = sensor.humidity()
print(f"Temperatura: {temp}°C | Humedad: {hum}%")
except OSError as e:
print("Error al leer el sensor. Reintentando...")
# IMPORTANTE: Los DHT son lentos.
# El DHT11 necesita mínimo 1s entre lecturas.
# El DHT22 necesita mínimo 2s.
time.sleep(2)
Si intentas leer el sensor demasiado rápido (sin el time.sleep), obtendrás un error ETIMEDOUT o lecturas fallidas. ¡Dale tiempo para respirar!
DS18B20 y el protocolo OneWire
Si el DHT es para el aire, el DS18B20 es el todoterreno. Es un sensor de temperatura de alta precisión que a menudo viene encapsulado en una sonda metálica impermeable, ideal para líquidos, neveras o exteriores.
Lo que hace especial al DS18B20 es que utiliza el protocolo Dallas OneWire.
¿Qué es OneWire?
Es un bus de comunicación que permite conectar múltiples sensores al mismo cable de datos.
Cada sensor DS18B20 tiene grabado a fuego en su silicio un código único de 64 bits (su dirección ROM). Gracias a esto, podemos tener 10 sensores conectados al mismo pin GPIO y leerlos individualmente preguntando por su nombre.
Conexión eléctrica
Igual que el DHT, necesita una resistencia Pull-Up de 4.7kΩ entre VCC y DATA. Sin ella, el bus no funcionará y no detectará ningún sensor.
Escaneo y lectura
El proceso tiene dos partes: primero buscamos quién está en el bus (Escaneo) y luego leemos. MicroPython separa esto en dos librerías: onewire (para el bus) y ds18x20 (para el sensor específico).
import machine, onewire, ds18x20, time
# 1. Configuración del Bus OneWire en el GPIO 4
dat = machine.Pin(4)
ds = ds18x20.DS18X20(onewire.OneWire(dat))
# 2. Escaneo del bus: Buscamos sensores conectados
print("Escaneando bus OneWire...")
roms = ds.scan()
if not roms:
print("¡No se encontraron sensores! ¿Pusiste la resistencia de 4.7k?")
else:
print(f"Encontrados {len(roms)} sensores.")
# Bucle principal de lectura
while True:
# A. Iniciar conversión: Gritamos "¡Todos a medir!"
ds.convert_temp()
# B. Esperamos: La conversión tarda unos 750ms máx.
time.sleep_ms(750)
# C. Leemos los resultados uno por uno
for rom in roms:
temperatura = ds.read_temp(rom)
# Formateamos la dirección ROM para que sea legible
rom_id = ''.join(f'{b:02x}' for b in rom)
print(f"Sensor {rom_id}: {temperatura:.2f}°C")
print("-" * 20)
time.sleep(2)
¿Por qué convert_temp y luego esperar?
El DS18B20 es un dispositivo pasivo. Necesita tiempo para capturar la temperatura y convertirla a digital. Si intentas leer (read_temp) inmediatamente después de pedir la conversión, leerás el valor antiguo (normalmente 85.0°C, que es el valor de reset).
DHT o DS18B20
| Característica | DHT11 | DHT22 | DS18B20 |
|---|---|---|---|
| Mide | Temp + Humedad | Temp + Humedad | Solo Temperatura |
| Rango Temp | 0 a 50°C | -40 a 80°C | -55 a 125°C |
| Precisión | Baja (±2°C) | Buena (±0.5°C) | Excelente (±0.5°C) |
| Protocolo | Propietario (1 hilo) | Propietario (1 hilo) | OneWire (Bus real) |
| Varios en 1 pin | No | No | Sí (Múltiples) |
| Velocidad | 1 Hz | 0.5 Hz | ~750ms conversión |
- Usa DHT22 si necesitas saber la humedad ambiental (estaciones meteorológicas, invernaderos). Evita el DHT11 salvo para prototipos escolares.
- Usa DS18B20 para todo lo demás: control de temperatura de líquidos, acuarios, suelo radiante o maquinaria. Su robustez y la capacidad de poner varios en un solo cable lo hacen imbatible.
Con esto ya tenemos ojos y piel digital para nuestro sistema. ¡Ya podemos sentir el entorno!