CO2 sensors compared: SCD40 vs SCD41 vs MH-Z19 vs SenseAir S8
CO2 is the best single number for "should I open a window" — it tracks occupancy, stuffiness and (roughly) how much everyone's exhaled air you're re-breathing. But it's also the sensor category with the most ways to buy wrong: estimators sold as sensors, clones that read low, and an auto-calibration default that quietly ruins the one room you care about. Four sensors measure real CO2 at hobby prices; here's the honest comparison.
Rule zero: if the listing says eCO2 (ENS160, SGP30, CCS811, BME680), it estimates CO2 from VOCs and will sleep through a room full of sleeping people. Details in the fake-sensor exposé. Everything below is real NDIR/photoacoustic measurement.
| SCD41 | SCD40 | MH-Z19B/C | SenseAir S8 | |
|---|---|---|---|---|
| Range | 400–5000 ppm | 400–2000 ppm | 400–5000 ppm | 400–2000 ppm |
| Tech | Photoacoustic NDIR | Photoacoustic NDIR | Optical NDIR | Optical NDIR, long-life emitter |
| Extras | + temp/RH · single-shot low power | + temp/RH | PWM out | — |
| Interface | I2C @ 0x62 | I2C @ 0x62 | UART 9600 (5 V) | UART Modbus (5 V) |
| ESPHome | native (scd4x) | native (scd4x) | native (mhz19) | native (senseair) |
| Clone risk | low | low | high (black-PCB fakes read low) | medium (OEM surplus grading) |
| Battery-viable | Yes (single-shot) | No | No | No |
| Street price | $9–16 | $8–13 | $10–14 | $12–20 |
| Verdict | The 2026 default | Fine if cheaper that day | Legacy; clone minefield | The decade-accuracy pick (it's what AirGradient ships) |
The calibration trap (this is the part nobody reads until it's too late)
Every affordable CO2 sensor self-calibrates by assuming it sees fresh air (~400 ppm) about once a week — the lowest weekly reading gets redefined as the 400 ppm baseline. In a living room with open windows, that works. In a bedroom, a cellar or any room that never fully airs out, the sensor gradually decides that "stuffy" is the new fresh, and your readings drift optimistic — the exact opposite of what a bedroom CO2 sensor is for.
The fix is one line of ESPHome config plus a habit: disable automatic
calibration (SCD4x: automatic_self_calibration: false · MH-Z19:
automatic_baseline_calibration: false), then force-calibrate outdoors or at an
open window for 10 minutes every few months. Both components expose a calibration
action/button you can put straight on your dashboard.
Which one, in one paragraph each
- SCD41 — buy this one. Photoacoustic NDIR shrunk to a fingernail: I2C alongside your other sensors, bonus temp/RH, native ESPHome, no real clone market, and the single-shot mode makes battery CO2 nodes possible. The extra range over the SCD40 (5000 vs 2000 ppm) matters the day something's actually wrong.
- SCD40 — same family, fine on a deal. Identical measurement in the range most homes live in; no low-power mode. If it's several dollars cheaper in your basket, take it.
- SenseAir S8 — the long-haul pick. Swedish NDIR with a 15-year-lifetime emitter, the sensor AirGradient chose for its monitors. Bigger, UART, no extras — just a CO2 number you can trust for a decade. Watch the surplus grading on cheap listings.
- MH-Z19B/C — legacy, buy carefully. The sensor of the 2018–2023 DIY wave, still natively supported and still fine — if genuine (green/blue PCB, Winsen store; the black-PCB clones read dangerously low) and if you manage its calibration. For a new build the SCD41 is simply less homework.
As an Amazon Associate and an affiliate we may earn from qualifying purchases. Prices and availability are set by the retailer.
Placement, briefly
Breathing height, away from faces, windows and vents: a CO2 sensor next to your pillow reads your exhalations, one on a windowsill reads the garden. Give any new sensor a day to settle, then do one outdoor calibration and enjoy the least-glamorous, most actionable number in your smart home — most people are genuinely surprised how fast a closed bedroom passes 1500 ppm.
All sensors, all specs: the comparison table · VOC instead? SGP41 · Worried about fakes? The exposé.