Tentokrát se mi dostal do ruky použitý modul LaskaKit SGP41 VOC a NOx. Senzory kvality vzduchu mě zajímají už delší dobu a SGP41 mě zaujal tím, že sleduje dvě různé skupiny plynů – VOC a NOx.
Protože jsem modul získal použitý, první otázkou je, jestli je senzor stále v pořádku. SGP41 má naštěstí vestavěný self-test, takže si jeho základní funkčnost můžeme ověřit přímo programem.
Pro první pokus použiju LOLIN D1 mini V4.0 s ESP8266. Modul připojím přes I²C, vyzkouším komunikaci, self-test a potom budeme sledovat jak surové hodnoty senzoru, tak vypočítané VOC a NOx indexy.

Co je SGP41
SGP41 od firmy Sensirion je digitální senzor kvality vzduchu založený na technologii MOx – metal oxide. Uvnitř jsou dva snímací prvky s vlastními mikroohřívači. Jeden poskytuje signál citlivý především na VOC a druhý na oxidující plyny, mezi které patří například NOx nebo ozon.
Plyn působí na zahřívanou snímací vrstvu a mění její elektrický odpor. Elektronika senzoru tuto změnu zpracuje a přes I²C poskytne dvě 16bitové hodnoty označené jako SRAW_VOC a SRAW_NOX.
Tyto surové hodnoty ale ještě nejsou výsledkem typu „tolik ppm VOC“. Sensirion doporučuje zpracovat je pomocí svého Gas Index Algorithm, který běží v připojeném mikrokontroléru a vytváří z nich VOC Index a NOx Index.

Co jsou VOC a NOx
Zkratka VOC znamená Volatile Organic Compounds, tedy těkavé organické látky. Jde o velkou skupinu různých látek, jejichž množství se může ve vzduchu měnit například při vaření, úklidu nebo používání různých chemických prostředků.
NOx je společné označení oxidů dusíku. SGP41 ale není laboratorní analyzátor konkrétního plynu. Jeho NOx část reaguje obecně na oxidující plyny a datasheet mezi nimi zmiňuje také ozon.
To je důležité pro správné pochopení výsledku. Senzor nám neříká přesnou koncentraci konkrétní chemické látky, ale spíš sleduje změnu složení vzduchu.
VOC Index
Pro běžné použití je mnohem zajímavější VOC Index než samotná hodnota SRAW_VOC.
Algoritmus Sensirion sleduje předchozí chování senzoru a přizpůsobuje se prostředí, ve kterém pracuje. Hodnota 100 představuje běžný průměr daného prostředí. Algoritmus používá jako základ historii přibližně za posledních 24 hodin.
Pokud VOC Index stoupne nad 100, znamená to vyšší výskyt VOC proti naučenému průměru. Hodnoty pod 100 naopak znamenají nižší množství VOC proti tomuto průměru. Rozsah indexu je podle datasheetu 1 až 500.
To zároveň znamená, že třeba hodnota 150 není koncentrace 150 ppm ani 150 µg/m³. Je to relativní index, který říká, že je momentální stav výraznější než stav, na který je senzor zvyklý.
NOx Index
NOx Index funguje trochu jinak. Běžná základní úroveň je mapována na hodnotu 1. Pokud senzor zaznamená událost spojenou s vyšším množstvím oxidujících plynů, index začne růst směrem k hodnotě 500.
I tady jde o relativní hodnotu vycházející z předchozí historie senzoru, nikoliv o přímé měření koncentrace NO₂ nebo jiného konkrétního plynu.
Právě kombinace VOC a NOx indexu může být zajímavá při dlouhodobém sledování vzduchu, protože různé události mohou oba senzory ovlivnit rozdílně.
SGP41 neměří přímo µg/m³
Tady je dobré upozornit na jednu věc. Na některých produktových stránkách lze u SGP41 narazit na údaj o rozsahu v µg/m³. Samotný datasheet SGP41 ale obecný výstup koncentrace VOC nebo NOx v µg/m³ nepopisuje.
Senzor poskytuje SRAW_VOC a SRAW_NOX a z nich se počítají relativní VOC a NOx indexy. Sensirion přímo uvádí, že u MOx (metal-oxide) senzoru, tedy senzoru založeného na změně odporu zahřívané vrstvy oxidu kovu, není vhodné za reálných podmínek převádět výstup na univerzální koncentraci. Pro praktické použití proto doporučuje právě Gas Index.
Proto budu v tomto článku pracovat pouze se surovými hodnotami a VOC/NOx indexem.
Základní parametry
| Parametr | Hodnota |
|---|---|
| Senzor | Sensirion SGP41 |
| Komunikace | I²C |
| I²C adresa | 0x59 |
| Napájení holého čipu SGP41 | 1,7 až 3,6 V |
| Typický proud při měření | 3,0 mA při 3,3 V |
| Maximální proud při měření | 3,4 mA |
| Typický proud v klidu | 34 µA |
| Výstup | SRAW_VOC, SRAW_NOX |
| VOC Index | 1 až 500 |
| NOx Index | 1 až 500 |
| Doporučený interval měření | 1 s |
| Doporučená provozní teplota | −10 až +50 °C |
| Provozní vlhkost | 0 až 90 % RH, bez kondenzace |
Samotný čip SGP41 je opravdu malý a měří jen 2,44 × 2,44 mm. Na použitém modulu LaskaKit je samozřejmě připájený na větší desce s konektory, takže se s ním při bastlení pracuje mnohem pohodlněji. Modul LaskaKit má rozměry přibližně 22,6 × 21,5 mm.

Použitý hardware
Pro první test použiju:
- LaskaKit SGP41 VOC a NOx – vlastní senzor kvality vzduchu
- LOLIN D1 mini V4.0 – řídicí deska s ESP8266
- propojovací vodiče – propojení I²C a napájení
ESP8266 je pro tento pokus vhodný hlavně tím, že pracuje s 3,3 V logikou. Nemusíme tedy řešit převod úrovní mezi mikrokontrolérem a senzorem.
Zapojení
SGP41 komunikuje přes klasickou I²C sběrnici, takže potřebujeme pouze napájení, zem a dvojici SDA/SCL.

Na LOLIN D1 mini V4.0 jsou I²C piny dokonce přímo označené na spodní straně desky.
| SGP41 | LOLIN D1 mini | Význam |
|---|---|---|
| VCC | 3V3 | Napájení |
| GND | GND | Zem |
| SDA | GPIO4 / SDA | Data I²C |
| SCL | GPIO5 / SCL | Hodiny I²C |
Důležité je napájet modul z 3,3 V. Samotný SGP41 má podle datasheetu maximální povolené napájecí napětí 3,6 V.

Instalace knihoven
Pro komunikaci se senzorem použiju přímo knihovny od výrobce Sensirion.
V Arduino IDE otevři Manažera knihoven a nainstaluj Sensirion I2C SGP41 a Sensirion Gas Index Algorithm.
První knihovna zajišťuje vlastní komunikaci se senzorem a druhá převádí surové hodnoty na VOC a NOx Index. Knihovna Sensirion I2C SGP41 používá také společnou závislost Sensirion Core.
Testovací program
Pro první test jsem připravil program, který dělá několik věcí najednou.
Po spuštění inicializuje I²C, načte sériové číslo senzoru a provede jeho vestavěný self-test. Potom proběhne desetisekundová příprava NOx snímače a následně se přibližně jednou za sekundu vypisují SRAW_VOC, SRAW_NOX, VOC Index a NOx Index.
Program vychází z postupu a funkcí použitých v oficiálních příkladech Sensirion, pouze je upravený pro ESP8266 a pro přehlednější výpis na sériový port.
///////////////////////SGP41 TEST fw v.0.1 //////////////////////////////////
///////////////////////18.8.2026 /////////////////////////////////////////////
///////////////////////www.michaluvbrloh.cz//////////////////////////////////
#include <Wire.h> //komunikace po I2C
#include <SensirionI2CSgp41.h> //ovládání senzoru SGP41
#include <VOCGasIndexAlgorithm.h> //výpočet VOC Indexu
#include <NOxGasIndexAlgorithm.h> //výpočet NOx Indexu
const byte SDA_PIN = 4; //SDA na GPIO4
const byte SCL_PIN = 5; //SCL na GPIO5
uint16_t conditioning = 10; //doba přípravy NOx části v sekundách
SensirionI2CSgp41 sgp41; //objekt senzoru
VOCGasIndexAlgorithm vocAlgoritmus; //algoritmus VOC Indexu
NOxGasIndexAlgorithm noxAlgoritmus; //algoritmus NOx Indexu
/////////////////////////////po spuštění///////////////////////////////////////////////////////////////////////////////////////
void setup()
{
Serial.begin(115200); //start sériové linky
delay(1000); //pauza po startu
Wire.begin(SDA_PIN, SCL_PIN); //start I2C
sgp41.begin(Wire); //inicializace SGP41
Serial.println();
Serial.println(F("SGP41 VOC + NOx test"));
Serial.println();
vypisSerioveCislo(); //načti sériové číslo
selfTest(); //proveď kontrolu senzoru
}
/////////////////////////////hlavní smyčka/////////////////////////////////////////////////////////////////////////////////////
void loop()
{
zmerVzduch(); //proveď měření
}
/////////////////////////////sériové číslo/////////////////////////////////////////////////////////////////////////////////////
void vypisSerioveCislo()
{
uint16_t serialNumber[3]; //48bitové sériové číslo jako 3x16 bit
uint16_t error;
error = sgp41.getSerialNumber(serialNumber);
if(error)
{
Serial.print(F("Chyba cteni serioveho cisla: "));
Serial.println(error);
}
else
{
Serial.print(F("Seriove cislo: 0x"));
for(byte i = 0; i < 3; i++)
{
if(serialNumber[i] < 0x1000) Serial.print('0');
if(serialNumber[i] < 0x0100) Serial.print('0');
if(serialNumber[i] < 0x0010) Serial.print('0');
Serial.print(serialNumber[i], HEX);
}
Serial.println();
}
}
/////////////////////////////self-test/////////////////////////////////////////////////////////////////////////////////////////
void selfTest()
{
uint16_t testResult;
uint16_t error;
Serial.print(F("Self-test: "));
error = sgp41.executeSelfTest(testResult);
if(error)
{
Serial.print(F("chyba komunikace "));
Serial.println(error);
}
else if(testResult == 0xD400)
{
Serial.println(F("OK"));
}
else
{
Serial.print(F("CHYBA, vysledek 0x"));
Serial.println(testResult, HEX);
}
}
/////////////////////////////měření vzduchu////////////////////////////////////////////////////////////////////////////////////
void zmerVzduch()
{
const uint16_t defaultRh = 0x8000; //výchozí hodnota 50 % RH
const uint16_t defaultT = 0x6666; //výchozí hodnota 25 °C
uint16_t srawVoc = 0; //surový VOC signál
uint16_t srawNox = 0; //surový NOx signál
uint16_t error;
delay(1000); //měření jednou za sekundu
if(conditioning > 0)
{
error = sgp41.executeConditioning(defaultRh, defaultT, srawVoc);
if(error)
{
Serial.print(F("Chyba kondicionovani: "));
Serial.println(error);
}
else
{
Serial.print(F("Priprava senzoru: "));
Serial.print(11 - conditioning);
Serial.println(F("/10 s"));
}
conditioning--;
return;
}
error = sgp41.measureRawSignals(defaultRh, defaultT, srawVoc, srawNox);
if(error)
{
Serial.print(F("Chyba mereni: "));
Serial.println(error);
return;
}
int32_t vocIndex = vocAlgoritmus.process(srawVoc); //výpočet VOC Indexu
int32_t noxIndex = noxAlgoritmus.process(srawNox); //výpočet NOx Indexu
Serial.print(F("SRAW VOC: "));
Serial.print(srawVoc);
Serial.print(F(" SRAW NOx: "));
Serial.print(srawNox);
Serial.print(F(" VOC Index: "));
Serial.print(vocIndex);
Serial.print(F(" NOx Index: "));
Serial.println(noxIndex);
}
Po nahrání programu otevři Sériový monitor na rychlosti 115200 baud.
Nejdřív by se mělo zobrazit sériové číslo čipu a výsledek self-testu. Pokud je všechno v pořádku, následuje přibližně deset sekund přípravy senzoru a potom pravidelný výpis naměřených hodnot.
VOC a NOx index se začne zobrazovat až po delší chvíli.

Proč se senzor po startu připravuje
SGP41 obsahuje vyhřívané snímací vrstvy. Po zapnutí nebo po předchozím vypnutí ohřevu musí před normálním měřením proběhnout tzv. conditioning.
U SGP41 trvá doporučená conditioning fáze 10 sekund. Datasheet zároveň upozorňuje, že tato fáze nemá být delší než 10 sekund, protože jiný režim ohřevu NOx snímacího prvku by při příliš dlouhém použití mohl poškodit citlivou vrstvu.
Těchto deset sekund ale neznamená, že je po jejich uplynutí senzor kompletně ustálený.
SGP41 dokáže změnu VOC nebo NOx začít spolehlivě detekovat do jedné minuty, ale dosažení plných specifikací trvá podstatně déle. Datasheet uvádí u VOC Indexu typicky méně než 1,5 hodiny a u NOx Indexu méně než 6 hodin. U samotného surového NOx signálu je náběh ještě výrazně delší.
Proto není dobré zapnout SGP41 na několik sekund, přečíst jedno číslo a podle něj hodnotit kvalitu vzduchu. Senzor dává větší smysl při dlouhodobém provozu.
Kompenzace teploty a vlhkosti
Na výsledný signál senzoru má vliv také teplota a vlhkost vzduchu. SGP41 proto umožňuje při každém měření předat aktuální teplotu a relativní vlhkost a podle nich svoje surové signály kompenzovat.
Samotný SGP41 ale teplotu ani vlhkost neměří.
V jednoduchém programu používám výchozí hodnoty 25 °C a 50 % RH. Při použití těchto výchozích hodnot je kompenzace podle skutečných podmínek vypnutá. Pro první ověření funkčnosti senzoru to stačí, ale pro přesnější dlouhodobý monitoring by bylo lepší připojit ještě samostatné čidlo teploty a vlhkosti.
Oficiální příklad Sensirion používá společně se SGP41 například senzor SHT4x a jeho hodnoty posílá do SGP41 při každém měření.
To může být zajímavé rozšíření pro další pokus.
Praktický test
Po základním ověření komunikace je nejzajímavější nechat senzor delší dobu běžet v místnosti a potom sledovat jeho reakci na různé změny vzduchu.
Pro dlouhodobé logování jsem program pro ESP lehce upravil tak, aby naměřené hodnoty vypisoval ve formátu snadno zpracovatelném v počítači. Pro PC jsem pak vytvořil jednoduchý program, který data ukládá do souboru CSV a zároveň z nich vykresluje grafy.
Protože VOC a NOx Index pracují relativně vůči předchozí historii, není nejdůležitější samotná číselná hodnota, ale hlavně její změna v čase.
Po několika hodinách měření se ukázalo, že senzor velmi výrazně reaguje na těkavé organické látky. Otevření lahve s acetonem přibližně 10 cm od senzoru způsobilo během několika sekund nárůst VOC Indexu až na maximální hodnotu 500. Návrat k běžným hodnotám potom trval několik hodin.

Naopak při pokusu s kouřem z opálené špejle ani se spalinami z plynového zapalovače nebyla pozorována změna NOx Indexu. Ten se během celého více než dvanáctihodinového měření držel na základní hodnotě 1.

SRAW_NOX – špička před 400. minutou odpovídá zachycenému pokusu se špejlíZatímco NOx Index zůstal po celou dobu na základní hodnotě 1, na surovém signálu SRAW_NOX byly vidět menší změny i při některých dalších pokusech. Je tedy vidět, že NOx část senzoru reaguje, ale změna nejspíš nebyla natolik výrazná nebo dlouhá, aby ji algoritmus vyhodnotil jako významnou NOx událost.
Na co si dát pozor
SGP41 není čidlo určené pro jednorázové okamžité změření přesné koncentrace konkrétního plynu. Nejlépe se hodí pro dlouhodobé sledování změn kvality vzduchu, při kterém má Gas Index Algorithm čas vytvořit si historii prostředí.
Při umístění senzoru je potřeba zajistit přístup okolního vzduchu k otvoru v čipu. Sensirion zároveň nedoporučuje během provozu vystavovat senzor intenzivnímu slunečnímu nebo umělému světlu a neměl by pracovat v podmínkách, kde na něm může kondenzovat voda.
Zajímavá je i spotřeba. Samotný SGP41 při kontinuálním měření odebírá při 3,3 V typicky kolem 3 mA. Není to mnoho, ale kvůli vyhřívaným snímacím vrstvám a potřebě dlouhodobého měření není ideální jednoduše senzor neustále vypínat mezi jednotlivými vzorky.
Kam se SGP41 hodí
SGP41 dává smysl hlavně jako součást dlouhodobého domácího monitoru kvality vzduchu, větracího systému, čističky vzduchu nebo dataloggeru. Díky ESP8266 by nebyl problém hodnoty ukládat, zobrazovat na webové stránce nebo odesílat na server a sledovat jejich průběh v grafu.
Zvlášť zajímavá je možnost zkombinovat SGP41 s dalšími čidly. CO₂, teplota, vlhkost, prachové částice a VOC/NOx totiž popisují různé vlastnosti vzduchu a jeden senzor sám o sobě neřekne všechno.
Závěr
SGP41 je trochu jiný senzor, než by se podle označení „VOC a NOx senzor“ mohlo na první pohled zdát. Nedostaneme z něj jednoduchou koncentraci konkrétního plynu, ale dva surové signály, které se pomocí algoritmu Sensirion převádějí na relativní VOC a NOx index.
Pro první pokus je zapojení jednoduché. K LOLIN D1 mini stačí čtyři vodiče, komunikace běží přes I²C a pro ESP8266 nepotřebujeme žádný převodník logických úrovní.
Praktické měření ukázalo velmi výraznou reakci VOC části na aceton, kdy VOC Index během několika sekund vystoupal až na maximální hodnotu 500. NOx Index naopak během celého více než dvanáctihodinového měření zůstal na základní hodnotě 1. Na surovém signálu SRAW_NOX ale byly při některých pokusech vidět menší změny, takže i tato část senzoru na okolní prostředí reaguje.
Pro další pokus bych k SGP41 doplnil čidlo teploty a vlhkosti a zapnul skutečnou kompenzaci podle aktuálních podmínek. Zajímavé by bylo také dlouhodobější měření v běžném provozu a porovnání změn VOC a NOx indexu během několika dnů.
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.
