Projekt hladinomer vznikol v roku 2019 ako jednoduchý responzívny projekt vo webovom rozhraní v Bootstrap Bare šablóne, ktorý umožňoval zber dát o výške hladiny vody v studni a ich následnú vizualizáciu. Využíva backend napísaný v jazyku PHP procedurálnym štýlom a umožňuje centralizovaný zber dát prichádzajúcich z mikrokontroléru.
Meranie výšky hladiny vody sa realizovalo s využitím ultrazvukových senzorov - HC-SR04, alebo jeho vodotesnej varianty JSN-SR04T. Princíp merania oboch senzorov je vyslanie signálu Trigger s dĺžkou 10μs a na základe času, kedy sa signál vráti do prijímača - Echo je možné dopočítať vzdialenosť medzi senzorom a hladinou.
To znamená, že je potrebné túto hodnotu normovať v závislosti od hĺbky studne, nakoľko viac vody = menšia nameraná hodnota. Oba senzory dokážu merať do vzdialenosti cca 450 cm. Na základe známej maximálnej hĺbky studne je možné prepočítať na strane servera pri preberaní dát z mikrokontroléru skutočnú výšku hladiny vody a dopočítať aj objem studne. Dôležitým parametrom u oboch ultrazvukových senzorov je šírka lúča, inými slovami detekčná charakteristika.
Senzor HC-SR04 má 15° detekčnú charakteristiku. Lúč je relatívne úzky a senzor je tak vhodný aj pre užšie studne, kde je isté riziko odrazu lúča od stien studne. Vodotesný senzor JSN-SR04T má detekčnú charakteristiku 60 až 75°. Z toho dôvodu nie je vhodný pre úzke studne. Vo vzdialenosti hladiny od senzora 450 cm má lúč priemer takmer 600 cm.
Webové rozhranie využíva trigonometriu pre odhad maximálnej hĺbky studne pri známom priemere studne (ďalší parameter pre výpočet objemu studne). Používateľovi vie tak dopočítať, do akej maximálnej hĺbky studne je každý zo senzorov vhodný.
Dôležitú úlohu v systéme zohráva aj použitý mikrokontróler. Pre projekt sa využila platforma Arduino (Uno) spojená s Ethernet modulom / shieldom z rady Wiznet model W5100, respektíve W5500, ktorý zabezpečoval HTTP konektivitu a umožnil mikrokontroléru prenos dát do vzdialeného webového rozhrania na internete.
Nakoľko je hladinomer exteriérovým projektom, mnoho používateľov by si obľúbilo aj možnosť využitia WiFi platformy bez nutnosti ťahania Ethernet konektivity až k studni. Keďže je platforma Arduino náchylnejšia na "zaseknutie" programu, bol do zdrojových kódov doplnený watchdog, ktorý je schopný platformu reštartovať.
Systém bol rozšírený o platformy ESP8266, ESP32, ktoré zabezpečujú prostredníctvom vstavanej WiFi konektivitu po HTTP, ale aj HTTPS protokole. Mikrokontróler ESP8266 pre HTTPS spojenie využíva odtlačok - fingerprint v SHA1 formáte z verejného kľúča servera a vyžaduje pravidelnú obnovu, nakoľko nové certifikáty pre domény sú vydávané na maximálne rok, respektíve v prípade Let's Encrypt certifikátov sú to 3 mesiace.
ESP32 má určitú výhodu v realizácii HTTPS spojenia. Využíva certifikát certifikačnej autority (Root CA) v .pem formáte, ktorý má vložený priamo do zdrojového kódu. Toto riešenie je z časového hľadiska oveľa spoľahlivejšie a dlhšie, nakoľko má certifikačná autorita platnosť aj 10, 20 rokov. Vydanie nového certifikátu pre doménu (renew) zmení verejný kľúč webservera (domény), avšak vydavateľ - Root CA sa nemení a ESP32 vykoná spojenie bez problémov bez nutnosti zásahov do zdrojového kódu.
Nakoľko majú platformy ESP8266, ESP32 len 3.3V operačnú logiku a napájanie HC-SR04 a JSN-SR04T je na 5V, je nutné signál Echo napäťovým deličom znížiť na 3.3V. Napäťový delič bol doplnený aj do jednoduchej schémy zapojenia, ktorá sa nachádza priamo vo webaplikácii. Pre tieto platformy bol pridaný aj režim OTA - Over The Air aktualizácii firmvéru prostredníctvom domácej LAN siete, kedy je možné z pohodlia domova aktualizovať bežiaci firmvér v mikrokontroléri, ktorý sa nachádza v studni.
Celý proces riadi nástroj Python a nahrávanie je realizované prostredníctvom prostredia Arduino IDE, kde sa objaví vysielaný OTA port mikrokontroléru. OTA aktualizácie podporujú aj určitú formu autentizácie, prostredníctvom mena a hesla, prípadne md5 hashu. Štandardne OTA používa port 3232. Pre vysielaný OTA port je možné definovať aj vlastný hostname, prípadne ESP vysiela port s názvom tvoreným jeho MAC adresou.
Ďalšou možnosťou (bez OTA aktualizácii) je využitie režimu hlbokého spánku pre obe platformy. Spotreba je na úrovni 10 až 25μA, čo umožňuje prevádzku aj na batériu. Pri režime hlbokého spánku je vypnutý WiFi adaptér, ktorý neumožňuje aktualizáciu, ani vysielanie OTA portu.
Platforma ESP8266 využíva pre prebudenie z režimu hlbokého spánku signál Wake z vývodu D0 (GPIO 16), ktorý je prepojený s vývodom RST (počas nahrávania nového firmvéru je nutné rozpojiť D0 a RST). ESP32 využíva RTC Timer, ktorý ho zobudí na základe počítadla interne. RTC dokáže uchovať dáta aj počas spánku a následne ich sprístupniť v bežiacom programe hlavnej aplikácie.
Webové rozhranie obsahuje rôzne vizualizačné techniky prostredníctvom grafov, real-time prehľadu posledných hodnôt, tabuľkový - historický prehľad posledných 100 hodnôt / celej histórie behu hladinomera. Prostredníctvom budíkových reprezentácii je možné vizualizovať maximálnu, minimálnu hodnotu hladinomera za 24 hodín, 7 dní, 30 dní. Grafická reprezentácia v čase čiarovými grafmi bola rozšírená a ponúka vizualizáciu za posledný 2 hodiny, 24 hodín, 7 dní, 30 dní, 365 dní.
V roku 2020 bol projekt rozšírený o zrážkomer, ktorý má v súčasnosti podporu iba pre platformy Arduino s Ethernet modulmi / shieldmi Wiznet W5100 / W5500. Zrážkomer Hydreon RG-11, ktorý bol v projekte použitý je optický bezúdržbový senzor. Nemá žiadnu mechanickú (pohyblivú) časť a tak má minimálnu poruchovosť. Senzor je vybavený kopulkou, na ktorú dopadajú dažďové kvapky.
Pomocou IR (infračervených) lúčov je schopný detegovať tieto kvapky. Rovnaký princíp využíva väčšina moderných automobilov pre riadenie automatického ovládania stieračov. Výhoda senzora je predovšetkým v tom, že nemá spomínanú mechanickú časť - tzv. preklápacie vedro, ani lievik, ktorý má tendenciu upchávať sa. Na druhú stranu je senzor menej presný, ako drahšie meteorologické zrážkomery s preklápacím mechanizmom.
RG-11 má aj vďaka kopulke samočistiaci efekt a je vhodný predovšetkým pre umiestnenie tam, kde nie je možný prístup a údržba. Zvláda aj 24/7 vystavenie priamemu slnečnému žiareniu. RG-11 je vybavený aj skupinou DIP prepínačov, ktorými je možné konfigurovať prevádzkový režim. Každý z režimov je na DIP prepínači možné nastaviť ale zároveň aj konfigurovať daný režim...
- Preklápacie vedro: Emuluje preklápacie vedro určenej veľkosti - štandardne 0.01mm (najpoužívanejší režim, využitý aj pre našu aplikáciu), impulz realizuje vstavané relé vstavané signalizačné relé - NO kontakt sa využíva pre signál prerušenia
- Detekcia dažďa: Zapne relé čím indikuje, že prší po dosiahnutí istej (navolenej) intenzity
- Senzor kondenzácie: Zisťuje kondenzáciu alebo tvorbu mrazu na povrchu
- Ovládanie stieračov: Ovládanie stieračov s dažďovým senzorom pri rôznych rýchlostiach
- Ovládanie zavlažovania: Výstup z merača dažďa, ktorý zabraňuje zalievaniu
- Detekcia poklesu: Produkuje impulz pre každý zistený pokles
Pre integráciu do projektu Hladinomer som využil režim Preklápacie vedro. Každý impulz preklápacieho vedra predstavuje logickú 0, ktorú je možné detegovať na strane Arduina, ku ktorému je tento výstup pripojený.
Napájanie RG-11 je realizované cez 12V DC adaptér. Arduino nezávisle na vykonávanom programe načítava v prerušení aj počet impulzov zo zrážkomera RG-11. Každých 5 minút, kedy sa realizuje odosielanie dát do webového rozhrania sa počet impulzov vynásobí s veľkosťou vedra --> t.j. 0.01mm a tak je možné vypočítať prírastok zrážok.
Výsledná hodnota je spolu s údajom o výške hladiny vody z ultrazvukového senzora HC-SR04 / JSN-SR04T odoslaná do webového rozhrania, kde sa spracuje a uloží. Prerušenie využíva softvérový debouncing medzi prípočtom ďalšieho vedra s dĺžkou 15 milisekúnd. To eliminuje prípadné zákmity, aby sa rovnaký signál nenačítal viac krát. Táto metóda je populárna aj pri rôznych infračervených snímačoch otáčok a podobne.
Arduino Uno má dva digitálne vstupy s podporou prerušenia ---> D2 a D3. Vývod D2 je obsadený Ethernet modulom Wiznet W5X00, ktorý tiež využíva prerušenie a vo výsledku realizuje TCP spojenie. Druhý vývod je použitý práve pre zrážkomer RG-11. Pre meranie je nutné pripojiť cez 10K rezistor pullup na vetvu, kde funguje prerušenie.
To definuje stav na vývode prerušenia, nakoľko obvod nie je inak uzavretý, keďže relé je prepnuté štandardne do NC (Normally closed) polohy a do stavu NO (Normally Open), kde je pripojený vývod sa relé prepne až pri signalizácii stavu. Vtedy Arduino načíta stav LOW - GND z COM vývodu trvale pripojeného na zem. Prerušenie FALLING zaznamená - deteguje zostupnú hranu signálu.
Existujúca MySQL tabuľka bola rozšírená pre stĺpec, kde sa zapisujú dáta zo senzora RG-11. Vo webovom rozhraní boli prispôsobené všetky výpisy aj pre zrážkomer, rovnako tak aj grafická reprezentácia. V časti Štatistika ponúka webového rozhranie aj vizualizáciu úhrnu (súčtu) zrážok za 2 hodiny, 24 hodín, 7 dní, 30 dní, 365 dní.
Webové rozhranie prijíma dáta iba metódou POST. Metódy GET, PUT, DELETE ignoruje. Mikrokontróler sa neautentizuje, overuje sa formát dát (is_number). Dáta sú zapísané s aktuálnou časovou značkou. Rozhranie neobsahuje autentizáciu / chránený obsah s menom a heslom, nakoľko neobsahuje žiadne ovládacie prvky.
Senzor JSN-SR04T obsahuje aj riadiacu dosku, ktorá nie je vodotesná a je ju nutné chrániť pred vlhkosťou. V prípade, že kábel ku senzoru nie je dostatočne dlhý, je možné nadpojiť originálne káble (majú tienenie) a kompatibilné konektory.
Zaujímavosti:
- Meranie výšky hladiny vody sa realizuje pri procese merania až 10 krát, pričom sa výsledky priemerujú pre dosiahnutie čo najmenšej odchýlky.
- Plávajúci hmyz na hladine dokáže rozvibrovať vodnú hladinu a tým znemožniť meranie.
- Knižnica Ethernet2 (pre Wiznet W5500) použitá pri vývoji z roku 2019 je plne kompatibilná pre príkazy knižnice Ethernet (pre Wiznet W5100). Novšia verzia nie je plne kompatibilná. V existujúcej implementácii stačí iba zmeniť hlavičkový súbor knižnice a program je plne prenositeľný.
- Projekt je plne preložený do slovenského, anglického, nemeckého a ruského jazyka
Programovú implementáciu pre Arduino je možné nájsť v mojom Github repozitári:
https://github.com/martinius96/hladinomer-studna-scripty/, kde je možné nájsť aj potrebné knižnice pre ultrazvukový senzor vzdialenosti HC-SR04, prípadne JSN-SR04T a knižnicu Ethernet2 pre Ethernet modul Wiznet W5500.
Zrážkomer RG-11 knižnicu nepotrebuje, generuje logický signál, ktorý načítavame v prerušení. Vzorový program odosiela dáta do testovacieho webového rozhrania na adrese:
http://arduino.clanweb.eu/studna/
Katalógový list Hydreon RG-11:
https://www.fondriest.com/pdf/hydreon_rg-11_manual.pdf