Close

Zavlažovací systém s GPRS ovládáním

Schéma Arduino GPRS zavlažovacího systému

Náš čtenář Martin Holcr nám poslal popis svého projektu, ve kterém vytvořil zavlažovací systém s Arduinem.


Základní popis Arduino projektu

Cílem tohoto projektu bylo především vyzkoušet si možnosti Arduino platformy, a pokusit se o vytvoření jednoduchého zahradního zavlažovacího systému s možností kontroly přes webové rozhraní. Zároveň jsem se chtěl naučit něco nového a vyzkoušet si zda je s Arduinem opravdu možné postavit vlastní projekt bez potřeby hlubokých znalostí elektrotechniky. Hned na úvod musím napsat, že nemám vystudovaný obor elektro, takže pokud v následujících řádcích naleznete nějaký zásadní problém, nebude se s největší pravděpodobností jednat o překlep nýbrž o moji neznalost. V takovém případě budu rád za vaši kritiku pod článkem.

Požadavky na systém

Základní požadavky systému byly především možnost snadného rozšíření o další senzory, nízká spotřeba energie (bez nutnosti napájení z rozvodné sítě). Dále pak zavlažování samospádem z nádrže s dešťovou vodou nebo malým čerpadlem napájeným solárním panelem. Důležitým kritériem byla také cena. Na začátku jsem chtěl projekt realizovat jen pomocí bezdrátového modulu s NRF24L01+, což se ale postupem času ukázalo jako nedostačující. Důvodem byl špatný signál mezi zahradou a routerem s připojením k internetu (vzdálenost přibližně 400m s několika domy a stromy mezi oběma body). Proto jsem se nakonec rozhodl pro variantu s využitím GPRS mobilní sítě. Toto řešení navíc rozšiřuje možnost využití systému kdekoli, kde je pokrytí daného mobilního operátora potřebným signálem.

Na druhou stranu použití GPRS sítě přináší určité zdražení následného provozu systému z důvodu poplatků za připojení k internetu. Já jsem pro testovací účely využil poměrně zajímavou nabídku virtuálního operátora Mobil.cz. Zde je ke klasické dobíjecí kartě nabízen internet zdarma po dobu jednoho měsíce od dobití kreditu. V následujících 5ti měsících jen dojde k omezení rychlosti připojení na minimum (upload 16/ download 32 kb/s). To je však vzhledem k malému objemu přenášených dat naprosto dostačující. Připojení k internetu by tedy mělo fungovat po dobu 6 měsíců za cenu 200,- Kč. Pokud byste na trhu našli nějakou výhodnější nabídku, můžete pod článek přidat váš komentář pro ostatní. Jinak si myslím, že pokud zrovna pracujete na nějakém podobném projektu s použitím GPRS, může se vám nabídka výše uvedeného virtuálního operátora také hodit.

Z čeho se systém skládá

Hlavní jednotka (Arduino + GPRS modul + NRF24l01+)

Hlavní jednotka celého systému je složená z Arduino (Arduino UNO, lépe však vytvořená deska plošného spoje s čipem atmega328p-pu, kde je možné lépe využít sleep down mode celého modulu a ušetřit tak energii z baterií) + GPRS modul. Testovací verze využívá Arduino UNO + GPRS modul od společnosti Pandatron s použitím Quectel M10. Dále pak bezdrátový modul NRF24l01+. Jako napájení jsem použil 3x baterie AA (NiMH Eneloop s kapacitou 1900mAh), které mají udávaný poměrně vysoký vybíjecí proud. GPRS modul od společnosti Pandatron totiž neobsahuje potřebné kondenzátory pro pokrytí špičkového proudu o velikosti až 2A. Proto je pro provoz GPRS modulu potřebný dostatečný zdroj energie. Systém se mi povedlo v testovacích podmínkách zprovoznit i s přímým zapojením k uvedeným bateriím, nicméně to není příliš vhodné pro reálný provoz. Je lepší vytvořit desku plošného spoje, kde jsou použity kondenzátory o potřebné kapacitě a typu.

NiMH baterie jsem zvolil záměrně, protože je považuji za bezpečné a navíc s možností snadného dobíjení pomocí malého solárního panelu. Jistě existuje celá řada vhodnějších zapojení s použitím Li-Ion nebo Li-Pol baterií. Musím přiznat, že vzhledem k tomu, že nemám dostatečné znalosti z oboru elektro, volím raději bezpečnější variantu s NiMH články.

V testovací verzi této hlavní jednotky jsem zvolil variantu bez připojení k solárnímu panelu. Chtěl jsem zjistit jak dlouho bude jednotka v provozu v reálných podmínkách. Dále ale plánuji využít malý solární panel (výkon 0,5W nebo 2W), který by dobíjel baterie a umožnil by nepřetržitý provoz jednotky. Jen v krátkosti zde uvedu, že hlavní jednotka je nastavena tak, aby byla většinu času ve sleep modu a ušetřila se tak značná část energie.

Funkce hlavní jednotky je asi všem zřejmá. Jedná se o zařízení, které komunikuje pomocí NRF modulu se všemi senzory a zařízeními na zahradě. Přijatá data jsou uložena do interní EEPROM paměti. Ve chvíli, kdy se jednotka připojí pomocí GPRS modulu k internetu jsou tato data odeslána do MySQL databáze. Zároveň jsou načteny příkazy zadané přes webové rozhraní uživatelem, případně i servisní příkazy. Ty jsou také uloženy do EEPROM paměti. Ve chvíli, kdy se k hlavní jednotce přes NRF modul připojí některý klient (senzor, čerpadlo), jsou jemu určená data odeslána. Typickým příkladem je čerpadlo, které dostane příkaz ke spuštění zavlažování.

Interval jak často se GPRS modul zapne a připojí k internetu se dá rovněž nastavit přes webové rozhraní. Co se týče NRF bezdrátového modulu hlavní jednotky a zároveň i samotného Arduina, jsou použity funkce pro úsporný režim (sleep down, power down), kde je opět možné provádět nastavení přes webové rozhraní. Toto jsem zvolil spíše pro testování, protože v reálných podmínkách by mělo vše fungovat s maximální úsporou energie. V současné době mám nastavený režim, kde je modul po dobu 8s v úsporném režimu a následně pak 200ms v aktivním režimu, kdy může přijímat data z ostatních zařízení na zahradě. Tato zařízení jsou nastavena tak, aby zkoušela kontaktovat hlavní jednotku po dobu alespoň 8,1s. Zároveň mají nastavený režim power down modu po dobu 15 minut. Takže například měření teploty probíhá jen jednou za čtvrt hodiny a po zbytek času modul sníží spotřebu energie na minimum. Existuje i druhá varianta, o které jsem se dozvěděl nedávno, že NRF24l01+ je možné mít nastavený v režimu příjmu dat (spotřeba 10mA) a zároveň Arduino modul v režimu power down s možností nastavení interrupt (přerušení) v okamžiku, že jsou přijata data pomocí NRF modulu. Toto nastavení jsem zatím nezkoušel, protože vetší úspory energie by se mělo docílit stávajícím řešením.

Hlavní jednotka dále poskytuje aktuální datum a čas, který je aktualizován při každém zapnutí GPRS modulu. Čas je nejdříve zjištěn pomocí AT příkazu a následně i při připojení k internetu vytvořeným PHP scriptem. Tím odpadá nutnost do systému vkládat ještě obvod reálného času. Kód připojení k internetu je vložen do setup() části programu a je proveden vždy při restartování Arduina. Arduino je tedy v pravidelných intervalech restartováno pomocí interního WDT (Watch Dog Timer). Samozřejmě je možné toto připojování vložit i do loop() části programu. Chtěl jsem ale, aby Arduino bylo pravidelně restartováno a zároveň jsem si chtěl tuto možnost vyzkoušet.

Schéma Arduino GPRS zavlažovacího systému

Schéma systému

Senzory + zavlažování

Všechny senzory (teplota ve skleníku, venkovní teplota, vlhkost ovzduší a půdy, intenzita slunečního záření, množství vody v nádrži atd…) a zavlažovací systém (čerpadlo) komunikují s hlavní jednotkou pomocí modulu s NRF24l01+. Senzory jsou nastaveny tak, aby byly většinu času v úsporném režimu. Hodnoty jsou měřeny a odeslány například jednou za 15 minut. Stejný interval využívá i zavlažovací systém (čerpadlo) pro kontrolu, zda se má začít zalévat, jak dlouho a jaký okruh. Po dokončení zavlažování odešle tuto informaci na hlavní jednotku.

Všechna data přijatá hlavní jednotkou jsou doplněna časovým údajem a data jsou uložena v EEPROM paměti až do doby, kdy se modul připojí k internetu a odešle data do MySQL databáze.

Webové rozhraní + MySQL databáze

Celý systém je navržen tak, aby jej bylo možné ovládat pomocí jednoduchého webového rozhraní. Je využito několika PHP scriptů spolu s MySQL databází. V současné verzi se k zabezpečení využívá pouze Basic Authentication jak pro přístup uživatele na web tak i pro odesílání dat do MySQL databáze. Data do databáze jsou ukládána pomocí PHP scriptu. Pro grafické zobrazení dat je použito jQuery + HighCharts.

Web je rozdělen do několika částí – home, zavlažování a nastavení. Na stránce home jsou graficky znázorněna naměřená data ze senzorů. Je možné zobrazit jak aktuální hodnoty, tak i hodnoty za konkrétní den. Na záložce zavlažování je možné nastavit, který okruh se má začít zavlažovat a po jak dlouhou dobu. Zároveň je zde vidět zda je již naplánováno zavlažování některého okruhu. Na záložce nastavení je pak možné měnit základní parametry hlavní jednotky (interval připojení k internetu, doba úsporného režimu – pouze pro testovací účely).

Ostatní informace o systému

V současné době lze připojit maximálně 5 klientů (5 modulů s NRF24l01+) k hlavní jednotce. Ke komunikaci s modulem je použita knihovna RF24 od Maniacbug. Každý klient může měřit hodnoty z několika senzorů. V současnosti využívám senzor DHT11 (teplota a vlhkost). Pro měření vlhkosti půdy pak čidlo s označením YL-69 od čínského výrobce z ebay (nečekám dlouhou životnost a příliš přesné měření, spíše chci vyzkoušet v základní verzi, jaké jsou možnosti aniž bych musel do podobného senzoru investovat větší částku). Pokud máte osobní zkušenosti s nějakým čidlem vlhkosti půdy určitě dejte vědět v diskusi pod článkem. Pro měření množství vody v barelu je použit ultrazvukový senzor měření vzdálenosti HC-SR04.

Pro komunikaci mezi klienty, hlavní jednotkou a internetem jsem vytvořil jednoduchý protokol, který je založen na packetu o velikosti 32 bitu (unsigned long). Tento packet obsahuje informaci o cíli, zdroji, typu dat, času a samotná data (pouze v rozsahu od 0 – 127, přenášení záporných hodnot je řešeno posunutím záporných hodnot a následným odečtením před vložením do databáze). Packety jsou na hlavní jednotce uloženy v EEPROM paměti. Pro testování používám pouze maximálně 32 packetů uložených v EEPROM paměti.

Závěr

Celý systém má v současné době řadu omezení (maximální počet připojených klientů, velikost packetu a přenášených dat, velikost dočasného úložiště packetů atd.) a je zatím ve fázi vývoje. Plánuji jeho použití pro zalévání zahrady příští rok. Chtěl jsem se především naučit jaké jsou možnosti, jak řešit určité problémy a jaké do budoucna použít komponenty a postupy. Musím přiznat, že jsem se do projektu pustil tak nějak bez přípravy a tudíž se s rozšiřováním kódu některé věci staly poměrně nepřehledné. Místo vytvoření několika knihoven jsem vše řešil kódem v rámci jednoho Arduino sketche, což k přehlednosti nikterak nepřispěje. Pokud se budete pouštět do vlastního projektu (což vřele doporučuji), určitě si vše alespoň částečně rozplánujte a dělejte alespoň minimální dokumentaci. Ušetří vám to drahocenný čas a neustálé hledání potřebných částí kódu.

Pokud by článek někoho zaujal nebo byste měli chuť podílet se na novém projektu podobného zaměření, napište mi na adresu boylucky@centrum.cz.


Děkujeme Martinovi za popis velice zajímavého projektu. Pokud vás také zaujal, podívejte se na náš Bitbucket, kde jsou po domluvě s Martinem dostupné zdrojové kódy.

Zbyšek Voda

Zbyšek Voda

Už nějaký čas se zajímám o věci kolem Internetu věcí a otevřeného hardware a software. Tak jsem se také v roce 2010 dostal k Arduinu, pro které dodnes programuji a taky píšu články o práci s ním. Baví mě vymýšlet, jak staré věci používat novým způsobem.
Zbyšek Voda

7 Comments on “Zavlažovací systém s GPRS ovládáním

posjirka
27.9.2016 at 8:01

jen pár poznámek:
1, snížení frekvence procesoru je určitě super pro snížení příkonu, nicméně je třeba s tím počítat i pro UARt komunikaci, Třeba ESP8266 má v základním nastavení rychost 115200 bd. To by už mohlo dělat problém. Je třeba aktualizovat i FW.
2, Pokud tě štve LED tak jí odpájej. Není to úplně nestandardní zásah. I SMD se dá takto řešit v domácích podmínkách i když trafopájku bych stejně nedoporučoval.
3, jako sondu vlhkosti, jsem někde viděl použití 2 tlustých tuh z tužky. sice omotání drátem vypadá hodně amatérsky a chce to alespň stáhnout smršt.bužírkou. Někde tu kolovali obrázky jak vypadá sonda po pár týdnech provozu. DC proud v kombinaci s vlastnostmi zeminy kovovou část dolova rozežral. Navíc je neustále pod napětím.
4, Napájení čidel pomocí atmegy je super nápad jen pozor na max. proud pinem (tuším že okolo 20mA). Rozhodně nespojovat paralelně piny pro vyší proud. To už bych radši řešil něco spínání pomocí FET trazistoru.
5, jaké to má celé odběr? Podle něj se bude teprve odvijet výkon solárního článku. je třeba mít na paměti, že bude třeba nabít baterie a zároveň živit arduino a to s přesahem teba 2-3 dní, kdy bude zataženo a bude nedostatečný osvit. Myslím že reálnější bude min. 5-10W. Právě se chystám ně naco pododbně napájeného.

Celkově díky za zajímavé zkušenosti a sdílení projektu. Dobrá práce

Martin
28.9.2016 at 22:54

Diky za komentář.

Add1)
jj je to jak píšeš. Já o té možnosti snížení frekvence začal psát kvůli tomu že se tím dá ušetřit další množství energie čidel ale popravdě jsem to v tomto projektu zatím nevyužil. Dřív jsem si si tím hrál jen pro zajímavost. Když už jste zmínil ESP8266 tak abych byl upřímný tak s tím jsem se zatím moc neskamarádil. Nevím jestli mi došel z číny nějaký šunt nebo je problém mezi klávesnicí a židlí (asi to druhé) ale rozchodit se mi jej nepovedlo. Zkoušel jsem AT příkazy přes terminál ale i při postupování podle nejrůznějších návodu se mi nikdy nepovedlo správně dojít k požadovanému výsledku. Některé AT příkazy proběhly podle očekávání jiné ne. Nicméně si myslím že pro nejrůznější čidla a zařízení v dosahu wifi to je naprosto perfektní věc za pár korun.

Add3)
jj, těch podomácku udělaných čidel se dá najít spousta. Ale jak sám píšete největší problém je neustálý kontaktu s hlínou a vodou + proud během měření. Takže většina čidel vezme za své. Napadla mě varianta jestli nezkusit měřit vlhkost půdy třeba pomocí senzoru pro měření vlhkosti ovzduší s tím že by se čidlo umístilo pod povrch tak aby nebylo přímo v kontaktu s půdou a vodou. Nevím jak by to dopadlo, zatím jsem to nezkoušel, pravděpodobně by to neukazovalo správné údaje.

Add4)
přesně tak. Mělo by to bým 20mA na pin a jak píšete, určitě nespojovat :o)

Add5)
přesný odběr jsem neměřil. Spíš jsem uvažoval o možnosti zahrnout do systému funkci měření napětí baterií a podle toho případně automaticky upravit interval zapínání GPRS modulu tak, aby se v případě nízkého napětí baterií ušetřila určitá energie. Co se týče odběru čidel tak tam by při použití plošného spoje s atmel čipem neměl být většinou problém s dobitím baterií jednou za sezónu.

Tomáš Jurman
26.9.2016 at 20:52
Petr Šourek
26.9.2016 at 19:09

Dobrý den,

určitě zajímavé, chci si udělat něco podobného, je pravdou, že jsem zatím nepřemýšlel co a jak a nemám potřebu to řešit na takovou vzdálenost, takže chci zkusit ESP8266 čip, k tomu hodit senzor a odesílat data na WS. Měl bych ale několikero dotazů:
– Jak douho jsou schopné dané baterie udržet UNO a senzory? Zkoušel jste? Někdo někde psal, že je to docela problém už jen kvůli neustále svítící ledce (možnost odpájet),
– Jak řešíte zabezpečení? Přeci jen GPRS nemá přímo veřejnou IP, ale znáte to, máte něco na domácí síti, s čím komunikuje něco z venku a krok ke kompromitaci je velmi malý. To ne že bych Vás chtěl strašit, ale zajímá mne i tento aspekt vývoje,

Jinak skvělá práce, byť u některých věcí nejsem schopen říct, jestli to píšete správně, ale načerpal jsem pár zajímavých poznatků.

Děkuji,
S Pozdravem
Šourek Petr

Martin
26.9.2016 at 22:24

Diky za komentáře. Co se týče vašich dotazů:
– pokud chcete použít Arduino Uno s bateriemi tak i v případě, že budete používat sleep down mode nevydrží baterie déle než několik hodin nebo maximálně dnů. Pokud chcete skutečně výrazně prodloužit dobu po kterou budou baterie schopné napájet senzory musíte použít přímo zapojení čipu ATMEGA328P. Tím získáte možnost napájet senzory i několik měsíců bez nutnosti výměny baterií. Arduino Uno bych použil pouze pro testování nebo je nutné vyřešit jeho napájení jinak. Dřive jsem zkoušel i snížení frekvence čipu ATMEGA328P na 1MHz s použitím interního oscilátoru, čímž můžete snížit spotřebu energie čipu i pod 1mA při napájení 3.3V a ještě podstatně níže v sleep down modu. Pak je dostačující i napájení přímo pomocí dvou NiMh baterií.

– co se týče zabezpečení. Mezi čidlem a GPRS modulem je komunikace nešifrovaná. Komunikace mezi GPRS modulem a web serverem probíhá tak že jsou data z GPRS modulu odeslána na PHP script, který je přístupný přes basic authentication (veškeré PHP scripty využité pro komunikaci jsou přístupné přes basic authentication). Souhlasím s vámi, že zabezpečení komunikace je pro projekty, kde máte možnost ovládat jednotlivá zařízení, poměrně důležité. Já sem si na projektu spíš chtěl vyzkoušet různé postupy a od toho se pak odrazit dál.

Petr Šourek
26.9.2016 at 23:53

Není zač, spíše já děkuji za skvělý článek. Jsem rád, že někdo napsal svůj pohled na věc a já mohu čerpat z již „ověřených“ informací.

Add 1) Tohle jsem přehlédl, myslel jsem, že používáte UNO i na ostrý provoz, moje chyba. Já osobně ještě přemýšlím použít buď nano (ale stále problém s žeroucí ledkou), nebo ještě vyzkoušet jak by zabral třeba LillyPad, jediný Arduino, který jsem zatím viděl, kde mohu programově vypnout ledku (má pouze PIN 13), ale zatím jen teoretik, takže uvidíme. Jenom se ještě zeptám, schéma dané desky?
viz. „lépe však vytvořená deska plošného spoje s čipem atmega328p-pu, kde je možné lépe využít sleep down mode celého modulu a ušetřit tak energii z baterií“ nebo se jedná jen o procák napojený propojený na další zařízení, viz. třeba tenhle https://www.gme.cz/atmega328p-pu-sdip28-atmel

Add 2) Jasně, zapomněl jsem napsat, že beru, že to je ve fázi zkoušení, jen mne zajímalo jak to řešíte, případně jak to máte namyšleno. Ono prakticky když mi někdo „hákne“ zavlažování kytek (v mém případě chilli papriček), tak je to nepříjemné, ale dá se s tím žít, spíše mi jde o kompromitaci domácí sítě, kde mám server a tam sbírám data a z něj by se mohl dostat dále, je pravdou, že neovlivním chyby apache/nginxu/IIS, php, atp., ale nechci přidat další díry. Možná by stálo ještě za zvážení, jestli je možné, zakryptovat komunikaci mezi senzory, aby pak nemohli zkusit útoky od SQL Injection až po sofistikovanější „kousky“, pokud by se vydávali za „senzor“… Ale to je spíše do budoucna, nepočítám, že zrovna já bych byl předmětem útoku, ale mimo jiné dělám i bezpečáka a paranoia patří k mé práci 🙂

Martin
28.9.2016 at 22:18

Add1)
Ano, je to jak píšete. Jde o čip ATMEGA328P-PU ke kterému je připojeno čidlo samotné + NRF modul. V případě že není potřeba frekvence 16MHz jde použít interní oscilátor na frekvenci 8MHz a tím ušetřit další potřebné součásti pro celé zařízení. Plošný spoj čidla jsem vytvářel ve Fritzing softwaru. Jak se dostanu k počítači tak jej najdu a můžu nasdílet nebo poslat na mejl. Nejde o nic světoborného, ale funkci to splní :o) Jinak čipů od ATMELU je spousta, já sem dřív zkoušel ještě např. ATTINY85. Pro některé projekty dostačující.

Add2)
souhlasím s vámi. Pokud za vás někdo zalije chili papričky víc než je zdrávo :o) tak je to smůla ale pokud tím nevytopí půl zahrady nebo bytu tak se prakticky nic neděje. Jinak je to ale určitě potřeba řešit. Na internetu jsem dřív našel pár zajímavých řešení šifrování přímo pro arduino. Dalo by se to určitě zahrnout do podobných projektů. Navíc si tím člověk ušetří spoustu času než aby vymýšlel sám něco podobného. To ostatně platí i o možnosti využít již hotové knihovny pro arduino i co se týče nějaké síťové komunikace s možností jednoduše přidávat další prvky do sítě aniž by bylo nutné nějak upravovat celou strukturu. Jinak SQL server využívám na webhostingu takže co se týče sekurity domácí sítě tak tam problém není.

Napsat komentář