V několika následujících pokračováních našeho seriálu o programování elektroniky si vyzkoušíme metody, pomocí kterých bychom mohli s trochou štěstí detekovat obtěžujícího kuřáka třeba na některém z okolních balkonů bytového domu.
Možná to také znáte. Je parné léto a vy chcete vyvětrat. Jakmile ale dokořán otevřete okno, průvan napříč budovou vtáhne do bytu agresivní cigaretový kouř ze sousedství. Sám s tím bojuji už roky a otravných kuřáků mě nakonec zbavil až covid a přetrvávající ztráta čichu.
Asi se ale shodneme, že virová infekce a dočasná ztráta klíčového smyslu je v boji s kuřáky docela agresivní řešení a vhodnější by bylo něco bezpečnějšího. A jelikož právě teď čtete seriál o programování elektroniky, asi by to měl být nějaký elektronický detektor.
Dnes se podíváme na první z nich, přičemž definitivní detektor bude komplexem hned několika optických a chemických čidel.
SDS011
Jedním z těch potenciálně nejpokročilejších, a přitom cenově stále relativně dostupných je malá krabička SDS011 (datasheet) od čínského výrobce Shandong Nova Fitness, kterou založili inženýři z tamní univerzity.
Na asijských i českých e-shopech ji často najdete i pod názvem Nova PM Sensor, no a jak už tento rozšířený název napovídá, jedná se o detektor prachových částic kategorie PM2,5 a PM10. Tedy drobky s velikostí okolo 2,5 μm, respektive 10 μm.

Prachový senzor SDS011 s USB/UART převodníkem pro snadné připojení k PC. My použijeme jako řídící počítač Raspberry Pi
Čidlo počítá jejich koncentraci v rozsahu 0,0 až 999,9 μg/m3, respektive 0,0 až 1 999,9 μg/m3 a změřené údaje vyjadřuje na adekvátních pinech buď délkou periodického obdélníkového pulzu (2 až 1001 ms odpovídá 0,0 až 999,9 μg/m3), anebo skrze 9600 b/s sériovou linku UART.
Rozptyl světla
Čidlo k měření koncentrace používá princip rozptylu světla – v tomto případě laserového paprsku uvnitř temné komory. Optický detektor pak měří změnu charakteru světla po průchodu prachovými částicemi. Aby mohl být detektor co nejrychlejší, obsahuje také malý ventilátor, který do komory neustále vhání čerstvý vzduch.
Metodu lze ovšem spolehlivě použít jen při relativní vlhkosti nasávaného vzduchu do 70 %. Při vyšší vlhkosti už totiž může na prachových částicích kondenzovat voda, zvětší se jejich objem a detektor nebude schopen podávat spolehlivé výsledky.

Prachové čidlo s nasávací trubičkou ve venkovní krabici s Raspberry Pi 4 a výkonným napájením PoE. Raspberry Pi poslouží skrze USB/UART převodník jako zdroj energie a počítač, který bude číst zprávy s koncentrací
Při použití venku tedy hrozí chybné údaje třeba za deště, kdy relativní vlhkost vzduchu stoupá ke 100 %. I z tohoto důvodu jsem detektor umístil do plastové schránky, ve které u mě na balkoně operuje i Raspberry Pi 4 napájené skrze PoE. Uvnitř schránky je díky jeho odpadnímu teplu i při teplotách pod nulou relativně vysoká teplota a nižší vlhkost.
Kuřákův prach
SDS011 sice primárně slouží k detekci ambientní přírodní a antropogenní prašnosti, prachové částice ale tvoří i kouř z cigarety. A pokud budeme pracovat s předpokladem, že čím silnější zápach, tím i vyšší koncentrace kouře a tedy i drobných částic, měřící jednotka by mohla zápach skutečně detekovat.
Ve výchozím stavu čip SDS011 měří automaticky s frekvencí 1 Hz. To znamená, že se ventilátor po připojení zdroje napájení roztočí a začne blikat laserová LED. Pokud nyní začneme v nekonečné smyčce číst hodnoty ze sériové linky, můžeme se prakticky okamžitě dozvědět, že se něco děje.

Teplo z PoE měniče, Raspberry Pi a ADSB přijímače se postará o to a díky ventilátoru prachového čidla neustálé proudění vzduchu se postarají o to, aby se v krabici držela vlhkost na bezpečné úrovni
Má to ale jednu nevýhodu. Výrobce odhaduje trvanlivost LED zhruba na 8 000 hodin aktivního svitu, což není ani jeden celý rok. LED ale jen krátce blikne, praktická trvanlivost optického zdroje proto bude mnohem vyšší.
Horší je to už se zanášením komory. Pokud bude čidlo vystavené trvale silně prašnému prostředí, po roce a bez důkladné očisty taktéž může vracet velmi shlazené hodnoty. Bohužel, toto není teploměr ale doslova prachový čítač, takže až jeho reálným používáním a sledováním, co vlastně zaznamenává a subjektivním porovnáváním s realitou zjistíte, jestli podává vůbec nějaké smysluplné výsledky.
Raspberry Pi, sériová linka a C
Jelikož krabička kvůli laserové LED a ventilátoru potřebuje solidní 5V napájení (až 1 W), k zapojení použiji zmíněné Raspberry Pi 4 a jeden z volných konektorů USB. SDS011 je totiž dodávané v balení včetně USB/UART převodníku, který nám zároveň bezpečně převede 3V logiku sériové linky na 5V a zpět.

Linuxový Raspberry Pi OS korektně detekoval USB/UART převodník sériové linky, který je dostupný na cestě /dev/ttyUSB0
Na Raspberry Pi mi běží standardní linuxový operační systém Raspberry Pi OS, a tak si to dnes celé naprogramujeme v jazyku C.
Zdrojové kódy najdete také na GitHubu našeho seriálu
Náš textový program bude mít několik parametrů. Tím prvním bude USB zařízení, se kterým se má program spojit, no a tím druhým počet měření, které má program zachytit, než skončí. Zároveň bude umět přepnout modul do režimu spánku s vypnutou laserovou LED a ventilátorem a zase jej probudit.
Aplikační rozhraní sériové linky senzoru toho umí ještě více. Třeba změnit frekvenci automatického měření, anebo jej zcela vypnout s tím, že se budeme požadavky na změření zasílat ručně. My se ale pro jednoduchost dnešního příkladu spokojíme s výchozím stavem. V každém případě, v závěru článku najdete vložené PDF s popisem kontrolního protokolu.
Deset bajtů
Když bychom se pomocí libovolného terminálu sériové linky spojili s čidlem, ve výchozím stavu by měl každou sekundu dorazit sled deseti bajtů v tomto formátu:
AA C0 71 00 85 00 2E 81 A5 AB
- AA: úvodní hlavička
- C0: úvodní hlavička
- 71: spodní bajt koncentrace PM2,5
- 00: horní bajt koncentrace PM2,5
- 85: spodní bajt koncentrace PM10
- 00: horní bajt koncentrace PM10
- 2E: první bajt ID čidla
- 81: druhý bajt ID čidla
- A5: 8bitový kontrolní součet bajtů 71, 00, 85, 00, 2E, 81
- AB: závěrečná patička
Jakmile tuto zprávu přečteme, spojíme spodní a horní bajt obou koncentrací do 16bitových čísel 0077 a 0085, která podělíme 10 a konečně vypočítáme koncentraci v μg/m3.Pokud bychom měli oněch 10 bajtů výše uloženo v poli zprava, pak by přepočet mohl vypadat v jazyku C třeba takto:
uint8_t zprava[10] = {0xAA, 0xC0, 0x71, 0x00, 0x85, 0x00, 0x2E, 0x81, 0xA5, 0xAB};
uint16_t _pm25 = (zprava[3] * 256) + zprava[2];
uint16_t _pm10 = (zprava[5] * 256) + zprava[4];
float pm25 = (float)_pm25 / 10.0f
float pm10 = (float)_pm10 / 10.0f
Pokračování článku patří k prémiovému obsahu pro předplatitele
Chci Premium a Živě.cz bez reklam
Od 41 Kč měsíčně