Měření CO₂ pomocí senzoru MH-Z19B a ESP32
Měření koncentrace oxidu uhličitého (CO₂) je užitečné například pro sledování kvality vzduchu v místnosti, řízení ventilace nebo projekty chytré domácnosti. V tomto článku si ukážeme, jak připojit a použít CO₂ senzor MH-Z19B s mikrokontrolerem ESP32.
Co je MH-Z19B
MH-Z19B je NDIR senzor (Non-Dispersive Infrared), který měří koncentraci CO₂ ve vzduchu pomocí infračerveného světla.
Základní vlastnosti senzoru:
- rozsah měření je přibližně 400 až 5000 ppm
- napájení senzoru je 4.5 až 5.5 V
- komunikace probíhá přes UART nebo PWM
- průměrná spotřeba je přibližně 20 mA
- senzor potřebuje asi 2 až 3 minuty zahřívání, než začne měřit přesně
Senzor má také automatickou kalibraci, která postupně upravuje přesnost měření při dlouhodobém provozu.

Zapojení senzoru s ESP32
Pro komunikaci použijeme UART, protože je nejjednodušší.
Napájecí pin Vin na senzoru připojíme na 5 V pin na ESP32.
Pin GND připojíme na GND na ESP32.
Pro komunikaci platí následující zapojení:
Pin TX na senzoru MH-Z19B připojíme na GPIO16 na ESP32, který funguje jako RX2.
Pin RX na senzoru MH-Z19B připojíme na GPIO17 na ESP32, který funguje jako TX2.
Je důležité zapojit piny křížem – tedy TX senzoru na RX mikrokontroleru a naopak.
Instalace knihovny
Pro práci se senzorem je vhodné použít knihovnu MHZ19.
Tu lze jednoduše nainstalovat přes Arduino IDE Library Manager.
Ukázkový program pro ESP32
1/**
2 * MH-Z19 CO2 senzor pro ESP32 DevKit
3 * Knihovna: "MH-Z19" by Jonathan Dempsey
4 *
5 * Instalace:
6 * Arduino IDE → Library Manager → hledat "MH-Z19" → nainstalovat od Jonathan Dempsey
7 *
8 * Zapojení:
9 * MHZ19 → ESP32
10 * VCC → 5V (NUTNĚ 5V, ne 3.3V!)
11 * GND → GND
12 * TX → GPIO 16 (RX2)
13 * RX → GPIO 17 (TX2)
14 */
15
16#include <MHZ19.h>
17#include <HardwareSerial.h>
18
19// --- Konstanty ---
20#define RX_PIN 16 // GPIO16 = RX2
21#define TX_PIN 17 // GPIO17 = TX2
22#define BAUDRATE 9600
23#define CO2_LIMIT 1000 // ppm – hranice pro varování
24#define READ_INTERVAL 5000 // ms mezi měřeními
25
26// --- Objekty ---
27MHZ19 myMHZ19;
28HardwareSerial mySerial(2); // UART2
29
30// --- Časování ---
31unsigned long lastRead = 0;
32
33void setup() {
34 Serial.begin(115200);
35 while (!Serial) { ; } // čekej na Serial monitor (volitelné)
36
37 Serial.println("=== MH-Z19 CO2 Senzor ===");
38 Serial.println("Inicializace...");
39
40 // Inicializace UART2
41 mySerial.begin(BAUDRATE, SERIAL_8N1, RX_PIN, TX_PIN);
42
43 // Inicializace senzoru
44 myMHZ19.begin(mySerial);
45
46 // Vypnout autokalibraci (doporučeno pro přesné měření)
47 myMHZ19.autoCalibration(false);
48
49 // Volitelné: nastavit rozsah senzoru (výchozí je 5000 ppm)
50 // myMHZ19.setRange(2000); // 2000 ppm pro interiéry
51
52 Serial.println("Senzor připraven.");
53 Serial.println("Zahřívání senzoru – první hodnoty mohou být nepřesné.");
54 Serial.println("-------------------------------------------");
55}
56
57void loop() {
58 unsigned long now = millis();
59
60 if (now - lastRead >= READ_INTERVAL) {
61 lastRead = now;
62
63 // Čtení hodnot
64 int co2 = myMHZ19.getCO2(); // ppm
65 int temp = myMHZ19.getTemperature(); // °C
66
67 // Kontrola validity – senzor vrátí 0 pokud ještě není zahřátý
68 if (co2 == 0) {
69 Serial.println("Senzor se zahřívá, čekejte...");
70 return;
71 }
72
73 // Výpis hodnot
74 Serial.print("CO2: ");
75 Serial.print(co2);
76 Serial.print(" ppm");
77
78 Serial.print(" | Teplota: ");
79 Serial.print(temp);
80 Serial.print(" °C");
81
82 // Kvalita vzduchu
83 Serial.print(" | Vzduch: ");
84 if (co2 < 600) Serial.print("Výborný");
85 else if (co2 < 800) Serial.print("Dobrý");
86 else if (co2 < 1000) Serial.print("Přijatelný");
87 else if (co2 < 1500) Serial.print("Špatný ⚠");
88 else Serial.print("Velmi špatný ⛔");
89
90 Serial.println();
91
92 // Upozornění při překročení limitu
93 if (co2 > CO2_LIMIT) {
94 Serial.print(">>> VAROVÁNÍ: CO2 překročilo ");
95 Serial.print(CO2_LIMIT);
96 Serial.println(" ppm – vyvětrejte! <<<");
97 }
98 }
99}Program každých pět sekund načte hodnotu CO₂ a vypíše ji do sériového monitoru.
Ukázka výstupu
1CO2: 915 ppm | Teplota: 26 °C
2CO2: 918 ppm | Teplota: 26 °C
3CO2: 921 ppm | Teplota: 26 °CBěžná koncentrace CO₂ v dobře větrané místnosti se pohybuje přibližně mezi 400 a 800 ppm. Vyšší hodnoty často znamenají, že je potřeba místnost vyvětrat.
Využití projektu
Tento senzor se často používá například pro:
- měření kvality vzduchu v místnosti
- automatické řízení ventilace
- projekty chytré domácnosti
- IoT projekty s WiFi pomocí ESP32
- domácí meteostanice
