01 · Punto de partida
Del analógico al dato
En los temas 9 a 11 recorrimos sensores de temperatura cuya señal era una resistencia o una tensión: había que preparar la señal, elegir el ADC y su referencia y aplicar una ecuación. El TMP117 del tema 10 ya adelantó la alternativa: un chip que integra el sensor, el conversor y el bus, y entrega el valor listo. En este tema vemos tres sensores digitales de uso masivo que cubren necesidades distintas:
- El DS18B20, un termómetro con bus de un solo cable (1-Wire) y código de identificación único, ideal para redes de sensores.
- El DHT22 (y su hermano básico DHT11), un módulo económico de temperatura y humedad con protocolo propio.
- El SHT31, un sensor de humedad y temperatura de mayor calidad con interfaz I2C y verificación de datos.
La humedad es una magnitud nueva en el curso, con una trampa conceptual: la humedad relativa depende de la temperatura. Entenderla evita errores que ningún sensor, por bueno que sea, puede corregir.
02 · Una magnitud engañosa
Qué es la humedad relativa
El aire puede contener una cantidad máxima de vapor de agua que depende de su temperatura: cuanto más caliente, más vapor admite. La humedad relativa (RH, relative humidity) es la relación, en porcentaje, entre la presión parcial de vapor que hay y la máxima posible (la de saturación) a esa temperatura:
La consecuencia es que una misma cantidad de agua en el aire produce humedades relativas distintas según la temperatura. Una habitación a 20 °C con 50 % RH, calentada a 30 °C sin agregar ni quitar agua, queda con alrededor de 27 % RH. La humedad relativa describe qué tan cerca está el aire de saturarse, no cuánta agua contiene.
Una magnitud que no depende de la temperatura es el punto de rocío: la temperatura a la que el aire alcanzaría la saturación (100 % RH) y comenzaría a condensar vapor sobre una superficie. Se calcula a partir de la temperatura y la humedad relativa con la fórmula de Magnus:
Es válida aproximadamente entre −45 y 60 °C. Con ella se predice, por ejemplo, el riesgo de condensación:
| Temperatura | Humedad relativa | Punto de rocío | Qué significa |
|---|---|---|---|
| 20 °C | 50 % | 9,3 °C | Un vaso a 9 °C empieza a empañarse |
| 25 °C | 60 % | 16,7 °C | Una tubería de agua fría a 15 °C condensa |
| 30 °C | 80 % | 26,2 °C | Ambiente bochornoso; casi todo condensa |
Por eso los sistemas de control (deshumidificadores, ventilación de baños, protección de equipos electrónicos contra la condensación) trabajan con el punto de rocío o comparan la temperatura de una superficie con él. La humedad relativa es útil para el confort y para saber qué tan cerca se está de la saturación, pero engaña si la temperatura cambia.
03 · Muchos termómetros, un cable
DS18B20 y el bus 1-Wire
El DS18B20 es un termómetro digital en encapsulado TO-92 (idéntico a un transistor) o en sonda impermeable. Sus datos principales:
- Rango: −55 a 125 °C. Exactitud: ±0,5 °C entre −10 y 85 °C.
- Resolución programable: 9, 10, 11 o 12 bits (0,5; 0,25; 0,125 y 0,0625 °C).
- Alimentación: de 3,0 a 5,5 V, o «parásita» (el sensor se alimenta desde la línea de datos).
- Código único de 64 bits grabado de fábrica: 8 bits de familia (0x28), 48 bits de número de serie y 8 bits de CRC.
- Un solo cable de datos más masa (y alimentación), con una resistencia de pull-up de 4,7 kΩ a Vcc.
El bus 1-Wire es de colector abierto (tema 7) y de tipo maestro–esclavos. Como todos los sensores comparten la misma línea, el maestro los distingue por su código de 64 bits. Una conversación típica tiene tres pasos:
- Un pulso de reset del maestro, al que los sensores presentes responden con un pulso de presencia.
- Un comando de ROM:
0xCC(Skip ROM, se dirige a todos o al único sensor),0x55(Match ROM, seguido de los 64 bits del sensor elegido) o0xF0(Search ROM, para descubrir los códigos de los sensores presentes). - Un comando de función:
0x44(iniciar la conversión) o0xBE(leer el scratchpad).
La conversión no es instantánea. El sensor mide durante un tiempo que depende de la resolución elegida:
| Resolución | Paso | Tiempo máximo de conversión |
|---|---|---|
| 9 bits | 0,5 °C | 93,75 ms |
| 10 bits | 0,25 °C | 187,5 ms |
| 11 bits | 0,125 °C | 375 ms |
| 12 bits | 0,0625 °C | 750 ms |
Una ventaja del bus: se puede enviar Skip ROM + Convert a todos los sensores a la vez, de modo que convierten en paralelo, y leer después uno por uno. Con cuatro sensores a 12 bits, el tiempo total es de unos 750 ms, no 3 segundos.
El scratchpad
El resultado se lee del scratchpad, una memoria de 9 bytes:
| Byte | Contenido |
|---|---|
| 0 y 1 | Temperatura: entero de 16 bits con signo, en unidades de 1/16 °C (primero el byte bajo) |
| 2 y 3 | Umbrales de alarma TH y TL |
| 4 | Configuración: bits de resolución |
| 5 a 7 | Reservados |
| 8 | CRC de los 8 bytes anteriores |
La temperatura es el entero de los bytes 0 y 1 dividido por 16: 0x0191 = 401 → 25,0625 °C; 0xFF5E = −162 → −10,125 °C. A resoluciones menores de 12 bits, los bits bajos no están definidos y hay que enmascararlos.
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire bus(2); // pin 2 con pull-up de 4,7 kΩ
DallasTemperature sensores(&bus);
uint32_t tInicio;
bool convirtiendo = false;
void setup() {
sensores.begin();
sensores.setResolution(12);
sensores.setWaitForConversion(false); // no bloquear mientras el sensor convierte
}
void loop() {
if (!convirtiendo) {
sensores.requestTemperatures(); // Skip ROM + Convert para todos
tInicio = millis();
convirtiendo = true;
} else if (millis() - tInicio >= 750) {
float t = sensores.getTempCByIndex(0);
convirtiendo = false;
if (t == DEVICE_DISCONNECTED_C) {
// sin sensor: tratar como falla
} else {
// usar t
}
}
// ... el resto del programa sigue corriendo
}
El código ilustra el patrón de este curso: no esperar con delay los 750 ms, sino iniciar la conversión, seguir trabajando y recoger el resultado cuando pasó el tiempo. Con el cable largo, el 1-Wire llega a varias decenas de metros con cuidado (cable trenzado, pull-up algo menor, topología en línea), pero la señal es sensible a la capacidad del cable y a la cantidad de sensores.
04 · Barato y popular
DHT11 y DHT22
El DHT22 (también llamado AM2302) integra un sensor capacitivo de humedad, un termistor y un pequeño microcontrolador que entrega ambos datos por un solo pin. El DHT11 es la versión de menor costo y menor calidad.
| Característica | DHT11 | DHT22 |
|---|---|---|
| Rango de temperatura | 0 a 50 °C | −40 a 80 °C |
| Exactitud de temperatura | ±2 °C | ±0,5 °C |
| Rango de humedad | 20 a 80 %RH | 0 a 100 %RH |
| Exactitud de humedad | ±5 %RH | ±2 %RH (hasta ±5 %RH en los extremos) |
| Resolución | 1 °C y 1 %RH | 0,1 °C y 0,1 %RH |
| Intervalo mínimo entre lecturas | 1 s | 2 s |
Su protocolo no es 1-Wire (aunque use un solo pin): es un protocolo propio con temporización estricta. El microcontrolador baja la línea al menos 1 ms para pedir una medición, la libera, y el sensor responde con un pulso de presencia (80 µs en bajo y 80 µs en alto) y luego con 40 bits. Cada bit empieza con 50 µs en bajo; el tiempo siguiente en alto distingue el valor: unos 26–28 µs es un 0 y unos 70 µs es un 1. Los 40 bits son la humedad (16 bits, décimas de %), la temperatura (16 bits, décimas de °C, con el bit de signo) y un checksum de 8 bits (la suma de los cuatro bytes anteriores, módulo 256), como decodificamos en el tema 3.
Las consecuencias para el programador son importantes:
- La lectura es bloqueante: hay que medir tiempos de decenas de microsegundos durante unos 4 ms. Las interrupciones pueden corromper la lectura, y en microcontroladores lentos o sistemas con interrupciones frecuentes la biblioteca puede fallar.
- El intervalo mínimo entre lecturas es de 2 s en el DHT22. Pedir datos más seguido produce errores o valores viejos. La medición debe planificarse con
millis(), nunca en cada vuelta del bucle. - El checksum detecta errores de transmisión, no de medición, y es débil (una suma). Los datos se validan además por rango físico.
- Un solo sensor por pin (no hay direcciones), con pull-up de 4,7 a 10 kΩ y cables cortos (hasta unos 20 m con cuidado).
- Calidad modesta: la humedad deriva con el tiempo y se degrada con la condensación y el envejecimiento.
Sirve muy bien para una estación meteorológica casera o un proyecto didáctico; para mediciones que exigen fiabilidad a largo plazo, conviene un sensor de mayor gama, como el SHT31.
05 · Un sensor de otra liga
SHT31 por I2C
El SHT31 de Sensirion mide humedad y temperatura con un elemento capacitivo calibrado de fábrica y se comunica por I2C. Sus datos principales:
- Humedad: ±2 %RH típicos en el rango medio; temperatura: ±0,3 °C típicos a 25 °C.
- Resolución: 0,01 %RH y 0,01 °C (conversor de 16 bits).
- Alimentación: de 2,15 a 5,5 V.
- Dirección I2C: 0x44 o 0x45, según un pin de selección.
- Calentador integrado para eliminar condensación y recuperar el sensor tras una exposición a humedad extrema.
- Datos verificados con CRC-8 en cada palabra de 16 bits.
Una medición «de un solo disparo» sigue una secuencia sencilla: se envía un comando de 2 bytes (por ejemplo 0x2400, alta repetibilidad, sin estirar el reloj), se espera el tiempo de conversión (hasta 15 ms) y se leen 6 bytes: la temperatura (2 bytes + CRC) y la humedad (2 bytes + CRC). Las fórmulas del fabricante son:
#include <Wire.h>
const uint8_t SHT31 = 0x44;
uint8_t crc8(const uint8_t *datos, uint8_t n) { // polinomio 0x31, inicial 0xFF
uint8_t crc = 0xFF;
for (uint8_t i = 0; i < n; i++) {
crc ^= datos[i];
for (uint8_t b = 0; b < 8; b++) crc = (crc & 0x80) ? (crc << 1) ^ 0x31 : (crc << 1);
}
return crc;
}
bool leerSHT31(float &temperatura, float &humedad) {
Wire.beginTransmission(SHT31);
Wire.write(0x24); Wire.write(0x00); // una medición, alta repetibilidad
if (Wire.endTransmission() != 0) return false;
delay(16); // máximo 15 ms (se evita con una máquina de estados, tema 41)
if (Wire.requestFrom(SHT31, (uint8_t)6) != 6) return false;
uint8_t b[6];
for (uint8_t i = 0; i < 6; i++) b[i] = Wire.read();
if (crc8(b, 2) != b[2] || crc8(b + 3, 2) != b[5]) return false; // datos corruptos
temperatura = -45.0 + 175.0 * ((b[0] << 8) | b[1]) / 65535.0;
humedad = 100.0 * ((b[3] << 8) | b[4]) / 65535.0;
return true;
}
Observá la estructura: la función devuelve false ante cualquier fallo (el sensor no responde, no llegaron los 6 bytes, el CRC no coincide) y solo entrega datos cuando son confiables. Su diferencia con el DHT22 es de fondo: dirección, tiempos y verificación están especificados y se pueden compartir el bus con otros sensores I2C.
06 · Elegir
Comparación y elección
| Característica | DS18B20 | DHT22 | SHT31 |
|---|---|---|---|
| Magnitudes | Temperatura | Temperatura y humedad | Temperatura y humedad |
| Interfaz | 1-Wire (bus compartible) | Un cable, protocolo propio (un sensor por pin) | I2C (bus compartible) |
| Exactitud de temperatura | ±0,5 °C | ±0,5 °C | ±0,3 °C |
| Exactitud de humedad | — | ±2 a ±5 %RH | ±2 %RH |
| Verificación de datos | CRC-8 en cada trama | Checksum de suma (débil) | CRC-8 en cada palabra |
| Tiempo entre lecturas | Hasta 750 ms (12 bits) | Mínimo 2 s | Hasta 15 ms |
| Sensores por línea | Decenas (por código único) | Uno | Dos (por dirección) |
| Cable largo | Bueno (decenas de metros con cuidado) | Aceptable | Corto (I2C) |
| Costo | Bajo | Bajo | Medio |
Reglas de decisión: DS18B20 para varias temperaturas a lo largo de un cable (tuberías, invernaderos, equipos industriales ligeros); DHT22 para proyectos económicos y didácticos donde ±2 a ±5 %RH alcanza; SHT31 para humedad con calidad, estabilidad y datos verificados. Si necesitás los dos extremos, un DS18B20 para la temperatura de proceso y un SHT31 para el ambiente.
07 · No creer en el cable
Verificar con CRC
Un CRC (cyclic redundancy check) es un número calculado a partir de los datos y enviado junto con ellos. El receptor repite el cálculo y compara: si no coincide, hubo un error de transmisión. Se obtiene como el resto de una división polinómica y detecta todos los errores de un bit, la mayoría de las ráfagas y muchos errores múltiples. Es mucho más fuerte que una suma (que no detecta, por ejemplo, dos errores que se compensan).
Los dos sensores con CRC de este tema usan variantes de 8 bits:
- DS18B20 (Dallas/Maxim): polinomio x⁸ + x⁵ + x⁴ + 1, valor inicial 0, calculado sobre los 8 primeros bytes del scratchpad y también sobre los 7 primeros del código ROM.
- SHT31 (Sensirion): polinomio x⁸ + x⁵ + x⁴ + 1 (0x31), valor inicial 0xFF, calculado sobre cada palabra de 2 bytes.
Por ejemplo, el scratchpad 50 05 4B 46 7F FF 0C 10 del DS18B20 tiene CRC 0x1C; y la palabra BE EF del SHT31 tiene CRC 0x92. Si alguno de los bytes cambia, el CRC calculado deja de coincidir.
Un CRC correcto asegura que el dato llegó íntegro, no que sea cierto. Un sensor desconectado puede devolver un valor «plausible» con CRC correcto (como el 85,0 °C inicial). Por eso se combinan tres defensas: el CRC (transmisión), la validación de rango físico (por ejemplo, descartar humedades fuera de 0 a 100 %) y el contexto (cambios imposibles de un instante a otro, tema 5).
08 · La parte difícil
Medir humedad en la práctica
La humedad es la magnitud más difícil de medir bien de este curso. Los sensores capacitivos son sensibles a las condiciones de uso, y varios problemas son independientes del chip:
- La temperatura del sensor es la que cuenta. Si el sensor está más caliente que el aire (por la placa, un regulador, un microcontrolador), mide una humedad relativa menor que la real, porque a mayor temperatura el aire está más lejos de la saturación. Con el aire a 25 °C y 60 % RH, un sensor 3 °C más caliente mide unos 50 % RH: un error de casi 10 puntos. El sensor debe estar aislado térmicamente de la electrónica.
- El punto de rocío no se altera. Si se calcula con la temperatura y la humedad medidas por el mismo sensor caliente, resulta casi igual al real. Es una buena señal de coherencia de la medición.
- Respuesta lenta. La constante de tiempo de la humedad ronda los 8 s en los mejores sensores y más en los económicos, y depende de la circulación de aire y de si hay filtros.
- Histéresis y deriva. Un sensor expuesto a humedad alta tarda en volver; con el tiempo deriva (típicamente fracciones de %RH por año en sensores de calidad).
- Condensación y contaminación. El agua líquida y los vapores químicos (solventes, ciertos adhesivos o gases de limpieza) dañan o desplazan la calibración. Muchos sensores incluyen un calentador para recuperar el elemento.
- Calibración. Se verifica con soluciones salinas saturadas que fijan la humedad de un recinto cerrado (por ejemplo, el cloruro de sodio produce unos 75 %RH y el cloruro de magnesio unos 33 %RH a 25 °C). Es un procedimiento de laboratorio, pero económico.
09 · Analogía con programación
Decodificar, verificar y calcular el punto de rocío
Probemos en Python las piezas de lógica de este tema: el CRC de cada sensor, la decodificación del scratchpad del DS18B20 (incluidos los negativos y el valor inicial de 85 °C), la trama del SHT31 y el efecto de un sensor demasiado caliente sobre la humedad medida y sobre el punto de rocío.
Python en tu navegador. Los bloques son editables: cambiá los valores y presioná «Ejecutar Python». La primera vez tarda unos segundos en cargar.
import math
def crc8_maxim(datos):
"""DS18B20: polinomio 0x31 reflejado (0x8C), valor inicial 0."""
crc = 0
for byte in datos:
crc ^= byte
for _ in range(8):
crc = (crc >> 1) ^ 0x8C if crc & 1 else crc >> 1
return crc
def crc8_sensirion(datos):
"""SHT31: polinomio 0x31, valor inicial 0xFF."""
crc = 0xFF
for byte in datos:
crc ^= byte
for _ in range(8):
crc = ((crc << 1) ^ 0x31) & 0xFF if crc & 0x80 else (crc << 1) & 0xFF
return crc
def ds18b20(scratchpad):
if crc8_maxim(scratchpad[:8]) != scratchpad[8]:
raise ValueError("CRC incorrecto")
bruto = scratchpad[1] << 8 | scratchpad[0]
if bruto >= 0x8000:
bruto -= 0x10000
return bruto / 16
def sht31(trama):
t_raw, h_raw = trama[0:2], trama[3:5]
if crc8_sensirion(t_raw) != trama[2] or crc8_sensirion(h_raw) != trama[5]:
raise ValueError("CRC incorrecto")
return (-45 + 175 * (t_raw[0] << 8 | t_raw[1]) / 65535,
100 * (h_raw[0] << 8 | h_raw[1]) / 65535)
RESTO = [0x4B, 0x46, 0x7F, 0xFF, 0x0C, 0x10]
for nombre, bajo, alto, crc in (("25,0625 °C", 0x91, 0x01, 0x70), ("-10,125 °C", 0x5E, 0xFF, 0x6A), ("arranque", 0x50, 0x05, 0x1C)):
print(f"DS18B20 ({nombre:10s}): {ds18b20([bajo, alto] + RESTO + [crc]):8.4f} °C")
danado = [0x91, 0x01] + RESTO + [0x70]
danado[0] ^= 0x01 # un bit se daña en el cable
try:
ds18b20(danado)
except ValueError as error:
print("DS18B20 con un bit dañado:", error)
print("SHT31:", sht31([0x66, 0x66, 0x93, 0x80, 0x00, 0xA2]))
A, B = 17.62, 243.12
def p_sat(t):
return 6.112 * math.exp(A * t / (B + t))
def punto_rocio(t, h):
g = math.log(h / 100) + A * t / (B + t)
return B * g / (A - g)
print()
for t, h in ((20, 50), (25, 60), (30, 80)):
print(f"{t} °C y {h} %RH -> punto de rocío {punto_rocio(t, h):.1f} °C")
print()
td = punto_rocio(25, 60)
for exceso in (0, 1, 3): # el sensor está más caliente que el aire
h_med = 100 * p_sat(td) / p_sat(25 + exceso)
print(f"sensor {exceso} °C más caliente: mide {25 + exceso} °C y {h_med:.1f} %RH, punto de rocío {punto_rocio(25 + exceso, h_med):.1f} °C")
Resultado: las tramas válidas dan 25,0625 °C, −10,1250 °C y 85,0000 °C (el valor de arranque, que se lee como válido: el CRC no lo detecta). Con un bit dañado, el CRC lo rechaza. La trama del SHT31 da (25,0 °C, 50,0 %RH) con una pequeña diferencia decimal. Los puntos de rocío son 9,3, 16,7 y 26,2 °C. Con el sensor 1 °C más caliente, la humedad medida baja de 60 a 56,5 %RH y con 3 °C a 50,3 %RH, mientras que el punto de rocío sigue en 16,7 °C.
La lección práctica: el CRC valida la transmisión, no la verdad del dato, y la humedad relativa depende de la temperatura del sensor mientras que el punto de rocío no. El modelo supone sensores sin error propio; en la realidad se suman la exactitud y la deriva del elemento sensible.
10 · Exploración interactiva
Resolución del DS18B20 y humedad con un sensor caliente
El primer instrumento simula un DS18B20: elegí la resolución y mirá el registro de 16 bits, la temperatura resultante, el tiempo de conversión y qué ocurre si se lee antes de tiempo. El segundo muestra cómo cambia la humedad relativa medida cuando el sensor está más caliente que el aire, y cómo el punto de rocío permanece estable.
Instrumento 1: DS18B20
Instrumento 2: humedad relativa y punto de rocío
Recorrido guiado
- Con 25,3 °C y 12 bits: el registro es 0x0195 (405 × 0,0625 = 25,3125 °C) y el error de cuantización es de 0,01 °C. Pasá a 9 bits: 0x0190 y 25,0 °C; el error es de 0,3 °C y la conversión baja de 750 a 93,75 ms.
- Probá −10,1 °C: el registro es un negativo en complemento a dos (0xFF5E con 12 bits). Revisá cómo los bits altos se llenan de unos.
- Marcá «Leer antes de que termine»: el registro muestra 0x0550 y 85,0 °C, el valor de arranque. Un dato válido en forma, pero falso.
- En el instrumento 2, con 25 °C, 60 % y sensor +3 °C: mide 28 °C y unos 50 %RH. El error de humedad es de casi −10 puntos. El punto de rocío calculado, en cambio, coincide con el real (16,7 °C).
- Poné el sobrecalentamiento en 0: la medición es exacta. Subilo de a poco y mirá cómo cae la humedad medida, unos 3 puntos por grado.
- Con la superficie en 15 °C, el LED indica condensación (15 es menor que 16,7). Subí la superficie a 18 °C: deja de condensar. Bajá la humedad real a 40 %: el punto de rocío baja a 10,5 °C.
Desafío: el sensor dentro de una caja
Un SHT31 está dentro de una caja con electrónica que calienta el aire interior 4 °C por encima del ambiente. La humedad medida es 45 %RH y la temperatura 27 °C. ¿Qué humedad relativa hay afuera, a 23 °C? Calculá el punto de rocío con la medición (≈ 14,0 °C) y buscá la humedad relativa a 23 °C que produce el mismo punto: ≈ 57 %RH. El sensor, en la caja, subestima la humedad exterior en unos 12 puntos. Con el instrumento 2 se reproduce el mecanismo. Corregir con el punto de rocío funciona solo si se conoce la diferencia de temperatura, y por eso conviene medir la temperatura exterior con un sensor aislado del calor de la caja.
11 · Método de trabajo
Cómo integrar un sensor digital de temperatura y humedad
- Definí la magnitud y la exactitud. ¿Solo temperatura, o también humedad? ¿±0,5 °C y ±2 %RH, o basta una idea aproximada?
- Elegí el sensor y su bus según el número de puntos de medida, la distancia y las líneas disponibles del microcontrolador.
- Conectá con las resistencias correctas: pull-up de 4,7 kΩ en 1-Wire y en el DHT; pull-ups de I2C si la placa no los trae. Desacople de 100 nF en la alimentación.
- Respetá los tiempos: conversión del DS18B20, intervalo mínimo de 2 s del DHT22, 15 ms del SHT31. Programalos con
millis(), no condelay. - Verificá cada lectura: CRC o checksum, rango físico, y el valor inicial sospechoso (85 °C, −127 °C).
- Pensá en el montaje térmico: sensor aislado del calor de la placa, con circulación de aire, protegido del agua líquida.
- Calculá el punto de rocío si el objetivo es evitar condensación o comparar humedades a distintas temperaturas.
- Definí qué hace el sistema ante una falla: reintentar, usar el último valor válido durante un tiempo máximo, o avisar.
Si un sensor «lee mal» de forma intermitente, primero buscá la falla física (pull-up, cable, alimentación) y luego los tiempos del programa. Un osciloscopio o analizador lógico en la línea de datos muestra enseguida si el protocolo se cumple.
12 · Comprensión
Confusiones frecuentes
«La humedad relativa es la cantidad de agua en el aire»
Es la proporción respecto del máximo que el aire admite a esa temperatura. La misma cantidad de agua da humedades relativas distintas según la temperatura. La cantidad real se expresa mejor con el punto de rocío o la humedad absoluta.
«Si el CRC coincide, el dato es correcto»
Solo asegura que el dato llegó sin alteraciones. Un valor de arranque (85,0 °C del DS18B20), un sensor mal montado o uno que derivó pasan el CRC sin problema.
«El DHT22 usa el protocolo 1-Wire»
Usa un solo pin, pero con un protocolo propio distinto del de Dallas. No admite direcciones, y no se pueden conectar varios DHT22 a un mismo pin como se hace con DS18B20.
«Puedo leer el DS18B20 todas las veces que quiera»
Cada lectura entrega el resultado de la última conversión; si se pide antes de que termine, se obtiene el valor anterior o el de arranque. Hay que iniciar la conversión y esperar el tiempo correspondiente.
«La humedad medida dentro de la caja es la del ambiente»
Si el interior está más caliente, la humedad relativa que ve el sensor es menor. La temperatura del sensor es la que determina su lectura.
«El DHT22 y el SHT31 son equivalentes»
Cubren la misma magnitud, pero difieren en exactitud, verificación de datos, tiempos, estabilidad a largo plazo y recuperación tras condensación. La diferencia se nota en productos que deben durar años.
13 · Práctica guiada
Predecí antes de comprobar
1. Decodificar el DS18B20
Los bytes 0 y 1 del scratchpad son 0x91 y 0x01 en un caso, y 0x5E y 0xFF en otro. ¿Qué temperaturas representan?
Ver solución
Primer caso: 0x0191 = 401 → 401 / 16 = 25,0625 °C. Segundo caso: 0xFF5E = 65 374; como es mayor que 0x8000, resta 65 536 y da −162 → −162 / 16 = −10,125 °C.
2. Cuatro sensores en paralelo
Hay cuatro DS18B20 en un mismo bus, a 12 bits. ¿Cuánto tarda en estar disponible la temperatura de todos si se envía un solo comando de conversión a todos? ¿Y si se configuran a 10 bits?
Ver solución
Con Skip ROM + Convert los cuatro convierten a la vez: 750 ms a 12 bits (no 4 × 750 = 3 s). A 10 bits, 187,5 ms. Después se lee el scratchpad de cada sensor por su código.
3. Riesgo de condensación
El aire está a 25 °C con 60 % RH y una tubería de agua fría está a 15 °C. ¿Condensa? ¿A qué temperatura de la tubería deja de hacerlo?
Ver solución
El punto de rocío es 16,7 °C. La tubería a 15 °C está por debajo: condensa. Deja de condensar cuando la superficie supera 16,7 °C, o si se baja la humedad del aire (con 40 %RH el punto de rocío cae a ≈ 10,5 °C).
4. Trama del SHT31
La temperatura llega como 0x6666 y la humedad como 0x8000. ¿Qué valores representan?
Ver solución
0x6666 = 26 214 → T = −45 + 175 × 26 214 / 65 535 = 25,0 °C. 0x8000 = 32 768 → RH = 100 × 32 768 / 65 535 ≈ 50,0 %. Antes se verifica el CRC de cada palabra (0x93 y 0xA2 en este caso).
5. Un sensor demasiado caliente
El aire está a 25 °C y 60 % RH, pero el sensor está 3 °C más caliente por la placa. ¿Qué temperatura y qué humedad aproximada mide? ¿Y qué punto de rocío calcularía?
Ver solución
Mide 28 °C y alrededor de 50 %RH: la humedad baja unos 10 puntos. El punto de rocío calculado con esos dos valores sigue siendo ≈ 16,7 °C, igual al real. El error de humedad se corrige si se conoce el calentamiento, o mejor aún, si se aísla el sensor.
6. Elegir el sensor
Elegí DS18B20, DHT22 o SHT31 para: (a) ocho puntos de temperatura a lo largo de una tubería de 30 m; (b) un higrómetro de laboratorio con ±2 %RH estable por años; (c) una estación casera económica con temperatura y humedad.
Ver solución
(a) DS18B20: bus compartido por código único y buena tolerancia a cables largos. (b) SHT31: calidad, estabilidad y datos con CRC. (c) DHT22: económico y suficiente (con lecturas cada 2 s o más), aunque el SHT31 es mejor si el presupuesto lo permite.
14 · Síntesis
Ideas para recordar
- La humedad relativa es la proporción de vapor respecto del máximo posible a esa temperatura; la misma agua da distintas RH según la temperatura.
- El punto de rocío no depende de la temperatura del aire y se calcula con la fórmula de Magnus; es la magnitud correcta para predecir condensación.
- El DS18B20 usa 1-Wire con código único de 64 bits, resolución de 9 a 12 bits y un tiempo de conversión de hasta 750 ms; su temperatura es el entero de 16 bits con signo dividido por 16.
- Un DS18B20 leído demasiado pronto entrega 85,0 °C (valor de arranque): un dato válido en forma pero falso.
- Varios DS18B20 convierten en paralelo con un único comando
Skip ROM + Convert. - El DHT22 usa un protocolo propio de 40 bits con temporización de microsegundos, un checksum de suma y un intervalo mínimo de 2 s; su lectura es bloqueante.
- El SHT31 es un sensor I2C de mayor calidad con CRC-8 por palabra: T = −45 + 175·raw/65535; RH = 100·raw/65535.
- El CRC garantiza la integridad de la transmisión, no la veracidad del dato; se complementa con validación de rango y de contexto.
- La temperatura del sensor determina su lectura de humedad: un sensor más caliente que el aire mide menos RH, pero el punto de rocío se mantiene.
- Las conversiones deben programarse sin bloquear: iniciar, seguir trabajando y recoger el resultado a tiempo.
¿Listo para el tema 13?
Antes de avanzar, decodificá el registro 0xFF5E de un DS18B20, calculá si una superficie a 15 °C condensa con aire a 25 °C y 60 % RH, y explicá por qué un CRC válido no basta para confiar en un 85,0 °C. Si podés justificar las tres respuestas, ya manejás los sensores digitales de temperatura y humedad.
En el próximo tema armamos un taller: estación de temperatura y humedad, que reúne el sensor, la validación, el punto de rocío y el registro de datos en un único programa.