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.

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 ppm | Venkovní vzduch | Současná koncentrace CO₂ ve venkovní atmosféře se pohybuje přibližně kolem této hodnoty |
| 430–800 ppm | Velmi dobré | Čerstvý nebo velmi dobře větraný vzduch |
| 800–1000 ppm | Dobré | Běžná hodnota v dobře větrané obývané místnosti |
| 1000–1500 ppm | Zhorš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 ppm | Velmi špatné | Hygienicky nepřijatelná kvalita vzduchu, místnost je vhodné důkladně vyvětrat |
| 5000 ppm a více | Mimo běžný provoz místnosti | Takto 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
| Parametr | Hodnota |
|---|---|
| Měřené veličiny | CO₂, 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 vlhkosti | 0 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 adresa | 0x62 |
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.

| SCD41 | Arduino UNO | Funkce |
|---|---|---|
| VCC | 5 V | Napájení |
| GND | GND | Společná zem |
| SDA | A4 | Data sběrnice I²C |
| SCL | A5 | Hodiny 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.

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.

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.

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.
