MH-Z19B (Winsen)

Sensor NDIR de CO2 económico, ampliamente usado en proyectos de invernadero.

Páginas del fabricante: Winsen MH-Z19B, Datasheet MH-Z19B (PDF) Ver tambien https://emariete.com/sensor-co2-mh-z19b/

Specs

SpecValor
TecnologíaNDIR (Non-Dispersive Infrared)
Rango0-5000 ppm
Precisión del valor medido
InterfaceUART (9600 baud, 8N1) o PWM
Voltaje4.5-5.5V DC (no funciona a 3.3V)
Calentamiento3 min después de power-on
Consumo pico150 mA @5V (avg <60 mA)

CRÍTICO en invernadero - desactivar ABC

ABC (Automatic Baseline Correction) asume que el sensor ve aire fresco exterior (400 ppm) al menos una vez cada 24h y recalibra el cero a ese valor.

En un invernadero cerrado con CO2 elevado permanentemente (fertilización con CO2, plantas respirando), el ABC recalibra continuamente con valores erróneos y las lecturas derivan de forma no lineal en cuestión de semanas.

Con ABC desactivado el MH-Z19B sigue siendo metodológicamente válido; varios papers de agricultura de precisión lo usan así, declarándolo explícitamente en la sección de materiales.

Comando UART para desactivar ABC

Hacerlo una sola vez antes de instalar el sensor, el setting se guarda en flash interno.

Comando para leer CO2

Implementación en ESP32

graph LR
    TX["ESP32 TX"] -->|RX| S["MH-Z19B"]
    S -->|TX| RX["ESP32 RX"]
    V5["5V externo"] -->|Vin| S
    GND["GND"] -->|GND| S

El MH-Z19B consume hasta 150 mA en pico durante el calentamiento del filamento IR. El regulador del DevKit puede no aguantar - alimentar desde un LM2596S directamente, no desde el 5V del DevKit.

UART config: 9600 baud, 8N1.

Variante MH-Z19C

MH-Z19C es similar pero con rango 0-2000 ppm.

Trampas

SíntomaCausa
Lecturas siempre cerca de 400 ppmABC sigue activo
Lecturas se desplazan ~50 ppm cada semanaSensor desgastado, requiere recalibración manual con N2 puro o aire de referencia
Primeras lecturas después de power-on son 400 ppm constantesFalta el periodo de calentamiento (3 min)
Respuesta del sensor consume mucha CPUImplementar timeout en uart_read_bytes(); el sensor responde cada 1 s, no más rápido