← Índice del curso

Sensores y Actuadores · Tema 12

Sensores digitales de temperatura y humedad

Un sensor digital entrega el número ya convertido, con su calibración y una verificación de errores. El DS18B20 permite colgar muchos termómetros de un solo cable; el DHT22 y el SHT31 agregan la humedad relativa, una magnitud engañosa que cambia con la temperatura y que se interpreta mejor con el punto de rocío.

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:

RH = 100 × pvapor / psaturación(T)

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:

γ = ln(RH/100) + a·T / (b + T)  Trocío = b·γ / (a − γ)  a = 17,62 b = 243,12 °C

Es válida aproximadamente entre −45 y 60 °C. Con ella se predice, por ejemplo, el riesgo de condensación:

Punto de rocío para algunas condiciones habituales.
TemperaturaHumedad relativaPunto de rocíoQué significa
20 °C50 %9,3 °CUn vaso a 9 °C empieza a empañarse
25 °C60 %16,7 °CUna tubería de agua fría a 15 °C condensa
30 °C80 %26,2 °CAmbiente 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:

  1. Un pulso de reset del maestro, al que los sensores presentes responden con un pulso de presencia.
  2. 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) o 0xF0 (Search ROM, para descubrir los códigos de los sensores presentes).
  3. Un comando de función: 0x44 (iniciar la conversión) o 0xBE (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 y tiempo máximo de conversión del DS18B20.
ResoluciónPasoTiempo máximo de conversión
9 bits0,5 °C93,75 ms
10 bits0,25 °C187,5 ms
11 bits0,125 °C375 ms
12 bits0,0625 °C750 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:

Estructura del scratchpad del DS18B20.
ByteContenido
0 y 1Temperatura: entero de 16 bits con signo, en unidades de 1/16 °C (primero el byte bajo)
2 y 3Umbrales de alarma TH y TL
4Configuración: bits de resolución
5 a 7Reservados
8CRC 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.

DHT11 frente a DHT22 (valores típicos de las hojas de datos).
CaracterísticaDHT11DHT22
Rango de temperatura0 a 50 °C−40 a 80 °C
Exactitud de temperatura±2 °C±0,5 °C
Rango de humedad20 a 80 %RH0 a 100 %RH
Exactitud de humedad±5 %RH±2 %RH (hasta ±5 %RH en los extremos)
Resolución1 °C y 1 %RH0,1 °C y 0,1 %RH
Intervalo mínimo entre lecturas1 s2 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:

T [°C] = −45 + 175 × rawT / 65535  RH [%] = 100 × rawH / 65535
#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

Los tres sensores digitales del tema.
CaracterísticaDS18B20DHT22SHT31
MagnitudesTemperaturaTemperatura y humedadTemperatura y humedad
Interfaz1-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 datosCRC-8 en cada tramaChecksum de suma (débil)CRC-8 en cada palabra
Tiempo entre lecturasHasta 750 ms (12 bits)Mínimo 2 sHasta 15 ms
Sensores por líneaDecenas (por código único)UnoDos (por dirección)
Cable largoBueno (decenas de metros con cuidado)AceptableCorto (I2C)
CostoBajoBajoMedio

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

Bytes 1 y 0 del scratchpad—
Temperatura leída—
Error de cuantización—
Tiempo máximo de conversión—

Instrumento 2: humedad relativa y punto de rocío

Temperatura medida por el sensor—
Humedad relativa medida—
Error de humedad—
Punto de rocío real—
Punto de rocío calculado con la medición—
Condensación en la superficie
—

Recorrido guiado

  1. 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.
  2. 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.
  3. 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.
  4. 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).
  5. 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.
  6. 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

  1. Definí la magnitud y la exactitud. ¿Solo temperatura, o también humedad? ¿±0,5 °C y ±2 %RH, o basta una idea aproximada?
  2. Elegí el sensor y su bus según el número de puntos de medida, la distancia y las líneas disponibles del microcontrolador.
  3. 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.
  4. Respetá los tiempos: conversión del DS18B20, intervalo mínimo de 2 s del DHT22, 15 ms del SHT31. Programalos con millis(), no con delay.
  5. Verificá cada lectura: CRC o checksum, rango físico, y el valor inicial sospechoso (85 °C, −127 °C).
  6. Pensá en el montaje térmico: sensor aislado del calor de la placa, con circulación de aire, protegido del agua líquida.
  7. Calculá el punto de rocío si el objetivo es evitar condensación o comparar humedades a distintas temperaturas.
  8. 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.