Fyzikální kabinet FyzKAB
Články Prostředí mBlock + modul Arduino Internetová meteorologická stanice pro neprogramátory

Internetová meteorologická stanice pro neprogramátory

Dnešní trh s elekronikou je doslova zahlcen různými nesmysly, takže se jistě dá zakoupit i „nějaká krabička“, která dokáže měřit teplotu, atmosférický tlak a vlhkost s tím, že tyto údaje je možné vzdáleně načítat přes internet. Tento článek je určen pro všechny, co se nechtějí jen smířit s nákupem takového zařízení, ale pro ty, co si chtějí takové zařízení postavit.

Proč to chtějí stavět? Protože prostě chtějí!!!

Nechci zde rozvádět rádoby filozofické úvahy o tom, proč by měl kdokoliv stavět něco, co je dostupné za pár stovek nebo snad tisíců. Situace je prostě postavena tak, že nyní chceme postavit zapojení jednoduché internetové meteorologické stanice a hotovo! Na následujících řádcích si tedy ukážeme, jak na to. A to zejména v případě, že o elektronice čtenář (zatím) toho moc nevím a žádný programovací jazyk (zatím) neumí.

Hardwarová část

Začneme hned tím, co je třeba si pořídit, kromě počítače s volným USB portem, abychom se do naší stavby mohli co nejdříve pustit.

Modul vývojového mikrokontroléru Arduino
125–250 Kč
Stačí některý z levnějších klonů typu UNO. (doporučuji tzv. precizní klon)

Arduino UNO

Rozšiřující modul Arduino Ethernet Shield
220–350 Kč
Potřebný pro připojení LAN kabelem k internetu.

Modul snímač teploty a vlhkosti DTH11
45–50 Kč
Osazená destička (ne jen samotné čidlo)

cidlo DHT11

Senzor měření teploty a tlaku BMP180
30–40 Kč
Osazená destička (ne jen samotné čidlo)

cidlo BMP180

Propojovací vodiče dupont (vidlice-zásuvka)
60–90 Kč (40 ks)
Postačí nám jich asi deset, ale minimální prodejní balení bývá obvykle 40.

vodice

Napájecí stabilizovaný zdroj síťový 9 V/min. 1 A
110–190 Kč
Napájecí síťový adaptér (stabilizovaný), souosý výstupní konektor 2,1 mm

zdroj

USB kabel (dle konektoru na PC a typu konetoru na modulu Arduino)
20–60 Kč
Kabel někdy bývá přímo součástí modulu Arduino (záleží na prodejci)

USB kabel

Síťový LAN kabel, 2× RJ45 konektor
10–30 Kč
tzv. „internetový“ kabel pro připojení k modemu či do domácí počítačové sítě

LAN kabel

Nákup všech položek by se nám měl vejít do tisícikoruny – pochopitelně záleží na prodejci. Pokud vše již máme, můžeme se pustit do zapojování.

Nejdříve sesadíme modul Arduino s modulem Ethernet Shield. Můžeme připojit i USB kabel, který budeme potřebovat pro programování modulu Arduino. Lze připojit i LAN kabel, který ale budeme potřebovat později až pro připojení do počítačové sítě. Pokud chceme nejdříve programovat a testovat samotné Arduino nemusíme řešit externí napájení. Pokud ale připojíme rozšiřující modul Ethernet Shield, doporučuji začít vzniklou soustavu napájet externím napaječem. Ethernet Shield má poměrně velkou spotřebu a tak jeho napájení jen přes USB může někdy vyvolávat problémy při zápisu programu do modulu Arduino. Jen ještě jednu poznámku: Ethernet Shield (verze 3) lze napájet i přes počítačovou síť, ale to musí tato síť podporovat, proto je lepší alespoň ze začátku se spolehnout na externí napáječ, který slouží jak pro modul Arduino, tak pro Ethernet Shield.

Arduino + Ethernet Shield Arduino + Ethernet Shield

Ač to může znít jako vtip, tak právě jsme si vytvořili počítač i se síťovou kartou! Nyní jen připojíme potřebná čidla a hardwarová část je hotová.

Čidlo DHT, které slouží pro měření teploty a vlhkosti vzduchu, stejně tak čidlo BMP180 určené pro měření absolutního atmosférického tlaku a teploty zapojíme k modulu Arduino podle následujícího schématu. Pro propojení použijeme vodiče pro nepájivé pole (vodiče dupond).

schema zapojeni

POZOR! Pokud budeme připojovat čidla do volných konektorů Ethernet Shield (a nikoliv do modulu Arduino, který zůstane připojen kdesi pod ním), musíme čidlo BMP180 připojit do pinů A4 a A5 (žlutý a zelený vodič), protože původní piny SDA a SCL na Ethernet Shield nejsou vyvedeny! Tato změna je naznačena ve schématu. Při tvorbě programu se toto jiné zapojení nijak neprojeví, protože jsou tyto vývody na modulu Arduino propojeny.

Pokud jsme zapojování zvládli, měli bychom získat něco následujícího:

propojeni Arduino a cidel

Z hlediska konstrukčního to není kdovíjaká paráda, ale případné uchycení do nějaké krabičky je již otázkou několika šroubků.

Hardware je asi po dvou minutách hotový, tak snad půjdeme programovat! Kéž nám to půjde stejně rychle!

Softwarová část

Modul Arduino se pochopitelně programuje pomocí vývojového prostředí Arduino IDE a programovacího jazyka Wire, který vychází z programovacího jazyka C. Pokud budeme chtít do budoucna dělat své obtížnější projekty, nezbyde nám asi než se tomuto jazyku naučit. Nyní ale chceme vytvořit internetovou meteorologickou stanici pro neprogramátory a tak se přece nemůžeme pouštět do kdovíjakého psaní programového kódu.

Pro naprogramování modulu Arduino použijeme vývojové prostředí mBlock, které je původně vyvinuté pro dětské programování robota mBot. Protože tento robot však obsahuje právě modul Arduino a protože vývojáři prozíravě neomezili toto prostředí jen pro tohoto robota, je možné jej výborně použít pro naše účely.

mBlock + Arduino

Vývojové prostředí mBlock (ver. 5) je ZDARMA dostupné buď ve Windows Store, nebo je možné jej stáhnout přímo z webových stránek prostředí mBlock. Osobně doporučuji stáhnout si aplikaci přímo z webových stránek – u verze z Windows Store jsem měl problém s připojením modulu Arduino do tohoto prostředí. Pro majitele počítačů s operačním systémem Linux či MAC sice neexistuje přímo vývojové prostředí, ale je možné využít on-line prostředí aplikace mBlock. Pro propojení tohoto online prostředí s modulem Arduino připojeným k Vašemu PC stačí jen doinstalovat doplněk mLink, který je k dispozici pro počítače Linux, MAC i Windows (mLink je ke stažení v odkazu Download na stránkách prostředí mBlock).

Jelikož jsem se programování modulu Arduino pomocí prostředí mBlock již věnoval v několika jiných článcích, nechci zde opakovat již vyřčené. Pro ty, co chtějí vědět, jak spustit prostředí mBlock a propojit jej s modulem Arduino, abychom mohli začít programovat, doporučuji přečíst úvod následujícího článku: mBlock (ver. 5), Arduino a Multi-Function Shield (Funduino). Zároveň ve zmíněném článku doporučuji v podkapitole „LED zobrazovače – AHOJ SVĚTE!“ nastudovat, jak se do mBlock přidávají připravená rozšíření (budeme to potřebovat).

Tak už začneme „programovat“?

Pokud jsme zvládli stáhnout a nainstalovat prostředí mBlock, připojit k němu náš modul Arduino (jak hardwarově, tak softwarově) jsme SKORO připraveni k vytvoření našeho kódu. Ještě nám zbývá přidat rozšíření pro Ethernet Shield a pro senzory BMP180 a DHT11. Klikneme v mBlock na ikonu rozšíření a pokud jsme připojeni k internetu, zadáme do vyhledávacího pole počáteční znaky hledaného rozšíření – například „Ethe“.

pridani rozsireni

Ve správci rozšíření se nám nabídne rozšíření Ethernet Shield, které (pokud používáme poprvé, nejdříve stáhneme kliknutím na zelenou ikonku) přidáme do našeho projektu kliknutím na „+ Přidat“. Obdobně přidáme rozšíření pro čidlo BMP180 a DHT11. Jen pozor, zatímco rozšíření pro Ethernet Shield a čidlo BMP180 jsou zde jediné (jsou z naší dílny, proto podporují češtinu), rozšíření pro čidlo DHT11 je zde již od jiných vývojářů a některá jsou jen v čínštině nebo turečtině. Doporučujeme použít anglické rozšíření „DHT Extensions“ od vývojáře extransfer – vyhledávat podle klíčového výrazu DHT (bez čísla 11) a ikona tohoto rozšíření vypadá ve správci rozšíření je znázorněna vpravo.

DHT Extensions

Máme-li přidány všechny potřebná rozšíření, mělo by prostředí mBlock vypadat následujícím způsobem:

prostredi mBlock s rozsirenimi

Potřebný kód začneme skládat z funkčních kostiček – to snad není kdoví jaké programování!

První kostičku najdeme v záložce Události a je to kostka: „Když se Arduino UNO spustí“. Tím začíná každý program pro modul Arduino. Následuje inicializace čidla BMP180 (najdeme v záložce čidla BMP180), čidla DHT11 (záložka DHT Extensions) a nastavení MAC a IP adresy Ethernet Shield (záložka Ethernet Shield) – viz následující část kódu:

kod-cast 1

V případě čidla BMP180 lze ještě nastavit drobnou korekci načítaných hodnot teploty, tlaku a nadmořské výšky, která je počítána z tlaku a tlaku přepočteného na hladinu moře – buď známe nadmořskou výšku a umíme spočítat tlak na hladině moře, nebo naopak.

U čidla DHT11 můžeme zvolit jeho číslo (zde 1), protože těchto čidel by bylo možné připojit hned několik. Dále se zde nastavuje číslo pinu, na který se odesílají data z čidla (zde pin 5). Typ čidla je nastaven na použitý typ DHT11.

Nastavení MAC adresy podléhá jistým pravidlům. Na některých destičkách Ethernet Shield je samolepka s danou MAC adresou, tu pak zde zadáme. Mělo by platit, že je tato adresa zcela unikátní, můžeme tedy třeba použít MAC adresu některé starší nepoužívané síťové karty, nebo si ji prostě zkusíme vymyslet. Já zde uvádím MAC adresu 222-173-190-254-254-254, které mi funguje. Vy zkuste být originální a aspoň jednu z šestice čísel prostě změňte. Zatím se mi nestalo, že bych touto metodou trefil adresu nějakého zařízení v mé části internetové sítě.

V případě IP adresy je třeba trochu spolupracovat se správcem vaší počítačové sítě. Nejlepší je mu přímo říci, ať Vám nějakou IP adresu přidělí a pak „zařídí“, aby tato adresa byla přístupná z internetu. Ať se stará! Pokud tuto možnost nemáte, je trochu problém s tím, že Vaše internetové připojení může být dle poskytovatele různé a nelze tady „jen tak“ dát univerzální návod. Asi největší problém nastane, máte-li od svého poskytovatele internetu tzv. dynamicky přiřazovanou IP adresu. Pak se bohužel k Vaší úloze moc nedostanete, protože se IP adresa Vašeho přístupového bodu neustále mění. Každopádně pokud zvolíte výše uvedenou adresu: 192.168.0.2, měla by být dostupná alespoň v rámci Vaší domácí (lokální) sítě právě na této adrese.

Dalším krokem našeho programu je spuštění služby webového serveru a první načtení měřených veličin. K našemu již rozpracovanému kódu tedy připojíme následující bloky:

kod-cast 2

Tmavě oranžový blok „Spustit SERVER“ spouští službu webového serveru na standardním portu 80. (tento blok najdeme jej na záložce „Server)

Světlejší oranžové bloky jsou přiřazením hodnot čidel do připravených proměnných (pojmenované T1, T2, CBP, SLP, Alt a Hum). Proměnné vytvoříme na kartě „Proměnné“ klinutím na tlačítko „Vytvoř proměnnou“, kde zvolíme její název (viz ukázka vytvoření proměnné „Hum“).

nova promenna

Žlutý blok „počkat 3 sekund“ pozastaví běh programu na tři vteřiny, aby byl dostatek času pro prvotní načtení relativně pomalého čidla DHT11.

Modrý blok „vynulovat čítač“ najdeme na záložce „Senzor“ a vynuluje časovač, který budeme potřebovat pro pravidelné načítání hodnot z čidel.

Další část kódu uzavřená ve smyčce „opakuj stále“ (záložka „Ovládání) se již týká samotné internetové komunikace a pravidelného načítání čidel. Projdeme je každou zvlášť.

kod-cast 3

První částí je vyřizování dotazu od internetového prohlížeče. Pokud někdo zadá adresu http://192.168.0.2/ je přes počítačovou síť odeslán dotaz na Ethernet Shield. V modulu Arduino je tedy splněna tmavě oranžová podmínka „Zaslal KLIENT nějaký dotaz?“ (záložka Server) a začne se zpracovávat kód v této sekci uzavřený.

Následující podmínka „Když Klientův GET dotaz obsahuje METEO.htm“ je složena z bloků „když-tak-jinak“ (záložka „Ovládání), „Klientův GET dotaz“ (záložka „Server) a operátor „obsahuje?“ (záložka „Operátory). Tato podmínka rozděluje program na dvě části. První nastává, pokud byl zadán dotaz na soubor METEO.htm, tedy pokud jsme do webového prohlížeče vzdáleného počítače zadali adresu http://192.168.0.2/METEO.htm. V případě, že bylo zadáno cokoliv jiného, bude zpět odeslána chyba 404 Not found.

V případě dotazu na webovou stránku METEO.htm musíme prohlížeči odpovědět stavovou hlavičkou 200 OK a pak odeslat tělo webové stránky, která bude obsahovat informace o teplotě, barometrickém tlaku a vlhkosti. Stavová hlavička a obsah webové stránky je rozdělen do dvou sekcí „ODESLAT odpověď klientovi“ (v první je sekvence odeslání hlavičky – dle protokolu HTTP/1.1, v druhém webová stránka, tak jak bychom ji psali v nějakém editoru webové stránky). Samozřejmě na místa, kde mají být hodnoty načtených veličin je vždy odeslána hodnota dané proměnné T1, T2, SLP… atd.)


Drobná vychytávka

Poznámka (9. 12. 2022)
Právě jsme zjistili, že použití „vychytávky“ Text uložený ve Flash společně s odesíláním odpovědí klientovi pomocí Ethernet Shield (ver. 0.0.1) má své slabiny. Chcete-li se o tom dozvědět více, doporučujeme článek: Pozor na F-Makro a Ethernet client.print().
Přemýšlíme nad nalezením lepšího řešení.
Poznámka (14. 1. 2023)
Dnes jsme odeslali do MakeBlock ke schválení novou verzi rozšížení Ethernet Shield (nyní ver. 0.0.3), které má již odstraněné slabiny ohledně odesílání textů odpovědi serveru – jak normálního textu, tak i při použití rozšíření Texty do Flash.
Chcete-li plně využít níže uvedenou „vychytávku“, doporučujeme tedy použít rozšíření Ethernet Shield minimální verze 0.0.3.

V kódu odeslání odpovědi na vzdáleně připojený počítač nám jistě neušlo, že odesílané texty jsou ještě vnořeny do světle modrého bloku „Text uložený ve Flash“, který se nám (zatím) v žádné záložce rozšíření najít nepodařilo a o kterém zatím nebyla zmínka.

Pro vysvětlení tohoto bloku si musíme něco říci o struktuře paměti modulu Arduino. Asi je jasné, že modul Arduino, jako počítač, který se vejde do dlaně, bude mít jistá omezení. Jedním z těch základních je právě velikost a struktura paměti.

Modul Arduino má hned několik částí celkové paměti:

  1. Paměť FLASH (32 KB u Arduino Uno): jde o část paměti, kde je tzv. bootloader (0,5 až 2 KB) a kam se též nahrává program. Uložené údaje zde zůstávají i po vypnutí proudu. Představte si ji jako BIOS v klasickém počítači.
  2. Paměť SRAM (2 KB u Arduino Uno): je částí paměti, kam se ukládají proměnné a kam si Arduino odkládá výpočty při svém běhu. Při přerušení napájení se data vymažou. Je to taková obdoba paměti RAM v klasickém počítači.
  3. Paměť EEPROM (1 KB u Arduino Uno), což je část paměti, kam si můžeme odkládat data při běhu programu a znovu je využívat. Oproti SRAM se data po přerušení napájení nevymažou, má však mnoho nevýhod, na které je potřeba myslet. V našem přirovnání ke klasickému PC si to můžeme představit jako pevný disk s velmi omezeným počtem zápisů.

Po spuštění programu jsou do paměti SRAM nahrány všechny proměnné, které máte uvedeny v programu. Potom při běhu programu jsou sem ještě ukládány proměnné deklarované v samostatných funkcích (lokální proměnné). Problém SRAM paměti je, že je poměrně malá a tedy rychle ubývá – hlavně při práci s textem. Modul Arduino si sám sice řídí využití této paměti, ale je třeba dávat pozor na její přetečení (tedy, když se pokusíte zapsat více dat, než je paměti k dispozici). Nejčastěji se to stává, když se dostanete na hranici velikosti paměti a pak začnete vytvářet texty, co potřebujete odeslat právě třeba na internet. A to je právě náš případ! Velkou část paměti zaberou knihovny pro práci s čidly a Ethernet Shield, na uložení textů pro odpověď a odeslanou webovou stránku již moc místa nezbývá.

V tomto poměrně jednoduchém příkladu bychom nemuseli tolik panikařit a jistě by šel vytvořit i bez dále uvedeného triku – tedy odesílané textu by šly rovnou napsat do bloku „řádek odpovědi“. Ale v případě většího projektu, nebo třeba při přidání dalších čidel by mohl nastat problém. Zvykněme si tedy i v takto malých projektech být trochu hospodárnějšími. Je tedy třeba hledat místo jinde než jen ve standardní SRAM!

Při pohledu na velikosti jednotlivých částí celkové paměti je pro náš účel nejschůdnější uložení rozsáhlých statických textů do paměti Flash. Texty tam jsou zapsány při nahrátí programu a čteny v případě potřeby při jejich zavolání. K tomu účelu právě slouží rozšíření nazvané „Texty do Flash“, které nabízí jediný blok „Text uložený ve Flash“. Po přidání tohoto rozšíření do prostředí mBlock jej můžeme začít používat tak, jak je uvedeno našem programu.


Poslední částí našeho programu je pravidelná obsluha měřicích čidel.

kod-cast 4

Jedná se o podmínku, která testuje proměnnou „časovač“. Tato proměnná se automaticky zvětšuje každou vteřinu. Dosáhne-li hodnoty větší než 30 dojde k načtení hodnot z čidel a jejich uložení do připravených proměnných (stejně jako na začátku – před začátkem smyčky „opakuj stále). Po načtení požadovaných veličin, je proměnná časovač vynulována, aby se mohlo čekat další interval. Celá podmínka je pochopitelně vnořena do nekonečné smyčky a tak se kód neustále opakuje a data jsou aktualizována přibližně každých 30 vteřin.

Hotový kód:

celkovy kod

Vytvořený kód nahrajeme do modulu Arduino a pokud nedošlo k nějaké chybě při překladu, kompilaci nebo nahrání kódu do modulu Arduino. Je hotovo! Vyzkoušet funkčnost můžeme tak, že pomocí LAN kabelu připojíme modul Arduino k síťová kartě počítače. Pokud na tomto počítači nastavíme IP adresu síťového připojení (NastaveníSíťová připojeníEthernetVlastnostiProtokol IP verze 4 (TCP/IPv4)Použít následující IP adresu) kupříkladu na hodnotu 192.168.0.1 je součástí stejné podsítě jako je modul Arduino.

Pokud zadáme do webového prohlížeče adresu http://192.168.0.2/METEO.htm měla by se načíst následující stránka, která se bude aktualizovat každých 30 vteřin.

webova stranka

Postupně jsme si rozebrali funkčnost programu pro vzdálenou internetovou meteorologickou stanici, který jsme vytvořili v prostředí mBlock. Jak jsme viděli, nebylo třeba vůbec znát syntaxi jakéhokoliv programovacího jazyka. Stačilo nám jen „skládat“ funkční bloky, tak jak bylo zcela logické pro činnost námi požadované aplikace. Spojení vývojového prostředí mBlock s pomocí sady rozšíření pro měřicí čidla a pro modul Ethernet Shield vytváří z mBlock silný a intuitivní nástroj pro vývoj jednoduchých domácích IoT zařízení. Obdobným způsobem můžeme nejen monitorovat podmínky v nějakém prostoru, ale můžeme třeba i spínat relé, natáčet servo nebo krokový motor.

Koneckonců si to můžeme ukázat v některém z dalších článků…

Autor článku: Miroslav Panoš
UPOZORNĚNÍ:
Nesouhlasíme s vyřazením Newtonových zákonů, Ohmova zákona a zákona zachování energie z učiva fyziky základních škol v České republice!