LK-29 je smart meteostanica doplnená o meranie rádioaktivity okolia a indikátor kvality ovzdušia, s webovým rozhraním a podporou ukladania nameraných hodnôt do databázy. Beží na mikrokontroléri ESP32-S3 s firmvérom napísaným v MicroPythone. Systém je navrhnutý pre nepretržitú prevádzku s minimálnou spotrebou energie a možnosťou vzdialenej konfigurácie.
Popis hardvéru
Jadrom obvodového riešenia je mikroradič ESP32-S3-Zero, použil som modul od Waveshare ESP32-S3FH4R2, Type-C USB
, ktorý na čipe integruje dvojjadrový procesor Xtensa® 32-bit LX7 s frekvenciou do 240 MHz, podporu 2,4 GHz Wi-Fi (802.11 b/g/n) a Bluetooth® 5 (LE). Má vstavanú 512 KB SRAM a 384 KB ROM, Flash pamäť 4 MB a 2 MB PSRAM. Modul má keramickú wifi anténu prispájkovanú priamo na doske, integrovaný USB sériový port s plnorýchlostným radičom, 24 × GPIO vývodov umožňujúcich flexibilne konfigurovať funkcie jednotlivých vývodov ako 4 × SPI, 2 × I2C, 3 × UART, 2 × I2S, 2 × ADC, atď.
Celková schéma zapojenia meteostanice je na obrázku. Jadro hardvéru meteostanice tvorí počítačom riadený obvod na doske plošných spojov (DPS), ktorá je zabudovaná do skrinky osadenej konektormi XS1 na pripojenie napájacieho napätia a konektormi XS3, XS4 na pripojenie I2C senzorov.


Konektory som zvolil masívnejšie s lepším krytím IP67 pre použitie vo vonkajšom prostredí. ePaper displej je doplnková voľba (nemusí byť pripojený), ak chcete vidieť namerané hodnoty v mieste umiestnenia stanice. Jeho prednosťou je, že zobrazuje údaje aj v stave po odpojení napájania a jeho priemerná spotreba počas obnovovania je 26,4 mW a mimo tohto času je odber menší ako 10 nA, takže „nežerie“ takmer nič. Nevýhodou je dlhšia doba obnovenia, ~14 sekúnd, počas ktorej displej bliká, čo kompenzuje jeho nízka cena. Ja som nastavil interval 15 minút, ale táto hodnota sa môže podľa ľubovôle zmeniť. Na konektor XS3 som pripojil I2C senzor BME688, ktorý poskytuje údaje o teplote, atmosférickom tlaku, vlhkosti a kvalite ovzdušia s vysokou presnosťou.
Konektor XS4 je rezerva pre plánované pripojenie ďalších senzorov, napríklad UV žiarenia, alebo vlhkosti pôdy, alebo niečo iné. Meranie radiácie zabezpečujú obvody sústredené na DPS, schéma zapojenia týchto obvodov je na obrázku vyššie.
Intenzita radiácie sa meria pomocou Geiger-Müllerovej trubice (ďalej GM). Princíp je jednoduchý: sklenená GM trubica je naplnená vzácnym plynom, obyčajne neónom, argónom…, alebo zmesou vzácneho plynu a halogénu, ako je chlór či bróm. Obsahuje dve elektródy, na ktoré je privedené vysoké jednosmerné napätie 400 V až 600 V. Prechod častice plynom vyvolá ionizujúci výboj, ktorý sa prejaví prúdovým impulzom na elektródach. Tie meriame. Zdroj potrebného vysokého napätia, ktoré sa privádza na elektródy GM trubice je tvorený Cockcroft–Walton (CW) generátorom, alebo to môžeme nazývať aj násobičom. Tu sa treba pristaviť a prehrýzť sa troškou nezáživnej teórie.
Uvyst = 2 x N x Upeak, kde Upeak je špičkové napätie generované cievkou (viď popis nižšie)
Aby VN napätie neklesalo treba vhodne zvoliť všetky parametre CW generátora, pre ktorý platí vzorec pre výpočet poklesu napätia:
\[ \Delta V = \frac{ \frac{I}{f C} \cdot N \left( N + 1 \right) \left( 2N + 1 \right) }{12} \]
kde f je vstupná frekvencia, N je počet stupňov, C je kapacita kondenzátora a I je zaťažovací prúd.
Pri výpočte som vychádzal z predpokladu, že bežná GM trubica (napríklad SBM-20) má pracovný prúd do 20 µA. Odporúča sa pracovná frekvencia medzi 5 kHz až 10 kHz, zvolil som 7 kHz, čo aj ESP32 dobre zvládne, aj spínací tranzistor bude mať pracovný bod ďaleko od medznej frekvencie fT.
To znamená, že pre každý jeden cyklus je potrebná energia:
\[ E_{cyklus} = \frac{P_{vyst}}{f} = 1{,}43 \times 10^{-6} \, \text{J} \]
pričom energia v cievke je:
\[ E = \frac{1}{2} L I_{\text{peak}}^2, \quad \text{kde} \quad I_{\text{peak}} = \frac{V_{\text{in}} \times t_{\text{on}}}{L}, \quad \text{takže} \quad E = \frac{1}{2} L \left( \frac{V_{\text{in}} \times t_{\text{on}}}{L} \right)^2 = \frac{(V_{\text{in}} \times t_{\text{on}})^2}{2L} \]
Z týchto vzťahov je jasné, že výstupné VN napätie sa dá pohodlne riadiť zmenou striedy a pre naše hodnoty VN = 500 V, I = 20 µA, požadovaný výkon 10 mW a energiu v cievke E = 1,43 µJ bude strieda 23,6 % (za ideálnych podmienok).
\[ D = \frac{t_{\text{on}}}{T}, \quad \text{a} \quad t_{\text{on}} = 33{,}8 \, \mu\text{s}, \quad \text{je strieda } 23{,}6\,\% \]
Z týchto vzťahov sa dá vypočítať, že pri striede 50 % bude výstupný výkon 44,7 mW a pri 90 % striede bude výkon 145 mW. Toto sú teoretické hodnoty, ale dávajú záruku, že pri vyššej radiácii bude zdroj schopný dodávať potrebný výkon, aby VN napätie na GM trubici neklesalo a trubica nestratila schopnosť ionizácie plynu a teda generovať impulzy pri prechode ionizujúcej častice.
Z vyššie uvedenej teórie vyplýva, že postačuje 3-stupňový CW generátor pre požadovaný rozsah napätia 300 V – 600 V (pri zohľadnení všetkých strát). Každý stupeň tvorí dvojica diód a kondenzátorov. Počas záporných a kladných polovĺn vstupného striedavého napätia sa kondenzátory postupne nabíjajú a výsledné napätie na výstupe je tak násobkom vstupného napätia. Vstupné striedavé napätie pre CW generátor je generované mikropočítačom ESP32 na vývod GPIO7 s frekvenciou 7 kHz a premenlivou striedou. To umožní nastavovanie výstupného vysokého napätia vo veľkom rozsahu. Tieto impulzy s premenlivou striedou budia tranzistor Q2 cez rezistor R12. Pri otvorenom tranzistore Q2 tečie cievkou prúd, ktorý vytvára magnetické pole v jadre cievky, keď sa tranzistor zavrie, energia tohoto magnetického poľa indukuje na koncoch cievky napätie. Tieto napäťové špičky majú amplitúdu až 200 V, čo zužitkuje následný CW generátor tvorený diódami D1, D2, D3 a kondenzátormi C4, C5 a C10. Teoreticky je možné takto dosiahnuť až 1200 V pri trojstupňovom CW, čo je optimistické a nezohľadňuje reálne parametre súčiastok (prechodové odpory, parazitné kapacity, strmosť spínania a rozpínania tranzistora …).
Teoretické výpočty CW generátora som overil praktickým meraním hodnôt:
| Žiadaná hodnota [V] | Výstupné napätie [V] | Duty cycle [%] | Odchýlka [V] | Odchýlka [%] |
| 100,00 | 228,41 | 9,97 | -128,41 | -128,41 % |
| 125,00 | 228,19 | 9,97 | -103,19 | -82,55 % |
| 150,00 | 228,43 | 9,97 | -78,43 | -52,28 % |
| 175,00 | 228,05 | 9,97 | -53,05 | -30,31 % |
| 200,00 | 228,11 | 9,97 | -28,11 | -14,05 % |
| 225,00 | 228,18 | 9,97 | -3,18 | -1,41 % |
| 250,00 | 245,17 | 11,14 | 4,83 | 1,93 % |
| 275,00 | 268,75 | 12,90 | 6,26 | 2,27 % |
| 300,00 | 296,34 | 14,86 | 3,66 | 1,22 % |
| 325,00 | 320,78 | 16,42 | 4,22 | 1,30 % |
| 350,00 | 347,01 | 18,38 | 2,99 | 0,85 % |
| 375,00 | 374,65 | 20,43 | 0,35 | 0,09 % |
| 400,00 | 394,64 | 21,99 | 5,37 | 1,34 % |
| 425,00 | 421,74 | 24,15 | 3,26 | 0,77 % |
| 450,00 | 447,34 | 26,20 | 2,66 | 0,59 % |
| 475,00 | 470,50 | 28,15 | 4,50 | 0,95 % |
| 500,00 | 495,73 | 30,40 | 4,27 | 0,85 % |
| 525,00 | 522,33 | 32,85 | 2,67 | 0,51 % |
| 550,00 | 545,59 | 35,19 | 4,41 | 0,80 % |
| 575,00 | 571,65 | 38,22 | 3,35 | 0,58 % |
| 600,00 | 596,20 | 40,96 | 3,80 | 0,63 % |
| 625,00 | 620,15 | 44,48 | 4,85 | 0,78 % |
| 650,00 | 644,96 | 48,29 | 5,04 | 0,78 % |
| 675,00 | 670,13 | 52,79 | 4,87 | 0,72 % |
| 700,00 | 696,30 | 58,75 | 3,71 | 0,53 % |
| 725,00 | 723,70 | 65,69 | 1,30 | 0,18 % |
| 750,00 | 712,11 | 89,93 | 37,89 | 5,05 % |
| 775,00 | 712,22 | 89,93 | 62,78 | 8,10 % |
| 800,00 | 711,80 | 89,93 | 88,20 | 11,02 % |
Zaujímalo ma ako sa bude obvod správať vrátane PID regulátora. Na presnosť nameraných výsledkov má vplyv hodnota DEADBAND PID regulátora (vysvetlené nižšie), ktorú som nastavil na 5 V. Graf na obrázku
ukazuje závislosť želanej a skutočnej hodnoty výstupného vysokého napätia. Z grafu vidno, že závislosť je v rozmedzí 250 až 700 V prakticky lineárna. Graf závislosti šírky budiacich impulzov CW generátora (duty cycle) zobrazuje
tento obrázok. Nedá sa očakávať, že CW generátor bude pracovať dobre ak bude strieda menšia ako 10 %, alebo väčšia ako 90 %, preto sú možné hodnoty striedy limitované na tento rozsah. Teoretický predpoklad (podľa výpočtu) hovoril, že 500 V dosiahneme pri striede 23,6 %. Pre 500 V je skutočná nameraná hodnota striedy 30,4 %, čo je perfektný výsledok, lebo tranzistor Q2 nie je ideálny spínací prvok a vzhľadom na to, že ide o tranzistor s veľkým záverným napätím CE sa dá očakávať, že prúdový zosilňovací činiteľ h21e bude rádovo desiatky, čo znamená vyššie straty počas nábežnej aj dobežnej hrany kvôli obmedzenej veľkosti bázového prúdu, ktorý môže poskytnúť GPIO výstup ESP32. Veľkosť striedy má len informatívny charakter pre posúdenie zhody s teóriou. Ako vplýva charakteristika spínania tranzistora na zhodu s teóriou, možno ilustrovať na tomto príklade. Rezistor R12 s hodnotou 2k7 v báze tranzistora Q2 som nahradil rezistorom s hodnotou 10k a strieda sa zmenila z 30 % na 43 % pri 500 V na výstupe. Uvádzam to len pre ilustráciu, ako sú dôležité spínacie charakteristiky tranzistora Q2 pre správnu činnosť CW generátora. V tomto zapojení to nie je kritické, lebo o nastavenie správneho výstupného napätia sa postará PID regulátor. Kritické by to bolo v aplikácii s otvorenou regulačnou slučkou. Percentuálnu odchýlku žiadanej a skutočnej hodnoty zobrazuje tento graf: 
Z grafu vidno, že presnosť nastavenia výstupného napätia zodpovedá očakávaniu.
Takto vytvorené vysoké napätie (VN) je privedené cez rezistor R6 na jednu elektródu GM trubice a cez odporový delič (R1+R2+R3+R4+R5)/R16 je toto VN zmenšené na tisícinu a cez filter C9,R11,C11 je privedené na vstup GPIO6, ktorý je nastavený ako vstup AD prevodníka. Takže ak je VN 500 V, na vstupe AD prevodníka je 0,5 V. Pomocou softvérového PID regulátora sa udržiava na elektróde GM trubice požadované VN napätie, ktoré sa dá nastavovať cez konfiguračnú web stránku a jeho nastavená hodnota závisí od použitej GM trubice. DPS je navrhnutá tak, aby sa dali použiť rôzne typy GM trubíc. Diódy D6 a D8 majú ochrannú funkciu AD prevodníka, ktorého vstupné napätie má byť v rozsahu 0 V – 1 V. Celkový úbytok napätia na týchto dvoch diódach (pri otvorení) sa pohybuje okolo 1,1 V, čo ochráni ESP32 pred zničením. Privedenie 3 V, alebo 5 V na tento vstup v režime AD prevodníka spoľahlivo zničí ESP32 (čo som neskúšal, verím výrobcovi). Keďže GM trubice majú pomerne široký rozsah VN napätia, pri ktorom spoľahlivo pracujú, nerobil som si starosti s presnosťou deliča, použil som rezistory s presnosťou 1 %, a teda presnosť merania (ak nezohľadníme nelinearitu a zašumenie AD prevodu) by mohla byť 2 %, a je určite lepšia ako 5 %. Vývody GPIO8 a GPIO9 mikropočítača sú použité na I2C zbernicu pre komunikáciu s inými zariadeniami. Diódy D9 až D12 chránia zbernicu pred indukovaným prepätím. Na vstup GPIO1 sú generované impulzy ionizujúcim žiarením z GM trubice upravené deličom R7, R15, C3 a sú programom počítané. Z nich je vypočítaná hodnota žiarenia v Sievertoch za hodinu. Cez odporový delič R8/R14 je napájacie napätie 5 V privedené na vstup GPIO2, ktorý je nastavený do režimu vstupu druhého AD prevodníka. Diódy D5 a D7 majú ochrannú funkciu, ako už bolo popísané a rezistor R9 s kondenzátorom C8 zabezpečujú filtráciu a stabilitu pri meraní napätia. Cez výstup GPIO10 a tranzistor Q1 je budený piezomenič BUZZER1 na akustickú signalizáciu prekročenia hraničných hodnôt. Jeho použitie nie je nevyhnutné a nie je až tak dôležité pre správnu funkciu meteostanice LK-29. Cievka L1 a ostatné kondenzátory majú filtračný charakter a majú zabrániť prenikaniu rušenia do meracích častí obvodov.
Všetky súčiastky sú umiestnené na jednom obojstrannom plošnom spoji o rozmeroch 140 x 80 mm (po odlomení výstupkov 120 x 80 mm). Spodná a horná strana motívu plošného spoja, osadzovací plán a trojrozmerné vyobrazenie sú na nasledujúcich obrázkoch.


Priestor pre GM trubicu je navrhnutý tak, aby bolo možné použiť ľubovoľnú GM trubicu menšiu ako 120 mm.
Plošný spoj som sa rozhodol navrhnúť technológiou THT (Through-Hole Technology ), aby bol dobre zrealizovateľný v amatérskych podmienkach aj menej skúseným rádioamatérom. Tvar plošného spoja zodpovedá rozmerom skrinky Kradex ZP15010060UJPH-PC, do ktorej som ho zabudoval.
Keďže dosku nebolo možné navrhnúť ako jednostrannú (čo by umožnilo domácu výrobu) bez použitia veľkého množstva prepojok, rozhodol som sa pre obojstranné vyhotovenie. Objavil som spoločnosť PCBWay, ktorá dokáže vyrobiť aj malé množstvo dosiek vo veľmi krátkom čase a v profesionálnej kvalite, čo je výhodné pri výrobe prototypov. Záujemcovia o stavbu si môžu objednať továrensky otestovanú dosku plošných spojov (pod číslom W1035028AS5P2) na webovej stránke www.pcbway.com.
Výstupky DPS na pravej a ľavej strane sa dajú odlomiť, alebo odstrihnúť, potom má DPS štandardný rozmer 120 x 80 mm. Skrinka má krytie IP65, čo je vhodné aj do nepriaznivých poveternostných podmienok, ktoré môžu panovať vonku. Vhodné puzdro pre senzor som vytlačil na 3D tlačiarni, vrátane jeho držiaka. Obrázok modelu zostavy aj s prívodným káblom a priechodkou PG7 je na nasledujúcom obrázku.
Kruhové puzdro má po obvode oválne otvory, aby dobre prúdil vzduch k snímaču. Dovnútra som vložil nerezové sitko z vodárenského Y ventilu s otvormi 400 µm, aby som zabránil vstupu hmyzu a pavúkov.
Je jasné, že treba vybrať vhodné miesto bez priameho slnečného osvetlenia senzora, aby údaje o teplote vzduchu boli hodnoverné.
Popis softvéru
Všetky požadované funkcie sú programovo riadené. Program zabezpečuje načítanie a prepočet hodnôt zo snímačov, ich zobrazenie na lokálnom ePaper displeji, alebo vzdialene vo webovom prehliadači cez HTTP protokol. Samozrejme spravuje sieťové wifi pripojenie. Program má modulárnu architektúru, tu je zoznam najdôležitejších z nich:
|
Najdôležitejšie programové moduly |
|
|
Súbor |
Popis |
|
main.py |
hlavný riadiaci cyklus, inicializácia modulov |
|
reg.py |
regulácia HV, ADC, GM pulzy, CPM |
|
i2c.py |
komunikácia s BME688 / SHT30 |
|
bme688.py |
ovládač senzora BME688 (teplota, vlhkosť, tlak, plyn) |
|
openweather.py |
načítavanie počasia z OpenWeatherMap |
|
openmeteo.py |
načítavanie počasia z Open-Meteo (nevyžaduje API kľúč) |
|
geoip.py |
geolokácia podľa IP |
|
display.py |
ePaper displej |
|
influx.py |
zápis do InfluxDB |
|
history.py |
história meraní pre grafy |
|
wifi_manager.py |
správa Wi-Fi pripojenia |
|
http_server.py |
HTTP server |
|
http_api.py |
API handlery (oddelené kvôli pamäti) |
|
config.py |
konfiguračné premenné |
|
http_cfg.py |
premenné pre webové rozhranie |
|
ota.py |
aktualizácia firmvéru |
|
html/dashboard.html |
Dashboard je hlavná používateľská obrazovka prístupná na adrese |
|
html/dashboard.css |
obsahuje štýly zobrazenia pre rôzne formáty a orientácie zobrazenia |
|
html/dashboard1.html až dashboard4.html |
alternatívne dashboardy, prepínajú sa potiahnutím prstom |
|
html/bme688.html |
stránka s nastavením senzora BME688 |
|
html/http_server.json |
definuje štruktúru webového rozhrania |
Uvažoval som aj o použití HTTPS protokolu, ale bezpečnostný prínos je minimálny. Zariadenie beží na lokálnej sieti a SSL chráni pred odpočúvaním dát na ceste medzi prehliadačom a serverom, ale na domácej WiFi je to riziko prakticky nulové. Skutočné ohrozenie (ak existuje) je neautorizovaný prístup a SSL to nerieši (ktokoľvek na sieti sa pripojí cez HTTPS rovnako ako cez HTTP). Toto rieši použitie hesla na konfiguračné stránky. Keďže ESP32 nemá doménu ani CA-podpísaný certifikát, musel by som použiť self-signed certifikát. Každý prehliadač zobrazí varovanie: „Toto pripojenie nie je bezpečné“ a budete musieť kliknúť „Pokračovať napriek riziku“. Na mobile v kiosk móde (Fully Kiosk) to môže byť problém — niektoré WebView to odmietnu úplne. Dashboard sa obnovuje každých 15 s a dashboard.html pritom zakaždým volá /api/dashboard_data. Každý request by vyžadoval plný TLS handshake (ESP32 neudržiava keep-alive pri TLS), čo na ESP32-S3 trvá 1–2 sekundy. To by spomalilo odozvu dashboardu a zaťažilo procesor aj RAM. Pri TLS spojeniach na ESP32 sa objavujú ENOMEM chyby (Not enough memory - nedostatok pamäte) a samotný handshake spotrebuje 30–50 KB RAM na jedno spojenie. Ak dashboard otvorí viacero requestov súčasne (dáta + CSS + JS), môže dôjsť k pádu programu.
Po reštarte sa spustí program boot.py, ktorý sa vytvorí pri nahratí Micropython do flash pamäte. Netreba ho nijako upravovať, lebo Micropython po zavedení boot.py automaticky spúšťa main.py ak existuje. Náš main.py zabezpečí načítanie konfigurácie z config.py, potom sa spustí reg.py, ktorý zinicializuje PWM, ADC, GM piny, PID regulátor a CPM timer (časovač pre počítanie impulzov z GM trubice). Vykoná sa inicializácia I2C zbernice, predpovede počasia, GeoIP (voliteľné) a pokúsi sa pripojiť k Wi-Fi (konfigurácia pre wifi je uložená v súbore wifi_config.json). Ak sa nepodarí pripojiť, spustí sa AP režim, kedy ESP32 vytvorí vlastnú Wi-Fi sieť „LK-29-meteo“ a po pripojení k nej je konfiguračná obrazovka dostupná na adrese http://192.168.4.1, kde sa zavolá sprievodca prvotným nastavením (jazyk, čas a poloha, Geiger) a program wifi_manager.py umožňujúci prehľadať okolité dostupné siete a pripojiť sa k nim, prípadne manuálne nastaviť sieťové parametre. Po stlačení tlačidla „Connect“ sa mikroprocesor pokúsi pripojiť k wifi sieti a ak je úspešný prepne sa do režimu klienta a reštartuje. Po reštarte a úspešnom pripojení do wifi sa pokračuje spustením HTTP servera a inicializáciou ePaper displeja. Potom zostáva program v hlavnej slučke a obsluhuje HTTP, I2C čítanie, aktualizácia predpovede počasia, InfluxDB zápis, ePaper displej (ak je). V hlavnej slučke sa program „fláká“, lebo všetky dôležité činnosti sú riadené cez prerušenia, vrátane časových slučiek. Vysoké napätie je nastavované a stabilizované PID regulátorom, ktorý beží v timer interrupte (predvolene 100 ms) a číta ADC hodnotu cez spätnú väzbu z deliča, porovnáva prečítanú hodnotu s premennou TARGET_VOLTAGE a vypočíta PID výstup a upraví PWM duty cycle. Ak je chyba (rozdiel medzi želanou a skutočnou hodnotou napätia) v pásme necitlivosti (DEADBAND – dovolená odchýlka od žiadanej hodnoty napätia), integrálna zložka sa vynuluje. Počítanie impulzov z GM trubice sa vykonáva tiež pomocou prerušenia. Prúdový impulz GM trubice vyvolá prerušenie od impulzu na vstupe GPIO1, ktoré zvýši hodnotu premennej obsahujúcej počet impulzov.
Prerušenie od časovača, ktoré sa vykoná každých 60 sekúnd vypočíta rozdiel starej a novej hodnoty počtu impulzov a takto sa získa aktuálna hodnota CPM (counts per minute), čo reprezentuje počet ionizujúcich častíc, ktoré excitovali plyn v trubici. Z týchto údajov sa počíta aj hodnota radiácie v µSievertoch za hodinu (µSv/h). Tento výpočet sa riadi vlastným časovačom pre zlepšenie presnosti, najmä pre menšie trubice, ako je napríklad Xeram 3G8B, ktorú som použil aj ja. Vzťah medzi CPM a intenzitou vyjadrenou v µSv/h je definovaný výrobcom a jeho hodnota je uložená v premennej CPM_PER_USV v config.py (pre trubicu Xeram 3G8B je to 6,85). Dávka žiarenia sa vypočítava takto:
\[ \text{dávka} \left( \frac{\mu\text{Sv}}{\text{h}} \right) = \frac{\text{CPM}}{\text{CPM\_PER\_USV}} \]
Hodnoty teploty, vlhkosti ,… sa čítajú z I2C senzorov. Automatická detekcia prítomnosti senzora sa vykonáva počas prvého skenovania (10 s po štarte). Potom sa číta v intervale I2C_INTERVAL sekúnd. BME688 poskytuje teplotu, vlhkosť, tlak a hodnotu IAQ (kvalita ovzdušia). Údaj IAQ je orientačný: senzor reaguje na plyny vo vzduchu, nemeria prachové častice PM1, PM2,5 ani PM10. Tlak sa prepočítava na hladinu mora podľa nadmorskej výšky stanice. V stanovenom intervale OWM_INTERVAL sa načítava aktuálne počasie a 5-dňová predpoveď (predvolené na 1800 s = 30 min). Ak nie je k dispozícii I2C senzor, teplota a vlhkosť sa preberajú z OWM (OpenWeatherMap, alebo Open-Meteo).
Pre ďalšie spracovanie nameraných údajov je možné ukladať údaje do databázy. Ak je INFLUX_ENABLED = True, systém v pravidelnom intervale INFLUX_INTERVAL (sekundy) zapisuje namerané hodnoty do databázy InfluxDB. Zapisujú sa: teplota, vlhkosť, tlak, dávka žiarenia, CPM, napätie batérie, atď. Hodnota premennej DISPLAY = True indikuje prítomnosť ePaper displeja a systém aktualizuje hodnoty na ePaper displeji v intervale REFRESH_DISP (počet sekúnd). Zobrazuje aktuálne hodnoty zo senzorov, vypočítanú dávku žiarenia a stav.
Dôležitú časť tvorí webové rozhranie cez HTTP server. Hlavná obrazovka je dostupná na http://IPadresa/, alebo http://IPadresa/dashboard.html. Vzhľad sa dá ovládať cez súbory CSS. Načítavanie údajov do stránky, automatické obnovovanie a zobrazovanie grafov zabezpečujú JavaScripty v html kóde. Rozhranie je dostupné v dvoch jazykových mutáciách a pridanie ďalšieho jazyka sa vykoná vytvorením JSON súboru s patričným prekladom. Napríklad pre češtinu stačí preložiť obsah súboru lang_en.json do češtiny a nazvať ho lang_cz.json. Potom v konfiguračnom rozhraní nastaviť jazyk na cz. Dôležitý je aj súbor manifest.json na ktorý odkazuje tzv. PWA manifest (hovorí prehliadaču a operačnému systému, ako má vaša aplikácia vyzerať a správať sa, keď si ju používateľ nainštaluje do zariadenia na plochu, do ponuky štart, na domovskú obrazovku telefónu). Každý html súbor na HTTP serveri odkazuje v svojom kóde naň a tak sa zabezpečuje správne zobrazovanie na rôznych zariadeniach (portrait/landscape mód na mobilnom telefóne, alebo tablete, celoobrazovkový režim, …). Veľkosti a umiestnenie sa dynamicky menia podľa zobrazovaného okna (responzívny dizajn).
Na adrese http://IPadresa/api/data je dostupná väčšina premenných na ďalšie možné spracovanie. Toto je výhodné pre prípadnú integráciu a prenášanie hodnôt do iných systémov. Príkladom je zobrazenie údajov v Home Assistante (program pre inteligentnú domácnosť) bez potreby ďalšej integrácie pomocou zabudovanej systémovej integrácie RESTful. ESP32 uchováva posledných 1440 nameraných bodov (24 hodín) v pamäti RAM. Raz za hodinu a pred riadeným reštartom ich ukladá aj do flash pamäte, takže grafy po reštarte neostanú prázdne. Pri každom novom bode (každú minútu) sa pole aktualizuje a grafy sa prekreslia. To znamená, že aj po vymazaní údajov v prehliadači, alebo po spustení prehliadača na inom zariadení sa grafy za posledných 24 hodín vykreslia.
Tieto dáta sú dostupné na adrese http://IPadresa/api/history. Čas sa synchronizuje s NTP serverom pri štarte a potom v intervale SYNC_INTERVAL_DEV hodín. Posun časovej zóny a DST sa nastavuje v config.py. Dashboard automaticky prepne do celoobrazovkového režimu po prvom kliknutí (kvôli PWA). Ak používateľ opustí fullscreen, zariadenie sa pokúsi znova aktivovať pri ďalšej interakcii.
Celoobrazovkový režim nefunguje na niektorých mobiloch a tabletoch v Chrome prehliadači. Môj kód v dashboard.html sa snaží vynútiť fullscreen cez JavaScript API pri prvom kliku/dotyku. Chrome rozlišuje rôzne režimy zobrazenia a requestFullscreen() má prísne pravidlá na tabletoch. Navyše na niektorých tabletoch Chrome rešpektuje systémové nastavenia navigačnej lišty a fullscreen odmietne. Ak má tablet slúžiť ako stály displej, Fully Kiosk Browser aplikácia je najspoľahlivejšie riešenie. Poskytuje natívny fullscreen bez navigačných prvkov, auto-start po boote, a screen-on management. Môj dashboard s ním funguje na telefóne aj tablete dobre.
Grafy v dashboarde je možné konfigurovať podľa želania pomocou funkcie "drag and drop" a to tak, že priložíte prst, alebo kurzor myši, na dlaždicu, ktorej hodnotu chcete vidieť v grafe a potiahnete do oblasti grafu.
Krátke kliknutie na dlaždicu s meranou hodnotou zobrazí na sedem sekúnd údaj o maximálnej a minimálnej hodnote za posledných 24 hodín, čo je aj rozsah osi X grafu.
Okrem hlavného dashboardu sú k dispozícii alternatívne dashboardy s iným rozložením (dashboard1.html až dashboard4.html), medzi ktorými sa prepína potiahnutím prstom. Dashboard 4 má kartové rozloženie určené pre mobil aj tablet: hodiny, teplota s 24-hodinovým grafom, polkruhová stupnica IAQ, kompas vetra, vlhkosť, tlak s trendom, radiácia a 5-dňová predpoveď s fázou Mesiaca.
Väčšina funkcií meteostanice je zobraziteľná cez webové rozhranie. Týmto spôsobom je možné zobraziť aj obsah vykreslený na ePaper displeji, alebo monitorovať to čo je vypisované na konzolu ESP32, napríklad logy
. Popis ostatných možností je možné nájsť v užívateľskej príručke, ako aj všetok potrebný softvér nájdete na stiahnutie na adrese https://www.dedeideas.eu v sekcii na stiahnutie.
Poznámka: Firmvér sa ďalej vyvíja, preto sa jeho funkcie aj vzhľad webového rozhrania môžu meniť podľa nových požiadaviek. Popis a obrázky v tomto článku preto nemusia presne zodpovedať najnovšej verzii. Aktuálny popis nájdete v užívateľskej príručke k príslušnej verzii firmvéru.
Ovládací panel
Nastavenie parametrov meteostanice LK-29 je sústredené v module config.py, tzv. „Control panel“. Všetky dôležité premenné sú dostupné aj cez http://IPadresa/config.

Prístup vyžaduje autorizáciu menom a heslom. Meno je pevne nastavené na „admin“ a heslo je implicitne prázdne. Ovládací panel je rozdelený do šiestich sekcií.
Prvé dve sekcie sú „Live Measurements“ a „Wi-Fi Status“. V ľavej hornej časti obrazovky je ikona ☀ alebo ☾, umožňujúca prepínanie medzi tmavým a svetlým štýlom (deň/noc). Sekcia „Live Measurements“ ukazuje aktuálne namerané dôležité hodnoty. Myslím, že ich nie je potrebné popisovať a ich význam je jasný z predchádzajúceho popisu meteostanice. Druhá sekcia „Wi-Fi Status“ zobrazuje aktuálne parametre sieťového pripojenia. Všetky údaje sú len na čítanie s výnimkou ikony tlačidla s ozubeným kolieskom ⚙ v riadku „Status“. Kliknutím na toto tlačidlo sa vyvolá obrazovka nastavenia sieťového pripojenia (Wi-Fi Manager), ktorý umožní preskenovať okolité siete a pripojiť sa k nim. Zoznam ukazuje aj skryté siete a názov siete sa dá zadať ručne. Pri slabom signáli (pod -72 dBm) sa zariadenie samo prepne na silnejší prístupový bod tej istej siete.
Na druhom obrázku sú vyobrazené ďalšie dve sekcie ovládacieho panela. „I2C Bus“ sekcia zobrazuje údaje o zariadeniach na I2C zbernici. Stlačenie tlačidla s ozubeným kolieskom ⚙ v riadku status vyvolá prescanovanie I2C zbernice. Nájdené zariadenia a ich adresy a typ sa vypíšu v nižšom riadku. Program dokáže obslúžiť v tejto verzii I2C zariadenia SHT3x a BME68x. Ikona ⚙ na konci riadku BME688 otvorí samostatnú stránku http://IPadresa/bme688 s nastaveniami senzora: vyhrievač, referenčné hodnoty (baseline) IAQ a hranice a texty šiestich úrovní IAQ. „Read Only Configuration“ sekcia zobrazuje dôležité systémové hodnoty, nedajú sa editovať, sú len na čítanie.
Ďalšia sekcia „OpenMeteo/OpenWeatherMap“ zobrazuje informácie o čítaní zo zdroja informácií o predpovedi počasia. Kliknutie na ikonu tlačidla s ozubeným kolieskom ⚙ vynúti načítanie nových údajov zo zdroja predpovede počasia. Najväčšia sekcia je sekcia „Editable configuration“, ktorá obsahuje niekoľko skupín (Firmware, OpenMeteo/OpenWeatherMap, Bat divider, …).
Prvá skupina v sekcii „Editable configuration“ patrí možnosti upgradu firmware cez wifi. Po kliknutí na tlačidlo „Upgrade“ sa otvorí stránka http://IPadresa/ota, ktorá ponúka dva spôsoby aktualizácie. Prvým je výber súboru ZIP s balíčkom programov z disku počítača. Druhým je tlačidlo „Aktualizovať“, po ktorom si zariadenie samo stiahne najnovší firmvér z internetu a nainštaluje ho. Predvolená diferenčná aktualizácia prepíše iba zmenené súbory, plná znova rozbalí všetky. Nastavenia (Wi-Fi, kalibrácia, heslo, InfluxDB, OpenWeatherMap) ostávajú vždy zachované a zariadenie ešte pred zápisom overí, že balík patrí k LK-29. Súbor ZIP môže byť s normálnou kompresiou, alebo bez kompresie. Priebeh rozbaľovania a kopírovania súborov sa zobrazuje v status bare a v ráme obrazovky upgradu. Po rozbalení súborov sa ESP32 automaticky reštartuje. V skupine „OpenMeteo / OpenWeatherMap“ je možné si zvoliť zdroj predpovede počasia. OpenMeteo nevyžaduje žiadne nastavenia okrem polohy (Latitude, Longitude), hodnoty ktorých získate z máp google. OpenWeatherMap vyžaduje prístupový kľúč (API key OWM), ktorý získate bezplatne po zaregistrovaní na stránke OpenWeatherMap.
Nasledujúca skupina „BAT divider“ obsahuje iba jednu položku „VBAT divider ratio“, čo je korekčný koeficient pre meranie napätia batérie, alebo napájania. Na vstup analógovo digitálneho prevodníka je napájacie napätie privedené cez delič napätia R8/R14. Použil som bežné odpory, ktoré nemajú vysokú presnosť ani hodnoty s presným deliacím pomerom. Pripojil som voltmeter na napájacie svorky a koeficient „VBAT divider ratio“ som nastavil na takú hodnotu, aby napätie na voltmetri a „Battery Voltage “ v sekcii „Live measurements“ ukazovali rovnakú hodnotu.
Ďalšia skupina „HV regulator“ sa týka PID regulátora vysokého napätia. V položke „Target voltage“ nastavíte žiadanú hodnotu vysokého napätia pre GM trubicu, podľa typu ktorý ste použili, na hodnotu určenú výrobcom. Obyčajne výrobca udáva minimálnu hodnotu vysokého napätia „threshold voltage“ pri ktorej nastáva výboj v trubici. Typicky je táto hodnota medzi 300 V – 400 V a označuje začiatok tzv. "Geiger plateau", čo je oblasť vysokého napätia nad „threshold voltage“, kde trubica spoľahlivo detekuje ionizujúce častice žiarenia a býva široká viac ako 200 V. Takže odporúčam nastaviť túto hodnotu na „threshold voltage“ + 50 V, alebo +100 V. Ja som použil GM trubicu Xeram 3G8B, kde výrobca určuje, že „threshold voltage“ je 445 V. Keď som nastavil 450 V, trubica spoľahlivo detekovala rádioaktívne častice z prírodného pozadia. Nastavil som 500 V, aby prípadný pokles vysokého napätia neskresľoval meranie. Ostatné parametre sa týkajú nastavenia PID regulátora a neodporúčam ich meniť, ak neviete čo robíte. Nasledujúca skupina „Buzzer“ má iba jednu položku a tou je zaškrtávacie políčko „Acoustic signalling“, čo slúži na zapnutie a vypnutie akustickej signalizácie detekovaných častíc. Skupina „Radiation“ v položke „CPM per 1µSv/h“ určuje počet zachytených častíc za minútu CPM pre výpočet 1 µSv/h. Tento údaj definuje výrobca GM trubice a hľadajte ho v jej dokumentácii. Položka „Alarm threshold“ určuje hodnotu radiácie pri ktorej sa spustí akustický alarm signalizujúci zvýšenú radiáciu. Hodnota v riadku s „CPM calc period“ reprezentuje číslo v sekundách, ako často sa prepočítava hodnota CPM na dávku radiácie v µSv/h.
V nasledujúcej skupine „I2C / Sensors“ sa nastavuje časový interval čítania hodnôt z I2C senzorov. Skupina „Display“ obsahuje interval obnovovania ePaper displeja a výber revízie panela (V3 alebo V4). Revíziu zariadenie nevie rozpoznať samo a pri nesprávnej voľbe ostane displej prázdny, preto je pri každej možnosti tlačidlo ⚙, ktoré spustí testovací obraz. Pripomínam, že čas potrebný na plné prekreslenie displeja je 14 sekúnd, počas ktorých displej bliká a nedá sa dobre čítať, takže príliš nízke hodnoty obnovovacieho intervalu by pôsobili rušivo. Skupina „Time“ umožňuje nastavovať údaje o čase a jazykovom rozhraní.
„InfluxDB“ skupina združuje nastavenia pre zápis nameraných hodnôt do databázy. Za pozornosť v tejto skupine stoja dva riadky: „Buffered records“ a „DB buffer capacity“. Prvý hovorí o tom koľko záznamov je v RAM mikropočítača ESP32 pripravených na zápis do databázy, ak je nedostupná, hodnota sa dá prepísať na menší údaj, aj vynulovať, čím sa neuložené záznamy trvalo stratia z pamäte RAM v ESP32. Druhý údaj hovorí koľko záznamov bude ESP32 držať v pamäti kým sa neobnoví prístup na databázu, aby mohli byť staré záznamy uložené. Je možné zadať ľubovoľne veľkú hodnotu, ktorá sa ale kontroluje na nároky na pamäť RAM a vypočíta sa maximálna hodnota, ktorá nespotrebuje viac ako 90 % voľnej RAM. Pamäť sa alokuje až pri vzniku nového záznamu, takže tento údaj neovplyvňuje okamžité využitie RAM. V tejto konfigurácii hardvéru je maximálna hodnota okolo 8000 záznamov, čo je pri minútovom zbere dát asi na týždeň. Údaje sú v kruhovom buffri, to znamená, že po dosiahnutí maximálneho počtu záznamov v buffri sa najstarší zmaže pri pridaní nového. Strata napájania znamená stratu obsahu buffra, keďže som sa rozhodol „netrápiť“ flash ukladaním záznamov do flash. Skupina „Debug level“ umožňuje zvoliť, ktoré programové moduly majú vykonávať detailné logovacie výpisy, napríklad modul regulátora vysokého napätia. Neodporúčam nechávať logy zapnuté, lebo výpisy sú smerované na konzolu ESP32. Dôvodom je, že väčšina sériových výpisov je blokujúca. To znamená, že procesor pri odosielaní každého znaku čaká, kým sa fyzicky odošle, a počas tohto času nemôže vykonávať žiadnu inú užitočnú prácu. A hoci je ESP32-S3 rýchly procesor, rýchlosť sériovej linky (typicky 115200 baudov, čo je ~11 kB za sekundu) je v porovnaní s ním extrémne pomalá, takže takáto réžia dominuje celkovému času behu programu a výrazne spomaľuje jeho odozvu. Kliknutie na malé štvorcové tlačidlo na konci riadku ✓ spôsobí okamžité nastavenie hodnoty, čo sa aj prejaví ihneď, ale neuloží sa do konfiguračného súboru v pamäti flash, čo má za následok, že takto vykonaná zmena platí iba do nasledujúceho reštartu, kde sa pri inicializácii nastavia hodnoty podľa nastavení uložených v pamäti flash ESP32. Akceptácia novej hodnoty je signalizovaná zmenou farby pozadia tlačidla na dve sekundy ✓ . Na permanentné uloženie zmenených hodnôt slúži tlačidlo „Save config“ v poslednej skupine. Tlačidlo „Download config“ umožní stiahnuť konfiguračný súbor do lokálneho počítača. Ostatné dve tlačidlá majú jasný význam. „Restart“ slúži na reštartovanie ESP32 a „Change PWD“ slúži na zmenu hesla pre prístup do konfiguračného panelu. Ak heslo stratíte, jediná možnosť je pripojiť sa do ESP32 cez sériový port a v config.py nastaviť premennú AUTH_PASSWORD = "" ako prázdnu, alebo na žiadanú hodnotu. Zmena niektorých parametrov vyžaduje reštart, toto je indikované zmenou pozadia tlačidla „Restart“ na červenú farbu, čo znamená, že je vyžadovaný čo najskorší reštart ESP32.


