Zpět na články

Měření CO₂ pomocí senzoru MH-Z19B a ESP32

Jednoduchý projekt měření CO₂ pomocí senzoru MH-Z19B a mikrokontroleru ESP32 přes UART.

Měření CO₂ pomocí senzoru MH-Z19B a ESP32

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.

ESP32 Blog image

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

mhz.cpp
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

vystup.cpp
1CO2: 915 ppm | Teplota: 26 °C 2CO2: 918 ppm | Teplota: 26 °C 3CO2: 921 ppm | Teplota: 26 °C

Běž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

Nakupte svoje ESP32 ještě dnes!

Doprava Zásilkovnou za 89 Kč
Platba dobírkou
Vrácení do 30 dnů
Omezené zásoby - skladem

ESP32-S3 DevKit USB-C

Kompletní vývojová deska s USB-C

240MHz dvoujádrový
WiFi 802.11 b/g/n
Bluetooth 4.2 + BLE
4MB Flash paměť
520KB SRAM
38 GPIO pinů
209za kus

Množstevní slevy:

1
Celkem
209
Objednat

Bezpečná platba při převzetí zásilky nebo online platba přes Comgate, a.s.