Za´padoˇceska´ univerzita v Plzni Fakulta aplikovany´ch vˇed Katedra informatiky a vy´poˇcetn´ı techniky
Bakal´ aˇ rsk´ a pr´ ace Arduino: Automatizovan´ y sklen´ık
Plzeˇ n, 2014
Luk´aˇs V´avra
Prohl´ aˇ sen´ı Prohlaˇsuji, ˇze jsem bakal´aˇrskou pr´aci vypracoval samostatnˇe a v´ yhradnˇe s pouˇzit´ım citovan´ ych pramen˚ u. V Plzni dne 9. kvˇetna 2014 Luk´aˇs V´avra
Abstract This work describes the creation of greenhouse automatic control system using programmable module Arduino UNO. The system consists of three parts – control unit, control application and database server. System realization includes the assembly of control unit from the Arduino module, necessary shields and sensors and the software development for all three parts. Each part is developed in the programming language that is supported by the platform.
Abstrakt V t´eto pr´aci je pops´ano vytvoˇren´ı syst´emu pro automatick´e ˇr´ızen´ı sklen´ıku vyuˇz´ıvaj´ıc´ı programovateln´ y modul Arduino UNO. Syst´em se skl´ad´a ze tˇr´ı ˇc´ast´ı – ˇr´ıd´ıc´ı jednotky, ovl´adac´ı aplikace a datab´azov´eho serveru. Realizace syst´emu zahrnuje sestaven´ı ˇr´ıd´ıc´ı jednotky z modulu Arduino, potˇrebn´ ych shield˚ u a senzor˚ u a vytvoˇren´ı programov´eho vybaven´ı vˇsech tˇr´ı ˇc´ast´ı. Kaˇzd´a ˇc´ast je vyv´ıjena v programovac´ım jazyce, kter´ y je danou platformou podporov´an.
Obsah ´ 1 Uvod
1
2 Z´ akladn´ı informace 2.1 Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Principy pˇestov´an´ı ve sklen´ıku . . . . . . . . . . . . . . . . . .
2 2 3
3 N´ avrh syst´ emu ˇ 3.1 R´ıd´ıc´ı jednotka sklen´ıku . . . . . . . . . . . . . . . . . . . . . 3.2 Uˇzivatelsk´e rozhran´ı v PC . . . . . . . . . . . . . . . . . . . . 3.3 Vzd´alen´a spr´ava pˇres server . . . . . . . . . . . . . . . . . . .
4 4 6 7
4 Program pro Arduino 4.1 Pamˇet’ov´a omezen´ı . . . . . . 4.2 Operace se soubory . . . . . . 4.3 Pˇripojen´ı k s´ıti . . . . . . . . 4.4 Ovl´ad´an´ı v´ ystupn´ıch zaˇr´ızen´ı . 4.5 Z´aznamy . . . . . . . . . . . .
. . . . .
8 8 10 13 16 19
5 Ovl´ adac´ı aplikace pro PC 5.1 Lok´aln´ı pˇr´ıstup . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Vzd´alen´ y pˇr´ıstup . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 Nastaven´ı Arduina a prohl´ıˇzen´ı z´aznam˚ u . . . . . . . . . . . .
20 20 21 24
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
6 Aplikace pro webov´ y server 26 6.1 Datab´azov´ y model . . . . . . . . . . . . . . . . . . . . . . . . 26 6.2 Knihovna PDO . . . . . . . . . . . . . . . . . . . . . . . . . . 27 6.3 Rozhran´ı pro Arduino a PC aplikaci . . . . . . . . . . . . . . . 27 7 Diskuze a budouc´ı pr´ ace
29
8 Z´ avˇ er
30
Literatura
31
A Uˇ zivatelsk´ a pˇ r´ıruˇ cka A.1 Zaloˇzen´ı sklen´ıku a naˇcten´ı dat z SD karty A.2 Vzd´alen´a spr´ava . . . . . . . . . . . . . . . A.3 Nastaven´ı Arduina . . . . . . . . . . . . . A.4 Nastaven´ı ovl´ad´an´ı . . . . . . . . . . . . . A.5 Zobrazen´ı z´aznam˚ u . . . . . . . . . . . . .
34 35 35 36 36 37
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
´ 1 Uvod C´ılem t´eto pr´ace je vytvoˇrit finanˇcnˇe dostupn´ y syst´em pro automatizovan´e ˇr´ızen´ı pˇestebn´ıho procesu v mal´ ych sklen´ıc´ıch, kter´ y bude poskytovat moˇznosti komerˇcnˇe prod´avan´ ych syst´em˚ u. Probl´emem komerˇcn´ıch zaˇr´ızen´ı je pomˇernˇe vysok´a poˇrizovac´ı cena, ˇc´ımˇz se pro drobn´e pˇestitele st´avaj´ı nedostupn´ ymi. Levn´a zaˇr´ızen´ı zase poskytuj´ı omezen´e moˇznosti ovl´ad´an´ı, kter´e mohou b´ yt pro n´aroˇcnˇejˇs´ı plodiny nedostaˇcuj´ıc´ı. Oba tyto probl´emy by mohlo vyˇreˇsit pouˇzit´ı open-source prostˇredk˚ u a finanˇcnˇe dostupn´ ych programovateln´ ych modul˚ u. V naˇsem pˇr´ıpadˇe je pro ˇr´ıd´ıc´ı jednotku pouˇzit modul ArduinoTM UNO1 . K Arduinu2 jsou pˇripojeny rozˇsiˇruj´ıc´ı moduly pro pˇr´ımou komunikaci s uˇzivatelem, pˇripojen´ı k s´ıti a pr´aci s microSD kartou, d´ale pak rel´e pro ovl´ad´an´ı v´ ystupn´ıch zaˇr´ızen´ı a sn´ımaˇce teploty a vlhkosti. Zbylou ˇc´ast syst´emu tvoˇr´ı pˇredevˇs´ım PC aplikace vytvoˇren´a v jazyce Java [1]. Tato aplikace slouˇz´ı k v´ ychoz´ı konfiguraci jednotky a pro vizualizaci zaznamenan´ ych dat. Pˇrenos dat mezi Arduinem a aplikac´ı v PC je realizov´an prostˇrednictv´ım soubor˚ u na microSD kartˇe nebo vzd´alen´ ym pˇripojen´ım pˇres Internet. Karta v ˇr´ıd´ıc´ı jednotce slouˇz´ı z´aroveˇ n jako u ´loˇziˇstˇe zaznamenan´ ych dat. V pˇr´ıpadˇe vzd´alen´eho pˇripojen´ı do syst´emu vstupuje spojovac´ı uzel (d´ale jen server), kter´ ym je kombinace PHP aplikace a MySQL datab´aze [2]. Server uchov´av´a konfiguraci ovl´ad´an´ı sklen´ıku a zaznamenan´a data v datab´azi, pˇriˇcemˇz k nim uˇzivateli i Arduinu umoˇzn ˇuje pˇr´ıstup prostˇrednictv´ım HTTP protokolu. N´asleduj´ıc´ı kapitola obsahuje kr´atk´e shrnut´ı informac´ı o Arduinu a popis princip˚ u pˇestov´an´ı plodin ve sklen´ıc´ıch. Dalˇs´ı kapitoly pojedn´avaj´ı o n´avrhu a realizaci jednotliv´ ych ˇca´st´ı syst´emu a form´at˚ u dat pro pˇrenos informac´ı mezi tˇemito ˇca´stmi. Pˇred z´avˇereˇcnou kapitolou jsou jeˇstˇe diskutov´any aspekty moˇzn´eho vylepˇsen´ı syst´emu.
1 2
http://arduino.cc/en/Main/arduinoBoardUno http://cs.wikipedia.org/wiki/Arduino
1
2 Z´akladn´ı informace Pˇred vlastn´ım n´avrhem syst´emu je zapotˇreb´ı se sezn´amit s pouˇzit´ ym programovateln´ ym modulem Arduino a zjistit, na z´akladˇe jak´ ych informac´ı je vhodn´e sklen´ık ovl´adat.
2.1
Arduino
Obr´azek 2.1: Arduino UNO R3 Arduino UNO je elektronick´a platforma slouˇz´ıc´ı k tvorbˇe prototyp˚ u [3, 4]. Z hlavn´ı ˇca´sti je tvoˇrena mikrokontrol´erem Atmel ATMega328 [5], coˇz je osmibitov´ y mikroprocesor s vestavˇenou 32 kB Flash pamˇet´ı (urˇcenou pro uloˇzen´ı programu), 2 kB SRAM operaˇcn´ı pamˇet´ı a 1 kB pamˇet´ı EEPROM. Zbylou ˇc´ast platformy tvoˇr´ı pˇrevodn´ık z USB na RS 232 a nap´ajen´ı. Mikrokontrol´er v Arduinu je vybaven bootloaderem, kter´ y zab´ır´a 0,5 kB programov´e pamˇeti v pˇr´ıpadˇe modelu UNO. Bootloader slouˇz´ı k pohodln´emu pˇrenosu programu z v´ yvojov´eho prostˇred´ı do mikrokontrol´eru prostˇrednictv´ım USB portu. T´ım odpad´a nutnost m´ıt k dispozici program´ator mikrokontrol´er˚ u. Arduino je tak´e velmi variabiln´ı n´astroj d´ıky sv´e modularitˇe. K desce lze velmi snadno pˇripojit rozˇsiˇruj´ıc´ı moduly, tzv. Shieldy, a dalˇs´ı samostatn´e periferie, pomoc´ı kter´ ych z´ısk´av´a nesˇcetn´e mnoˇzstv´ı vyuˇzit´ı [6, 7, 8]. Platforma byla p˚ uvodnˇe vyvinuta jako jednoduch´ y n´astroj pro studenty. Jej´ı popularita vˇsak ˇcasem vzrostla a dnes Arduino vyuˇz´ıv´a mnoho jednotlivc˚ u i komunit po cel´em svˇetˇe. Tomu odpov´ıd´a i pomˇernˇe velk´e mnoˇzstv´ı webov´ ych str´anek a diskuzn´ıch f´or vˇenovan´ ych pr´avˇe Arduinu. 2
Z´akladn´ı informace
Principy pˇestov´an´ı ve sklen´ıku
Programov´an´ı Arduina prob´ıh´a v dod´avan´em prostˇred´ı1 , kter´e je vytvoˇreno v jazyce Java. Samotn´e programov´an´ı Arduina prob´ıh´a v jazyce C/C++ [9]. Ten je pro tyto potˇreby rozˇs´ıˇren o funkce pro pr´aci se vstupy a v´ ystupy, textov´ ymi ˇretˇezci, s´eriov´ ym portem, spr´avou pˇreruˇsen´ı a ˇcasem ve formˇe uplynul´ ych mikrosekund od spuˇstˇen´ı mikrokontrol´eru. Na [10] existuje mnoho dalˇs´ıch volnˇe dostupn´ ych knihoven a jin´e praktick´e rady pro vˇsemoˇzn´e vyuˇzit´ı Arduina. Podrobn´ y popis v´ yvojov´eho prostˇred´ı a procesu kompilace programu vˇcetnˇe jeho nahr´an´ı do mikroˇcipu je k dispozici v [11]. Pro pˇreloˇzen´ı programu do jazyka mikrokontrol´eru je pouˇzit volnˇe dostupn´ y n´astroj avrgcc2 , pro upload zkompilovan´eho programu slouˇz´ı avrdude3 .
2.2
Principy pˇ estov´ an´ı ve sklen´ıku
Pˇestov´an´ı ve sklen´ıc´ıch je st´ale velmi obl´ıben´e. D˚ uvod˚ u je mnoho, poˇc´ınaje finanˇcn´ı str´ankou, kdy ceny potravin rostou ne´ umˇernˇe k mzd´am, a konˇce ned˚ uvˇerou k prod´avan´ ym produkt˚ um. Sklen´ıky proto b´ yvaj´ı ned´ılnou souˇc´ast´ı kaˇzd´e venkovsk´e i pˇr´ımˇestsk´e zahrady. Provoz sklen´ıku vˇsak pˇrin´aˇs´ı sv´a specifika. V prvn´ı ˇradˇe je potˇreba plodiny zavlaˇzovat, protoˇze uvnitˇr sklen´ıku nemohou z´ısk´avat vl´ahu z deˇstˇe. Zavlaˇzov´an´ı by mˇelo b´ yt u ´ˇceln´e a u ´sporn´e, voda by se mˇela k rostlin´am pˇriv´adˇet pouze v potˇrebn´em mnoˇzstv´ı a nejl´epe pˇr´ımo ke koˇren˚ um. V letn´ıch mˇes´ıc´ıch hroz´ı, ˇze dojde k pˇrehˇr´ıv´an´ı vzduchu uvnitˇr sklen´ıku. Dalˇs´ım probl´emem je vyˇsˇs´ı vzduˇsn´a vlhkost, kter´a m˚ uˇze v´est k tvorbˇe pl´ısn´ı a jin´ ych chorob. Tˇemto probl´em˚ um lze pˇredej´ıt zvolen´ım vhodn´eho syst´emu zavlaˇzov´an´ı a ventilace [12, 13]. Pˇred n´avrhem syst´emu pro automatick´e ˇr´ızen´ı sklen´ıku je tˇreba si nejdˇr´ıve uvˇedomit, jak´ ym zp˚ usobem a na z´akladˇe jak´ ych informac´ı je vhodn´e pˇestov´an´ı rostlin ˇr´ıdit. V´ ystupem by mˇelo b´ yt ovl´ad´an´ı zavlaˇzov´an´ı a vˇetr´an´ı. Na [14] je moˇzn´e naj´ıt mnoˇzstv´ı ˇcl´ank˚ u pojedn´avaj´ıc´ıch o podm´ınk´ach potˇrebn´ ych pro pˇestov´an´ı r˚ uzn´ ych plodin, pˇriˇcemˇz prim´arn´ımi ukazateli jsou teplota a vlhkost. Informace nutn´e pro ˇr´ızen´ı lze z´ıskat vyuˇzit´ım sn´ımaˇc˚ u fyzik´aln´ıch veliˇcin, ze kter´ ych jsou nejd˚ uleˇzitˇejˇs´ı sn´ımaˇc teploty a sn´ımaˇc vlhkosti vzduchu. Tak´e je moˇzn´e vyuˇz´ıt sn´ımaˇc vlhkosti p˚ udy pro pˇresnˇejˇs´ı kontrolu zavlaˇzov´an´ı. 1
ke staˇzen´ı na http://arduino.cc/en/main/software http://gcc.gnu.org/wiki/avr-gcc 3 http://savannah.nongnu.org/projects/avrdude 2
3
3 N´avrh syst´emu Syst´em bude tvoˇren dvˇema z´akladn´ımi prvky, kter´ ymi jsou ˇr´ıd´ıc´ı jednotka sklen´ıku (d´ale jiˇz jen Arduino) a aplikace v PC. Voliteln´ ym prvkem bude webov´ y server slouˇz´ıc´ı jako spojovac´ı uzel pro vzd´alenou spr´avu sklen´ık˚ u. Prostˇrednictv´ım PC aplikace bude uˇzivatel Arduino konfigurovat. Z´aroveˇ n bude moˇzn´e naˇc´ıtat z´aznamy ze sn´ımaˇc˚ u a zobrazovat je na ˇcasov´e pˇr´ımce. Pˇrenos dat mezi PC aplikac´ı a Arduinem bude realizov´an dvˇema zp˚ usoby: • soubory na microSD kartˇe, kter´a bude v ˇr´ıd´ıc´ı jednotce z´aroveˇ n slouˇzit jako u ´loˇziˇstˇe dat, • skrze webov´ y server prostˇrednictv´ım internetov´eho pˇripojen´ı.
3.1
ˇ ıd´ıc´ı jednotka sklen´ıku R´
Z´akladn´ım prvkem ˇr´ıd´ıc´ı jednotky bude Arduino UNO, pˇredevˇs´ım proto, ˇze se jedn´a o volnˇe dostupnou open-source platformu urˇcenou pro prototypov´an´ı a poskytuj´ıc´ı moˇznost dalˇs´ıho upravov´an´ı a vylepˇsov´an´ı vˇsem, kdo o to maj´ı z´ajem. Syst´em navrhovan´ y v t´eto pr´aci je urˇcen pro vyuˇzit´ı ˇsirok´e veˇrejnosti, poˇrizovac´ı n´aklady by tedy mˇeli b´ yt minim´aln´ı. Arduino je cenovˇe pˇr´ızniv´e, cena se pohybuje ˇra´dovˇe ve stovk´ach korun1 . Souˇca´st´ı Arduina mus´ı b´ yt modul umoˇzn ˇuj´ıc´ı pr´aci s SD kartou. Ta bude slouˇzit jako u ´loˇziˇstˇe dat a budou se z n´ı do Arduina nahr´avat konfiguraˇcn´ı soubory. D´ale je poˇzadov´ana pˇr´ıtomnost s´ıt’ov´eho modulu, kter´ y uˇzivateli umoˇzn´ı pˇripojit ˇr´ıd´ıc´ı jednotku k internetu, aby bylo moˇzn´e ji spravovat vzd´alenˇe. Oba tyto moduly jsou souˇc´ast´ı Ethernet Shieldu [15], kter´ y na sobˇe nese jak kontrol´er pro pr´aci s Ether2 netem W5100 , tak i slot pro vloˇzen´ı microSD karty (na str´ank´ach vˇenovan´ ych tomuto shieldu3 jsou dostupn´e podrobnˇejˇs´ı informace). Jednotka by mˇela poskytovat uˇzivateli informace a moˇznosti z´akladn´ıho ruˇcn´ıho ovl´ad´an´ı pˇr´ımo na m´ıstˇe, tedy tam, kde je nainstalov´ana - v bl´ızkosti sklen´ıku. K tomu dobˇre poslouˇz´ı LCD Keypad Shield4 , kter´ y se skl´ad´a z LCD displeje a tlaˇc´ıtek. 1
V dobˇe psan´ı pr´ ace je poˇrizovac´ı cena modelu Arduino UNO R3 s mikroprocesorem Atmel ATMega 328 cca 600 Kˇc. 2 http://www.wiznet.co.kr/ 3 http://arduino.cc/en/Main/ArduinoEthernetShield 4 http://www.dfrobot.com/wiki/index.php?title=Arduino LCD KeyPad Shield (SKU: DFR0009)
4
ˇ ıd´ıc´ı jednotka sklen´ıku R´
N´avrh syst´emu
Displej obsahuje 2×16 znak˚ u, kaˇzd´ y znak je sedm zobrazovac´ıch bod˚ u vysok´ y ˇ a pˇet bod˚ u ˇsirok´ y. Tlaˇc´ıtek je celkem ˇsest. Ctyˇri jsou pops´ana jako smˇerov´a (Left, Right, Up, Down), jedno jako tlaˇc´ıtko v´ ybˇeru volby (Select) a jedno pro znovuspuˇstˇen´ı syst´emu (Reset). Kromˇe tlaˇc´ıtka reset jsou vˇsechna ostatn´ı tlaˇc´ıtka pˇripojena pˇres odporovou kask´adu k jednomu analogov´emu vstupu Arduina (A0). K tomu, aby jednotka mohla z´ısk´avat data z okol´ı, je nutn´e k n´ı pˇripojit zvolen´e sn´ımaˇce. V prvn´ı ˇradˇe se nab´ız´ı sn´ımaˇc DHT115 , kter´ y v sobˇe kombinuje sn´ımaˇc okoln´ı teploty a sn´ımaˇc vlhkosti vzduchu. Tak´e pˇrijde vhod sn´ımaˇc p˚ udn´ı vlhkosti, kter´ y tvoˇr´ı p˚ udn´ı sonda (tiˇstˇen´ y spoj ve tvaru p´ısmene U), a pomocn´ y obvod pro mˇeˇren´ı pr˚ utoku proudu mezi obˇema p´oly p˚ udn´ı sondy. Pro ovl´ad´an´ı v´ ystupn´ıch zaˇr´ızen´ı, slouˇz´ıc´ıch k zavlaˇzov´an´ı a ventilaci, bude k Arduinu pˇripojen modul obsahuj´ıc´ı dvˇe rel´e. Jejich sp´ınac´ı kontakty jsou dimenzov´any na stˇr´ıdav´e napˇet´ı 250V a proud 10A. Coˇz by mˇelo b´ yt dostaˇcuj´ıc´ı pro vˇetˇsinu elektromechanick´ ych zaˇr´ızen´ı pouˇz´ıvan´ ych ve sklen´ıc´ıch. Arduino UNO je vybaveno ˇctrn´acti digit´aln´ımi vstupy/v´ ystupy6 a ˇsesti analogov´ ymi vstupy. Analogov´e vstupy jsou vyuˇzity tˇri: • pin A0 pro tlaˇc´ıtka, • pin A1 pro sn´ımaˇc teploty a vlhkosti vzduchu DHT11, • pin A2 pro sn´ımaˇc p˚ udn´ı vlhkosti. Z digit´aln´ıch pin˚ u jich je vyuˇzito celkem tˇrin´act. • piny D1 a D2 slouˇz´ı pro ovl´ad´an´ı rel´e na v´ ystupu, • piny D3, D5, D6, D7, D8 a D9 pouˇz´ıv´a LCD display, • piny D4, D10, D11, D12 a D13 jsou pouˇzity pro Ethernet Shield, kde: – piny D11 - D13 jsou spoleˇcn´e pro Ethernet kontrol´er a slot microSD karty, nebot’ komunikuj´ı po sbˇernici SPI, – pin D10 slouˇz´ı pro ˇr´ızen´ı s´ıt’ov´eho modulu – pin D4 slouˇz´ı pro ˇr´ızen´ı slotu microSD karty. 5 6
http://www.micro4you.com/files/sensor/DHT11.pdf Z´ aleˇz´ı na tom, jak´ y m´ od se pro jednotliv´e piny nastav´ı.
5
N´avrh syst´emu
Uˇzivatelsk´e rozhran´ı v PC
Voln´ y z˚ ustal pouze digit´aln´ı pin D0 a analogov´e vstupy A3 - A6. Jejich moˇzn´a vyuˇzit´ı budou pops´ana v kapitole Diskuze a budouc´ı pr´ace.
3.2
Uˇ zivatelsk´ e rozhran´ı v PC
Aby bylo ˇr´ızen´ı sklen´ıku automatick´e, mus´ı syst´em pracovat bez pˇr´ıtomnosti obsluhy na z´akladˇe pˇredem nastaven´e konfigurace. Tu bude uˇzivatel vytv´aˇret ˇci upravovat v aplikaci ve sv´em PC. Aplikace prostˇrednictv´ım grafick´eho uˇzivatelsk´eho rozhran´ı poskytne moˇznosti konfigurace zavlaˇzov´an´ı a ventilace ve zvolen´ ych ˇcasech a po zvolenou dobu, pˇr´ıpadnˇe podle informac´ı ze senzor˚ u. Aplikace by tak´e mˇela podporovat vˇetˇsinu dostupn´ ych operaˇcn´ıch syst´em˚ u. Nelze totiˇz oˇcek´avat, ˇze vˇsichni uˇzivatel´e budou vyuˇz´ıvat stejn´ y operaˇcn´ı syst´em ve sv´em PC. Programovac´ım jazykem pro tvorbu aplikace byla zvolena Java [1], kter´a splˇ nuje obˇe krit´eria. Java je multiplatformn´ı jazyk, tj. aplikaci vytvoˇrenou v Javˇe lze bez opˇetovn´e kompilace spustit na jak´ekoliv platformˇe, pro kterou existuje JVM7 . Program je pˇrekl´ad´an do tzv. bajtk´odu“, ve kter´em je ˇs´ıˇren ” a n´aslednˇe interpretov´an virtu´aln´ım strojem v okamˇziku spuˇstˇen´ı aplikace. S vyuˇzit´ım knihovny Swing [16] nab´ız´ı ˇsirokou ˇsk´alu n´astroj˚ u pro tvorbu GUI, kter´e bude umoˇzn ˇovat pˇrehlednou konfiguraci. Aplikace mus´ı poskytovat tyto z´akladn´ı funkce: • Zaloˇzen´ı nov´eho sklen´ıku - vytvoˇren´ı konfiguranˇcn´ıch soubor˚ u na SD kartˇe. • Editaci konfigurace Arduina. • Prohl´ıˇzen´ı z´aznam˚ u (ˇcas, teplota, vlhkost atd.) na ˇcasov´e pˇr´ımce a uloˇzen´ı aktu´aln´ıho grafu ve form´atu PNG na disk v PC. Je nutn´e dodat, ˇze posledn´ı dva body mus´ı b´ yt moˇzno prov´adˇet jak lok´alnˇe (´ upravou konfigurace na microSD kartˇe), tak i vzd´alenˇe (pˇres server). Pro vzd´alenou spr´avu budou nav´ıc na serveru a v PC aplikaci k dispozici funkce pro pˇrihl´aˇsen´ı, odhl´aˇsen´ı a registraci nov´eho uˇzivatele. Uˇzivatel bude m´ıt moˇznost pˇridat, odebrat a prohl´ıˇzet seznam pˇripojen´ ych sklen´ık˚ u. 7
Java Virtual Machine - Virtu´ aln´ı stroj Javy
6
N´avrh syst´emu
3.3
Vzd´alen´a spr´ava pˇres server
Vzd´ alen´ a spr´ ava pˇ res server
V pˇr´ıpadˇe, ˇze se uˇzivatel rozhodne vyuˇz´ıvat vzd´alenou spr´avu, tedy konfiguraci Arduina a prohl´ıˇzen´ı z´aznam˚ u prostˇrednictv´ım Internetu, je nutn´e zajistit komunikaci mezi PC aplikac´ı a Arduinem. Pro pˇrenos dat na microSD kartˇe jsou pouˇzity soubory obsahuj´ıc´ı textov´e ˇretˇezce. V r´amci kompatibility proto bude vhodn´e zvolit takov´ y pˇrenosov´ y protokol, kter´ y vyuˇz´ıv´a stejn´ y form´at dat, v jak´em jsou uloˇzeny informace v souborech. Dalˇs´ım krit´eriem pro volbu je pohodln´e pouˇzit´ı. Nen´ı ˇz´adouc´ı, aby se uˇzivatel musel zab´ yvat pot´ıˇzemi spojen´ ymi s pˇripojen´ım, jako je nastaven´ı firewallu, proxy serveru atp. Jednoduch´e a z´aroveˇ n efektivn´ı ˇreˇsen´ı poskytuje HTTP protokol [17]. HTTP protokol je jedn´ım z nejv´ıce pouˇz´ıvan´ ych protokol˚ u na svˇetˇe d´ıky jeho vyuˇzit´ı v Internetu. Pr´avˇe proto je v drtiv´e vˇetˇsinˇe pˇr´ıpad˚ u povolen pˇrenos dat pˇres transportn´ı protokol TCP [18] na portu 80, kter´ y je protokolem HTTP standardnˇe vyuˇz´ıv´an. HTTP je nav´ıc prim´arnˇe urˇcen pro pr´aci s ASCII, tedy s textovou podobou dat, coˇz je pro naˇse u ´ˇcely vyhovuj´ıc´ı. Jedinou vˇetˇs´ı nev´ yhodou je absence zabezpeˇcen´ı a ˇsifrov´an´ı. Obecnˇe se pro zabezpeˇcen´e spojen´ı pouˇz´ıv´a protokol TLS [19] a spojen´ı je pak oznaˇcov´ano jako HTTPS. V t´eto pr´aci vˇsak HTTPS pouˇz´ıt nelze, nebot’ implementace TLS, ˇci starˇs´ıho SSL, by byla v pˇr´ıpadˇe Arduina pˇr´ıliˇs komplexn´ı. Spoleˇcnˇe se softwarem pro ˇr´ızen´ı by pak pravdˇepodobnˇe pˇrerostla pamˇet’ov´a omezen´ı. Zde bude jako bezpeˇcnostn´ı prvek pouˇzita identifikace uˇzivatele a ˇr´ıd´ıc´ı jednotky unik´atn´ım kl´ıˇcem, kter´ y bude generovat aplikace na serveru. Pˇrenos dat bude prob´ıhat nezabezpeˇcenˇe. Pro tvorbu webov´e aplikace, kter´a zprostˇredkuje pˇrenos dat mezi uˇzivatelem a Arduinem, bude pouˇzit skriptovac´ı jazyk PHP. Skripty zpracova´vaj´ı HTTP poˇzadavky na stranˇe serveru a vracej´ı odpovˇedi ve formˇe webov´e str´anky. Pro obˇe z´akladn´ı ˇc´asti syst´emu (PC aplikace a Arduino) budou vytvoˇreny separ´atn´ı skripty, slouˇz´ıc´ı jako jejich s´ıt’ov´a rozhran´ı na u ´rovni aplikaˇcn´ı vrstvy modelu ISO/OSI [18]. Mezi tˇemito rozhran´ımi bude prob´ıhat komunikace prostˇrednictv´ım spoleˇcn´eho u ´loˇziˇstˇe, kter´ ym bude bˇeˇznˇe dostupn´a datab´aze MySQL. V datab´azi budou data uchov´ana i pro pˇr´ıpad znovupouˇzit´ı. PHP skripty rozloˇz´ı pˇr´ıchoz´ı data na jednotliv´e sloˇzky (ˇcas, typ, hodnoty), kter´e budou uloˇzeny oddˇelenˇe, coˇz umoˇzn´ı jejich snadnˇejˇs´ı zpracov´an´ı. Tato kombinace je z ˇca´sti ovlivnˇena i finanˇcn´ı str´ankou, nebot’ vˇetˇsina volnˇe dostupn´ ych webov´ ych hosting˚ u poskytuje pr´avˇe tyto prostˇredky.
7
4 Program pro Arduino Vytvoˇrit jako prvn´ı program pro Arduino je logick´a volba, nebot’ jde o ˇca´st syst´emu, kter´a se pot´ yk´a s nejvˇetˇs´ımi omezen´ımi, a to pˇredevˇs´ım pamˇet’ov´ ymi. Pr´avˇe proto je potˇreba navrhnout form´aty a zp˚ usob pˇrenosu dat tak, aby byly pro Arduino pamˇet’ovˇe nen´aroˇcn´e. Jak se uk´azalo, 32 kB programov´e pamˇeti nen´ı mnoho. V programu, vytvoˇren´em pro ˇr´ıd´ıc´ı jednotku (greenhouse_main), jsou kv˚ uli omezen´e velikosti pamˇeti zavedena nˇekter´a u ´sporn´a opatˇren´ı spojen´a s redukc´ı velikosti zkompilovan´eho programu. I tak zab´ır´a hlavn´ı program t´emˇeˇr celou programovou pamˇet’ (aktu´alnˇe 30 182 B).
4.1
Pamˇ et’ov´ a omezen´ı
V pˇr´ıpadˇe pouˇzit´ı standardn´ıch knihoven dod´avan´ ych k v´ yvojov´emu prostˇred´ı pro Arduino by velikost programu pˇrev´ yˇsila velikost pamˇeti. Z tohoto d˚ uvodu 1 muselo doj´ıt k nˇekolika u ´prav´am. Napˇr´ıklad vypuˇstˇen´ı objektu String , kter´ y slouˇz´ı pro pr´aci s textov´ ymi ˇretˇezci. Nam´ısto nˇej jsou implementov´any vlastn´ı funkce pro pr´aci s textem, kter´e jsou pro syst´em nezbytnˇe zapotˇreb´ı. Jde o z´apis dvou a tˇr´ıznakov´eho ˇc´ısla s doplˇ nov´an´ım nul, nalezen´ı ˇc´ısla v proudu dat2 , naˇcten´ı ˇr´adku z proudu dat, ˇci nalezen´ı ˇr´ıd´ıc´ıho znaku v odpovˇedi serveru. Funkce pracuj´ı pouze s ukazateli a poli znak˚ u [20] a jsou rozdˇeleny podle oblast´ı pouˇzit´ı na souborov´e, s´ıt’ov´e a obecn´e. Operace s ukazateli a poli jsou z´aleˇzitost operaˇcn´ı pamˇeti, takˇze nezvˇetˇsuj´ı velikost programu. V tabulce 4.1 je vidˇet, ˇze pouˇzit´ı objektu String pˇrid´a k velikosti programu 1508 B oproti pouˇzit´ı pole znak˚ u a ukazatele na nˇej, pˇri kter´em se velikost programu nezmˇen´ı. Spoleˇcnˇe s vynech´an´ım objektu String pˇrich´az´ı jeˇstˇe jedno u ´sporn´e opatˇren´ı. T´ım je z´apis vˇsech text˚ u pouˇzit´ ych v Arduinu do pamˇeti EEPROM. Pro pr´aci s touto pamˇet´ı je k dispozici knihovna3 , kter´a umoˇzn ˇuje z´apis a ˇcten´ı po jednotliv´ ych bytech pamˇeti. A proto, ˇze jeden znak m´a velikost 1 B, je moˇzn´e do EEPROM uloˇzit 1024 znak˚ u v pˇr´ıpadˇe ATMega328. Vzhledem k tomu, ˇze texty jsou urˇcen´e pˇrev´aˇznˇe pro v´ ystup na LCD displej, kter´ y m´a ˇr´adky dlouh´e 16 znak˚ u, bude pamˇet’ rozdˇelena na 64 blok˚ u po ˇsestn´acti znac´ıch. Pro z´apis 1
http://arduino.cc/en/Reference/StringObject http://arduino.cc/en/Reference/Stream 3 http://arduino.cc/en/Reference/EEPROM 2
8
Program pro Arduino
Pamˇet’ov´a omezen´ı
void setup() {} void loop() {}
444 byt˚ u
char char void void
444 byt˚ u
buffer[10]; *p_buffer; setup() {} loop() {}
String buffer[10]; void setup() {} void loop() {}
1952 byt˚ u
Tabulka 4.1: Velikosti zkompilovan´ ych program˚ u pˇri pouˇzit´ı String a char[] text˚ u do EEPROM je potˇreba pouˇz´ıt pomocn´ y program greenhouse_text, kter´ y obsahuje seznam vˇsech text˚ u v Arduinu a zapisuje ho po znac´ıch do pamˇeti. V´ yrobce ud´av´a, ˇze ˇzivotnost pamˇeti je 100 000 cykl˚ u z´apisu nebo maz´an´ı. V tomto pˇr´ıpadˇe vˇsak staˇc´ı zapsat textov´e ˇretˇezce do pamˇeti pouze jednou, coˇz znamen´a, ˇze v nejhorˇs´ım pˇr´ıpadˇe dojde k 1024 cykl˚ um z´apisu. Nehroz´ı tedy poˇskozen´ı pamˇeti EEPROM a lze pˇredpokl´adat, ˇze data v t´eto pamˇeti z˚ ustanou konzistentn´ı po celou dobu provozu. Hlavn´ı program si pro jejich naˇc´ıt´an´ı alokuje m´ısto v operaˇcn´ı pamˇeti (d´ale jen buffer), kam pot´e kop´ıruje jednotliv´e znaky z EEPROM a vytv´aˇr´ı z nich pouˇziteln´e texty pro dalˇs´ı pouˇzit´ı. Jelikoˇz je textov´ y ˇretˇezec v pamˇeti reprezentov´an pouze jako pole znak˚ u zakonˇcen´e znakem s hodnotou nula (’\0’), je tento znak doplˇ nov´an hlavn´ım programem na konec naˇcten´eho textu do bufferu. Program tento text neprodlenˇe po naˇcten´ı pouˇzije a n´aslednˇe ho v pˇr´ıpadˇe potˇreby nahrad´ı jin´ ym. T´ım je uspoˇrena nejen programov´a pamˇet’, ale i pamˇet’ operaˇcn´ı, protoˇze vˇsechny operace s textem jsou prov´adˇeny v jednom vymezen´em prostoru pamˇeti. Dalˇs´ı u ´sporu pˇrin´aˇs´ı nahrazen´ı knihovny pro pr´aci s SD kartou4 (SD.h) pamˇet’ovˇe u ´spornˇejˇs´ı knihovnou Fat165 (Fat16.h), kter´a tak´e poskytuje potˇrebn´e funkce a je mnohem menˇs´ı. Jak je vidˇet v tabulce 4.2, rozd´ıl velikost´ı zkompilovan´eho programu, kter´ y pouze inicializuje pˇr´ıstup k SD kartˇe, je 4868 B. Tento rozd´ıl jeˇstˇe vzroste pˇri otevˇren´ı souboru a pr´aci s n´ım. Hlavn´ı odliˇsnost´ı mezi tˇemito knihovnami jsou podporovan´e souborov´e syst´emy. Jak 4 5
http://arduino.cc/en/Reference/SD https://code.google.com/p/fat16lib/
9
Program pro Arduino
Operace se soubory
#include <SD.h> void setup() { SD.begin(4); } void loop() {}
7206 byt˚ u
#include
SdCard card; void setup() { card.init(); } void loop() {}
2338 byt˚ u
Tabulka 4.2: Velikosti zkompilovan´ ych program˚ u pˇri pouˇzit´ı knihovny SD a Fat16 jiˇz n´azev knihovny napov´ıd´a, pouˇzit´a knihovna podporuje pouze SD karty se souborov´ ym syst´emem FAT166 , kdeˇzto standardn´ı knihovna podporuje jak FAT16, tak i FAT32. Tento fakt s sebou nese omezen´ı velikosti pouˇzit´e SD karty, protoˇze FAT16 dok´aˇze pracovat maxim´alnˇe s 2 GB SD kartou. V dobˇe psan´ı pr´ace jsou jeˇstˇe v prodeji, ale jiˇz brzy je na trhu nahrad´ı karty s vˇetˇs´ı kapacitou. Tento probl´em bude diskutov´an v kapitole Diskuze a budouc´ı pr´ace. Knihovna Fat16 nav´ıc um´ı pracovat pouze v koˇrenov´em adres´aˇri SD karty a soubory mus´ı m´ıt n´azvy ve form´atu 8.37 , tzn. jm´eno souboru sm´ı m´ıt d´elku nejv´ yˇse osm znak˚ u a souˇc´ast´ı m˚ uˇze b´ yt tˇr´ıznakov´a pˇr´ıpona. To vˇsak nen´ı pˇrek´aˇzka, nebot’ k pˇrenosu dat staˇc´ı tˇri soubory, kter´e mohou b´ yt v hlavn´ım adres´aˇri a n´azev soubor˚ u bude tak´e odpov´ıdat poˇzadavku.
4.2
Operace se soubory
V Arduinu slouˇz´ı SD karta jako u ´loˇzn´ y prostor pro ukl´ad´an´ı z´aznam˚ u a uchov´av´an´ı konfigurace ˇr´ızen´ı sklen´ıku. Data jsou rozdˇelena do tˇr´ı textov´ ych soubor˚ u: 6 7
http://cs.wikipedia.org/wiki/File Allocation Table http://en.wikipedia.org/wiki/8.3 filename
10
Program pro Arduino
Operace se soubory
• SETTINGS.TXT • CONFIG.TXT • RECORDS.TXT Prvn´ı ze zm´ınˇen´ ych soubor˚ u (SETTINGS.TXT) obsahuje informace, kter´e jsou pouˇzity pˇri kaˇzd´em spuˇstˇen´ı Arduina. Jde o n´azev jednotky, reˇzim pˇripojen´ı k s´ıti a v pˇr´ıpadˇe, ˇze bude pouˇzito s´ıt’ov´e spojen´ı, MAC adresa, jm´eno uˇzivatele, komunikaˇcn´ı kl´ıˇc a adresa serveru. Jednotliv´e poloˇzky jsou uloˇzeny po ˇr´adc´ıch. V´ yznam poloˇzek je pops´an v ˇc´asti Pˇripojen´ı k s´ıti. Obsah souboru s nastaven´ım pˇripojen´ı vyuˇz´ıvaj´ıc´ıho DHCP server m˚ uˇze vypadat takto: Sklenik 1 1 00-11-22-33-44-55 lukas E77CFE02F7DDB58A30C80E5460E3177F 217.198.115.56 greenhouse.php5.cz Druh´ y soubor (CONFIG.TXT) obsahuje data potˇrebn´a pro ˇr´ızen´ı v´ ystupn´ıch zaˇr´ızen´ı. Jsou v nˇem uloˇzeny ˇcasy spuˇstˇen´ı jednotliv´ ych v´ ystup˚ u (sepnut´ı rel´e), popˇr. i hodnoty pro automatick´e ovl´ad´an´ı (na z´akladˇe informac´ı ze senzor˚ u). Nav´ıc obsahuje interval mezi z´aznamy dat a dobu odstaven´ı automatick´eho ˇr´ızen´ı v pˇr´ıpadˇe pouˇzit´ı ruˇcn´ıho ovl´ad´an´ı. Podrobnˇejˇs´ı popis je v ˇca´sti Ovl´ad´an´ı v´ystupn´ıch zaˇr´ızen´ı. Data v tomto souboru mohou vypadat n´asledovnˇe: V W D D
01 000 002 01 030 001 1 060 2 010
Do tˇret´ıho souboru (RECORDS.TXT) jsou ukl´ad´any z´aznamy ze senzor˚ u a stav˚ u zaˇr´ızen´ı. Jednotliv´e z´aznamy jsou uloˇzeny po ˇra´dc´ıch a jsou to souvisl´e ˇretˇezce s pˇresnˇe definovanou d´elkou. Proto bylo moˇzn´e vynechat mezery mezi jednotliv´ ymi sloˇzkami z´aznamu a t´ım uspoˇrit 9 znak˚ u na kaˇzd´em ˇr´adku. Velikost nejdelˇs´ıho ˇra´dku je v pˇr´ıpadˇe z´aznamu dat ze senzor˚ u (E) 23 znak˚ u. 11
Program pro Arduino
Operace se soubory
Pˇresn´ y v´ yznam tˇechto dat je pops´an v ˇc´asti Z´aznamy. Pˇr´ıklad z´aznam˚ u z Arduina: E0641082014040920037000 E0646092014040920037000 A06472220140409101 A06500320140409100 E0651102014040919037000 E0656102014040919037000 Po inicializaci knihovny Fat16 je moˇzn´e otevˇr´ıt soubory prostˇrednictv´ım funkce open(jm´ eno souboru, zp˚ usob otevˇ ren´ ı). Jm´eno souboru je naˇc´ıt´ano z EEPROM do bufferu a zp˚ usoby otevˇren´ı jsou r˚ uzn´e kombinace pˇreddefinovan´ ych konstant. Tˇemi jsou: O READ - otevˇren´ı pro ˇcten´ı O WRITE - otevˇren´ı pro z´apis O RDWR - otevˇren´ı pro ˇcten´ı a z´apis O APPEND - pˇrem´ıst´ı kurzor na konec souboru O CREAT - vytvoˇr´ı soubor, pokud neexistuje O TRUNC - smaˇze obsah souboru O EXCL - vr´at´ı chybovou hl´aˇsku, pokud soubor existuje Pro ˇcten´ı ze souboru slouˇz´ı funkce read(), kter´a vrac´ı naˇcten´ y znak nebo v pˇr´ıpadˇe konce souboru ˇci chyby ˇcten´ı vrac´ı hodnotu -1. Z´apis do souboru je zprostˇredkov´an funkcemi print(data) a println(data). Tyto funkce umoˇzn ˇuj´ı z´apis cel´eho ˇretˇezce znak˚ u najednou a v pˇr´ıpadˇe funkce println() i odˇra´dkov´an´ı.
12
Program pro Arduino
4.3
Pˇripojen´ı k s´ıti
Pˇ ripojen´ı k s´ıti
Pro pˇr´ıstup k s´ıti je Arduino vybaveno Ethernet Shieldem8 , kter´ y se k s´ıti 9 pˇripojuje kabelem UTP se standardn´ım konektorem RJ-45. Ethernet Shield podporuje rychlost pˇripojen´ı 10/100 Mbps. Ve v´ yvojov´em prostˇred´ı Arduina je pro tento Shield pˇripravena knihovna Ethernet10 , kter´a slouˇz´ı k vytvoˇren´ı aplikace pˇristupuj´ıc´ı k lok´aln´ı s´ıti nebo k Internetu. Knihovna podporuje aˇz ˇctyˇri soubˇeˇzn´a pˇripojen´ı (pˇr´ıchoz´ı, odchoz´ı nebo kombinace oboj´ıho). K inicializaci knihovny a s´ıt’ov´eho nastaven´ı slouˇz´ı funkce begin()11 ve stejnojmenn´e tˇr´ıdˇe Ethernet, kter´a je souˇca´st´ı knihovny. Tato funkce je pˇret´ıˇzen´a a nab´ız´ı pˇet reˇzim˚ u pˇripojen´ı s r˚ uzn´ ym poˇctem argument˚ u: • Ethernet.begin(mac); • Ethernet.begin(mac, ip); • Ethernet.begin(mac, ip, dns); • Ethernet.begin(mac, ip, dns, gateway); • Ethernet.begin(mac, ip, dns, gateway, subnet); Prvn´ı pˇr´ıpad pouˇz´ıv´a jako parametr pouze fyzickou adresu Ethernet Shieldu. K pˇripojen´ı je pak pouˇzito nastaven´ı z´ıskan´e z DHCP serveru. Tato moˇznost se objevila aˇz od verze 1.0 v´ yvojov´eho prostˇred´ı Arduina. Jako jedin´a m´a tak´e n´avratovou hodnotu, kter´a vyjadˇruje u ´spˇech (true) ˇci ne´ uspˇech (false) pˇri z´ısk´av´an´ı nastaven´ı z DHCP. Dalˇs´ı reˇzimy slouˇz´ı pro nastaven´ı statick´e IP adresy, v pˇr´ıpadˇe vyuˇzit´ı jmenn´eho serveru adresy DNS, a d´ale pak adresy br´any a masky pods´ıtˇe. Tˇemto funkc´ım odpov´ıdaj´ı reˇzimy s´ıt’ov´eho pˇripojen´ı Arduina, kter´ ych je ˇsest: 0 - S´ıt’ov´e spojen´ı je vypnuto, nejsou zad´any ˇza´dn´e dalˇs´ı parametry 1 - Je pouˇzito spojen´ı vyuˇz´ıvaj´ıc´ı DHCP server, mus´ı b´ yt zad´ana MAC 2 - Je pouˇzita statick´a IP adresa (+ MAC adresa) 8
http://arduino.cc/en/Main/ArduinoEthernetShield Unshielded Twisted Pair - Nest´ınˇen´a kroucen´a dvojlinka 10 http://arduino.cc/en/Reference/Ethernet 11 http://arduino.cc/en/Reference/EthernetBegin 9
13
Program pro Arduino
Pˇripojen´ı k s´ıti
3 - Je pouˇzit jmenn´ y server DNS (+ IP a MAC adresa) 4 - Je pouˇzita s´ıt’ov´a br´ana (+ DNS, IP a MAC adresa) 5 - Je pouˇzita maska pods´ıtˇe (+ adresa br´any, DNS, IP a MAC adresa) ˇ ıslo reˇzimu je uloˇzeno v souboru pro konfiguraci s´ıtˇe (SETTINGS.TXT) a C´ pokud je s´ıt’ vyuˇz´ıv´ana, n´asleduj´ı za n´ım v souboru u ´daje pro konfiguraci s´ıt’ov´eho pˇripojen´ı. Tˇemito u ´daji jsou jm´eno uˇzivatele, komunikaˇcn´ı kl´ıˇc pro spojen´ı se serverem, IP adresa serveru a URL12 serveru. Pro komunikaci pˇres s´ıt’ jsou v knihovnˇe k dispozici tˇr´ıdy EthernetClient a EthernetServer, kter´e odpov´ıdaj´ı modelu klient/server v pˇr´ıpadˇe socketov´e komunikace [22]. Tˇr´ıdˇe EthernetServer se v konstruktoru pˇred´a jako parametr ˇc´ıslo portu, na kter´em potom server ˇcek´a na pˇr´ıchoz´ı pˇripojen´ı. Zde popisovan´e Arduino vˇsak pracuje pouze jako HTTP klient, tud´ıˇz tuto tˇr´ıdu nevyuˇz´ıv´a a nebude d´ale popisov´ana. V naˇsem pˇr´ıpadˇe je pouˇzita pouze tˇr´ıda EthernetClient, kter´a navazuje spojen´ı se serverem a slouˇz´ı k odes´ıl´an´ı a pˇrij´ım´an´ı dat. Spojen´ı se navazuje prostˇrednictv´ım funkce connect(adresa, port), kter´a m´a dva zp˚ usoby pouˇzit´ı. Adresu lze zadat jako objekt String s URL serveru nebo jako pole ˇctyˇr bajt˚ u s IP adresou. V naˇsem pˇr´ıpadˇe je pro spojen´ı pouˇzita adresa IP nahran´a ze souboru a ˇc´ıslo portu 80, tedy standardn´ı port pro HTTP protokol. N´avratov´a hodnota t´eto funkce znaˇc´ı, zda bylo spojen´ı nav´az´ano. Pokud dojde k chybˇe, Arduino pˇrejde do reˇzimu chyba spojen´ı“. Tento reˇzim je spolu s reˇzimy spojen´ı vypnuto“ a pˇripo” ” ” jeno“ zobrazen v menu Arduina na LCD displeji. Uˇzivatel m´a moˇznost pokusit se o opˇetovn´e nav´az´an´ı spojen´ı stisknut´ım tlaˇc´ıtka na Arduinu. Pokud bylo spojen´ı nav´az´ano, odeˇsle se kontroln´ı poˇzadavek na server. Odes´ılan´a data se pˇred´avaj´ı funkc´ım print() a println() jako parametr ve v´ıce form´atech – textov´e ˇretˇezce jako objekt String nebo ukazatel na pole znak˚ u (pouˇzit´e v naˇsem pˇr´ıpadˇe) a ˇc´ısla jako byte, int, long. Pro z´apis ˇc´ısel je moˇzn´e pouˇz´ıt jeˇstˇe druh´ y parametr, kter´ y ud´av´a ˇc´ıselnou soustavu, napˇr. DEC pro des´ıtkovou, HEX pro ˇsestn´actkovou atd. Funkce println() nav´ıc za odeslan´ ymi daty pos´ıl´a ˇr´ıd´ıc´ı znak konce ˇra´dku. Poˇzadavky jsou odes´ıl´any jako hlaviˇcky HTTP metodou GET, kter´e n´aslednˇe zpracov´av´a server. Metoda GET je oproti metodˇe POST mnohem jednoduˇsˇs´ı na implementaci, coˇz je v pˇr´ıpadˇe Arduina ˇz´adouc´ı. Arduino zas´ıl´a tˇri typy poˇzadavk˚ u: kontroln´ı, potvrzovac´ı a poˇzadavek s odes´ılan´ ymi daty. Tyto poˇzadavky jsou uloˇzeny v pamˇeti EEPROM, a v pˇr´ıpadˇe potˇreby jsou nahr´any do bufferu a n´aslednˇe odesl´any. 12
Uniform Resource Locator - Jednotn´ y lok´ator zdroj˚ u
14
Program pro Arduino
Pˇripojen´ı k s´ıti
Hlaviˇcka poˇzadavku m´a tento tvar: GET /uconn.php?action=&key=&name=<user> HTTP/1.1 Host: greenhouse.php5.cz Connection: close
V pˇr´ıpadˇe kontroln´ıho poˇzadavku je na pozici hodnota check. Pˇri odes´ıl´an´ı potvrzovac´ıho poˇzadavku je na t´eto pozici hodnota received a hodnota send se vkl´ad´a pˇri odes´ıl´an´ı dat. V posledn´ım zm´ınˇen´em poˇzadavku je nav´ıc pouˇzita dvojice da=, do kter´e se vkl´adaj´ı odes´ılan´a data. M´ısto znaˇcek a <user> se dosazuje komunikaˇcn´ı kl´ıˇc a jm´eno uˇzivatele z konfiguraˇcn´ıho souboru. Verze poˇzadavku je HTTP/1.1, jde o aktu´aln´ı a nejpouˇz´ıvanˇejˇs´ı verzi protokolu. Kontroln´ı poˇzadavek se zas´ıl´a cyklicky v pˇreddefinovan´em ˇcasov´em intervalu. Server na tento poˇzadavek vrac´ı odpovˇed’, kterou Arduino pˇrijme a uloˇz´ı do 16 kB velk´e mezipamˇeti kontrol´eru W5100. K dat˚ um v t´eto pamˇeti se pˇristupuje jako k proudu dat, ze kter´eho je moˇzn´e ˇc´ıst po znac´ıch. To znamen´a, ˇze po pˇreˇcten´ı znaku je tento znak z mezipamˇeti odstranˇen a ukazatel se posune na dalˇs´ı znak. Ve tˇr´ıdˇe EthernetClient je pro tuto operaci funkce read(). Spoleˇcnˇe s funkc´ı available(), kter´a indikuje, zda jsou v mezipamˇeti dalˇs´ı data, je tato funkce pouˇzita pro zpracov´an´ı odpovˇedi od serveru. Server ve sv´e odpovˇedi zas´ıl´a ˇr´ıd´ıc´ı znaˇcky, tzv. tagy, n´asledovan´e daty pro Arduino. Tyto tagy jsou v podobn´em form´atu jako tagy jazyka HTML. To proto, aby byl provoz na portu 80 co nejpodobnˇejˇs´ı bˇeˇzn´emu provozu, jako v pˇr´ıpadˇe proch´azen´ı webu. V tabulce 4.3 je popis vˇsech tag˚ u a n´asledn´ ych hodnot. V Arduinu je vytvoˇrena funkce char get_tag(*EthernetClient), kter´e se pˇred´a ukazatel na instanci klientsk´e tˇr´ıdy. Nalezen´ y tag pˇred´av´a funkce jako n´avratovou hodnotu. Hled´an´ı tagu v proudu prob´ıh´a tak, ˇze se ˇctou znaky, dokud nen´ı nalezen znak zaˇc´atku tagu, tedy <, potom funkce vrac´ı znak, kter´ y po nˇem n´asleduje. Ten urˇcuje, o jak´ y tag se jedn´a a jakou operaci m´a s pˇr´ıpadn´ ymi n´asleduj´ıc´ımi daty Arduino vykonat. Pro ˇcten´ı ˇc´ısel z proudu dat v mezipamˇeti je implementov´ana funkce uint16_t http_int (*EthernetClient), kter´a vyhled´a prvn´ı v´ yskyt ˇc´ısla v proudu dat, pˇreˇcte ho a vr´at´ı jako ˇc´ıslo uint16_t13 . Tato funkce je vyuˇzita pro pˇr´ıjem autor13 ˇ
Sestn´ actibitov´e bezznam´enkov´e cel´e ˇc´ıslo (0 - 65535)
15
Program pro Arduino
Ovl´ad´an´ı v´ystupn´ıch zaˇr´ızen´ı
Tag
Hodnota
Popis
0, 1
Autorizaˇcn´ı tag – server ovˇeˇruje komunikaˇcn´ı kl´ıˇc a jm´eno uˇzivatele
Poˇcet sekund od p˚ ulnoci 1.1.1970
Synchronizaˇcn´ı tag – server zas´ıl´a Arduinu aktu´aln´ı ˇcas
<s>
Synchronizaˇcn´ı tag – server ˇz´ad´a Arduino o zasl´an´ı konfigurace
Synchronizaˇcn´ı tag – server signalizuje Arduinu pˇrijet´ı nov´e konfigurace z PC aplikace a zas´ıl´a ji po ˇra´dc´ıch Arduinu ve stejn´em form´atu, v jak´em je uloˇzena v souboru
Nastaven´ı ovl´ad´an´ı Arduina
Potvrzovac´ı znak – server informuje Arduino, ˇze poˇzadavek byl zpracov´an
>
Ukonˇcovac´ı znak – pˇrenos dat byl dokonˇcen Tabulka 4.3: Seznam tag˚ u zas´ılan´ ych serverem do Arduina
izaˇcn´ı odpovˇedi, ˇcasu a konfigurace ovl´ad´an´ı. Pˇrijat´e nastaven´ı je okamˇzitˇe uloˇzeno do souboru CONFIG.TXT. Po pˇrijet´ı dat odeˇsle Arduino potvrzen´ı na server, aby aktualizoval synchronizaˇcn´ı pˇr´ıznak. Pokud Arduino odes´ıl´a konfiguraˇcn´ı data, ukl´ad´a do bufferu jednotliv´e ˇra´dky, kter´e pak zas´ıl´a jako samostatn´e datov´e poˇzadavky.
4.4
Ovl´ ad´ an´ı v´ ystupn´ıch zaˇ r´ızen´ı
K v´ ystupn´ım pin˚ um Arduina jsou pˇripojena rel´e, kter´a uˇzivateli slouˇz´ı pro sp´ın´an´ı vlastn´ıch zaˇr´ızen´ı. Sp´ın´an´ı tˇechto rel´e je ovl´ad´ano na z´akladˇe konfigurace, kterou si uˇzivatel nastav´ı prostˇrednictv´ım aplikace v PC. Do Arduina je tato konfigurace pˇred´ana jako soubor textov´ ych ˇretˇezc˚ u CONFIG.TXT nebo 16
Program pro Arduino
Ovl´ad´an´ı v´ystupn´ıch zaˇr´ızen´ı
ze s´ıtˇe. Prvn´ı znak ˇretˇezce urˇcuje jeho typ. Konfiguraci vˇetr´an´ı znaˇc´ı p´ısmeno V, zal´ev´an´ı p´ısmeno W a pro nastaven´ı prodlevy z´aznamu dat a ruˇcn´ıho ovl´ad´an´ı je vyhrazeno p´ısmeno D. Ke sp´ın´an´ı ventilace a z´alivky doch´az´ı bud’ v pˇredem nastaven´em ˇcase, nebo dle vstupn´ıch dat ze senzor˚ u. Za p´ısmeny V nebo W n´asleduje ˇc´ıslo ˇretˇezce oddˇelen´e mezerou. Pokud je toto ˇc´ıslo trojcifern´e, znamen´a to, ˇze je pouˇzito ovl´ad´an´ı vyuˇz´ıvaj´ıc´ı senzory. Za ˇc´ıslem ˇretˇezce navazuj´ı hodnoty nastaven´ı. Pokud je ˇc´ıslo ˇretˇezce jedno- nebo dvojcifern´e, jde o nastaven´ı ˇcasu sepnut´ı. Ten je zad´an jako dalˇs´ı ˇc´ıslo za ˇc´ıslem ˇretˇezce. Toto ˇc´ıslo je od 0 do 144 a reprezentuje ˇcas po desetiminutov´ ych kroc´ıch. N´asleduj´ıc´ı ˇc´ıslo je doba, po kterou bude v´ ystup spuˇstˇen. Ta je d´ana v minut´ach v pˇr´ıpadˇe zal´ev´an´ı a v pˇetiminutov´ ych kroc´ıch v pˇr´ıpadˇe ventilace. Tato dˇelen´ı na kroky jsou pouˇzita z d˚ uvodu moˇznosti pouˇz´ıt pro udrˇzov´an´ı hodnot nastaven´ı pole datov´ ych typ˚ u byte14 m´ısto typu uint16 t a t´ım sn´ıˇzit potˇrebn´ y prostor v pamˇeti na polovinu. Pˇred pouˇzit´ım se hodnoty pouze vyn´asob´ı dan´ ym krokem. Pokud se jedn´a o nastaven´ı automatick´eho ovl´ad´an´ı, jsou za ˇc´ıslem ˇretˇezce uvedeny maxim´aln´ı a minim´aln´ı hranice hodnot senzor˚ u. V pˇr´ıpadˇe nastaven´ı prodlevy, tedy ˇretˇezce zaˇc´ınaj´ıc´ıho p´ısmenem D, n´asleduje tak´e ˇc´ıslo ˇretˇezce. To ud´av´a o jakou prodlevu je jedn´a (0 pro z´aznam, 1 pro ruˇcn´ı ovl´ad´an´ı). Posledn´ı hodnota ˇretˇezce je pak hodnota prodlevy. ˇ Jak bylo ˇreˇceno, data jsou pro pˇr´ım´e pouˇzit´ı uchov´av´ana v pamˇeti. Casov´ a nastaven´ı jsou uloˇzena jako dvojrozmˇern´e pole typu byte ve tvaru: [ˇ cas] - krok 10 min, [prodleva] - krok 1 min / 5 min Mezn´ı hranice hodnot pro ovl´ad´an´ı podle senzor˚ u jsou uloˇzeny v samostatn´ ych promˇenn´ ych, kter´e jsou tak´e typu byte. Konfiguraˇcn´ı data jsou v zadan´ ych intervalech porovn´av´ana s aktu´aln´ım ˇcasem, popˇr. se vstupn´ımi hodnotami senzor˚ u. Pˇred samotn´ ym porovn´av´an´ım se inicializuj´ı dvˇe promˇenn´e, do kter´ ych je ukl´ad´an doˇcasn´ y stav na z´akladˇe aktu´alnˇe porovn´avan´ ych dat. Hodnoty tˇechto promˇenn´ ych jsou po skonˇcen´ı cel´eho porovn´avac´ıho procesu odesl´any na v´ ystupn´ı pin. Porovn´av´an´ı prob´ıh´a podle priority od nejniˇzˇs´ı po nejvyˇsˇs´ı, aby byl v´ ystup ovlivnˇen nastaven´ım s nejvyˇsˇs´ı prioritou. Automatick´e ovl´ad´an´ı m´a vyˇsˇs´ı prioritu neˇz ˇcasov´e. Vyhodnot´ı se tedy nejprve ˇcasy sepnut´ı a pokud nˇekter´ y odpov´ıd´a aktu´aln´ımu ˇcasu, je do promˇenn´e zaps´ana logick´a 1. Pak se vyhodnot´ı automatick´e nastaven´ı a popˇr´ıpadˇe se zmˇen´ı stav promˇenn´ ych. Napˇr´ıklad pokud je teplota ve sklen´ıku niˇzˇs´ı, neˇz jak´a je nastaven´a v konfiguraci, zmˇen´ı se stav v promˇenn´e se stavem ventilace zpˇet na logickou 0 i pokud ˇcas spuˇstˇen´ı odpov´ıd´a aktu´aln´ımu ˇcasu. Jako dalˇs´ı pˇr´ıklad 14
Osmibitov´e cel´e kladn´e ˇc´ıslo (0 - 255)
17
Program pro Arduino
Ovl´ad´an´ı v´ystupn´ıch zaˇr´ızen´ı
je situace, kdy nen´ı nastaven ˇza´dn´ y ˇcas z´alivky, ale pouze minim´aln´ı hranice vlhkosti p˚ udy. Pak se jednoduˇse spust´ı z´alivka, pokud vlhkost klesne pod nastavenou u ´roveˇ n. Z toho plyne, ˇze automatick´e nastaven´ı slouˇz´ı z´aroveˇ n jako ochrana pˇred tˇemito havarijn´ımi stavy: • Sepnut´ı ventilace v pˇr´ıpadˇe n´ızk´e teploty • Sepnut´ı z´alivky v pˇr´ıpadˇe jiˇz zavlaˇzen´e p˚ udy • Nesepnut´ı ventilace v pˇr´ıpadˇe vysok´e teploty nebo vlhkosti vzduchu • Nesepnut´ı z´alivky v pˇr´ıpadˇe pˇr´ıliˇs such´e p˚ udy Pokud by si uˇzivatel chtˇel sepnout nˇekter´ y z v´ ystup˚ u pˇr´ımo ve sklen´ıku, aniˇz by musel mˇenit data konfigurace, je mu k dispozici ruˇcn´ı ovl´ad´an´ı v´ ystup˚ u pomoc´ı tlaˇc´ıtek v menu Arduina. V momentˇe, kdy uˇzivatel zmˇen´ı stav ruˇcn´ım ovl´ad´an´ım, vyˇrad´ı se na pˇrednastavenou dobu vyhodnocov´an´ı ovl´adac´ıch dat. Ruˇcn´ım ovl´ad´an´ım je tedy moˇzn´e pˇrep´ınat rel´e i v pˇr´ıpadˇe havarijn´ıch stav˚ u.
18
Program pro Arduino
4.5
Z´aznamy
Z´ aznamy
Arduino vytv´aˇr´ı dva typy z´aznam˚ u. Prvn´ım typem jsou z´aznamy hodnot ze senzor˚ u DHT11 a vlhkosti p˚ udy. Tyto z´aznamy se vytv´aˇrej´ı pr˚ ubˇeˇznˇe v nastaven´em intervalu. Do z´aznamu se zapisuje ˇcas, teplota, vlhkost vzduchu a vlhkost p˚ udy. Druh´ ym typem je sledov´an´ı zmˇen stav˚ u obou v´ ystupn´ıch zaˇr´ızen´ı. Pokaˇzd´e, kdyˇz dojde ke zmˇenˇe se vytvoˇr´ı z´aznam obsahuj´ıc´ı ˇcas zmˇeny, informaci o tom, zda byla zmˇena vyvol´ana ˇr´ızen´ım nebo ruˇcn´ım reˇzimem, zaˇr´ızen´ı kter´e bylo ovlivnˇeno a stav do kter´eho pˇreˇslo. Oba typy z´aznam˚ u se ukl´adaj´ı do souboru RECORDS.TXT na microSD kartˇe a pokud je aktivn´ı s´ıt’ov´e spojen´ı, odes´ılaj´ı se z´aroveˇ n na server. Z´aznamy maj´ı podobu textov´eho ˇretˇezce, kter´ y zaˇc´ın´a znakem typu z´aznamu. T´ım je bud’ p´ısmeno E, tedy z´aznam vlastnost´ı prostˇred´ı, nebo p´ısmeno A, coˇz je z´aznam zmˇeny stavu v´ ystupn´ıho zaˇr´ızen´ı. Za t´ımto znakem n´asleduje datum a ˇcas z´aznamu ve tvaru hhmmssrrrrmmdd, napˇr. 06410820140409 vyjadˇruje ˇcas 6:41:08 dne 9.4.2014. V pˇr´ıpadˇe z´aznamu ze senzor˚ u jsou dalˇs´ımi hodnotami teplota, vlhkost vzduchu a vlhkost p˚ udy. Teplota je ud´ana dvojcifernˇe, nebot’ teplotn´ı rozsah DHT11 je 0-55 ◦ C. Obˇe vlhkosti jsou trojcifern´e a jsou vyj´adˇreny v procentech. Z´aznam zmˇeny v´ ystupu m´a tak´e tˇri hodnoty, vˇsechny jsou vˇsak jednocifern´e. Prvn´ı ud´av´a, zda byla zmˇena vyvol´ana v ruˇcn´ım reˇzimu (0) nebo na z´akladˇe ˇr´ıd´ıc´ıch dat (1). Druh´a hodnota definuje ovlivnˇen´e zaˇr´ızen´ı – ventilaci (0) nebo zavlaˇzov´an´ı (1). Posledn´ı hodnotou je stav zaˇr´ızen´ı po zmˇenˇe, tj. vypnuto (0) nebo zapnuto (1).
19
5 Ovl´adac´ı aplikace pro PC Aplikace umoˇzn ˇuje uˇzivateli pˇr´ıstup ke vˇsem funkc´ım, kter´e syst´em poskytuje. Jsou rozliˇseny dva z´akladn´ı zp˚ usoby pˇr´ıstupu k dat˚ um v Arduinu. Lok´aln´ı pˇr´ıstup k soubor˚ um na microSD kartˇe, kterou uˇzivatel vyjme z Arduina a vloˇz´ı do ˇctec´ıho zaˇr´ızen´ı v PC nebo vzd´alen´ y pˇr´ıstup skrze internetov´e pˇripojen´ı prostˇrednictv´ım webov´eho serveru. Oba zp˚ usoby poskytuj´ı stejn´e moˇznosti konfigurace ovl´ad´an´ı a prohl´ıˇzen´ı z´aznam˚ u. Nastaven´ı pˇripojen´ı Arduina k s´ıti lze pouze lok´aln´ım zp˚ usobem.
5.1
Lok´ aln´ı pˇ r´ıstup
Pokud uˇzivatel zakl´ad´a nov´ y sklen´ık nebo pokud nevyuˇz´ıv´a vz´alenou spr´avu sklen´ıku, pˇren´aˇs´ı data mezi Arduinem a PC aplikac´ı v souborech na kartˇe. Java poskytuje pro pr´aci se soubory mnoho tˇr´ıd ve standardn´ı knihovˇe [23]. Pro manipulaci se soubory a sloˇzkami slouˇz´ı tˇr´ıda File z knihovny java.io. V naˇsem pˇr´ıpadˇe zastupuje koˇrenov´ y adres´aˇr microSD karty i jednotliv´e textov´e soubory na n´ı. Tato tˇr´ıda nab´ız´ı pro v´ ypis obsahu adres´aˇre metodu list(), kter´a vrac´ı n´azvy vˇsech soubor˚ u a sloˇzek. T´ımto zp˚ usobem aplikace zjiˇst’uje, kter´e z pouˇzit´ ych soubor˚ u jsou na kartˇe k dispozici. Podle toho aktivuje pˇr´ısluˇsn´a tlaˇc´ıtka pro pˇr´ısluˇsn´e operace. Soubory se s´ıt’ov´ ym nastaven´ım Arduina a s konfigurac´ı ovl´ad´an´ı jsou povinn´e a jsou k dispozici vˇzdy. Pokud nejsou na kartˇe, znamen´a to, ˇze jde o zakl´ad´an´ı nov´eho sklen´ıku a je potˇreba tyto soubory vytvoˇrit. K tomu slouˇz´ı metoda createNewFile(), kter´a vytvoˇr´ı soubor se jm´enem zadan´ ym v konstruktoru tˇr´ıdy File. Pro vstup a v´ ystup dat pouˇz´ıv´a Java zobecnˇen´ı v podobˇe datov´eho proudu. Ten reprezentuje zdroj, popˇr. c´ıl dat, zpˇr´ıstupˇ nuje nebo pˇrij´ım´a libovoln´e datov´e bloky a skr´ yv´a detaily dˇen´ı uvnitˇr datov´eho objektu. Datov´e proudy se dˇel´ı podle smˇeru dat na vstupn´ı a v´ ystupn´ı. V Javˇe jsou reprezentov´any z´akladn´ımi tˇr´ıdami InputStream a OutputStream v pˇr´ıpadˇe pr´ace s bajty nebo tˇr´ıdami Reader a Writer v pˇr´ıpadˇe pr´ace s textem. Vstupn´ı proudy poskytuj´ı pro ˇcten´ı metodu read(), pro z´apis do v´ ystupn´ıho proudu slouˇz´ı metoda write(). Z´akladn´ı tˇr´ıdy se obvykle nepouˇz´ıvaj´ı samostatnˇe, ale v kombinaci s dalˇs´ımi vrstvami, kter´e data zpˇr´ıstupˇ nuj´ı skrze efektivnˇejˇs´ı rozhran´ı. Pro ˇcten´ı je to tˇr´ıda BufferedReader, kter´a poskytuje metodu readLine() pro naˇcten´ı cel´eho ˇra´dku, a pro z´apis cel´eho ˇra´dku nab´ız´ı tˇr´ıda PrintWriter metodu println(). Vˇsechny tyto tˇr´ıdy jsou tak´e souˇca´st´ı knihovny java.io. 20
Ovl´adac´ı aplikace pro PC
5.2
Vzd´alen´y pˇr´ıstup
Vzd´ alen´ y pˇ r´ıstup
Pro pr´aci se s´ıt´ı obecnˇe nab´ız´ı Java knihovnu java.net. Jej´ı souˇc´ast´ı jsou i tˇr´ıdy pro pˇr´ıstup ke zdroj˚ um na dan´em URL [24]. K reprezentaci samotn´eho URL slouˇz´ı stejnojmenn´a tˇr´ıda URL. V dialogu nastaven´ı vzd´alen´e spr´avy zad´a uˇzivatel URL webov´eho rozhran´ı pro aplikaci, kter´a se tˇr´ıdˇe pˇred´a v konstruktoru. Tˇr´ıda UrlConnection umoˇzn ˇuje kontrolu nad komunikac´ı klient/server. Instance t´eto tˇr´ıdy se z´ısk´av´a jako n´avratov´a hodnota metody URL.openConnection(). Pro komunikaci prostˇrednictv´ım HTTP protokolu existuje nadstavbov´a tˇr´ıda HttpUrlConnection, kter´a zjednoduˇsuje pr´aci s HTTP hlaviˇckami a umoˇzn ˇuje snadn´e pouˇzit´ı metody POST. Tato metoda poˇzadavku je vhodnˇejˇs´ı pro odes´ıl´an´ı dat. Data jsou v bin´an´ı podobˇe odes´ıl´ana bezprostˇrednˇe za hlaviˇckou. Nen´ı tedy omezeno mnoˇzstv´ı pˇrenesen´ ych dat jako u metody GET, kter´a pˇred´av´a data jako souˇc´ast URL v hlaviˇcce poˇzadavku. Pro nastaven´ı metody poˇzadavku je k dispozici metoda HttpUrlConnection.setRequestMethod(), v naˇsem pˇr´ıpadˇe je to ”POST”. Zdˇedˇenou metodou setDoOutput(true) se nastav´ı pˇr´ıznak odes´ıl´an´ı tˇela poˇzadavku (data po odesl´an´ı hlaviˇcky poˇzadavku) na server. Tato data jsou stejnˇe jako v pˇr´ıpadˇe metody GET ve form´atu kl´ ıc ˇ=hodnota a spojeny znakem &. Metoda getOutputStream, zdˇedˇen´a od tˇr´ıdy URLConnection, otev´ır´a v´ ystupn´ı datov´ y proud a umoˇzn ˇuje z´apis po bajtech. Spoleˇcnˇe s n´ı se pouˇz´ıv´a obalovac´ı tˇr´ıda DataOutputStream, kter´a pˇrev´ad´ı odes´ılan´e objekty na bajty. Cel´a konstrukce vypad´a takto: HttpURLConnection conn = (HttpURLConnection) url.openConnection(); OutputStream stream = conn.getOutputStream(); DataOutputStream out = new DataOutputStream(stream); out.writeBytes(param); Tento k´od je implementov´an ve tˇr´ıdˇe HttpConnector. Ta m´a pouze dvˇe metody, send(String[]) a String[] receive(). Tˇr´ıdˇe se pˇred´a URL v konstruktoru a n´aslednˇe jsou vol´any metody pro odes´ıl´an´ı a pˇrij´ım´an´ı dat z HTTP serveru. Kaˇzd´ y dotaz na server se chov´a jako samostatn´e pˇripojen´ı, kter´e je po pˇrijet´ı dat od serveru ukonˇceno. Tomu odpov´ıd´a i pouˇzit´ı tˇechto metod. Metodˇe send() se jako argument pˇred´a pole String, coˇz jsou jednotliv´e dvojice kl´ ıc ˇ=hodnota. Ty jsou nejprve spojovac´ım znakem poskl´ad´any do jednoho ˇretˇezce (param). N´aslednˇe je nav´az´ano spojen´ı se serverem a data odesl´ana vyuˇzit´ım v´ yˇse zm´ınˇen´e konstrukce. Spojen´ı z˚ ust´av´a otevˇren´e do 21
Ovl´adac´ı aplikace pro PC
Vzd´alen´y pˇr´ıstup
t´e doby, neˇz je zavol´ana metoda receive(), kter´a vrac´ı tak´e pole String. V tomto pˇr´ıpadˇe jsou to vˇsak jednotliv´e ˇr´adky tˇela odpovˇedi. ˇ ı odpovˇedi prob´ıh´a stejnˇe jako pˇri pr´aci se soubory prostˇrednictv´ım Cten´ proudu dat. Metoda HttpConnection.getInputStream vrac´ı vstupn´ı proud pro ˇcten´ı dat z aktivn´ıho spojen´ı. Ke ˇcten´ı jsou pouˇzity dvˇe tˇr´ıdy typu Reader, protoˇze vˇsechna pˇren´aˇsen´a data jsou v textov´e podobˇe. InputStreamReader pˇrev´ad´ı datov´ y proud z bin´arn´ıho na textov´ y. BufferedReader z nˇej pak ˇcte text a vrac´ı ho po ˇr´adc´ıch metodou readLine(). Tato ˇc´ast k´odu vypad´a n´asledovnˇe: InputStream stream = conn.getInputStream(); InputStreamReader input = new InputStreamReader(stream); BufferedReader reader = new BufferedReader(input); String line = reader.readLine(); Tˇr´ıda HttpConnector je v aplikaci vyuˇz´ıv´ana dalˇs´ı vlastn´ı tˇr´ıdou WebDB, kter´a obsahuje metody pro odes´ıl´an´ı a pˇrij´ım´an´ı dat a jednotliv´ ych pˇr´ıkaz˚ u. Pro kaˇzdou interakci se serverem existuje, stejnˇe jako v Arduinu, vlastn´ı pˇr´ıkaz, kter´ y je zas´ıl´an jako hodnota s kl´ıˇcem action. V tabulce 5.1 je pˇrehled tˇechto pˇr´ıkaz˚ u. Pro identifikaci pˇripojen´eho uˇzivatele slouˇz´ı komunikaˇcn´ı kl´ıˇc, tzv. token. Ten je generov´an serverem pˇri registraci a kaˇzd´em nov´em pˇrihl´aˇsen´ı. Pˇri tˇechto dvou operac´ıch se serveru zas´ıl´a uˇzivatelsk´e jm´eno (user) a heslo (password). Server ve sv´e odpovˇedi zaˇsle token, kter´ y je pak pouˇz´ıv´an pˇri vˇsech ostatn´ıch operac´ıch. Pokud jsou to operace s daty zvolen´eho sklen´ıku, mus´ı b´ yt v poˇzadavku zasl´ano ID sklen´ıku v datab´azi (unitid). Toto ˇc´ıslo z´ısk´a aplikace pˇri v´ ypisu dostupn´ ych sklen´ık˚ u (unitlist) nebo pˇri pˇrid´an´ı nov´eho sklen´ıku (addunit). Pokud uˇzivatel odes´ıl´a konfiguraˇcn´ı data do Arduina, jsou tato data rozdˇelena na jednotliv´e ˇra´dky (data), kter´e jsou odes´ıl´any jako samostatn´e poˇzadavky. Pro synchronizaci dat v Arduinu a serveru jsou v datab´azi definovan´e bin´arn´ı promˇenn´e, tzv. pˇr´ıznaky. Ty Arduinu oznamuj´ı, ˇze uˇzivatel odeslal novou konfiguraci, kterou m´a pˇrijmout a uloˇzit na SD kartu (updatecnf), nebo aby odeslal pouˇz´ıvan´a data na server (requestcnf).
22
Ovl´adac´ı aplikace pro PC
Vzd´alen´y pˇr´ıstup
Pˇ r´ıkaz
Odes´ılan´ a data
Popis
login
user, password
Pˇrihl´aˇsen´ı uˇzivatele - server odeˇsle vygenerovan´ y komunikaˇcn´ı token
register
user, password
Registrace nov´eho uˇzivatele - server odeˇsle vygenerovan´ y komunikaˇcn´ı token
check
token, user
Ovˇeˇren´ı platnosti komunikaˇcn´ıho tokenu Z´ısk´an´ı URL a IP adresy serveru
getinfo
Pˇrid´an´ı nov´eho Arduina do datab´aze – server vrac´ı ID sklen´ıku
addunit
token, unitname
removeunit
token, unitid
unitlist
token
V´ ypis pˇripojen´ ych jednotek – server vrac´ı jm´ena a ID vˇsech sklen´ık˚ u
requestcnf
token
Nastaven´ı pˇr´ıznaku zasl´an´ı konfiguraˇcn´ıch dat vˇsem sklen´ık˚ um sklen´ıky
updatecnf
token, unitid
Nastaven´ı pˇr´ıznaku pˇrijet´ı konfiguraˇcn´ıch dat zvolen´emu sklen´ıku
getrec
token, token
Staˇzen´ı z´aznam˚ u z datab´aze
getcnf
token, unitid
Staˇzen´ı konfiguraˇcn´ıch sklen´ıku z datab´aze
sendcnf
token, unitid, data
clearrec
token, unitid
Smaz´an´ı vˇsech z´aznam˚ u sklen´ıku z datab´aze
clearcnf
token, unitid
Smaz´an´ı vˇsech konfiguraˇcn´ıch dat zvolen´eho sklen´ıku z datab´aze
Odebr´an´ı Arduina z datab´aze
zvolen´eho dat
sklen´ıku zvolen´eho
Odesl´an´ı konfiguraˇcn´ıch dat pro zvolen´ y sklen´ık do datab´aze zvolen´eho
Tabulka 5.1: Seznam pˇr´ıkaz˚ u odes´ılan´ ych z PC aplikace na server
23
Ovl´adac´ı aplikace pro PC
5.3
Nastaven´ı Arduina a prohl´ıˇzen´ı z´aznam˚ u
Nastaven´ı Arduina a prohl´ıˇ zen´ı z´ aznam˚ u
Pro operace s daty ovl´ad´an´ı a z´aznamy a jejich uchov´an´ı slouˇz´ı dvˇe tˇr´ıdy typu model, kter´e podle architektury MVC1 [25, s. 235] zastupuj´ı v´ ypoˇcetn´ı i datovou komponentu, viz obr´azek 5.1. Konfiguraˇcn´ı data jsou spravov´ana tˇr´ıdou ConfigModel, kter´a poskytuje metody void parseData(String[]) a String[] getData(). Tyto metody slouˇz´ı pro operace s daty v textov´e podobˇe. Pro pr´aci s textov´ ymi ˇretˇezci slouˇz´ı obdobnˇe jako v Arduinu tˇr´ıda String. Pole tˇechto ˇretˇezc˚ u (String[]) reprezentuje data po ˇra´dc´ıch. D´ıky tomu nen´ı tato tˇr´ıda z´avisl´a na zdroji vstupn´ıch dat, nebot’ v obou pˇr´ıpadech (soubory nebo pˇripojen´ı k s´ıti) je s daty pracov´ano v tomto form´atu. V pˇr´ıpadˇe, ˇze jsou konfiguraˇcn´ı data spravov´ana prostˇrednictv´ım vzd´alen´e spr´avy, udrˇzuje si tˇr´ıda ID sklen´ıku z´ıskan´e od serveru. To je v´ yhodn´e v pˇr´ıpadˇe, ˇze se uˇzivatel rozhodne upravovat konfiguraˇcn´ı data pro v´ıce sklen´ık˚ u najednou. Toto ˇc´ıslo je odes´ıl´ano spoleˇcnˇe s konfiguraˇcn´ımi daty pˇri z´apisu dat na server, aby identifikovalo pˇr´ısluˇsn´e Arduino. Uˇzivatel zad´av´a konfi-
Obr´azek 5.1: Diagram architektury MVC guraˇcn´ı data prostˇrednictv´ım grafick´eho rozhran´ı, kter´e je implementov´ano ve tˇr´ıdˇe ConfigFrame. Ta tvoˇr´ı prezentaˇcn´ı komponentu architektury MVC. Okno pro konfiguraci ovl´adac´ıch dat obsahuje seznamy ˇcas˚ u spuˇstˇen´ı ovl´adan´ ych zaˇr´ızen´ı a textov´a pole pro zad´an´ı mezn´ıch hodnot ze senzor˚ u. Pro volbu ovl´ad´an´ı podle hodnot ze senzor˚ u jsou k dispozici zaˇskrt´avac´ı pole. Pˇri naˇcten´ı konfiguraˇcn´ıch dat ze zdroje do modelu se tato data zobraz´ı v oknˇe konfigurace. Pokud je uˇzivatel uprav´ı nebo dopln´ı (popˇr. redukuje), m˚ uˇze je uloˇzit zpˇet do zdroje. Pˇri t´eto akci se data pˇrenesou z prezentaˇcn´ı komponenty zpˇet do modelu. Ten data pˇrevede do jiˇz zm´ınˇen´eho textov´eho form´atu a zap´ıˇse je do zdroje, ze kter´eho byla nahr´ana. 1
Model-View-Controller – Oddˇelen´ı datov´e, prezentaˇcn´ı a v´ ypoˇcetn´ı komponenty
24
Ovl´adac´ı aplikace pro PC
Nastaven´ı Arduina a prohl´ıˇzen´ı z´aznam˚ u
Na stejn´em principu funguj´ı operace se z´aznamy z Arduina. Model pro tyto z´aznamy tvoˇr´ı tˇr´ıda RecordsModel. Tento model je pouze jednosmˇern´ y, tzn. data se nemodifikuj´ı a nevracej´ı zpˇet do zdroje, ale jsou pouze zobrazov´ana. Jedin´ ym pˇr´ıpadem manipulace s daty v pˇr´ısluˇsn´em zdroji je jejich smaz´an´ı. K tomu slouˇz´ı metoda void clear(). Jelikoˇz i v tomto pˇr´ıpadˇe m˚ uˇze uˇzivatel zobrazovat z´aznamy z v´ıce sklen´ık˚ u, je nutn´e si v modelu uchov´avat jejich ID. Tˇr´ıda RecordsModel stejnˇe jako ConfigModel obsahuje metodu void parseData(String[]), kter´a pˇrev´ad´ı data z textov´e podoby do objekt˚ u Record. Tyto objekty zastupuj´ı jednotliv´e z´aznamy a umoˇzn ˇuj´ı k nim snadn´ y pˇr´ıstup. Data jsou pˇred´av´ana prezentaˇcn´ı komponentˇe RecordsDiagram, kter´a je vykresluje v pˇrehledn´em grafu, viz obr. 5.2. Tato komponenta je um´ıstˇena v oknˇe pro zobrazen´ı z´aznam˚ u RecordsDialog. V tomto oknˇe jsou z´aroveˇ n um´ıstˇena tlaˇc´ıtka pro odstranˇen´ı z´aznam˚ u a pro uloˇzen´ı aktu´aln´ıho grafu jako obr´azku ve form´atu PNG2 . Pˇri ukl´ad´an´ı obr´azku do souboru se nejprve vykresl´ı graf do objektu BufferedImage, coˇz je tˇr´ıda reprezentuj´ıc´ı grafick´e obr´azky z knihovny java.awt. Objekt je pot´e prostˇrednictv´ım statick´e metody write() tˇr´ıdy ImageIO zaps´an jako soubor PNG do zvolen´eho um´ıstˇen´ı. Jako n´azev tohoto souboru se implicitnˇe nastav´ı datum a ˇcas z lev´eho okraje aktu´alnˇe zobrazen´eho grafu.
Obr´azek 5.2: Zobrazen´ı z´aznam˚ u z Arduina v grafu
2
Portable Network Graphics – Pˇrenosn´a s´ıt’ov´a grafika, form´at pro bezztr´atovou kompresi rastrov´e grafiky
25
6 Aplikace pro webov´y server Software um´ıstˇen´ y na serveru se skl´ad´a ze samostatn´ ych PHP skript˚ u. Ty slouˇz´ı nejen pro komunikaci s Arduinem a aplikac´ı v PC, ale i pro zobrazen´ı z´akladn´ıho uˇzivatelsk´eho rozhran´ı v oknˇe prohl´ıˇzeˇce. Data jsou na serveru uchov´av´ana v datab´azov´em syst´emu MySQL. K propojen´ı mezi skripty a datab´az´ı je pouˇzita knihovna PDO, kter´a se objevila v PHP od verze 5.1 [26].
6.1
Datab´ azov´ y model
K uchov´av´an´ı dat je pouˇzit relaˇcn´ı datab´azov´ y syst´em [27], kter´ y je na serveru k dispozici. Vˇetˇsina neplacen´ ych hosting˚ u poskytuje uˇzivateli pˇr´ıstup k datab´azi, kter´a je vyhrazena pro jeho webov´ y prostor na serveru. Nejˇcastˇeji b´ yv´a spravov´ana datab´azov´ ym strojem MySQL1 , kter´ y je vyd´av´an v nˇekolika verz´ıch. Na neplacen´ ych serverech b´ yv´a zpravidla bezplatn´a verze MySQL, kter´a je ˇs´ıˇrena pod licenc´ı GPL2 . Komunikace s relaˇcn´ı datab´az´ı prob´ıh´a prostˇrednictv´ım dotazovac´ıho jazyka SQL3 , kter´ y obsahuje pˇr´ıkazy pro manipulaci s daty, definici dat, ˇr´ızen´ı pˇr´ıstupov´ ych pr´av a ˇr´ızen´ı transakc´ı. user
greenhouse
record
userid INT
greenhouseid INT
recordid INT
username VARCHAR(64)
user_id INT
greenhouse_id INT
password VARCHAR(32)
name VARCHAR(64)
lastlog_dt DATETIME
token VARCHAR(32)
lastlog_ip VARCHAR(45)
request_cnf BOOL
token VARCHAR(32)
update_cnf BOOL
Indexes
dt DATETIME
config
Indexes
type ENUM('A','E')
configid INT
v1 INT
greenhouse_id INT
v2 INT
type ENUM('V', 'W', 'D') number INT
v3 INT Indexes
v1 INT v2 INT Indexes
Obr´azek 6.1: ER model datab´aze. Vytvoˇreno v MySQL Workbench 6.1 Na obr´azku 6.1 je vidˇet E-R-A diagram datab´aze, kter´ y byl vytvoˇren pˇri n´avrhu modelu. Tabulka informac´ı o uˇzivatel´ıch user uchov´av´a jm´ena a hesla 1
http://www.mysql.com/ https://www.gnu.org/licenses/gpl.html 3 Structured Query Language - Strukturovan´ y dotazovac´ı jazyk 2
26
Aplikace pro webov´y server
Knihovna PDO
uˇzivatel˚ u, data posledn´ıch pˇrihl´aˇsen´ı a aktu´aln´ı komunikaˇcn´ı kl´ıˇce pro spojen´ı s PC aplikac´ı. Z´akladn´ı informace o sklen´ıc´ıch jednotliv´ ych uˇzivatel˚ u jsou v tabulce greenhouse. Ta obsahuje ID majitele, n´azev sklen´ıku, komunikaˇcn´ı kl´ıˇc pro pˇripojen´ı Arduina a pˇr´ıznaky pro synchronizaci konfiguraˇcn´ıch dat mezi serverem a Arduinem. Ke kaˇzd´emu sklen´ıku pˇr´ısluˇs´ı z´aznamy v tabulk´ach config a record. V prvn´ı tabulce jsou aktu´aln´ı data konfigurace Arduina. Do druh´e tabulky jsou ukl´ad´any z´aznamy z Arduina.
6.2
Knihovna PDO
Pro spojen´ı serverov´e aplikace s datab´az´ı je pouˇzita knihovna PDO. Datov´e objekty PHP, neboli PDO, je rozˇs´ıˇren´ı PHP5, kter´e vytv´aˇr´ı abstraktn´ı 4 ˇ rozhran´ı mezi PHP a mnoha typy SRBD . PDO bylo navrˇzeno tak, aby program´ator nemusel pˇri zmˇenˇe datab´azov´eho syst´emu upravovat vˇsechny skripty, kter´e k datab´azi pˇristupuj´ı. Kaˇzd´ y datab´azov´ y syst´em definuje vlastn´ı 5 ˇ API pro funkce, kter´e jsou pro vˇetˇsinu SRBD spoleˇcn´e. Tˇemito funkcemi jsou napˇr. vytvoˇren´ı pˇripraven´eho v´ yrazu (Prepared Statement) nebo zpracov´an´ı chyb (Error Handling). Fakt, ˇze tato API nejsou sjednocen´a, pˇrin´aˇs´ı v pˇr´ıˇ padˇe zmˇeny SRBD nutnost pˇrepisovat mnoho ˇra´dk˚ u k´odu a vede k nov´ ym chyb´am. Ty je n´aslednˇe potˇreba opˇet odladit, coˇz b´ yv´a ˇcasovˇe n´aroˇcn´e. Ab6 sence jednotn´e knihovny, jako je JDBC v pˇr´ıpadˇe Javy, ˇradila jazyk PHP v ˇzebˇr´ıˇcku popularity za v´ yznamn´e programovac´ı jazyky. Nyn´ı, kdyˇz takov´a knihovna existuje, z´ısk´av´a PHP lepˇs´ı pozici a je obl´ıbenou platformou pro miliony program´ator˚ u [28].
6.3
Rozhran´ı pro Arduino a PC aplikaci
Server je navrˇzen jako spojovac´ı uzel mezi Arduinem a PC aplikac´ı. Pro komunikaci s Arduinem je na serveru skript uconn.php. Ten pˇrij´ım´a od Arduina vˇsechny tˇri typy poˇzadavk˚ u (kontroln´ı, potvrzovac´ı a odes´ıl´an´ı dat) a odpov´ıd´a na nˇe prostˇrednictv´ım tag˚ u popsan´ ych v kapitole Program pro Arduino. Pokud skript pˇrijme kontroln´ı poˇzadavek, ovˇeˇr´ı jm´eno uˇzivatele a token zaslan´ y Arduinem. V pˇr´ıpadˇe, ˇze autorizace neprobˇehne u ´spˇeˇsnˇe, odeˇsle 4
Syst´em pro ˇr´ızen´ı b´ aze dat Application Programing Interface - Rozhran´ı pro programov´an´ı aplikac´ı 6 Java Database Connectivity – Rozhran´ı pro jednotn´ y pˇr´ıstup k datab´az´ım v Javˇe 5
27
Aplikace pro webov´y server
Rozhran´ı pro Arduino a PC aplikaci
se Arduinu negativn´ı odpovˇed’. Jakmile je token v datab´azi nalezen a uveden´e jm´eno je totoˇzn´e se zaslan´ ym, je Arduinu odesl´ano kladn´e potvrzen´ı autorizace a aktu´aln´ı ˇcas serveru. N´aslednˇe skript zkontroluje v datab´azi pˇr´ıznaky pro synchronizaci. Jestliˇze jsou na serveru k dispozici konfiguraˇcn´ı data pro Arduino, naˇctou se z datab´aze, pˇrevedou se do textov´eho form´atu a zaˇslou se jako souˇca´st odpovˇedi na kontroln´ı poˇzadavek. Arduino data pˇrijme, odeˇsle potvrzovac´ı poˇzadavek a skript nastav´ı v datab´azi pˇr´ıznak update_cnf na logickou 0. Pokud je nastaven pˇr´ıznak request_cnf, je Arduinu odesl´an pˇr´ısluˇsn´ y informaˇcn´ı tag, viz tabulka 4.3. Arduino po pˇrijet´ı tohoto tagu zaˇcne odes´ılat konfiguraˇcn´ı data. Po pˇrijet´ı prvn´ıho poˇzadavku s tˇemito daty nastav´ı skript synchronizaˇcn´ı pˇr´ıznak na logickou 0. Poˇzadavek s odes´ılan´ ymi daty m˚ uˇze obsahovat tak´e z´aznamy z Arduina. Skript tento z´aznam prostˇrednictv´ım funkce explode() rozloˇz´ı na jednotliv´e poloˇzky, kter´e uloˇz´ı do datab´aze. Pro komunikaci s PC aplikac´ı slouˇz´ı skript clientconn.php. Ten zpracov´av´a vˇsechny pˇr´ıkazy uveden´e v tabulce 5.1. Po pˇrihl´aˇsen´ı uˇzivatele zaˇsle aplikace pˇr´ıkaz requestcnf a skript v datab´azi nastav´ı pˇr´ıznak request_cnf na logickou 1 u vˇsech sklen´ık˚ u, kter´e patˇr´ı uˇzivateli. To zajist´ı, ˇze budou v datab´azi aktu´aln´ı data ze vˇsech sklen´ık˚ u pro pˇr´ıpad, ˇze by je chtˇel uˇzivatel upravovat. Pˇri odes´ıl´an´ı konfiguraˇcn´ıch dat z PC aplikace na server je pouˇzit pˇr´ıkaz sendcnf. Po odesl´an´ı vˇsech dat je pˇr´ıkazem updatecnf nastaven pˇr´ıznak update_cnf na logickou 1. T´ım je dosaˇzeno toho, ˇze Arduino zaˇcne pˇrij´ımat konfiguraˇcn´ı data aˇz po jejich u ´pln´em odesl´an´ı na server. Pˇri kaˇzd´em pˇrihl´aˇsen´ı (pˇr´ıkaz login) nebo pˇri registraci (pˇr´ıkaz register) prob´ıh´a generov´an´ı tokenu pro komunikaci aplikace se serverem. Tento token je pak odesl´an aplikaci. K´od pro generov´an´ı unik´atn´ıho tokenu vypad´a n´asledovnˇe: $token = md5(uniqid(mt_rand()) . $_SERVER[’REMOTE_ADDR’]); Token je vytv´aˇren funkc´ı MD5, kter´a vypoˇc´ıt´av´a hash z n´ahodn´eho ˇc´ısla a IP adresy uˇzivatele. Stejn´ y k´od je pouˇzit pro generov´an´ı tokenu pro Arduino. Pokud uˇzivatel zaloˇz´ı nov´ y sklen´ık s pˇripojen´ım k serveru, odeˇsle aplikace pˇr´ıkaz addunit a skript pˇrid´a do tabulky greenhouse novou poloˇzku v´azanou na pˇrihl´aˇsen´eho uˇzivatele.
28
7 Diskuze a budouc´ı pr´ace Vytvoˇren´ y syst´em ovl´ad´a dva v´ ystupy (zavlaˇzov´an´ı, ventilace) a z´ısk´av´a data ze tˇr´ı vstup˚ u (tlaˇc´ıtka, DHT11, vlhkost p˚ udy). Pokud by mˇel uˇzivatel z´ajem pˇripojit dalˇs´ı v´ ystupn´ı zaˇr´ızen´ı, napˇr. osvˇetlen´ı nebo vyt´apˇen´ı, bylo by to po hardwarov´e str´ance moˇzn´e, protoˇze na Arduinu z˚ ustal jeden nezapojen´ y v´ ystupn´ı pin D0. Z hlediska softwaru je to tak´e re´aln´e, ale je potˇreba doplnit a ˇca´steˇcnˇe upravit st´avaj´ıc´ı programy ve dvou ˇca´stech syst´emu. V pˇr´ıpadˇe Arduina by musel b´ yt rozˇs´ıˇren algoritmus pro ovl´ad´an´ı v´ ystup˚ u a v ovl´adac´ı aplikaci pro PC pˇrid´an dalˇs´ı panel v oknˇe konfigurace. Stejn´ y pˇr´ıpad nast´av´a, pokud se uˇzivatel rozhodne pˇripojit k Arduinu dalˇs´ı senzory, napˇr. pro mˇeˇren´ı vnˇejˇs´ı teploty nebo intenzity sluneˇcn´ıho svitu. Do voln´ ych vstupn´ıch pin˚ u A3 - A6 je moˇzn´e pˇripojen´ı aˇz ˇctyˇr senzor˚ u. V Arduinu by pak musela b´ yt rozˇs´ıˇrena funkce pro z´aznam dat a v PC aplikaci rozˇs´ıˇren graf pro zobrazen´ı z´aznam˚ u. Pokud by uˇzivatel chtˇel podle tˇechto dat ovl´adat nˇekter´ y z v´ ystup˚ u, muselo by b´ yt rozˇs´ıˇreno konfigurov´an´ı syst´emu. Moˇznost ˇr´ıdit vybran´e v´ ystupn´ı zaˇr´ızen´ı podle dalˇs´ıho senzoru znamen´a pˇrid´an´ı pol´ı pro zad´an´ı mezn´ıch hodnot tohoto senzoru do panelu pro nastaven´ı vybran´eho v´ ystupn´ıho zaˇr´ızen´ı v oknˇe konfigurace. V programu pro Arduino by to obn´aˇselo upraven´ı algoritmu pro porovn´av´an´ı konfiguraˇcn´ıch dat a hodnot z´ıskan´ ych ze senzor˚ u. Pˇri realizaci syst´emu, konkr´etnˇe pˇri tvorbˇe programu pro Arduino, se vyskytl probl´em s omezenou dostupnost´ı microSD karet s velikost´ı do 2 GB, coˇz je maxim´aln´ı velikost, kterou podporuje souborov´ y syst´em FAT16. Tyto karty jiˇz t´emˇeˇr vymizely z obchod˚ u. Tento probl´em by zp˚ usobil nepouˇzitelˇ sen´ım je pouˇz´ıt vˇetˇs´ı SD kartu a vytvoˇrit na nost vytvoˇren´eho syst´emu. Reˇ n´ı 2 GB odd´ıl FAT16, pˇriˇcemˇz zbyl´ y prostor z˚ ustane nevyuˇzit´ y. K vytvoˇren´ı tohoto odd´ılu slouˇz´ı napˇr. program fdisk, kter´ y je dostupn´ y v GNU/Linux a MS Windows.
29
8 Z´avˇer V t´eto pr´aci byli vytvoˇreny tˇri aplikace, kter´e dohromady tvoˇr´ı syst´em pro automatizovan´e ˇr´ızen´ı sklen´ıku. Prvn´ı aplikac´ı je software pro Arduino, kter´e spoleˇcnˇe s shieldy, senzory a rel´e tvoˇr´ı ˇr´ıd´ıc´ı jednotku um´ıstˇenou ve sklen´ıku. Pro realizaci t´eto aplikace bylo nutn´e jednotku nejdˇr´ıve sestavit. Cena Arduina vˇcetnˇe ostatn´ıch komponent nepˇres´ahla ˇca´stku 1500 Kˇc. Protoˇze jsou to z´aroveˇ n jedin´e finanˇcn´ı n´aklady, lze cel´ y syst´em povaˇzovat za cenovˇe dostupn´ y, nebot’ komerˇcnˇe prod´avan´a zaˇr´ızen´ı v t´eto cenov´e relaci slouˇz´ı pouze k ovl´ad´an´ı samotn´eho zavlaˇzov´an´ı1 . Software pro Arduino umoˇzn ˇuje sp´ın´an´ı ovl´adan´ ych v´ ystupn´ıch zaˇr´ızen´ı v nastaven´em ˇcase po zvolenou dobu nebo pˇri dosaˇzen´ı nastaven´ ych mezn´ıch hodnot teploty a vlhkosti. Konfiguraˇcn´ı data pro ovl´ad´an´ı jsou do Arduina pˇren´aˇsena v souborech na SD kartˇe nebo pˇres s´ıt’ov´e spojen´ı. Arduino zaznamen´av´a hodnoty ze senzor˚ u a stavy ovl´adan´ ych zaˇr´ızen´ı v ˇcase. Konfiguraci ovl´ad´an´ı prov´ad´ı uˇzivatel v PC prostˇrednictv´ım aplikace vytvoˇren´e v Javˇe. Ta umoˇzn ˇuje zobrazovat zaznamenan´a data v grafu, export grafu jako obr´azku PNG, nastaven´ı s´ıt’ov´eho pˇripojen´ı Arduina a vzd´alenou spr´avu Arduina. Webov´ y server, slouˇz´ıc´ı jako spojovac´ı uzel, je vytvoˇren v jazyce PHP a k ukl´ad´an´ı dat pouˇz´ıv´a SQL datab´azi. Na serveru pˇrij´ımaj´ı a poskytuj´ı data skripty pˇredstavuj´ıc´ı webov´e rozhran´ı pro obˇe zm´ınˇen´e aplikace. Syst´em tedy splˇ nuje vˇsechny poˇzadavky, kter´e jsou uvedeny v zad´an´ı pr´ace.
1
http://www.gardena.com/cz/water-management/water-controls/
30
Literatura ˇ e Budˇejovice: [1] HEROUT, Pavel. Uˇcebnice jazyka Java. 5., rozˇs. vyd. Cesk´ Kopp, 2010, 386 s. ISBN 978-80-7232-398-2. [2] GILMORE, Jason W. Velk´a kniha PHP a MySQL 5: kompendium znalost´ı pro zaˇc´ateˇcn´ıky i profesion´aly. Vyd. 1. [i.e. 2. vyd.]. Brno: Zoner Press, 2007, 864 s. ISBN 80-868-1553-6. [3] BANZI, Massimo. Getting started with Arduino. 1st ed. Make: Books / O’Reilly, 2009. ISBN 978-059-6155-513. [4] ARDUINO SA. Arduino [online]. 2005 [cit. 2014-04-24]. Dostupn´e z: http://arduino.cc/ [5] ATMEL CORPORATION. Atmel 8-bit Microcontroller with 4/8/16/32KBytes In-System Programmable Flash. San Jose, CA, 2012. [6] MONK, Simon. 30 Arduino projects for the evil genius. New York: McGraw-Hill, c2010, 191 s. ISBN 00-717-4133-X. [7] DI JUSTO, Patrick a GERTZ, Emily. Atmospheric monitoring with arduino: building simple devices to collect data about the environment. First edition. Farnham: O’Reilly, c2013, 76 s. ISBN 14-493-3814-3. [8] MARGOLIS, Michael. Arduino cookbook. 2nd ed. Sebastopol, Calif.: O’Reilly, c2012, 699 s. ISBN 14-493-1387-6. [9] VIRIUS, Miroslav. Jazyky C a C++: kompletn´ı kapesn´ı pr˚ uvodce program´atora. 1. vyd. Praha: Grada, 2006, 518 s. ISBN 80-247-1494-9. [10] ARDUINO SA. The Arduino Playground [online]. 2005 [cit. 2014-04-24]. Dostupn´e z: http://playground.arduino.cc/
31
[11] MCROBERTS, Michael. Beginning Arduino. New York: Apress, 2010, 433 s. technology in action. ISBN 978-1-4302-3240-7. ´ [12] VONDRAK, Aleˇs. Sklen´ıky. 1. vyd. Brno: ERA, 2007, 116 s. Stav´ıme. ISBN 978-80-7366-105-2. ´ Josef. Sklen´ıky, paˇreniˇstˇe, f´oliovn´ıky. 1. vyd. Praha: [13] SVOJANOVSKY, ˇ a zahrada. ISBN 80-716-9473-8. Grada, 1998, 97 s. Cesk´ [14] UNIVERSITY OF MASSACHUSETTS AMHERST. Fact Sheets on Greenhouse Management and Engineering [online]. 2014 [cit. 201404-24]. Dostupn´e z: http://extension.umass.edu/floriculture/ fact-sheets/greenhouse-management-engineering ´ Martin. Arduino: webov´ [15] MALY, y server i klient do ruky. In: Root.cz [online]. 27.7.2010 [cit. 2014-04-26]. Dostupn´e z: http://www.root.cz/ clanky/arduino-webovy-server-i-klient-do-ruky. [16] LOY, Marc a ECKSTEIN, Robert. Java Swing. 2nd ed. Sebastopol, CA: O’Reilly, c2003, 1252 s. ISBN 05-960-0408-7. [17] KOSEK, Jiˇr´ı. Protokol HTTP. In: PHP - tvorba interaktivn´ıch internetov´ych aplikac´ı: podrobn´y pr˚ uvodce. Vyd. 1. Praha: Grada, 1999, s. 435460. Pr˚ uvodce (Grada). ISBN 80-7169-373-1. ´ [18] DOSTALEK, Libor. Velk´y pr˚ uvodce protokoly TCP/IP a syst´emem DNS. 2. aktualiz. vyd. Praha: Computer Press, 2000, 426 s. ISBN 80722-6323-4. [19] RESCORLA, E. SSL and TLS. Vyd. 1. Boston: Addison-Wesley, 2001, 499 s. ISBN 02-016-1598-3. [20] KERNIGHAN, Brian a RITCHIE, Dennis. Ukazatele a pole. In: Programovac´ı jazyk C. Vyd. 1. Brno: Computer Press, 2006, s. 111-144. ISBN 80-251-0897-x. [21] SIMON, Mark. A Crash Course in PDO [online]. Comparity Training Resources, 2010 [cit. 2014-04-20]. Dostupn´e z: http://resources. comparity.net/pdf/pdo.pdf ´ Ivona. Poˇc´ıtaˇcov´e s´ıtˇe: praktick´a pˇr´ıruˇcka spr´avce s´ıtˇe. [22] SPURNA, Vyd. 1. Kralice na Han´e: Computer Media, c2010, 180 s. ISBN 978807-4020-360.
32
[23] ECKEL, Bruce. Mysl´ıme v jazyku Java: knihovna zkuˇsen´eho program´atora. Praha: Grada, 2000, 472 s. ISBN 80-247-0027-1. [24] FRIESEN, Jeff. Beginning Java 7. New York, NY: Apress, c2011, 898 s. ISBN 978-1-4302-3909-3. [25] BOLLINGER, Gary a NATARAJAN, Bharathi. JSP - Java Server Pages: podrobn´y pr˚ uvodce zaˇc´ınaj´ıc´ıho tv˚ urce. 1. vyd. Praha: Grada, 2003, 418 s. Modern´ı programov´an´ı. ISBN 80-247-0340-8. [26] THE PHP GROUP. PHP Data Objects [online]. c2014 [cit. 2014-04-25]. Dostupn´e z: http://www.php.net/manual/en/book.pdo.php [27] LACKO, L’uboslav. SQL: kapesn´ı pˇrehled. Vyd. 1. Brno: CP Books, 2005, 96 s. ISBN 80-251-0788-4. [28] POPEL, Dennis. Learning PHP data objects: a beginner’s guide to PHP data objects, database connection abstraction library for PHP 5. 1. publ. Birmingham, UK: Packt Pub. Ltd, 2007. ISBN 978-184-7192-660.
33
A Uˇzivatelsk´a pˇr´ıruˇcka Ovl´adac´ı aplikace v PC slouˇz´ı uˇzivateli k vytv´aˇren´ı a editov´an´ı ovl´adac´ıho nastaven´ı Arduina a k prohl´ıˇzen´ı zaznamenan´ ych informac´ı ze senzor˚ u a stav˚ u v´ ystupn´ıch zaˇr´ızen´ı. Hlavn´ı okno ovl´adac´ı aplikace je rozdˇeleno na dvˇe sekce, viz obr. A.1. Jedna slouˇz´ı pro pr´aci s daty na SD kartˇe, druh´a pro ovl´ad´an´ı prostˇrednictv´ım vzd´alen´e spr´avy. V sekci SD Karta je tlaˇc´ıtko pro v´ ybˇer koˇrenov´eho adres´aˇre SD karty. Po vybr´an´ı adres´aˇre se aktivuj´ı pˇr´ısluˇsn´a tlaˇc´ıtka pro pr´aci s jednotliv´ ymi soubory. Ta slouˇz´ı pro nastaven´ı Arduina, konfiguraci ovl´adac´ıch dat a prohl´ıˇzen´ı uloˇzen´ ych z´aznam˚ u. Pro nastaven´ı vzd´alen´e spr´avy je v horn´ı liˇstˇe menu Vzd´alen´y pˇr´ıstup. Seznam dostupn´ ych sklen´ık˚ u je v sekci Vzd´alen´a spr´ava. Zde je moˇzn´e odebrat Arduino z datab´aze tlaˇc´ıtkem (X).
Obr´azek A.1: Hlavn´ı okno aplikace
34
A.1
Zaloˇ zen´ı sklen´ıku a naˇ cten´ı dat z SD karty
Pˇred samotnou konfigurac´ı je potˇreba do ˇctec´ıho zaˇr´ızen´ı v PC vloˇzit SD kartu s odd´ılem FAT16. Stisknut´ım tlaˇc´ıtka Otevˇr´ıt u´loˇziˇstˇe se otevˇre dialog pro v´ ybˇer adres´aˇre. V nˇem je nutn´e zvolit koˇrenov´ y adres´aˇr SD karty. ˇ N´aslednˇe se aktivuj´ı tlaˇc´ıtka Nastaven´ı jednotky a R´ıd´ıc´ı data jednotky. Pokud je na kartˇe soubor s uloˇzen´ ymi z´aznamy, aktivuje se z´aroveˇ n tlaˇc´ıtko Zobrazit z´aznamy.
A.2
Vzd´ alen´ a spr´ ava
Pokud uˇzivatel vyuˇzije moˇznosti ovl´ad´an´ı a sledov´an´ı sklen´ıku pˇres Internet, mus´ı nejprve v aplikaci nastavit URL webov´eho rozhran´ı. V menu Vzd´alen´y pˇr´ıstup je poloˇzka Nastaven´ı, kter´a otevˇre dialog pro zad´an´ı URL (obr´azek A.2). N´aslednˇe je zapotˇreb´ı vytvoˇrit vlastn´ı uˇzivatelsk´ y u ´ˇcet. Zvolen´ım Zaloˇzit
Obr´azek A.2: Dialog pro nastaven´ı URL webov´eho rozhran´ı u´ˇcet v menu Vzd´alen´y pˇr´ıstup se zobraz´ı dialog pro vytvoˇren´ı nov´eho u ´ˇctu (obr´azek A.3). Pokud m´a uˇzivatel u ´ˇcet jiˇz vytvoˇren, m˚ uˇze se pˇrihl´asit volbou Pˇrihl´asit (obr´azek A.4). Odhl´aˇsen´ı uˇzivatele a smaz´an´ı pˇr´ıpadn´ ych pˇrihlaˇsovac´ıch u ´daj˚ u je prov´adˇeno volbou Odhl´asit.
Obr´azek A.3: Dialog pro vytvoˇren´ı nov´eho u ´ˇctu
35
Obr´azek A.4: Dialog pro pˇrihl´aˇsen´ı uˇzivatele
A.3
Nastaven´ı Arduina
Stisknut´ım tlaˇc´ıtka Nastaven´ı jednotky se zobraz´ı dialog pro nastaven´ı n´azvu sklen´ıku, reˇzimu pˇripojen´ı k s´ıti a pˇr´ıpadnˇe i vˇsech parametr˚ u s´ıt’ov´eho pˇripojen´ı, viz obr´azek A.5. Zaˇskrtnut´ım pol´ıˇcka Vzd´alen´a spr´ava se v pˇr´ıpadˇe, ˇze je uˇzivatel pˇrihl´aˇsen, aktivuje sekce S´ıt’ov´e nastaven´ı jednotky. Pokud uˇzivatel pˇrihl´aˇsen nen´ı, zobraz´ı se nejprve dialog pro pˇrihl´aˇsen´ı. Aplikace automaticky pˇredvypln´ı kl´ıˇc, jm´eno uˇzivatele, adresu serveru a IP serveru. Tyto informace z´ısk´a aplikace od serveru, na kter´em probˇehne pˇrid´an´ı Arduina do datab´aze. Pokud bude Arduino vyuˇz´ıvat DHCP server, staˇc´ı zadat pouze MAC adresu.
A.4
Nastaven´ı ovl´ ad´ an´ı
ˇ ıd´ıc´ı data jednotky nebo tlaˇc´ıtka s n´azvem sklen´ıku se Stisknut´ım tlaˇc´ıtka R´ zobraz´ı okno pro nastaven´ı ˇr´ıd´ıc´ıch dat Arduina (obr´azek A.6). Na z´akladˇe tˇechto dat Arduino ovl´ad´a v´ ystupn´ı zaˇr´ızen´ı a zapisuje z´aznamy. Uˇzivatel m´a moˇznost nastavit aˇz 32 r˚ uzn´ ych ˇcas˚ u spuˇstˇen´ı jednotliv´ ych zaˇr´ızen´ı po dobu, kter´a m˚ uˇze b´ yt pro kaˇzd´ y ˇcas spuˇstˇen´ı r˚ uzn´a. Z´aroveˇ n m´a moˇznost zapnout ovl´ad´an´ı na z´akladˇe vstupn´ıch dat ze senzor˚ u. V tom pˇr´ıpadˇe mus´ı nastavit hraniˇcn´ı hodnoty jednotliv´ ych veliˇcin. Tak´e jsou k dispozici pole pro nastaven´ı prodlevy mezi jednotliv´ ymi z´aznamy hodnot ze senzor˚ u a doby, po kterou bude vyˇrazen algoritmus ovl´ad´an´ı podle konfigurace, pokud uˇzivatel pouˇzije ruˇcn´ı reˇzim.
36
Obr´azek A.5: Dialog pro nastaven´ı Arduina
A.5
Zobrazen´ı z´ aznam˚ u
Stisknut´ım tlaˇc´ıtka Zobrazit z´aznamy v oknˇe pro nastaven´ı ovl´ad´an´ı nebo pˇr´ımo v hlavn´ım oknˇe aplikace se zobraz´ı okno se z´aznamy vyobrazen´ ymi v grafu (obr´azek A.7). Pomoc´ı kurzoru myˇsi je moˇzn´e prohl´ıˇzet hodnoty ze senzor˚ u ve zvolen´em ˇcase. Tlaˇc´ıtkem Obnovit se opˇetovnˇe nahraj´ı z´aznamy a aktualizuje se graf. Po stisknut´ı tlaˇc´ıtka Uloˇzit jako obr´azek se zobraz´ı dialog pro v´ ybˇer um´ıstˇen´ı souboru s obr´azkem. Z´aznamy se z u ´loˇziˇstˇe (souboru nebo datab´aze) maˇzou tlaˇc´ıtkem Odstranit z´aznamy.
37
Obr´azek A.6: Dialog pro konfiguraci ovl´ad´an´ı
Obr´azek A.7: Dialog pro zobrazen´ı z´aznam˚ u
38