Background
Vlastní CO₂ monitor s M5Stack Atom Matrix a SCD40 v ESPHome

Vlastní CO₂ monitor s M5Stack Atom Matrix a SCD40 v ESPHome

📅 Publikováno:
✍️ Autor: Ondřej Výšek
⏰ Čas čtení: 5 min

Jednoduchý, otevřený a rozšiřitelný projekt pro Home Assistant

Typický problém s hotovými měřidly typu Netatmo nebo podobnými stanicemi je uzavřenost a omezená přizpůsobitelnost. Data často tečou přes cloud, API má limity, vizualizace je daná výrobcem a automatizace bývá omezená. Níže je řešení, které staví na snadno dostupných dílech, běží plně lokálně a nad daty máte plnou kontrolu. Jádro tvoří M5Stack Atom Matrix s 5×5 LED a senzor SCD40 pro CO₂, teplotu a vlhkost. Firmware je ESPHome pod ESP-IDF, integrace do Home Assistantu je bezbolestná.

image

image

Co to umí

  • Zobrazení tří hodnot v reálném čase pomocí tří svislých sloupců na 5×5 matici
    • Teplota vlevo. Spodní dvě modře, prostřední zeleně, horní dvě červeně
    • Vlhkost uprostřed. Spodní oranžově, prostřední dvě zeleně, horní dvě červeně
    • CO₂ vpravo. Spodní dvě zeleně do 800 ppm, prostřední dvě žlutě 800–1200 ppm, horní červeně nad 1200 ppm
  • Tlačítkem na čele se displej zapíná a vypíná. Ve výchozím stavu je vypnutý
  • Jas po zapnutí 50 %, aby se zařízení tolik nehřálo
  • Data se odesílají do Home Assistantu a zároveň jsou vidět na vestavěném webu
  • Měření je lokální bez cloudu a bez účtů

Proč je to užitečné oproti uzavřeným krabičkám

  • Plná kontrola nad daty. Zůstávají ve vaší síti, nejsou závislá na cizím cloudu
  • Rozšiřitelnost. Kód i schéma zobrazení si upravíte během minut a přidáte další senzory nebo logiku
  • Automatizace bez omezení. Větrání podle CO₂, upozornění do mobilu, přepínání režimů klimatizace
  • Cena a dostupnost. M5 Atom a SCD40 jsou běžně skladem, nepotřebujete proprietární gateway
  • Dlouhodobá udržitelnost. Pokud výrobce přestane podporovat zařízení, projekt vám dál běží

Co budete potřebovat

  • M5Stack Atom Matrix
  • Senzor Sensirion SCD40 na I2C
  • Propojky pro Grove port, napájení přes USB-C
  • Home Assistant s doplňkem ESPHome

Zapojení a poznámky

  • SCD40 připojte na I2C. U Atom Matrix je typicky SDA 26 a SCL 32
  • LED matice je WS2812 na pinu 27
  • ESPHome zde používá ESP-IDF a ovladač RMT pro stabilní řízení WS2812
  • Teplota se může mírně zvedat vlivem ohřevu od LED. Proto je jas 50 % a v kódu je volitelný teplotní offset

YAML konfigurace

Níže je kompletní a okomentovaný kód. Před sdílením si vyměňte hesla a klíče za vlastní. Pokud kopírujete do produkce, doporučuji nahradit klíče v sekcích api a ota za hodnoty z vašeho prostředí.

# M5Stack Atom Matrix + SCD40 + ESPHome (ESP-IDF)
# Inline dokumentace pro sdílení a údržbu.

esphome:
  name: matrix1
  friendly_name: matrix1

  # Nechávejte LED po startu vypnuté. Tlačítko a přepínač je mohou zapnout.
  on_boot:
    priority: -10             # spustí se později, až budou subsystémy připravené
    then:
      - switch.turn_off: display_enabled
      - light.turn_off: matrix

esp32:
  board: m5stack-atom
  framework:
    type: esp-idf             # nativní RMT ovladač pro WS2812, stabilní buildy bez Arduino toolchainu

logger:

api:
  encryption:
    key: "VAŠE_API_KEY"       # nahraďte vlastním klíčem pro šifrované spojení s Home Assistantem

ota:
  - platform: esphome
    password: "VAŠE_OTA_HESLO"  # nahraďte vlastním heslem pro OTA

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:                                                     # fallback AP při selhání Wi-Fi
    ssid: "Matrix1 Fallback Hotspot"
    password: "ZMĚŇTE_MĚ"

web_server:                                               # jednoduchá stavová stránka

# SCD40 na Atomu: SDA=26, SCL=32
i2c:
  sda: 26
  scl: 32
  scan: true

sensor:
  # SCD40 CO2, teplota, vlhkost
  - platform: scd4x
    id: scd40

    co2:
      id: co2_ppm
      name: "CO2"
      accuracy_decimals: 0     # celé ppm v HA

    temperature:
      id: temp_c
      name: "Temperature"
      accuracy_decimals: 2     # dvě desetinná místa v HA
      filters:
        - offset: -2.0         # korekce, pokud zařízení čte přibližně o 2 °C výš
        - lambda: |-           # tvrdé zaokrouhlení na dvě desetinná místa
            if (isnan(x)) return x;
            return roundf(x * 100.0f) / 100.0f;
      # Alternativa místo dvou řádků výše:
      # temperature_offset: 2.0  # kompenzace v čidle zlepší i RH a CO2

    humidity:
      id: rel_hum
      name: "Humidity"
      accuracy_decimals: 2
      filters:
        - lambda: |-
            if (isnan(x)) return x;
            return roundf(x * 100.0f) / 100.0f;

    update_interval: 10s        # nové hodnoty každých 10 s
    automatic_self_calibration: true  # ASC pro dlouhodobý baseline CO2

# 5×5 WS2812 matice přes ESP-IDF RMT ovladač
light:
  - platform: esp32_rmt_led_strip
    id: matrix
    name: "Atom Matrix"
    pin: 27
    num_leds: 25
    chipset: WS2812
    rgb_order: GRB
    default_transition_length: 0s
    restore_mode: ALWAYS_OFF        # zůstane zhasnuto po výpadku i při startu
    on_turn_on:                     # vynutí 50 % jasu při zapnutí
      - light.control:
          id: matrix
          brightness: 50%

# Softwarový přepínač, který uvidíte i v Home Assistantu
switch:
  - platform: template
    id: display_enabled
    name: "Matrix Display Enabled"
    optimistic: true
    restore_mode: RESTORE_DEFAULT_OFF
    turn_on_action:
      - light.turn_on:
          id: matrix
          brightness: 50%
    turn_off_action:
      - light.turn_off: matrix

# Přední tlačítko. GPIO39 nemá interní pull-up, tlačítko je aktivní v log. 0
binary_sensor:
  - platform: gpio
    id: atom_button
    name: "Atom Button"
    pin:
      number: 39
      mode:
        input: true
    inverted: true
    on_press:
      - switch.toggle: display_enabled

# 5×5 vizualizace: tři svislé sloupce ve sloupcích 0, 2 a 4
# T škáluje 18..30 °C, RH 10..100 %, CO2 400..2000 ppm
# Každý sloupec má pevné barevné zóny a střed je normální stav.
display:
  - platform: addressable_light
    id: matrix_display
    addressable_light_id: matrix
    width: 5
    height: 5
    rotation: 0
    update_interval: 1s
    lambda: |-
      if (!id(display_enabled).state) { it.clear(); return; }

      // Převod na výšku 1..5 (0 pokud není hodnota)
      auto level = [](float v, float vmin, float vmax) -> int {
        if (isnan(v)) return 0;
        if (v < vmin) v = vmin;
        if (v > vmax) v = vmax;
        int L = (int)ceilf(((v - vmin) / (vmax - vmin)) * 5.0f);
        if (L < 1) L = 1;
        if (L > 5) L = 5;
        return L;
      };

      float t = id(temp_c).state;    // °C
      float h = id(rel_hum).state;   // %
      float c = id(co2_ppm).state;   // ppm

      int lt = level(t, 18.0f, 30.0f);
      int lh = level(h, 10.0f, 100.0f);
      int lc = level(c, 400.0f, 2000.0f);

      it.clear();

      // Barvy zón po řádcích (y=0 dole .. 4 nahoře)
      auto temp_color_for_row = [](int y) -> Color {
        if (y <= 1) return Color(0x0000FF);  # modrá
        if (y == 2) return Color(0x00FF00);  # zelená
        return Color(0xFF0000);              # červená
      };
      auto hum_color_for_row = [](int y) -> Color {
        if (y == 0) return Color(0xFFA500);  # oranžová
        if (y <= 2) return Color(0x00FF00);  # zelená
        return Color(0xFF0000);              # červená
      };
      auto co2_color_for_row = [](int y) -> Color {
        if (y <= 1) return Color(0x00FF00);  # zelená
        if (y <= 3) return Color(0xFFFF00);  # žlutá
        return Color(0xFF0000);              # červená
      };

      auto draw_zoned_col = [&](int x, int L, auto color_for_row) {
        for (int y = 0; y < L; y++) {
          it.draw_pixel_at(x, 4 - y, color_for_row(y));
        }
      };

      if (lt > 0) draw_zoned_col(0, lt, temp_color_for_row);
      if (lh > 0) draw_zoned_col(2, lh, hum_color_for_row);
      if (lc > 0) draw_zoned_col(4, lc, co2_color_for_row);

Tipy k přesnosti

Nechte čidlo po startu několik minut ustálit. Pokud teplota dlouhodobě sedí o stálou hodnotu vedle, použijte temperature_offset na úrovni zařízení. LED matice může zahřívat okolí, proto je dobré držet jas na 50 % a displej mít zhasnutý, pokud zrovna neslouží jako indikátor.

Závěr

Otevřený CO₂ monitor z M5Stack Atom Matrix a SCD40 vám dá přesná data, okamžitou vizuální zpětnou vazbu a úplnou svobodu při zpracování v Home Assistantu. Komponenty jsou snadno dostupné, firmware je čitelný a upravitelný. Pokud budete chtít, můžeme přidat noční režim, adaptivní jas podle ambientního světla nebo automatické přepínání zobrazovaných metrik.

Hlavní výhody M5Stacku

  • Bez pájení u většiny scénářů. Moduly a jednotky propojíte konektory Grove nebo přes připravené základny. Rychlé MVP i servis je snadnější.
  • Plug and play ekosystém. Řada „Units“ a „Bases“ pokrývá I2C senzory, RS485, LoRa, relé, displeje, enkodéry a mnoho dalšího. Není potřeba řešit level shifty ani napájecí desky.
  • Integrované periférie. U Atom Matrix máš 5×5 RGB matici a tlačítko přímo na čipu, v jiných modelech bývá mikrofon, reproduktor, IMU, RTC nebo baterie. Méně krabiček, méně kabelů.
  • Stabilní napájení a RF část. M5Stack moduly mají odladěné napájení, USB-C a anténu, takže odpadá typická „ruleta“ s neočekávanými restarty nebo nestabilním Wi-Fi.
  • Konzistentní pinout a dokumentace. Nemusíš pokaždé lovit, který devkit má jak mapované piny. Projekty se rychleji sdílí v týmu.
  • Lepší mechanika. Krabičky, montážní otvory, držáky a 3D modely jsou k dispozici. Snadno to připevníš na zeď, do racku nebo na rozvaděčovou lištu.
  • Dostupnost a životní cyklus. M5Stack prodává stejné moduly dlouhodobě a skladem, takže není problém vyrobit dalších 10 kusů za rok se stejným BOM.
  • Čas jsou peníze. Samotné ESP32 je levnější, ale ztracený čas na pájení, ladění napájení a krabičku se rychle zaplatí v ceně M5Stacku.
  • Lokální provoz bez cloudu. V kombinaci s ESPHome a Home Assistantem máš kompletní kontrolu nad daty, právy, aktualizacemi i integracemi.
  • Snadné servisování. Výměna senzoru nebo celého modulu je otázka minut, ne hodin s páječkou.

Kdy dává smysl „holé“ ESP32

  • Extrémně nízký rozpočet a velké série s vlastním PCB.
  • Netypická mechanika nebo speciální periférie, které v M5Stack ekosystému nejsou.
  • Projekty vyžadující přesné analogové měření s vlastní analogovou front-end částí.

Pro CO₂ monitor v článku je M5Stack Atom Matrix ideální: 5×5 displej pro okamžitou vizuální odezvu, tlačítko pro zapnutí a vypnutí, jeden kabel k SCD40 přes I2C a hotovo. Všechno běží lokálně, konfiguruje se v YAML a kdykoli to rozšíříš o další jednotky bez zásahu do krabičky.

About the Author

O autorovi

Ondřej Výšek

Ondřej Výšek

Technologický hračička a vizionář | Microsoft MVP | SoftwareOne

Ondřej Výšek je držitelem titulu Microsoft MVP již od roku 2004 a zakladatelem komunitního webu Optimalizovane-IT.cz, který od roku 2008 pomáhá IT profesionálům s best practices v oblasti Microsoft technologií. V IT působí od roku 1993 a během své kariéry prošel širokým spektrem rolí – od konzultanta a architekta až po strategického poradce pro digitální transformaci. Pomáhal organizacím všech velikostí, od menších podniků až po enterprise prostředí s desítkami až stovkami tisíc uživatelů. V posledních letech se zaměřuje na umělou inteligenci, cloudové technologie Microsoft 365 a Azure, přičemž v SoftwareOne pomáhá zákazníkům vytvářet efektivní IT strategie a využívat nejmodernější digitální nástroje k dosažení jejich cílů.

vlastni-co2-monitor-s-m5stack-atom-matrix-a-scd40-v-esphome