CO2

Sensores NDIR (Non-Dispersive Infrared) para concentración de CO2 atmosférico.

Conviene el SCD41

Comparativa

SensorFabricanteTecnologíaRangoPrecisiónInterface
MH-Z19BWinsenNDIR0-5000 ppm (config)UART
MH-Z19CWinsenNDIR400-2000 ppm (config a 5000)UART
SCD41SensirionPAS NDIR400-5000 ppm hasta 1000 ppmI2C

Ver https://shop.winsen-sensor.com/blogs/news/what-is-the-difference-between-mh-z19b-and-mh-z19c

Genernally, MH-Z19C has better consistency and performance than MH-Z19B, and can directly replace MH-Z19B.

Ver https://www.reddit.com/r/esp32/comments/1798eb2/co2_sensors_for_around_the_house_any_tried_and/

note that to get an accurate CO2 reading you also need a barometric pressure sensor so you can give the SCD4x the pressure, which it then uses to compensate it’s CO2 reading

Ver https://en.ovcharov.me/2025/02/19/comparing-mh-z19b-and-scd41-building-a-smarter-co-monitor/

Trampa crítica para invernadero: ABC (Automatic Baseline Correction)

El ABC 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, el ABC recalibra continuamente con valores erróneos lecturas derivan en semanas.

  • MH-Z19B y MH-Z19C: desactivar ABC vía UART antes de instalar
  • SCD41: el ASC (Automatic Self Calibration) tiene la misma trampa - desactivar con comando I2C 0x2416 (set_automatic_self_calibration_enabled = 0) + 0x3615 (persist_settings) para que sobreviva el power-cycle, antes de uso continuo

Por qué la temperatura y humedad afectan la lectura

Los NDIR miden CO2 viendo cuánta luz infrarroja se absorbe a 4.26 µm. El problema: la absorción no depende solo del CO2, también del estado del gas:

  • Temperatura: a mayor T, las moléculas se expanden menos moléculas en el volumen que ve el sensor lectura “más baja” aunque haya el mismo CO2.
  • Humedad: el vapor de agua también absorbe IR (en bandas que se solapan parcialmente con la del CO2) suma “ruido” al cálculo.
  • Presión: la densidad del gas depende de la presión (PV = nRT). En altura o con frente de baja presión, hay menos moléculas por volumen lectura baja sin compensar.

Sin compensar, un aire con 1000 ppm reales puede leerse como 950-1050 ppm según T/HR. Si se publica formalmente, ese ruido en la serie temporal contamina las correlaciones.

Cómo lo resuelve cada sensor

SensorT + HRPresión
MH-Z19B, MH-Z19CSin compensación interna. Hay que leer T+HR aparte (ej. SHT45) y aplicar corrección en firmware si la T del invernadero varía mucho con las estacionesSin compensación
SCD41Automática. Trae un SHT4x integrado en el mismo chip (per datasheet §Introduction: “on-chip signal compensation is realized with the built-in SHT4x”) y te devuelve un valor ya compensadoHay que dárselo con el comando set_ambient_pressure (0xE000). Si no, asume 1013 hPa default - error en altura o con baja presión. Conectar un BMP280/BME280 al mismo bus I2C y reportar la presión

Recomendaciones por tipo de uso

Caso de usoSensor típicoRazón
Lectura económica con metodología documentadaMH-Z19B (ABC off)Bajo costo, ampliamente usado en literatura agronómica
Integración con SHT4x en mismo bus I2CSCD41I2C @ 0x62, comparte bus
Necesidad de compensación automática T+HRSCD41Trae sensor T+HR integrado, no hace falta cablearlo aparte ni compensar en firmware. Drift bajo a largo plazo

(T+HR significa Temperatura y Humedad Relativa)