SCD41 – měření CO₂, teploty a vlhkosti vzduchu pomocí Arduina

Kvalitu vzduchu v místnosti není vždy možné poznat podle zápachu nebo pocitu. Pokoj může působit úplně normálně, přesto v něm může být kvůli lidem poměrně vysoká koncentrace oxidu uhličitého. Právě pro její měření jsem vyzkoušel modul se senzorem Sensirion SCD41.

SCD41 umí měřit koncentraci CO₂, teplotu a relativní vlhkost vzduchu. Na rozdíl od jednodušších čidel, která hodnotu CO₂ pouze odhadují podle jiných plynů ve vzduchu, používá skutečné optické měření oxidu uhličitého. Výsledkem je přímo koncentrace udávaná v ppm.

V článku modul připojím k Arduino UNO, nainstaluji potřebnou knihovnu a pomocí jednoduchého programu vypíšu všechny naměřené hodnoty do sériového monitoru.

Modul SCD41

Co znamená koncentrace CO₂

Oxid uhličitý je běžnou součástí vzduchu. V místnosti jeho koncentrace roste hlavně dýcháním přítomných lidí a klesá větráním nebo výměnou vzduchu.

Koncentrace se udává v jednotkách ppm, tedy parts per million neboli počet částic na jeden milion částic vzduchu. Hodnota 1000 ppm například znamená, že na milion částic vzduchu připadá přibližně 1000 částic CO₂. Hodnota 1000 ppm odpovídá přibližně 0,1 % CO₂.

Senzor CO₂ se proto hodí jako ukazatel vydýchaného vzduchu. Lze podle něj sledovat větrání v ložnici, dětském pokoji, kanceláři, dílně nebo učebně.

Jak naměřené hodnoty hodnotit

Pro běžné domácí měření lze použít následující orientační přehled. Nejde o přesné hranice, při kterých by se vzduch náhle stal zdravým nebo nebezpečným. Hodnota CO₂ slouží především jako ukazatel toho, jak dobře je místnost větraná.

Koncentrace CO₂HodnoceníCo hodnota znamená
Přibližně 430 ppmVenkovní vzduchSoučasná koncentrace CO₂ ve venkovní atmosféře se pohybuje přibližně kolem této hodnoty
430–800 ppmVelmi dobréČerstvý nebo velmi dobře větraný vzduch
800–1000 ppmDobréBěžná hodnota v dobře větrané obývané místnosti
1000–1500 ppmZhoršenéVzduch začíná být vydýchaný a je vhodné vyvětrat
1500–2000 ppmŠpatnéHodnota ukazuje na nedostatečné větrání, je potřeba zvýšit přívod čerstvého vzduchu
Nad 2000 ppmVelmi špatnéHygienicky nepřijatelná kvalita vzduchu, místnost je vhodné důkladně vyvětrat
5000 ppm a víceMimo běžný provoz místnostiTakto vysoká hodnota už nemá být považována za přijatelný cíl pro obytný prostor

Německý Spolkový úřad pro životní prostředí považuje hodnoty pod 1000 ppm za hygienicky nezávadné, rozsah 1000 až 2000 ppm za zvýšený a koncentraci nad 2000 ppm za hygienicky nepřijatelnou. Britský úřad HSE zároveň uvádí, že hodnoty trvale přesahující 1500 ppm v obsazené místnosti ukazují na špatné větrání.

Hranice 5000 ppm se objevuje jako pracovní expoziční limit pro osmihodinovou směnu. Neznamená to ale, že by byla podobná koncentrace vhodná v bytě, kanceláři nebo ložnici. Pro běžné vnitřní prostředí je rozumným cílem držet se pokud možno pod 1000 ppm.

Důležitější než krátkodobý výkyv je dlouhodobější průběh. Jedno vysoké číslo může způsobit člověk, který se právě nadechl nebo vydechl v blízkosti senzoru. Pokud ale hodnota v obsazené místnosti postupně roste a dlouhodobě zůstává nad 1000 až 1500 ppm, je to dobrý důvod k vyvětrání.

Jak SCD41 měří CO₂

SCD41 používá fotoakustický NDIR princip označovaný výrobcem jako PASens. Uvnitř senzoru je zdroj infračerveného záření, měřicí prostor a akustický snímač.

Oxid uhličitý pohlcuje infračervené záření určité vlnové délky. Periodické zahřívání plynu způsobí velmi malé změny tlaku, které zachytí akustický snímač. Elektronika následně z intenzity signálu vypočítá koncentraci CO₂.

Součástí senzoru je také čidlo řady SHT4x pro měření teploty a relativní vlhkosti. Tyto údaje se používají také pro vnitřní kompenzaci měření.

Modul LaskaKit SCD41

Samotný SCD41 je malá součástka určená k osazení na plošný spoj. Použitý modul od LaskaKit jej převádí do podoby vhodné pro běžné bastlení.

Deska má klasické otvory s roztečí 2,54 mm a konektory μŠup. Rozměry celého modulu jsou přibližně 21 × 21 × 8 mm. Komunikace probíhá přes sběrnici I²C na pevné adrese 0x62.

Na desce jsou také připravené pull-up rezistory pro sběrnici I²C. Jejich připojení k 3,3 V se ovládá pájecí propojkou, proto je při problémech s komunikací dobré zkontrolovat její stav.

Modul lze napájet napětím od 2,4 do 5,5 V. Je tedy použitelný s 5V deskami, jako je Arduino UNO, i s 3,3V deskami ESP nebo Raspberry Pi.

Základní parametry

ParametrHodnota
Měřené veličinyCO₂, teplota a relativní vlhkost
Výstupní rozsah CO₂0 až 40 000 ppm
Specifikovaný rozsah CO₂400 až 5000 ppm
Přesnost CO₂ při 400–1000 ppm±50 ppm + 2,5 % z hodnoty
Přesnost CO₂ při 1001–2000 ppm±50 ppm + 3 % z hodnoty
Přesnost CO₂ při 2001–5000 ppm±40 ppm + 5 % z hodnoty
Typická doba odezvy CO₂60 sekund
Rozsah teploty−10 až 60 °C
Přesnost teploty při 15–35 °C±0,8 °C
Rozsah vlhkosti0 až 100 % RH
Přesnost vlhkosti při 15–35 °C±6 % RH
Napájecí napětí2,4 až 5,5 V
I²C adresa0x62

Senzor sice dokáže vrátit hodnotu až 40 000 ppm, ale výrobcem garantované parametry měření SCD41 platí v rozsahu 400 až 5000 ppm. Vyšší hodnoty je proto vhodné považovat hlavně za orientační.

Použitý hardware

Pro základní zprovoznění jsem použil:

  • Arduino UNO – řídicí deska
  • LaskaKit SCD41 – senzor CO₂, teploty a vlhkosti
  • Propojovací vodiče
  • USB kabel

Místo Arduina UNO lze použít také ESP32 nebo jinou desku podporující I²C. Program zůstane téměř stejný, lišit se může pouze výběr pinů SDA a SCL.

Zapojení k Arduinu UNO

Modul používá čtyři vodiče: napájení, zem a dva vodiče sběrnice I²C.

Modul SCD41 – pájecí piny
SCD41Arduino UNOFunkce
VCC5 VNapájení
GNDGNDSpolečná zem
SDAA4Data sběrnice I²C
SCLA5Hodiny sběrnice I²C

Piny A4 a A5 jsou u Arduina UNO současně vyvedené také na samostatných kontaktech označených SDA a SCL. Je tedy jedno, kterou dvojici fyzických kontaktů použijeme.

Modul je tolerantní k napájení i logice 3,3 V a 5 V, takže při použití s Arduinem UNO není potřeba převodník logických úrovní. U ESP32 se modul napájí z vývodu 3,3 V. Výchozí piny I²C u běžného ESP32 DevKitu bývají GPIO 21 pro SDA a GPIO 22 pro SCL, u jiných desek se ale mohou lišit.

Připojení k Arduinu UNO

Instalace knihovny

Pro komunikaci se senzorem použiji oficiální knihovnu výrobce.

V Arduino IDE otevřeme manažéra knihoven, do vyhledávacího pole zadáme: Sensirion I2C SCD4X a nainstalujeme knihovnu Sensirion I2C SCD4X od Sensirion. Společně s ní je potřeba také knihovna Sensirion Core, kterou správce knihoven nabídne jako závislost.

Pozor na velikost písmen v názvu souboru knihovny. Použitá verze 1.1.0 používá:

#include <SensirionI2cScd4x.h>

Starší programy na internetu mohou používat mírně odlišný název třídy nebo knihovny.

Program pro základní měření

Následující program spustí periodické měření a každých pět sekund vypíše koncentraci CO₂, teplotu a relativní vlhkost.

///////////////////////SCD41 Arduino UNO fw v.0.1 ////////////////////////////
///////////////////////3.8.2026 //////////////////////////////////////////////
///////////////////////www.michaluvbrloh.cz//////////////////////////////////

#include <Wire.h>                 //komunikace po I2C
#include <SensirionI2cScd4x.h>    //knihovna pro senzor SCD41

#define NO_ERROR 0                //návratová hodnota bez chyby

SensirionI2cScd4x scd41;          //objekt senzoru SCD41

int16_t chyba = 0;                //kód poslední chyby

void spustSenzor();               //spuštění periodického měření
void zmerHodnoty();               //načtení a výpis naměřených hodnot
void vypisChybu(const __FlashStringHelper* text, int16_t kod);

/////////////////////////////po spuštění///////////////////////////////////////////////////////////////////////////////////////
void setup()
  {
    Serial.begin(115200);                 //start sériové linky
    Wire.begin();                         //start I2C sběrnice

    delay(1000);                          //krátká pauza po zapnutí

    Serial.println(F("SCD41 - mereni CO2, teploty a vlhkosti"));
    Serial.println();

    spustSenzor();                        //inicializace senzoru
  }

/////////////////////////////hlavní smyčka/////////////////////////////////////////////////////////////////////////////////////
void loop()
  {
    zmerHodnoty();                        //načti a vypiš hodnoty
    delay(5000);                          //čekej 5 sekund
  }

/////////////////////////////spuštění senzoru//////////////////////////////////////////////////////////////////////////////////
void spustSenzor()
  {
    scd41.begin(Wire, SCD41_I2C_ADDR_62); //připojení senzoru na adrese 0x62

    delay(30);                            //čekání po inicializaci

    scd41.wakeUp();                       //probuzení senzoru
    scd41.stopPeriodicMeasurement();      //zastavení případného starého měření

    delay(500);                           //senzor po zastavení potřebuje pauzu

    chyba = scd41.reinit();               //nové načtení nastavení senzoru

    if(chyba != NO_ERROR)
      {
        vypisChybu(F("Chyba inicializace senzoru"), chyba);
        return;
      }

    chyba = scd41.startPeriodicMeasurement(); //spuštění měření po 5 sekundách

    if(chyba != NO_ERROR)
      {
        vypisChybu(F("Chyba spusteni mereni"), chyba);
        return;
      }

    Serial.println(F("Senzor byl spusten"));
    Serial.println(F("Cekam na prvni mereni..."));
  }

/////////////////////////////měření hodnot/////////////////////////////////////////////////////////////////////////////////////
void zmerHodnoty()
  {
    bool dataPripravena = false;           //stav nové naměřené hodnoty
    uint16_t co2 = 0;                      //koncentrace CO2 v ppm
    float teplota = 0.0;                   //teplota ve stupních Celsia
    float vlhkost = 0.0;                   //relativní vlhkost v procentech

    chyba = scd41.getDataReadyStatus(dataPripravena);

    if(chyba != NO_ERROR)
      {
        vypisChybu(F("Chyba kontroly dat"), chyba);
        return;
      }

    if(dataPripravena == false)            //pokud nové měření ještě není hotové
      {
        return;
      }

    chyba = scd41.readMeasurement(co2, teplota, vlhkost);

    if(chyba != NO_ERROR)
      {
        vypisChybu(F("Chyba cteni senzoru"), chyba);
        return;
      }

    Serial.print(F("CO2: "));
    Serial.print(co2);
    Serial.print(F(" ppm | Teplota: "));
    Serial.print(teplota, 1);
    Serial.print(F(" °C | Vlhkost: "));
    Serial.print(vlhkost, 1);
    Serial.println(F(" %"));
  }

/////////////////////////////výpis chyby///////////////////////////////////////////////////////////////////////////////////////
void vypisChybu(const __FlashStringHelper* text, int16_t kod)
  {
    Serial.print(text);
    Serial.print(F(", kod: "));
    Serial.println(kod);
  }

Program vychází z aktuálního rozhraní oficiální knihovny Sensirion. Periodické měření poskytuje novou hodnotu přibližně každých pět sekund. Před čtením program pomocí getDataReadyStatus() zkontroluje, zda už je výsledek připravený.

Po nahrání programu otevřeme sériový monitor a nastavíme rychlost 115200 baud.

Po několika sekundách se začnou zobrazovat řádky podobné následujícímu výpisu.

Výpis na sériový port


Při prvním spuštění je vhodné nechat senzor několik minut ustálit. Typická doba odezvy měření CO₂ je přibližně 60 sekund, teplota a vlhkost mohou na změny reagovat ještě pomaleji.

Použití s ESP32

SCD41 lze bez úprav knihovny použít také s ESP32. Napájení se v tomto případě připojí na 3,3 V a při použití běžného ESP32 DevKitu lze sběrnici spustit například takto, případně zvolit jiné vhodné piny:

Wire.begin(21, 22);    //SDA, SCL

Zbytek programu zůstává stejný. U menších desek ESP32-C3 nebo ESP32-S3 se konkrétní piny liší, proto je potřeba ověřit pinout použité desky.

Použití ESP32 dává smysl hlavně v případě, že chceme hodnoty odesílat přes Wi-Fi, ukládat na web, zobrazovat v Home Assistantu nebo dlouhodobě zaznamenávat do databáze.

Teplota a zahřívání senzoru

Naměřenou teplotu je potřeba brát s určitou rezervou. Senzor i okolní elektronika při provozu vytvářejí malé množství tepla, takže naměřená teplota může být vyšší než skutečná teplota vzduchu.

SCD41 proto podporuje nastavení teplotního offsetu. Z výroby je offset nastavený na 4 °C, ale správná hodnota závisí na způsobu montáže, proudění vzduchu, použité krabičce a teple produkovaném okolními součástkami. Nastavení teplotního offsetu ovlivňuje výstup teploty a vlhkosti, nemá ale vliv na samotné měření CO₂.

Přesnou korekci proto nemá smysl nastavovat hned podle náhodného rozdílu. Nejprve je vhodné nechat celé zařízení tepelně ustálit a hodnotu porovnat s jiným teploměrem umístěným ve stejné výšce a ve stejném proudění vzduchu.

Pro přesné měření teploty a vlhkosti může být vhodnější použít samostatné čidlo umístěné dál od zdrojů tepla a SCD41 používat především pro měření CO₂.

Kompenzace nadmořské výšky a tlaku

Koncentraci vypočítanou senzorem ovlivňuje také atmosférický tlak. SCD41 umožňuje nastavit nadmořskou výšku v rozsahu 0 až 3000 metrů nebo mu během měření průběžně předávat aktuální atmosférický tlak z jiného senzoru.

Nastavení není pro základní vyzkoušení nutné, ale může zlepšit přesnost měření. Pokud je k zařízení připojen například BME280, lze jeho naměřený tlak průběžně posílat do SCD41. Přímá kompenzace tlakem má přednost před nastavením nadmořské výšky.

Automatická kalibrace

SCD41 obsahuje automatickou vlastní kalibraci označovanou jako ASC. Algoritmus sleduje dlouhodobý průběh měření a předpokládá, že se senzor pravidelně dostane do prostředí s koncentrací blízkou čerstvému venkovnímu vzduchu.

Výrobce počítá s tím, že se senzor přibližně jednou týdně dostane do vzduchu s koncentrací blízkou referenční hodnotě. Pokud bude senzor trvale umístěný v uzavřeném prostoru, kde koncentrace nikdy neklesne k venkovnímu základu, může automatická kalibrace časem hodnoty posouvat.

V běžném bytě nebo kanceláři, kde se pravidelně větrá, lze automatickou kalibraci většinou nechat zapnutou. U skleníku, terária nebo jiného prostoru s trvale zvýšeným CO₂ je potřeba kalibraci řešit jiným způsobem.

Úsporné režimy

Základní program používá periodické měření s aktualizací každých pět sekund. Průměrný odběr modulu je v tomto režimu přibližně 15 až 18 mA při napájení 3,3 V.

SCD41 podporuje také úsporné periodické měření a režim jednorázového měření. Při jednom měření za pět minut může být průměrný odběr podstatně nižší. Jednorázový režim dostupný právě u SCD41 se hodí pro zařízení napájená z akumulátoru.

Pro běžný pokojový monitor napájený z USB je ale jednodušší nechat senzor měřit nepřetržitě.

Možnosti dalšího použití

Základní program lze rozšířit například o:

  • OLED nebo e-ink displej
  • Barevnou signalizaci pomocí LED
  • Akustické upozornění na vysokou koncentraci CO₂
  • Ukládání měření na SD kartu
  • Odesílání hodnot přes Wi-Fi
  • Propojení s Home Assistantem
  • Automatické ovládání ventilace
  • Záznam teploty, vlhkosti a CO₂ do CSV

Pro trvalý monitoring by se hodilo ESP32 s Wi-Fi, zatímco Arduino UNO je vhodné pro základní měření, lokální displej nebo datalogger bez připojení k síti.

Graf z testovacího měření v ložnici přes noc se zachycením otevření okna

Závěr

SCD41 představuje jednoduchý způsob, jak měřit skutečnou koncentraci oxidu uhličitého pomocí Arduina. Kromě CO₂ poskytuje také teplotu a relativní vlhkost, takže jedním modulem získáme základní přehled o vzduchu v místnosti.

Použitý modul od LaskaKit lze napájet z 3,3 V i 5 V a díky sběrnici I²C potřebuje pouze čtyři vodiče. S Arduinem UNO funguje bez převodníku logických úrovní a stejný modul lze později připojit také k ESP32.

Při použití je potřeba počítat s pomalejší odezvou, zahříváním senzoru a případnou korekcí teploty. Pro přesné dlouhodobé měření je také důležitá správná automatická kalibrace a případně kompenzace nadmořské výšky nebo atmosférického tlaku.

Základní zprovoznění se ukázalo být jednoduché. Po připojení čtyř vodičů, instalaci knihovny a nahrání programu se naměřené hodnoty začnou během několika sekund zobrazovat v sériovém monitoru.

Příště se podíváme na praktickou stavbu domácího monitoringu CO₂.

Tento modul zakoupíte na Laskakit.cz, přímý odkaz je ZDE.

Další díly ze začátečnické série o modulech najdete ZDE.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *