Obsah
HUMI - teplota a vlhkost s ESP8266
Autor: Pavel Janko
Web autora: http://www.fancon.cz/
Kontakt na autora: pavel.janko@fancon.cz
Aktuální stránku programu spolu se stažením jeho zdrojového kódu naleznete na adrese:
https://www.fancon.cz/esp8266-humi-server-klient/arduino-humi-server-client.html
Program pro měření vlhkosti HUMI
Úvod
Program HUMI byl primárně vytvořen pro odesílání teploty a vlhkosti ze senzoru HTU21 (SI7021) na portál tmep.cz. Tam jsou data uchovávána a v případě potřeby zobrazována i ve formě grafu.
Program však může pracovat i autonomně a jeho zajímavé vlastnosti je možné využít i pro jiné senzory nebo veličiny. K tomu stačí malá modifikace nebo přidání a nastavení vhodných knihoven.
Základním hardwarem je obvod ESP8266. Je možné použít samostatný modul ESP8266-12 s pár součástkami, ale pozor, na titulním obrázku nejsou vidět pullup a pulldown rezistory, které jsou schovány pod obvodem. NodeMcu ESP8266 a také WeMos D1 Mini ESP8266 modul můžete použít prakticky bez úprav. Stačí připojit čtyřmi vodiči čidlo a nahrát program HUMI.
Program provádí dvě hlavní činnosti. Zobrazuje základní okamžité údaje ze senzoru a provozní data na vlastní webové stránce a naměřené hodnoty pak odesílá na portál tmep.cz. Pokud nepotřebujeme data nikam odesílat, lze jediným parametrem při kompilaci programu odesílání vypnout.
Příjemnou vlastností je také OTA, to je možnost nahrání nového firmware - sketche do ESP8266 přes WiFi, bez toho, že bychom ho museli připojovat k PC přes sériovou linku. A je dlužno říct, že OTA funguje skvěle. Podmínkou pro správnou funkci je, aby měl váš modul s ESP8266 alespoň 1MB paměti, ale to je již dnes naprosto obvyklé.
Přístup k upgrade firmware je chráněn heslem, které si zvolíte. Pomocí parametru je možné také nastavit jednoduché omezení přístupu heslem k lokální webové stránce.
Pochopitelně je možné se k webové stránce připojit i z internetu, předpokládá to však, že umíte ve svém routeru nastavit mapování portů na toto zařízení. Dobré je také nastavit statickou adresu DHCP systému pro váš ESP8266, protože jeho IP adresa se může za určitých podmínek změnit a může být problém ho potom s prohlížečem najít a připojit se na něj.
Předpokladem funkce programu ve spojení s portálem tmep.cz je, že se tam zareigistrujete a získáte takzvanou doménu a identifikátor GUID. Veškeré informace k této problematice hledejte přímo na webu tmep.cz
Popis rozhraní lokální webové stránky
Lokální webové rozhraní má velmi střízlivý vzhled. Za prvé nejsem expert na tvorbu webových prezentací, za druhé zbytečně moc grafiky zpomaluje chod aplikace. Ale hlavní důvod je ten, že spousta návrhářů využívá styly a skripty, které se stahují z kdovíjakých webových stránek bez jakékoliv záruky. Vypadá to někdy hodně pěkně, ale pak stačí ztráta vnějšího připojení a je po žížalkách, stránky mohou být i nečitelné. Jednoduchá tabulka plně dostačuje, na druhé straně jsem se snažil, aby interface poskytoval potřebné údaje.
NAME je v programu volitelné jméno vašeho senzoru, nezapomeňte ovšem, že tabulka upravuje svoji šířku podle obsaženého textu, tak to není dobré s délkou jména přehánět.
MAC je MAC adresa senzoru, která se načítá přímo z chipu ESP8266. Zvolil jsem její zobrazení proto, protože podle výrobce je číslem ID obvodu značena celá série obvodů a není to tedy na rozdíl od MAC adresy jednoznačný identifikátor. Znalost MAC adresy vám také pomůže při konfiguraci DHCP statické IP adresy a při případném mapování portů na routeru.
VALUE jsou poslední naměřené hodnoty přečtené ze senzoru.
RESET popisuje slovy, jak došlo k restartu zařízení. Je to interní proměnná obvodu ESP8266. Například text „Software/System restart“ je zobrazen po upgrade firmware bezdrátově přes OTA.
ON je informace o době provozu zařízení od posledního restartu. Je ve formátu DD:HH.MM.SS, ale i když to tak může vypadat, nejsou to hodiny a neukazují tedy reálný čas.
WiFi vyjadřuje intenzitu WiFi signálu v dBm a v procentech. Je to pochopitelně informace pouze jednosměrná, tedy jak slyší anténka ESP8266 WiFi signál, který přichází od vašeho routeru respektive WiFi acess pointu.
RAM zjednodušeně řečeno ukazuje, kolik má obvod ještě k dispozici volné paměti
VCC je napájecí napětí obvodu, které by mělo být 3,3V s tolerancí cca 10%.
„The host's response is OK“ je řádek hlášení. Popisuje se na něm stav připojení k serveru tmep.cz a hlásí případné chyby, pokud vzniknou a dají se jednoduše detekovat. Kolečko vpravo od hlášení přeblikává v rytmu odesílání dat na tmep.cz. Je to pouze signalizace, která slouží k lepší orientaci, protože za běžných podmínek je reakce serveru poněkud stereotypní.
Úplně poslední pole tabulky obsahuje odpověď serveru na odeslání dat a může přispět k diagnostice případných problémů.
Nastavení proměnných programu
Nastavení programu provádějte v části - záložce, která se jmenuje HUMIx_LOOP. Jsou to tyto proměnné:
ssid = „SetApSSID“; | nastavte jméno vaší WiF |
password = „ SetYourPassword “; | nastavte heslo vaší WiFi |
host = „xxxx.tmep.cz“; | nastavte kompletní cestu na tmep.cz včetně vám přidělené domény xxxx |
guid = „xxxxxxxxxxxx“; | nastavte vám přidělené GUID xxxxxxxxxxxx |
WWWAUTHENTI = false; | pokud nastavíte WWWAUTHENTI = true; tak po vás bude lokální webová stránka požadovat před připojením následující uživatelské jméno a heslo |
WWWUSERNAME = „admin“; | nastavte si uživatelské jméno pro webovou stránku |
WWWPASSWORD = „admin“; | nastavte si heslo pro webovou stránku |
OTAUSER = „admin“; | nastavte si uživatelské jméno pro OTA - update fw přes WiFi |
OTAPASSWORD = „admin“; | nastavte si určitě heslo pro OTA - update fw přes WiFi |
OTAPATH = „/firmware“ | cesta pro aktualizaci firmware přes OTA |
SensorName = „ HTU21D-001“; | zde vložte libovolné jméno vašeho senzoru, použijte délku do 38 znaků včetně mezer, větší počet zvětší šířku webové tabulky, speciální znaky je třeba zadávat v HTML syntaxi |
SensorReadPeriod = 10000L; | perioda čtení senzoru v milisekundách, nyní 10 s |
SendPeriod = 60000L; | perioda odesílání dat na server tmep.cz v [ms], nyní 1 minuta |
PageRefreshPeriod = 10; | perioda obnovování lokální webové stránky, nyní 10 s |
SendToTmep = true; | hodnota SendToTmep = false; zablokuje odesílání dat na server tmep.cz., zařízení bude pracovat pouze jako lokální webová stránka se zobrazováním posledního měření |
FloatRounding = 1; | Počet zobrazovaných a odesílaných desetinných míst naměřených veličin, tj. teploty a relativní vlhkosti. |
Komponenty programu
Jednotlivé záložky jsou vlastně systém nezávislých funkcí. Účelem jejich použití je zpřehlednění programu.
HUMIx_LOOP je základní smyčka programu se všemi globálními parametry.
HUMIx_HTML_TYPOGRAPHER provádí formátování dat, přijatých od serveru tmep.cz jako odpověď - response. Vkládají se html tagy, kontroluje délka řádků a také aby objem dat nepřekročil přijatelný limit.
Malé odbočení. Když jsem testoval chybová hlášení, tak jsem zjistil, že i když odpojím internet, tak mám pořád připojení k serveru tmep.cz. Po dlouhém bádání, které vám možná ušetřím, jsem zjistil, že nejspíš většina domácích routerů ASUS v případě, že jsou odpojeny od WAN, tedy internetu, podsunou svoji webovou stránku. A v tom okamžiku nevíte, co se vlastně děje.
Našel jsem na internetu způsob, jak vypnout tuto vlastnost na starších i novějších zařízeních ASUS, ale stejně jsem program upravil, aby byl schopen se s touto vlastností automaticky vyrovnat a nahlásit alespň chybu. Víc totiž udělat nemůže. Kde není, ani čert nevezme.
HUMIx_ESP5266_READ_PARAMS čte parametry ESP8266 a přepočítává sílu signáli WiFi
HUMIx_HTML_DATA tvoří základ lokální webové stránky, případně kontroluje uživatelské jmeno a heslo, pokud jste tuto funkci aktivovali.
HUMx_POWER_ON_TIME z funkce millis() vytváří řetězec DD:HH:MM:SS, který se zobrazuje na webové stránce.
HUMIx_READ_SENSOR čte veličiny z čidla a další data pro webovou stránku.
HUMIx_SEND_DATA_TO_HOST zajišťuje odesílání dat na server tmep.cz, generuje chybová hlášení a přijímá odpovědi serveru tmep.cz
Kompilace programu
Já jsem při programování obvodu volil konfiguraci s prostorem 1MB pro OTA a 1MB pro souborový systém SPIFFS. To mi umožnilo posléze nahrát speciálním nástrojem - tools pro LittleFS do SPIFFS třeba i webovou ikonku favicon.ico. A zkoušel jsem to i s pěkným obrázkem. Jen se mi nepodařilo obrázky odeslat přes OTA. To mi zrušilo veškerý obsah v SPIFFS. Musel jsem obrázky nahrát sériovou linkou.
Pro přehlednost hovořím o SPIFFs, ale ve skutečnosti jsem použil modernější file system LittleFS. K němu je třeba použít odpovídající nástroj pro uložení souborů. Ten se dá najít na webu github.com. Bez faviconu se obejdete, ani jeho struktura, ani práce se souborovým systémem není předmětem tohoto popisu. Fungovat to bude i bez SPIFFS, ESP8266 odpoví prohlížeči, že favicon.ico nemá a hotovo.
Když do ESP8266 přes Arduino IDE program nahrajete, tak raději proveďte reset obvodu ještě ručně. Po flashování se obvod bez resetu nespustí a vy pak můžete taky marně čekat. Pokud chcete něco na programu vylepšit, tak to udělejte a vyzkoušejte si OTA. Nebo na zkoušku můžete přehrát program sebou samým. Stačí v novější verzi Arduino IDE místo „Nahrát“ zvolit položku „Export kompilovaného Binaru“. Vyčkejte a pak otevřete „Zobraz adresář s projekty“ a tam máte již kompilovaný program s příponou *.bin. Ten si dáte někam, kde ho snadno najdete. Pak se stačí připojit na lokální webovou stránku čidla a do řádku prohlížeče napsat cestu (defaultně je /firmware). Poprvé budete vyzváni k zadání uživatelského jména a hesla pro OTA. Pak se objeví nabídka. V mém případě to pak vypadá takto:
Další postup je asi jasný. Jen připomenu, že položka FileSystem v OTA mi nejen nefungovala, ale mazala i již v SPIFFS uložené soubory. Zatím to bez sériové linky prostě neumím.
Po vybrání binárního souboru a stisku tlačítka Update firmware se kód nahraje do ESP8266 a provede se automaticky pro provoz dostačující restart. Trvá to dejme tomu 30 - 40 s. Pak se do prohlížeče načte znovu lokální webová stránka, pokud jste program nějak chybně neupravili. Pak by nezbylo, než zase zařízení připojit k sériové lince na první nahrání funkční verze programu s OTA.
Prostě je to při troše pozornosti velmi pohodlné nahrávání, bez nutnosti k čidlu vůbec chodit. Z mnoha desítek pokusů nedošlo u mě ani jednou k selhání.
Provoz zařízení
Připojování k WiFi je signalizováno blikáním interní LED v půlvteřinových intervalech a klasickým vypisování teček na sériový výstup rychlostí 115 200bd. Pokud se obvod opravdu připojí, tak vypíše na serial svoji IP a MAC adresu. Pak se ovšem od sériové linky odpojí a veškerý výstup probíhá výhradně na webovou stránku ležící na jeho IP adrese !
První měření i odeslání dat na server tmep.cz (pokud jste to povolili) se provede bezprostředně po připojení k WiFi. A úspěšnost lze obvykle posoudit již z hlášení na lokální webové stránce. Běžná reakce této webové stránky je mezi 80-200ms. Jen jednou za čas se interval trochu prodlouží, souvisí to asi s procesy, které probíhají na pozadí ve WiFi mangementu.
Chybová hlášení za provozu:
- Data sending is disabled - odesílání dat nebylo při kompilaci povoleno, funguje jen lokální režim
- Connection to host failed ! - připojení k serveru se nezdařilo
- Connection to host successful - server je připojen
- Host not respond - time out ! - server neodpověděl v časovén limitu 1s
- The host's response is OK - obdržena správná hlavička odpovědi HTTP/1.1 200 OK
- This is an invalid host response ! - odpověď neobsahuje správnou hlavičku
- Too much data ! - odpověď je nestandardní, delší než 512 znaků
Stabilita se v mém případě jeví výborná. Údaj o době provozu od restartu se nejspíš vynuluje po cca 50 dnech a začne počítat znovu, ale to asi není věc, která by nás měla trápit.
Stručný souhrn
Malé shrnutí základního nastavení. Senzor se sběrnicí I2C je k ESP8266 připojen následovně:
Senzor | ESP8266 |
Vcc | 3.3V |
GND | GND |
SDA | GPIO4 |
SCL | GPIO5 |
Senzor se čte každých deset sekund, data se odesílají každou minutu a lokální webová stránka se obnovuje každých deset sekund. Všechny tyto parametry jsou v podstatě libovolně nastavitelné.
Puntík vpravo od hlášení se mění při každém pokusu o odeslání dat, ať už je úspěšný či nikoliv. Při pokusu o odeslání také kratince problikne LED_BUILTIN.
Nula na konci response serveru tmep.cz je parametr délky těla zprávy serveru podle standardu HTTP 1.1.
Přestože jsem pamětí rozhodně neškudlil, program má ještě dost rezerv na případné vaše rozšíření. Překladač mi vypsal toto využití zdrojů:
Projekt zabírá 345124 bytů (33%) úložného místa pro program. Maximum je 1044464 bytů. Globální proměnné zabírají 30628 bytů (37%) dynamické paměti, 51292 bytů zůstává pro lokální proměnné. Maximum je 81920 bytů.