Vlastní domácí meteostanice

Autor: Eduard Mráček

Popisovaná meteostanice je první můj projekt tohoto druhu. I když jsem měl klasickou meteostanici prodávanou na trhu, jediné, co jsem na ní mohl vyčíst, byl datum a čas synchronizovaný radiovým signálem DCF77, vnitřní teplotu místnosti s vlhkostí, venkovní teplotu s vlhkostí, fázi měsíce a předpověď počasí. Venkovní měření bylo ovlivněno umístěním čidla na parapetu okna. To muselo být umístěno tak, aby na něj nepršelo vzhledem k netěsné konstrukci. V mrazech docházelo k výpadkům měření. Předpověď počasí moc nefungovala. To byl impulz, proč se pustit do něčeho vlastního.

Mám rád, pokud je výsledek mého snažení hezký funkčně i vzhledově a nezůstává jako pavučina drátů na prkýnku. Raději pominu náklady, které vyváží pouze nadšení z kutilství a dobrý pocit, že to i funguje. Žádný vlastní vývoj bohužel není zadarmo. Domácí meteostanice by také měla být estetická součást domácnosti, ne jen kutilského koutku.

První, co musím předeslat, je, že jako důchodce mám na kutilství už více času. Za druhé, v mých 70 letech, nebýt pomoci AI, už bych si na programování netroufl, i když nějaký základ mám. Orientovat se na diskuzní skupiny bych ale fakt vůbec nedal. Za třetí, manželka, která toleruje moje sezení u počítače a kutilství, je nade vše.

Předtím, než jsem se pustil do domácí stanice, dost jsem si hrál s PLC a OPLC, různými alternativami připojení teplotních senzorů, DS18B20, Arduino s WiFi, ESP01/S a D1 mini Pro a nakonec ESP32.

01-hlavni-displej

Hlavní obrazovka hotové meteostanice

Hardware – co budete potřebovat

Základ celé stanice tvoří tyto komponenty, většinou od LaskaKit:

  • LaskaKit Meteo Mini v4.1: hlavní procesor venkovní i hlavní jednotky – WiFi deska se vším potřebným pro připojení senzoru, zálohovací baterii a solární nabíjení po USB-C. Použil jsem ji dvakrát.
  • LaskaKit Meteo Mini Meteostanice v3 a tištěné díly k ní: hotová radiační clona a pouzdro pro venkovní čidlo, pokud nechcete řešit vlastní 3D model.
  • LaskaKit ESP32-C3-LPKit v4.0: mozek vnitřní jednotky se senzorem SHT40, připravený na zálohovací baterii včetně nabíjení.
  • Nextion orig. Enhanced NX8048K070_011C: 7″ zakrytovaný kapacitní dotykový displej hlavní jednotky.
  • Senzor BMP280+SHT40 pro venkovní teplotu, vlhkost a tlak.
  • Modul RTC DS3231 a microSD karta pro hlavní jednotku.
  • Lithiová baterie 2500 mAh, 3D tiskárna na vlastní nástavec pod displej.

Aktuální verze systému

Ta se skládá ze tří částí spolu komunikujících po WiFi, většinou s komponenty od LaskaKit.

Venkovní měření

První, co jsem sestavil, bylo měření s METEO Mini C3 v4.1. Deska má vše potřebné k okamžitému připojení senzoru BMP280+SHT40, zálohovací baterie, solárního článku po USB-C. Zkušební provoz ve venkovním prostředí, v provizorní krabičce jsem zahájil na přelomu roku a pokud teplota klesla pod 0 °C, v režimu úspor procesor vydržel víc než 14 dnů bez dalšího napájení nebo dobíjení ze solárního článku. Dost jsem se toho obával, ale optimalizace doby uspáváním podle nabití článku vše vyřešila.

02-venkovni-cidlo

Venkovní čidlo s radiační clonou, solárním článkem a WiFi anténou

07-solarni-panel-drzak

Solární panel na nastavitelném držáku pro dobíjení venkovní jednotky

Počátkem jara jsem dokoupil radiový štít, 3D tiskárnu, stáhl si model krabičky, vytiskl a celé meteo sestavil do finální podoby. Finální program do ESP jsem si napsal sám, provádím pouze měření a předávám výsledek včetně napětí baterie a síly signálu po WiFi. Většinu času procesor ale prospí.

03-3d-tisk-drzaku

Tisk montážního dílu venkovní jednotky na 3D tiskárně

Vnitřní měření

04-vnitrni-jednotka-krabicka

Vnitřní jednotka si vystačila s krabičkou po externím disku

Není součástí hlavní jednotky, jak to je standardně, ale v malé provizorní krabičce po externím WD disku. Vyhodnocení je pomocí ESP32-C3-Mini-1U LPKit v4.0 s čidlem SHT40. Výhodou této desky je připravenost pro zálohování baterií včetně nabíjení a konektory pro připojení čidla. Měří teplotu a vlhkost v místě, kam ho umístím, a předává se na centrálu také napětí zálohovací baterie. Bez napájení vydrží několik dnů. Není to možná finální řešení, ale vyhovuje.

Hlavní jednotka s displejem

První data od venkovního a vnitřního měření jsem chytal na Arduinu Mega s WiFi, kde jsem odladil protokoly. Konečné rozhodnutí padlo opět na METEO Mini C3 v4.1. První výsledky jsem přenesl na Tmep.cz a začal jsem řešit zobrazování místo původní meteostanice.

Zobrazovací panel

Z různých variant od displejů nakonec padla volba na dražší verzi displeje Nextion NX8048K070-011C v zakrytovaném 7" provedení.

Důvod výběru panelu

Při rozhodování, který typ panelu mám použít, jsem myslel na jednoduchost implementace. Inspirací byly terminály HMI, které jsem dříve používal v automatizaci. Nechtěl jsem se pouštět do programování složité grafiky a dotykového ovládání. Panely HMI mají zabudované komponenty, které se přidávají na plochu a parametrizují včetně reakce na dotyk. Inspirovalo mě také třeba Virtuino, které jsem spojoval s Arduinem přes Bluetooth modul a návrh jednoduché obrazovky byl velmi rychlý a přesto vypadal naprosto profesionálně. Vybraný displej se k tomu dost přibližuje, mimo možností komunikace. Mnoho ikon z Virtuina jsem si připravil jako použitelné obrázky PNG k dalšímu využití. Jinak nezatracuji panely komunikující například přes SPI, ale to, co bych potřeboval a věnoval se programování grafiky, je u panelů HMI již uděláno, včetně možnosti dalšího doprogramování ovládání komponent.

Zakrytovaná varianta

05-nextion-rozklad

Rozložený pohled na kryt vybraného Nextion displeje

Další rozhodování bylo, jestli si pořídit panel, u kterého musím řešit zakrytování, nebo finální variantu, kterou připojím, nahraji a někam umístím. Druhou variantu vybraný panel naprosto splňuje. Od nezakrytých verzí mě odradila problematika vytvoření dokonalých předních masek a boxu. Kdo používá vrabčí hnízda, řešit to nemusí.

U Nextionu je možné stáhnout soubory pro 3D tisk, ale zatím jsem na dokonalé rámečky z 3D tisku nenarazil a s vlastní tiskárnou zas nemám takové zkušenosti. Nechat si tisknout u profesionálů, co je možno si zakoupit naprosto dokonalé, nedává moc smysl a levněji to nevyjde.

08-nextion-predni-sklo

Přední lesklá dotyková plocha displeje bez vyčnívající masky

Pořízená verze je plně zakrytovaná s možností případného zabudování do panelu pomocí dodaných úchytek. Vrchní část je jedna lesklá dotyková plocha bez vystupující krycí masky. Pod deskou je schována část elektroniky, která není ani z mírného bočního pohledu vidět. Bohužel moc dalších modulů se pod zadní kryt nevejde, ale je možné si vytvořit vlastní krabičku a tu s displejem spojit v jeden celek. Touto cestou jsem se dal.

Jednoduché parametrizování, minimální programování

Největší předností panelu je, že v minimální verzi si člověk vystačí pouze s přidáváním vestavěných objektů a jejich parametrizováním. K těmto objektům pak zasílám hodnoty z ESP32 po sériové komunikaci jednoduchými příkazy. Je také možnost k objektům přidávat vlastní funkce jazykem vycházejícím z C. Tak je návrh obrazovek velmi rychlý.

Je ale nutné upozornit, že displeje Nextion jsou v několika variantách (pominu rozměry) a u nižších není několik typů objektů podporováno. To samé, při vykreslování obrázků je možné prolínání pouze od verze „Intelligent". U verze „Enhanced", kterou mám, není podporována asi třetina zajímavých funkcí, na což se ale nikde moc neupozorňuje. Reklamní videa jsou zřejmě s vyšší verzí. Je ale možné použít pár triků použitím grafických příkazů zaslaných po sériové lince.

Další zásadní vlastností pro tvorbu je, že si displej můžeme navrhnout se vším, co se má zobrazovat, a pustit si návrh v Debug módu, aniž byste měli displej fyzicky. Funguje odladění komunikace, reakce na chyby, reakce objektů na dotyk. Funguje graf, RTC, zápisy a čtení z paměti. Režim Debug funguje i po komunikaci.

Nahrávání displeje a napájení

Často prezentovanou možnost nahrávat pomocí SD karty jsem nevyužil, stejně tak ukládání na SD kartu. Je dobré na řídicí desku displeje vložit knoflíkovou baterii pro RTC. Ve finální variantě mám dodaným kabelem propojen displej s externí zdrojovou deskou. Ta není podmínkou pro používání, ale je vhodným doplňkem. Přes zdrojovou desku je možné panel pomocí USB nahrávat a propojit displej s ESP32.

Sériové rozhraní displeje i přes propojení přes zdrojovou desku podporuje úroveň 3,3 V. Komunikace s displejem je v širokém rozsahu rychlostí otevřeným ASCII protokolem. Já zvolil 115200 Bd i pro nahrávání displeje. Jediným problémem bylo, že deska METEO Mini C3 v4.1 neobsahuje moc konektorů pro připojení ani vyvedených IO. Nakonec jsem použil dva nevyužité 3pinové konektory pro připojení IO uŠup. Jeden pro RxD, druhý pro TxD.

Zdrojová deska má konektor 5,5/2,1 mm pro napětí 6–26 Vdc a napájím ji standardním síťovým adaptérem. Dává také dostatečný proud na 5 V. Tím napájím ESP32, které je zálohováno baterií. Konektor pro připojení komunikace a napájení zdrojové desky je propojen na 2pinový konektor SOLAR desky ESP32.

Integrace hlavní jednotky

Nástavec pod displej jsem si navrhl a vytiskl na 3D tiskárně v černém matu. Do nástavce jsem umístil METEO Mini C3 v4.1 s baterií, modul pro mikro SD kartu a modul RTC, propojených přes uŠup konektory. Baterie pro ESP32 má kapacitu 2500 mAh a vydrží zálohovat desku více než celý den bez usínání. Dále je zde zdrojová deska a upravený propojovací kabel. Moduly jsou rozmístěny tak, aby bylo přístupné připojení a SD karta. Tím je zachován kompaktní vzhled celé stanice s jedním napájecím kabelem i s možností uchycení na panel přes dodané úchytky. Myslel jsem i na otvor pro pověšení na zeď, což na původním krytu není.

06-zapojeni-elektroniky

Zapojení elektroniky uvnitř hlavní jednotky – nástavec pod displejem

09-zapojeni-konektory

Detail konektorů na zadní straně hlavní jednotky

10-zadni-strana-krytu

Hotová zadní strana krytu s jedním napájecím kabelem

Popis jednotlivých objektů na obrazovce

Zvolil jsem orientaci na výšku pro lepší uspořádání různých údajů. Podle toho je i umístěn napájecí modul uvnitř, tak aby napájecí konektor byl ve středu spodní hrany.

Jednotlivé části:

  • Datum, den v týdnu a čas. Čas je zobrazen výrazným fontem sedmisegmentových číslic. Fonty se pro Nextion generují samostatně z PC v požadované velikosti i kódové stránce. Na obrazovce nelze s velikostí manipulovat, a tak se každý nový typ generuje samostatně. Není dobré generovat font pro UTF8, zabírá to moc místa a znaky se nevyužijí. Datum a čas je řízen z vnitřního RTC zálohovaného baterií displeje. To ušetří na komunikaci s ESP. Texty dnů v týdnu jsou také naprogramovány v displeji. Datum a čas se rozeběhne okamžitě po zapnutí displeje, aniž by panel komunikoval, a je synchronizován s hodinami ESP pomocí NTP. ESP zasílá pravidelně svůj čas do displeje ve 4 hodiny ráno. Úplně vpravo je malý svislý bargraf s hodnotou napětí baterie ESP32. Barva bargrafu je řízena v displeji podle procenta nabití baterie. Zvolil jsem si ještě kliknutím na číslo hodin zvyšování jasu a na minut snižování jasu displeje. Programováno jen v displeji, stejně jako úplné zhasnutí podsvícení.
  • Vnitřní teplota, vlhkost, napětí baterie a síla signálu jednotky vnitřního měření. Informace měření je dodávaná již popisovaným modulem po WiFi.
  • Venkovní teplota, vlhkost, tlak a napětí baterie meteo měření. Tato měření se promítají do spodního grafu. Jak bylo uvedeno, meteo měření je postaveno na METEO Mini C3 v4.1 a BME280+SHT40. Data jsou zasílána pomocí WiFi UDP a deska také většinou spí.
  • Obrázek aktuálního počasí je odvozen z dat přijímaných pomocí OpenWeatherMap, kdy stahuji pravidelně předpověď na pět dnů v tříhodinových intervalech. Podle informací serveru jsou data dodávaná ČHMÚ podle zeměpisných souřadnic. Obrázky se střídají podle ID předpovědi s tím, že od západu do východu slunce je zobrazována fáze měsíce, pokud není v předpovědi oblačnost. Fázi měsíce si počítám podle známých algoritmů. Obrázky se importují z PNG souborů. Čas východu a západu slunce je také vyčten z předpovědi.
  • Panáčci jsou spíše legrácka. Původně jsem je chtěl zobrazovat podle domečku na počasí s panáčkem a panenkou, nicméně v současnosti jsou obrázky generovány ze zabudovaného kalendáře událostí. Pokud má někdo svátek, zobrazí se kytka, pokud narozeniny, dort atd. Na další události je místo, přidá se pouze PNG obrázek a záznam do souboru událostí.
  • Předpovědi. Hodnoty průměru, pocitové teploty, minimální a maximální jsou přebírány z OpenWeatherMap na následující tři hodiny. Tyto informace jsou dobré z toho důvodu, že venkovní měření mám orientované na východ a po rozbřesku za hezkého počasí jsou přímo měřené hodnoty ovlivněny sluncem.
  • Část grafu měření – je rozdělena na 400 denních bodů (rozlišení displeje je 800×480 pixelů). Měřené hodnoty teploty, vlhkosti a tlaku jsou zaznamenány na SD kartu a zároveň přepočítávány do grafu. Počátek grafu začíná půlnocí a do rozbřesku je vidět trend, kam se hodnoty budou pohybovat. Výhodou záznamů na SD kartu je možnost rekonstrukce grafu po resetu displeje, kdy se graf vymaže. Graf se negeneruje, pokud je nastavena jiná obrazovka. V ESP je naprogramováno, že pokud je překročen rozsah nějakého měření, provede se přepočet maxima a minima a překreslí se dosavadní měření do nového průběhu. Tím se eliminují případné odskoky. Nad grafem jsou dva horizontální bargrafy. Levý dopoledne, pravý odpoledne. Na bargrafy je proveden přepočet den a noc. Viditelný posun je způsoben letním časem. Vpravo od grafu jsou barevně zobrazena maxima a minima rozsahu grafu pro teplotu, vlhkost a tlak.
  • Předpověď po třech hodinách – odvozena opět z OpenWeatherMap a převedena na symboly s uvedením, ke které hodině je uvedená předpověď.
  • Kalendář událostí je vnitřní tabulka, kam jsem zapsal důležité rodinné a obecné události. Podle aktuálního data jsou nalezeny dvě následující události. Pokud se první řádek shoduje s aktuálním dnem, je zobrazen žlutým textem. Pokud je událost označena svátkem nebo narozeninami, změní se obrázek na panáčcích. Tabulka je ve dvou variantách, první je zakompilovaná v ESP, druhá na SD kartě pro možnost změny bez nutnosti kompilace. Ale na každý rok je nutné aktualizovat tabulky.
  • Stmívání displeje je řešeno dotykem na displej. Nepoužívám usínání displeje, které Nextion umožňuje, protože pak by se zastavilo generování grafu. Všechny hodnoty zobrazované na displeji jsou v zálohovaném ESP, tak by i usínací varianta byla možná.

Hlavní jednotka

Hlavním procesorem pro příjem měření po WiFi UDP je METEO Mini C3 v4.1, LaskaKit. Vzhledem k tomu, že nevyužívám možnost vzdáleného nahrávání, mohl jsem zvolit Partition scheme: Huge App. V základním nastavení jsem se dostal na 96 % obsazení paměti pro program při 2500 řádcích programu. Po přenastavení jsem se dostal pod 50 % a mám silnou rezervu na další vychytávky.

Přehled funkcí:

  • Kompletní ovládání displeje přes sériovou komunikaci Serial1. Datová komunikace je připojená přes dva třípinové konektory na IO uŠup.
  • Připojení na WiFi s pevnou adresou tak, aby se podřízené stanice mohly automaticky připojit pomocí DHCP jako klienti na server protokolem UDP. Nerealizovaná úvaha je nastavit WiFi do režimu STA+AP tak, aby nebylo WiFi připojení závislé na místní WiFi síti, když jsou všechny stanice se zálohovaným napájením. Nepoužívám režim s OTA, tak je to jen otázka budoucí výměny programů a přenastavení sítě.
  • Na každou zprávu odpovídá server ACK. Pokud klienti nedostanou ACK, provedou si po čase restart připojení do sítě. Zprávy jsou většinou měření z čidel. Vzhledem k tomu, že jedou v režimu uspávání, není perioda odesílání kratší než 1 minuta a čas se prodlužuje podle napětí baterie. Tak není komunikace zahlcena.
  • Připojený modul RTC nastavuje čas procesoru pouze pokud procesor startuje, aby byly k dispozici hodiny, i když není připojení k síti. Po připojení na WiFi se provádí kontrola s NTP a pak vždy ve 4 hodiny v noci z důvodu přechodu na zimní/letní čas. Po synchronizaci se odesílá čas do displeje, který má vlastní zálohované RTC.
  • Po WiFi se odesílá každé dvě minuty měření na Tmep.cz. Z uvedeného serveru je možné zasílat zprávy zpět, které se při přijmu odpovědi parsují a je možné je používat pro vzdálené nastavování z webu (předpoklad dalších vychytávek).
  • Hodnoty z čidel od klientů se zapisují do jednotné tabulky, na klientech se neprovádí žádné vyhodnocení. Jednotná tabulka se periodicky prohledává, vyhodnocuje se aktivita čidel, rozsahy hodnot a tam, kde jsou nastaveny příznaky, provádí se filtrace hodnot pro zobrazení. Je možné nastavit limity pro alarmy. Překročení limitů se loguje na SD kartu a posílá na WhatsApp.
  • Přes internet se provádí stahování předpovědí z OpenWeatherMap každou hodinu, hodnoty se přenáší na displej.
  • Z příkazového řádku Arduino IDE je možné zadávat, co se má případně logovat. Tato nastavení včetně min a max limitů pro graf se zapisují přes Preferences do NVS, a tak jsou tato nastavení zachována i po restartu procesoru.

Konfigurace a software

Kód hlavní jednotky (301_Centrala_X.ino) píšu a nahrávám v Arduino IDE, deska METEO Mini C3 v4.1 se v něm nastavuje takto:

Deska:             ESP32C3 Dev Module
USB CDC On Boot:   Disabled
Flash mode:        QIO
Partition Scheme:  Huge App
Rychlost portu:    115200 Bd

Partition Scheme: Huge App jsem mohl zvolit proto, že nevyužívám vzdálené nahrávání (OTA) – ušetřené místo jde do vlastního programu. V základním nastavení jsem se s 2500 řádky kódu dostal na 96 % obsazené paměti, po přenastavení na Huge App klesla obsazenost pod 50 %.

Program stojí na běžných knihovnách: Adafruit_NeoPixel (RGB LED na desce), ArduinoJson (parsování odpovědí z OpenWeatherMap), HTTPClient a WiFiClientSecure (stahování předpovědi), RTClib (obvod RTC DS3231), SD a SPI (záznam na SD kartu), WiFi a WiFiUDP (komunikace s venkovní a vnitřní jednotkou), Wire (I2C k senzorům) a Preferences (ukládání nastavení do NVS).

Síť a externí služby

Základní síťové a servisní údaje se nastavují na začátku souboru:

const char* ssid = "ssid";
const char* pass = "pass";
IPAddress ipAddr(192, 168, 0, 50);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
const uint16_t ipPort = 54321;      // UDP port pro venkovni a vnitrni jednotku

// --- Tmep.cz ---
const char *TMEP1_HOST = "id1.tmep.cz";
const uint16_t TMEP_PORT = 80;

// --- OpenWeatherMap ---
const char *weatherUrl =
    "https://api.openweathermap.org/data/2.5/forecast?"
    "lat=...&lon=..."
    "&appid=..."
    "&cnt=10&units=metric&lang=cz";

Pevná IP adresa hlavní jednotky je důležitá – venkovní i vnitřní jednotka se k ní připojují jako UDP klienti pomocí DHCP, takže centrála musí v síti sedět na stálé adrese.

Nastavení za běhu přes sériovou linku

Aby nebylo nutné kvůli každé maličkosti znovu nahrávat program, dá se chování hlavní jednotky měnit za běhu jednoduchými znakovými příkazy ze sériového monitoru Arduino IDE. Malé písmeno přepíná logování dané oblasti, velké písmeno přepíná danou funkci úplně:

Příkaz Funkce
d / D logování displeje / sériová komunikace s displejem zap./vyp.
s / S logování senzorů / filtrace hodnot
t / T logování Tmep.cz / odesílání na Tmep.cz
u logování UDP komunikace
w / W logování předpovědi / stahování z OpenWeatherMap
z / Z logování SD karty / zápis na SD kartu
g / G výpis / regenerace grafu ze záznamů na SD kartě

Všechna tato nastavení, včetně min/max limitů pro graf, se ukládají přes Preferences do NVS paměti ESP32, takže zůstanou zachovaná i po restartu. Kromě toho má hlavní jednotka připravený mechanismus pro příkazy přijaté zpět z Tmep.cz (zatím jen testovací Test) – do budoucna počítám s tím, že by šlo stanici nastavovat i vzdáleně přes web.

Kalendář událostí (Kalendar_iso.cfg)

Kalendář, který se promítá do „panáčků" a spodní části displeje, je samostatný konfigurační soubor vložený do hlavního programu přes #include – jde ho upravovat bez zásahu do zbytku kódu:

// Kodova stranka: ISO 8859-2 Central Europe (EE)
stKalendar Kalendar[] =
{
// M   D  DT ICO
  {1,  1, 4, 0, "NOVÝ ROK"},
  {1,  6, 2, 0, "Tři králové"},
  {5,  1, 5, 0, "1.Máj"},
  {12,24, 4, 0, "Štědrý den"},
  {12,25, 5, 0, "1. svátek vánoční"},
  {0,  0, 0, 0, ""}
};

Každý řádek je měsíc, den, kód dne v týdnu, index obrázku a text události. Soubor je uložený v kódové stránce ISO 8859-2, protože v ní je vygenerovaný i font pro Nextion – při přechodu na jinou kódovou stránku je potřeba přegenerovat i font.

Projekt displeje v Nextion Editoru

Grafika a chování displeje se navrhuje samostatně v Nextion Editoru jako projekt Home_04.HMI. Po dokončení se zkompiluje do binárního firmwaru Home_04.tft, který se nahraje do displeje (přes USB, případně přes zdrojovou desku). Fonty se generují samostatně v požadované velikosti a kódové stránce – displej neumí velikost fontu měnit za běhu, takže každá varianta velikosti je samostatný font. Většinu drobné logiky (texty dnů v týdnu, chod hodin, jas, přepočet bargrafů) jsem naprogramoval přímo v displeji jazykem vycházejícím z C, takže se o to hlavní jednotka nemusí starat.

Ke stažení

Diskuze (0)

Buďte první, kdo napíše příspěvek k této položce.

Nevyplňujte toto pole