Vous êtes sur la page 1sur 292

Tytu oryginau: Programming Your Home: Automate with Arduino, Android, and Your Computer

Tumaczenie: Mikoaj Szczepaniak

ISBN: 978-83-246-5678-3

Helion 2013.
All rights reserved.

Copyright 2012 The Pragmatic Programmers, LLC.


All rights reserved.

No part of this publication may be reproduced, stored in a retrieval system, or transmitted,


in any form, or by any means, electronic, mechanical, photocopying, recording, or otherwise,
without the prior consent of the publisher.

Many of the designations used by manufacturers and sellers to distinguish their products
are claimed as trademarks. Where those designations appear in this book, and The Pragmatic
Programmers, LLC was aware of a trademark claim, the designations have been printed in initial
capital letters or in all capitals. The Pragmatic Starter Kit, The Pragmatic Programmer, Pragmatic
Programming, Pragmatic Bookshelf, PragProg and the linking g device are trademarks of The
Pragmatic Programmers, LLC.

Wszelkie prawa zastrzeone. Nieautoryzowane rozpowszechnianie caoci lub fragmentu


niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metod kserograficzn,
fotograficzn, a take kopiowanie ksiki na noniku filmowym, magnetycznym lub innym powoduje
naruszenie praw autorskich niniejszej publikacji.

Wszystkie znaki wystpujce w tekcie s zastrzeonymi znakami firmowymi bd towarowymi


ich wacicieli.

Wydawnictwo HELION dooyo wszelkich stara, by zawarte w tej ksice informacje byy
kompletne i rzetelne. Nie bierze jednak adnej odpowiedzialnoci ani za ich wykorzystanie,
ani za zwizane z tym ewentualne naruszenie praw patentowych lub autorskich. Wydawnictwo
HELION nie ponosi rwnie adnej odpowiedzialnoci za ewentualne szkody wynike
z wykorzystania informacji zawartych w ksice.

Wydawnictwo HELION
ul. Kociuszki 1c, 44-100 GLIWICE
tel. 32 231 22 19, 32 230 98 63
e-mail: helion@helion.pl
WWW: http://helion.pl (ksigarnia internetowa, katalog ksiek)

Pliki z przykadami omawianymi w ksice mona znale pod adresem:


ftp://ftp.helion.pl/przyklady/intdom.zip

Drogi Czytelniku!
Jeeli chcesz oceni t ksik, zajrzyj pod adres
http://helion.pl/user/opinie/intdom_ebook
Moesz tam wpisa swoje uwagi, spostrzeenia, recenzj.

Printed in Poland.

Pole ksik na Facebook.com Ksigarnia internetowa


Kup w wersji papierowej Lubi to! Nasza spoeczno
Oce ksik
Opinie o ksice Inteligentny dom.
Automatyzacja mieszkania za pomoc
platformy Arduino, systemu Android
i zwykego komputera
Mike ma bogate dowiadczenie w wiecie technologii i wykorzysta umie-
jtnoci z rnych dziedzin do przygotowania tych niezwykych projektw.
To niesamowite, jak atwo i tanio mona tworzy tak ciekawe rozwizania.
Radz przeczyta t ksik od deski do deski, aby nie przeoczy adnego
pomysu.
Michael Bengtson, konsultant
Moja rodzina na co dzie korzysta z wygody i bezpieczestwa oferowa-
nych przez projekt internetowego wcznika wiata; ten sam projekt po-
szerzy moj wiedz na temat komunikacji za porednictwem interfejsu
RS-232. To wspaniae, e mog sterowa owietleniem domu, nie wstajc
z ulubionego fotela. Projekt wierkajcego karmnika dla ptakw otworzy
mi oczy na zupenie nowe zastosowania komunikacji radiowej w domu
(wczeniej korzystaem tylko z technologii Wi-Fi). Projekt pozwoli mi te
znacznie skuteczniej wczy si w akcj ochrony gatunkw ptakw poszu-
kujcych pokarmu i bezpiecznych siedlisk.
Bob Cochran, specjalista IT
W tej ksice Mike Riley wykorzysta potencja mikrokontrolera Arduino
w sposb, ktry przypadnie do gustu zarwno nowicjuszom, jak i bardziej
dowiadczonym mionikom technologii automatyzacji domu.
Sven Davies, wiceprezes ds. aplikacji
Ten doskonay podrcznik powinien trafi na biurko kadego mionika
technik zrb to sam. Jestem przekonany, e tak jak inynierowie opro-
gramowania mwi o ksice o wzorcach bandy czworga, tak w przy-
szoci konstruktorzy hobbyci bd mwili o ksice o automatyzacji
domu Rileya.
Jon Kurz, prezes firmy Dycet, LLC
Kada technologia jest tyle warta, ile warte s rozwizania tworzone przy
jej uyciu. Mike zaopatrzy si w kilka tanich czci elektronicznych, pyt-
k Arduino i troch kodu rdowego, aby za pomoc tych prostych kom-
ponentw sprawi, e nasze domy bd duo ciekawsze i wygodniejsze.
Precyzyjny, jasny sposb prezentacji projektw powoduje, e wszystkie
proponowane rozwizania s przydatne i sprawiaj konstruktorom mn-
stwo radoci.
Maik Schmidt, programista,
autor ksiki Arduino: A Quick-Start Guide
Jeszcze nigdy nie bawiem si rwnie dobrze podczas poznawania nowych
jzykw, systemw i gadetw jak podczas lektury tej ksiki!
James Schultz, programista
Automatyzacja domu to wietna zabawa, a ksika Inteligentny dom Mikea
Rileya pozwoli kademu od razu zacz przygod z odpowiednimi tech-
nologiami. Dziki tej ksice i atwo dostpnym (za darmo lub za niewy-
growane kwoty) urzdzeniom sprztowym i programom praktycznie ka-
dy moe realizowa te wietne projekty.
Tony Williamitis, starszy inynier systemw wbudowanych
To wspaniae przeycie przekona si, jak urzdzenia elektroniczne mog
oddziaywa na otaczajcy nas wiat (poczwszy od naszego wasnego
domu)!
John Winans, starszy architekt oprogramowania
Ksik dedykuj Billowi, Eileen i Josie.
Spis treci

Podzikowania .................................................................................... 13

Sowo wstpne .................................................................................... 15


Kto powinien przeczyta t ksik ................................................................... 16
Co znajduje si w tej ksice ............................................................................. 16
Arduino, Android, iPhone mj Boe! .......................................................... 17
Przykady kodu i stosowane konwencje ............................................................. 20
Zasoby dostpne w internecie .......................................................................... 21

Cz I. Przygotowania ............................................23
Rozdzia 1. Pierwsze kroki ................................................................. 25
1.1. Czym jest automatyzacja domu? ................................................................ 25
1.2. Gotowe rozwizania dostpne na rynku ..................................................... 26
1.3. Rozwizania typu zrb to sam ............................................................... 27
1.4. Uzasadnienie inwestycji ............................................................................ 28
1.5. Przygotowywanie warsztatu ....................................................................... 30
1.6. Zapisywanie pomysw w formie szkicw ................................................... 31
1.7. Zapisywanie, czenie i testowanie ............................................................ 33
1.8. Dokumentowanie pracy ............................................................................ 34
8  Inteligentny dom

Rozdzia 2. Potrzebne elementy ........................................................ 37


2.1. Znajomo sprztu ................................................................................... 38
2.2. Znajomo oprogramowania ..................................................................... 45
2.3. Bezpiecznej zabawy! ................................................................................. 46

Cz II. Projekty ......................................................49


Rozdzia 3. System powiadamiania o poziomie wody .................... 51
3.1. Czego potrzebujemy ................................................................................. 53
3.2. Budowa rozwizania ................................................................................ 55
3.3. czenie .................................................................................................. 55
3.4. Tworzenie szkicu ...................................................................................... 56
3.5. Implementacja aplikacji internetowej wysyajcej poczt elektroniczn .......... 64
3.6. Dodanie moduu sieciowego ...................................................................... 67
3.7. czenie wszystkich elementw ................................................................. 71
3.8. Nastpne kroki ......................................................................................... 73

Rozdzia 4. Elektryczny pies strujcy .......................................... 77


4.1. Czego potrzebujemy ................................................................................. 78
4.2. Budowa rozwizania ................................................................................ 80
4.3. System elektronicznego psa strujcego .................................................... 82
4.4. Szkolenie psa ........................................................................................... 85
4.5. Testowanie .............................................................................................. 89
4.6. Spuszczamy psa ....................................................................................... 90
4.7. Nastpne kroki ......................................................................................... 91

Rozdzia 5. wierkajcy karmnik dla ptakw ................................. 93


5.1. Czego potrzebujemy ................................................................................. 95
5.2. Budowa rozwizania ................................................................................ 98
5.3. Czujnik grzdy ......................................................................................... 98
5.4. Czujnik ziarna ........................................................................................ 102
5.5. Komunikacja bezprzewodowa ................................................................. 106
5.6. wierkanie w Pythonie ........................................................................... 113
5.7. Koczenie projektu ................................................................................. 121
5.8. Nastpne kroki ....................................................................................... 123
Spis treci  9

Rozdzia 6. Wykrywacz dostarczania paczek ................................ 125


6.1. Czego potrzebujemy ............................................................................... 127
6.2. Budowa rozwizania .............................................................................. 128
6.3. czenie sprztu .................................................................................... 129
6.4. Pisanie kodu .......................................................................................... 131
6.5. Szkic systemu wykrywania dostarczonych paczek ...................................... 132
6.6. Testowanie szkicu wykrywajcego dostarczanie paczek ............................. 133
6.7. Skrypt przetwarzajcy komunikaty o przesykach ...................................... 134
6.8. Tworzenie bazy danych systemu wykrywania przesyek ............................. 135
6.9. Instalacja niezbdnych pakietw Pythona ................................................. 137
6.10. Pisanie skryptu ...................................................................................... 139
6.11. Testowanie skryptu przetwarzajcego komunikaty o paczkach ................... 144
6.12. Instalacja systemu .................................................................................. 145
6.13. Nastpne kroki ...................................................................................... 146

Rozdzia 7. Internetowy wcznik wiata .................................... 149


7.1. Czego potrzebujemy ............................................................................... 150
7.2. Budowa rozwizania .............................................................................. 153
7.3. czenie ................................................................................................ 154
7.4. Pisanie kodu klienta w formie aplikacji internetowej .................................. 158
7.5. Testowanie klienta aplikacji internetowej .................................................. 161
7.6. Pisanie kodu klienta dla systemu Android ................................................ 162
7.7. Testowanie aplikacji klienckiej dla systemu Android ................................. 167
7.8. Nastpne kroki ....................................................................................... 169

Rozdzia 8. Automatyzacja dziaania zasony ............................... 173


8.1. Czego potrzebujemy ............................................................................... 174
8.2. Budowa rozwizania .............................................................................. 177
8.3. Stosowanie silnika krokowego .................................................................. 178
8.4. Programowanie silnika krokowego ........................................................... 179
8.5. Doczanie czujnikw ............................................................................. 181
8.6. Pisanie szkicu ........................................................................................ 182
8.7. Instalacja sprztu .................................................................................... 187
8.8. Nastpne kroki ....................................................................................... 190
10  Inteligentny dom

Rozdzia 9. Zamek do drzwi sterowany przez Androida .............. 193


9.1. Czego potrzebujemy ............................................................................... 194
9.2. Budowa rozwizania .............................................................................. 197
9.3. Sterowanie zamkiem z poziomu Androida ............................................... 202
9.4. Pisanie kodu serwera dla systemu Android .............................................. 207
9.5. Pisanie aplikacji klienckiej dla systemu Android ....................................... 220
9.6. Testy i instalacja .................................................................................... 225
9.7. Nastpne kroki ....................................................................................... 226

Rozdzia 10. Dajmy przemwi naszemu domowi ........................ 229


10.1. Czego potrzebujemy .............................................................................. 230
10.2. Konfiguracja gonikw .......................................................................... 231
10.3. Wsuchajmy si w gos systemu ............................................................... 234
10.4. Kalibracja mikrofonu bezprzewodowego ................................................. 238
10.5. Programowanie mwicego systemu ........................................................ 240
10.6. Rozmowa z wasnym domem ................................................................. 249
10.7. Nastpne kroki ...................................................................................... 250

Cz III. Przewidywana przyszo ....................253


Rozdzia 11. Przysze projekty ......................................................... 255
11.1. Przyszo na wycignicie rki ............................................................... 256
11.2. Prognoza dugoterminowa ...................................................................... 260
11.3. Dom przyszoci .................................................................................... 262

Rozdzia 12. Wicej pomysw na projekty ................................... 267


12.1. Wykrywacz baaganu ............................................................................. 267
12.2. Monitor zuycia energii elektrycznej ........................................................ 268
12.3. Elektryczny strach na wrble .................................................................. 269
12.4. Pilot systemu domowej rozrywki ............................................................. 269
12.5. Wycznik urzdze domowych na czas snu ............................................ 270
12.6. Sterowanie nawadnianiem za pomoc czujnika wilgotnoci ....................... 270
12.7. Czujniki dymu przystosowane do komunikacji sieciowej ........................... 271
12.8. Zblieniowy mechanizm otwierania bramy garaowej ............................... 272
12.9. Inteligentny sterownik klimatyzacji i wentylacji ......................................... 272
Spis treci  11

12.10. Inteligentna skrzynka na listy ............................................................... 273


12.11. Inteligentne owietlenie ....................................................................... 273
12.12. Monitorowanie rde energii
zasilanych promieniami sonecznymi i wiatrem ..................................... 273

Dodatki ....................................................................275
Dodatek A. Instalacja bibliotek platformy Arduino .................... 277
A.1.1. System Apple OS X ......................................................................... 277
A.1.2. System Linux ..................................................................................... 278
A.1.3. System Windows ................................................................................ 278

Dodatek B. Bibliografia .................................................................... 281

Skorowidz .......................................................................................... 283


12  Inteligentny dom
Podzikowania

O
dkd pamitam, uwielbiam majsterkowa. Doskonale pamitam, jak
rozoyem na najdrobniejsze elementy zepsuty magnetofon mojego
ojca te pierwsze dowiadczenia nauczyy mnie szacunku dla
technologii stosowanej do produkcji tego i podobnych urzdze. Od tamtego
czasu zestawy maego konstruktora, kolejki elektryczne i programowalne
kalkulatory zostay zastpione przez komputery osobiste, urzdzenia mobilne
i mikrokontrolery. Przez lata z pasj poznawaem nie tylko zasady dziaa-
nia czci elektronicznych, ale take techniki ich czenia w celu budowy
zaskakujcych rozwiza, ktre nierzadko daway mi mnstwo satysfakcji
i napaway mnie dum. Wanie dlatego pisanie tej ksiki sprawio mi
tyle radoci.
Jednym z najwaniejszych celw tej ksiki (obok wietnej zabawy) jest
pomaganie innym w dostrzeganiu potencjau drzemicego w pozornie po-
spolitych konstrukcjach i mechanizmach rzeczach, ktre po zastosowa-
niu przemylanej technologii mog uatwi nam ycie. Mimo to powstanie
tej ksiki nie byoby moliwe bez wsparcia osb, ktre pomogy mi wy-
bra i waciwie zaprezentowa najciekawsze pomysy. Jestem winien tym
osobom ogromn wdziczno za wsparcie podczas prac nad t ksik.
Wielkie podzikowania nale si redaktor tej ksiki, Jackie Carter, ktra
spdzia dugie godziny na poprawianiu mojego tekstu, aby cay materia
by dostatecznie jasny i precyzyjny. Korektorka jzykowa, Molly McBeath,
dokonywaa cudw, znajdujc dobrze ukryte (przynajmniej z mojej per-
spektywy) literwki i bdy gramatyczne. Jestem te winien podzikowania
14  Inteligentny dom

Susannah Pfalzer za jej zaraliwy entuzjazm i niespotykane zdolnoci moty-


wacyjne. Dzikuj take Maikowi Schmidtowi, ktry jest ekspertem w dzie-
dzinie platformy Arduino, moim koleg i autorem zatrudnionym w tym
samym wydawnictwie. To jego wczeniejsze sukcesy utoroway drog dla tej
ksiki.
Dzikuj take Johnowi Winansowi, technologicznemu geniuszowi, ktry
udoskonali kod maszyny stanw uywany w wielu projektach. Na moj
wdziczno zasuyy take nastpujce osoby za pomoc w dopracowywa-
niu technicznych aspektw tej ksiki i prac na rzecz doprowadzenia tego
zadania do szczliwego koca: Sven Davies, Mike Bengtson, Jon Bearscove,
Kevin Gisi, Michael Hunter, Jerry Kuch, Preston Patton i Tony Williamitis.
Dzikuj take Jonowi Eriksonowi i Jonowi Kurzowi za ich entuzjazm i sku-
teczne zachty do prac nad t ksik. Chciabym te wyrazi wdziczno
Bobowi Cochranowi i Jimowi Schultzowi za bezcenn pomoc podczas prac
nad wczesnymi wersjami tej ksiki. Dzikuj te Philipowi Aabergowi za
stworzenie muzyki, przy ktrej kada praca jest przyjemnoci. Jestem te
wdziczny twrcom i uczestnikom projektw Arduino i Fritzing to
dziki nim wiat zmienia si na lepsze.
Najwiksze podzikowania nale si jednak mojej onie, Marinette, i caej
rodzinie za akceptacj i wsparcie w czasie, gdy niemal nie wychodziem ze
swojego pokoju podczas prac nad t ksik. Nie potrafi wyrazi swojej
wdzicznoci take dla crki, ktra przygotowaa doskonae ilustracje do
tej ksiki. Jestem z Ciebie taki dumy, Marielle!
I wreszcie jestem szczerze wdziczny Daveowi Thomasowi i Andyemu
Huntowi za ich pasj i wizj. Jestecie doskonali.

Mike Riley
Adres e-mail: mike@mikeriley.com
Naperville, grudzie 2011
Sowo wstpne

W
itam we wspaniaym wiecie automatyzacji domu, w ktrym wszyst-
ko jest moliwe! Kady, kto kiedykolwiek marzy o domu, ktry
bdzie oferowa co wicej ni schronienie przed zjawiskami
pogodowymi i ktry udostpni domownikom nowoczesne rozwizania cyfro-
we, znajdzie w tej ksice wskazwki, jak stworzy odpowiednie mechanizmy.
Dziki opisanym tutaj atwym w budowie projektom czytelnik opanuje umie-
jtnoci potrzebne do planowania i realizacji wasnych niepowtarzalnych
projektw automatyzacji domu.
Gwnym celem tej ksiki jest zainteresowanie czytelnika metodami auto-
matyzacji domu i wskazanie ogromnego potencjau drzemicego w prostych
i niedrogich urzdzeniach. Chciabym te, aby kady nabra pewnoci siebie
i wiary we wasne umiejtnoci, aby w przyszoci realizowa wasne pomysy.
Opisane projekty mog te by doskonaym sposobem spdzania czasu
z dziemi, a gotowe rozwizania z pewnoci bd powodem do dumy dla
naszych maych konstruktorw. Kto wie? By moe nasze dziea automa-
tyzujce funkcjonowanie domu zmieni wiat i bd zacztkiem jakiego
wielkiego biznesu (jeli na przykad ludzie zainteresuj si naszym oszcz-
dzajcym czas i pienidze rozwizaniem).
16  Inteligentny dom

Kto powinien przeczyta t ksik


Ksika Inteligentny dom jest przeznaczona przede wszystkim dla konstrukto-
rw, programistw i majsterkowiczw, ktrzy lubi spdza wolny czas na
budowie nowoczesnych rozwiza automatyzujcych pewne czynnoci i ro-
bicych wraenie na znajomych i przyjacioach. Ksika jest adresowana
przede wszystkim do osb zainteresowanych tworzeniem niestandardowych
technologii i rozwiza elektronicznych na wasne potrzeby.
Podczas realizacji projektw opisanych w tej ksice sporym uatwieniem
bdzie podstawowa znajomo platformy Arduino i takich jzykw pro-
gramowania jak Ruby czy Python, jednak znajomo tych technologii nie
jest wymagana. W ksice pokazano, jak czy te technologie w ramach
niepowtarzalnych konfiguracji eliminujcych konieczno wielokrotnego
powtarzania uciliwych czynnoci lub zwikszajcych efektywno zarz-
dzania domem.
Oprcz skryptw jzyka Python i usug sieciowych na bazie frameworku
Ruby on Rails w wielu projektach opisanych w tej ksice wykorzystano
platform Android firmy Google do gromadzenia danych o zdarzeniach,
wizualizacji informacji i generowania pewnych dziaa. Znajomo pod-
staw pakietu Android SDK jest o tyle wana, e projekty implementowa-
ne z myl o systemie operacyjnym Android mona uruchamia na popu-
larnych smartfonach.
Dla osb, ktre wol co wasnorcznie zbudowa zamiast kupi gotowe
rozwizanie, ta ksika bdzie dodatkow motywacj do wykorzystania uzy-
skanej wiedzy jako punktu wyjcia dla dalszych prac nad doskonaleniem
i optymalizacj rozwiza we wasnym domu. Mimo e cz projektw wy-
maga czenia wielu programw i rozwiza sprztowych, budowa propono-
wanych mechanizmw nie powinna sprawi nikomu problemw ani wyma-
ga duych nakadw finansowych. Najwaniejszym zadaniem tych projektw
jest jednak pokazanie, e kilka prostych pomysw pozwala przeksztaci sta-
tyczne, analogowe rodowisko w inteligentny, cyfrowy dom i e budowa
tych rozwiza moe by wietn zabaw.

Co znajduje si w tej ksice


Po wprowadzeniu podstawowych zagadnie zwizanych z automatyza-
cj domu i omwieniu dostpnych narzdzi skoncentrujemy si w ksice
na sposobach konstruowania i programowania omiu niepowtarzalnych
Sowo wstpne  17

projektw, ktre zwiksz wygod mieszkacw i umoliwi bardziej efek-


tywne spdzanie wolnego czasu. Kady projekt wymaga uycia niedrogich
czujnikw, urzdze wykonawczych i mikrokontrolerw, a kade z tych urz-
dze cechuje si wasnymi niepowtarzalnymi funkcjami. Bdziemy czy
urzdzenia sprztowe i tworzy oprogramowanie odpowiedzialne za wiele
rnych funkcji, jak wczanie i wyczanie przecznikw za porednictwem
telefonu, wykrywanie dostarczonych paczek i wysyanie powiadomie w for-
mie wiadomoci poczty elektronicznej, publikowanie na Twitterze wpisw
informujcych o koniecznoci dosypania ziarna w karmniku dla ptakw oraz
podnoszenie i opuszczanie zason w zalenoci od natenia wiata i tempe-
ratury w pokoju.
Poniewa zbir polecanych umiejtnoci, ktre bd przydatne podczas
realizacji tych projektw, obejmuje midzy innymi programowanie, w tej
ksice mona znale wiele odwoa do opublikowanych wczeniej naka-
dem wydawnictwa Pragmatic Bookshelf tytuw. Czytelnikw zainteresowa-
nych opanowaniem umiejtnoci programowania platformy Arduino bd
pisania skryptw jzykw Ruby lub Python gorco zachcam do lektury ksi-
ek wymienionych w dodatku B zatytuowanym Bibliografia.
Kady projekt rozpoczyna si od oglnego wprowadzenia, po ktrym nast-
puje podrozdzia Czego potrzebujemy zawierajcy list potrzebnych urz-
dze. Nastpny podrozdzia (zatytuowany Budowa rozwizania) za-
wiera szczegowy opis sposobu czenia elementw sprztowych projektu.
W zdecydowanej wikszoci projektw (cho nie we wszystkich) opisanych
w ksice Inteligentny dom bdziemy si posugiwali platform Arduino. Po
skonstruowaniu i poczeniu urzdze sprztowych moemy zaprogramowa
nowy system tak, aby podejmowa automatyczne dziaania. Bdziemy stoso-
wali bardzo rne programy od kodu dla kontrolerw Arduino po
skrypty wykonywane na komputerach w celu sterowania urzdzeniami oraz
gromadzenia i przetwarzania danych przesyanych przez elementy sprztowe.
W ostatnich dwch rozdziaach tej ksiki zawarem wasne prognozy roz-
woju automatyzacji domu oraz dodatkowe pomysy na wykorzystanie sprztu
i oprogramowania uytego we waciwych omiu projektach.

Arduino, Android, iPhone mj Boe!


Byskawiczny wzrost popularnoci urzdze mobilnych spowodowa, e
w sowniku technologicznym na stae zagoci termin era post-PC.
Jestem wielkim zwolennikiem postpu i zmian technologicznych, ale te
18  Inteligentny dom

yj dostatecznie dugo (przeyem trzy wielkie rewolucje polegajce odpo-


wiednio na popularyzacji komputerw PC, pojawieniu si internetu i przej-
ciu od komputerw PC do urzdze mobilnych), by stwierdzi, e zmiany
nie nastpuj tak szybko, jak si o nich mwi. Dopki aplikacji mobilnych nie
bdzie mona tworzy na samych urzdzeniach mobilnych (tak jak teraz
s tworzone aplikacje dla komputerw PC na komputerach z systemem Li-
nux, Windows czy Mac), komputer pozostanie najwaniejszym narzdziem
w pracy programistw aplikacji mobilnych. To samo dotyczy programowania
platformy Arduino.
Mimo wszystkich tych zastrzee trudno nie zauway dynamicznych zmian.
Oddzia Microsoft Research by jednym z pierwszych dostawcw systemw
operacyjnych dla telefonw komrkowych, ktry opracowywa rdzenne
aplikacje mobilne bezporednio na urzdzeniach docelowych (w rodowisku
TouchStudio). Damon Kohler, inynier zatrudniony w firmie Google, opra-
cowa technologi Scripting Layer for Android (SL4A), ktra umoliwia
uytkownikom systemu Android pisanie do rozbudowanych programw
za pomoc edytora tekstu zainstalowanego w ich telefonach. Pytka IOIO
(czyt. jo-jo) firmy Sparkfun to z kolei dobry przykad pierwszych, zapewne
niedoskonaych prb budowy rozwiza, ktre w przyszoci pozwol zastpi
komputery PC.
Skoro i tak potrzebujemy komputera z systemem Mac, Linux lub Windows
do programowania platformy Arduino i aplikacji mobilnych opisanych
w tej ksice, ten sam komputer mona wykorzysta take w roli serwera dla
programw interpretujcych i przetwarzajcych dane wysyane przez urz-
dzenia mobilne. Czytelnicy dysponujcy tylko jednym komputerem, ktry
w dodatku ma posta laptopa regularnie zabieranego z domu, powinni roz-
way zakup taniego komputera z systemem Linux lub Mac do roli domowe-
go serwera. Dziki temu bdziemy dysponowali nie tylko dedykowanym ser-
werem monitorujcym aplikacje w trybie 24/7/365, ale te serwerem pamici
masowej NAS (od ang. Network Attached Storage).
Jestem oddanym wyznawc idei sprztu i oprogramowania open source. Wa-
nie dlatego wszystkie projekty opisane w tej ksice zbudowano na bazie
takich produktw. Staram si te unika nadmiernego przywizywania si
do tej czy innej technologii, producenta sprztu czy jzyka programowania.
Kod napisany na potrzeby tej ksiki mona by rwnie dobrze napisa
w jzykach C# i Perl, jednak zdecydowaem si na jzyki Ruby i Python
z uwagi na ich przenono i szerokie wsparcie open source (take ze strony
licznej spoecznoci programistw). W roli serwera i systemu wytwarzania
Sowo wstpne  19

oprogramowania mgbym wykorzysta komputer z systemem operacyjnym


Windows lub Linux, jednak wybraem system Mac, w ktrym jzyki Ruby
i Python s wstpnie instalowane oznacza to, e korzystanie z tych jzy-
kw jest moliwe bez koniecznoci instalacji, konfiguracji i rozwizywania
problemw (a wic dodatkowych nakadw czasu).
Wanie ze wzgldu na filozofi open source zdecydowaem si prezento-
wa przykady aplikacji mobilnych opracowanych wycznie dla systemu
operacyjnego Android. Mimo e sam wol urzdzenia z systemem iOS
w roli platformy mobilnej, dodatkowe nakady niezbdne do tworzenia apli-
kacji dla tego systemu stanowi niemay problem. Oprcz koniecznoci
opanowania jzyka Objective-C i wielu frameworkw oraz rcznego imple-
mentowania mechanizmw zarzdzania pamici wdraanie aplikacji sys-
temu iOS wymaga albo dostpu do odpowiednio przebudowanego urz-
dzenia, albo wykupienia rocznego konta usugi sieci programistw urz-
dze iPhone. Zupenie inaczej jest w przypadku pakietu SDK systemu
Android, gdzie wdraanie aplikacji jest darmowe i ma otwarty charakter.
Programy dla systemu Android dodatkowo oferuj wiksze moliwoci
w zakresie wielozadaniowoci ni aplikacje systemu iOS. Wymienione za-
lety oczywicie zwikszaj ryzyko dla bezpieczestwa systemu i mog pro-
wadzi do nieefektywnego uywania dostpnych zasobw. Mimo to zach-
cam czytelnikw, ktrzy z rnych wzgldw wol tworzy i uruchamia
programy na innych platformach ni Android, do przenoszenia prostych
aplikacji klienckich opisanych w tej ksice do ulubionych systemw ope-
racyjnych i do dzielenia si swoimi dzieami ze spoecznoci czytelnikw
ksiki Inteligentny dom.
Innym terminem, ktry coraz czciej pojawia si w prasie technicznej, jest
okrelenie internet rzeczy (ang. Internet of Things). To okrelenie odnosi
si do ciekawej koncepcji, zgodnie z ktr rosnca popularno mikrokon-
trolerw sprawi, e liczba niewielkich urzdze komunikujcych si po-
midzy sob za porednictwem internetu z czasem przekroczy liczb ludzi
korzystajcych z sieci. O ile w przypadku samego wysyania da opisany
warunek by moe ju teraz jest speniony, o tyle nawizywanie komunikacji
w przeciwnym kierunku (z samymi urzdzeniami) wci stwarza powane
problemy. Nie wystarczy wiedza techniczna potrzebna do skonfigurowania
dynamicznego adresu serwera DNS i bezpiecznego ustawienia przekazy-
wania portw zdarza si, e operatorzy internetu blokuj porty wycho-
dzce, aby uniemoliwi klientom instalowanie serwerw dedykowanych
na popularnych portach, jak FTP, HTTP (i HTTPS) czy SMTP.
20  Inteligentny dom

Projekty opisane w tej ksice powinny doskonale dziaa w domowej sieci


lokalnej. Okazuje si jednak, e uzyskanie wskaza czujnika poza sieci lo-
kaln nie jest takie proste. Czy mona w czasie rzeczywistym sprawdza od-
czyty termometru bez koniecznoci otwierania i przekazywania portw przez
router (nie wspominajc o potencjalnych zagroeniach dla bezpieczestwa
sieci)?
Okazuje si, e wiele firm opracowuje i intensywnie promuje platformy do-
stpne za porednictwem prostych interfejsw API usug sieciowych, ktre
pozwalaj skutecznie omija te utrudnienia. Do platform tego typu, ktre
w ostatnim czasie notuj dynamiczny wzrost popularnoci, nale midzy
innymi Pachube, Exosite i Yaler1. Konfigurowanie tych usug i korzystanie
z oferowanych rozwiza jest zadziwiajco proste. Zachcam do odwiedzenia
tych serwisw i przekonania si, jak oferowane mechanizmy przesyania
komunikatw mona wykorzysta we wasnych projektach.

Przykady kodu i stosowane konwencje


Kod opracowany na potrzeby tej ksiki skada si z programw jzyka
C/C++ dla platformy Arduino, kodu Javy dla systemu Android, skryptw
jzyka Ruby dla warstwy poredniej aplikacji internetowych oraz skryptw
Pythona dla tradycyjnych programw. Wikszo przykadw kodu zostaa
zaprezentowana w caoci (wyjtkiem s rozbudowane biblioteki zewntrzne
uywane w programach dla systemu Android i skryptach na bazie frame-
worku Ruby on Rails). W przykadach kodu we wszystkich tych jzykach
wyrniono odpowiednio elementy skadniowe, a znaczna cz kodu zostaa
dodatkowo opatrzona zarwno standardowymi komentarzami, jak i dodat-
kowymi punktami wskazujcymi najwaniejsze miejsca listingw.
Specjalne wyrnienia i dodatkowe ramki s stosowane w tej ksice spora-
dycznie, poniewa zaley mi na moliwie sprawnym i pynnym przekazywa-
niu informacji.

1
Patrz odpowiednio http://www.pachube.com, http://www.exosite.com i http://
www.yaler.org.
Sowo wstpne  21

Zasoby dostpne w internecie


Polecam serwisy internetowe powicone technikom zrb to sam, w tym
strony Makezine i Instructables2, na ktrych mona si wymienia dowiad-
czeniami z liczn spoecznoci innych hobbystw konstruktorw i maj-
sterkowiczw.
Istnieje take wiele kanaw IRC w serwisie freenode.net oraz specjalistycz-
nych forw w ramach Grup Google powiconych tym zagadnieniom. Wiele
spord tych grup koncentruje si na szczegowych aspektach projekto-
wania gadetw, automatyzacji domu i eksperymentowania ze sprztem3.
Wystarczy ju tych wstpw. Przejdmy wreszcie do budowy czego poy-
tecznego!

2
Patrz odpowiednio http://www.makezine.com i http://www.instructables.com.
3
http://groups.google.com/group/comp.home.automation/topics
22  Inteligentny dom
Cz I
Przygotowania
24  Inteligentny dom
Rozdzia 1.
Pierwsze kroki

Z
anim przystpimy do czenia sprztu i pisania kodu, warto przy-
najmniej na chwil pochyli si nad podstawami i zastanowi si, co
waciwie rozumiemy przez automatyzacj domu, jakie rozwizania
byy dostpne na rynku w przeszoci i dlaczego konstruowanie wasnych
rozwiza ma sens (teraz i w przyszoci).
Przeanalizujemy te kilka zalecanych praktyk projektowych i konstruktor-
skich, ktre bdziemy konsekwentnie stosowali podczas realizacji projek-
tw opisanych w tej ksice.
Zaczniemy od zdefiniowania, co rozumiemy przez automatyzacj domu.
W dalszej czci rozdziau omwimy kilka gotowych rozwiza dostp-
nych na rynku, po czym dokonamy krtkiego przegldu wybranych, naj-
bardziej popularnych urzdze i programw. Na kocu tego rozdziau
zaprezentuj kilka narzdzi i praktyk, ktre uatwiy mi budow projektw
na potrzeby tej ksiki oraz wielu innych projektw, ktre trudno zaliczy
do kategorii automatyzacji domu.

1.1. Czym jest automatyzacja domu?


Co dokadnie oznacza termin automatyzacja domu? Na najprostszym
poziomie automatyzacja jest produktem lub usug wzbogacajc dom
o dziaanie, komunikat lub dowolne inne zdarzenie generowane bez bez-
poredniego udziau waciciela. Przykadem urzdzenia automatyzacji
domu jest budzik. Innym przykadem jest czujnik dymu. Problem w tym, e
26  1.2. Gotowe rozwizania dostpne na rynku

wymienione urzdzenia s w peni autonomiczne i nie uywaj standardo-


wego protokou komunikacji sieciowej, zatem nie mog si ze sob komu-
nikowa w sposb zbliony do komputerw poczonych sieci.
Jednym z najstarszych przykadw automatyzacji domu by przelewowy au-
tomatyczny ekspres do kawy Mr. Coffee wprowadzony na rynek na pocztku
lat siedemdziesitych ubiegego wieku. To proste urzdzenie kuchenne
sprawio prawdziw rado moim rodzicom, ktrzy uwielbiali kaw. wia-
domo, e zaraz po przebudzeniu bd mogli sign po filiank wieo
zaparzonej kawy, bya dla nich czym wspaniaym. Kto by pomyla, e to
proste poczenie koncepcji ekspresu do kawy z budzikiem moe zmieni
wiat?
Obecnie, w dwudziestym pierwszym wieku zwyke ekspresy do kawy s
przerabiane przez majsterkowiczw, ktrzy wzbogacaj je o karty sieciowe,
czujniki temperatury i mikrokontrolery tak przebudowane urzdzenia
parz kaw we waciwym momencie i w odpowiedniej temperaturze, po
czym wysyaj wiadomo tekstow informujc waciciela o gotowym na-
poju. Skoro elektronicy hobbyci robi to od lat, zastosowanie tych tanich
elementw elektronicznych w masowo produkowanych urzdzeniach jest
tylko kwesti czasu. Okazuje si jednak, e wci nie udao si rozwiza
problemu standardowego protokou komunikacji pomidzy urzdzeniami
tego typu. Wielu producentw automatyki domowej podejmuje prby
rozwizania tego problemu i stworzenia niezbdnego protokou.

1.2. Gotowe rozwizania dostpne


na rynku
Prby standaryzacji protokow komunikacji automatycznych urzdze do-
mowych s podejmowane niemal od czasu wprowadzenia na rynek ekspresu
do kawy Mr. Coffee. Jednym z pierwszych wanych graczy w tej dziedzi-
nie bya firma X10, ktra nadal oferuje podstawowe i stosunkowo niedrogie
elementy automatyzacji domw. Rozwizania firmy X10 wykorzystuj ist-
niejce okablowanie elektryczne domu. Firma wykorzystaa prosty protok
wysyania impulsw do przekazywania komunikatw przez stacj bazow
X10 lub komputera poczonego z interfejsem komunikacyjnym X10. Tech-
nologia bya jednak naraona na problemy zwizane ze spadkiem jakoci
sygnau, obsug sum kontrolnych i potwierdzaniem otrzymywania komu-
nikatw. Co wicej, do due urzdzenia X10 i sterowanie przepywem
Rozdzia 1. Pierwsze kroki  27

prdu za pomoc przecznikw relay switch utrudniao szerokie stosowanie


tych rozwiza.
Inne firmy co prawda podejmoway prby wyznaczenia standardw komu-
nikacji urzdze domowych, jak CEBus czy Insteon, jednak adne z tych
rozwiza nie zyskao szerokiej akceptacji. Brak jednego powszechnie sto-
sowanego standardu po czci wynika z problemu jajka i kury skoro
elektronika i urzdzenia domowe s jednoczenie projektowane i wytwarzane
przez rnych producentw, trudno stwierdzi, ktra strona powinna dosto-
sowywa swoje produkty do rozwiza drugiej strony.
Ostatnio firma Google podja prb popularyzacji systemu operacyjnego
Android jako oprogramowania wbudowanego dla inteligentnych urzdze
instalowanych w caym domu. Czas pokae, czy Google osignie sukces tam,
gdzie polego wiele innych przedsibiorstw historia dotychczasowych
prb nie napawa optymizmem.
Zamiast czeka kolejne dwadziecia lat na pojawienie si nowego standardu,
ktry zrewolucjonizuje ten rynek, warto zwrci uwag na istniejce pod-
zespoy komputerowe wykorzystujce protok TCP/IP do komunikacji
z innymi komputerami. Odpowiedni sprzt kosztuje dzisiaj zaledwie uamek
tego, ile trzeba byo wyda na analogiczne rozwizania jeszcze kilka lat temu.
Skoro niezbdne komponenty sprztowe s dostpne dosownie na wyci-
gnicie rki, odpowiedzialno za rozwj tej dziedziny spada na programi-
stw, mionikw automatyki domowej i majsterkowiczw, ktrzy bd
projektowali i implementowali wasne rozwizania. Garstce szczliwcw
uda si stworzy efektywne kosztowo, atrakcyjne rozwizania, ktre pewne-
go dnia zawojuj rynek i przyczyni si do trwaej zmiany naszych domo-
wych przyzwyczaje.

1.3. Rozwizania typu zrb to sam


Producenci rozwiza z kategorii zrb to sam s obecnie bardziej aktywni
ni kiedykolwiek wczeniej. Dostpno niedrogiej elektroniki i tanich
komputerw powoduje, e ten rodzaj produktw sta si wyjtkowo atrak-
cyjny. Istniej te inne czynniki decydujce o atrakcyjnoci rozwiza tego
typu. W przeciwiestwie do opatentowanych produktw komercyjnych
projekty realizowane w tym trybie nie maj postaci tajemniczych czarnych
skrzynek. Dysponujemy kodem rdowym. Dysponujemy wiedz. Dyspo-
nujemy pomiarami, wskanikami i metodami.
28  1.4. Uzasadnienie inwestycji

Nie do, e wiemy, jak zbudowa odpowiednie rozwizania, to jeszcze po-


trafimy eliminowa usterki, naprawia te urzdzenia i konstruowa ewen-
tualne rozszerzenia. adne z gotowych rozwiza dostpnych na rynku
z natury rzeczy nie moe w peni odpowiada na nasze potrzeby. Produ-
cenci rozwiza z dziedziny automatyzacji domu staraj si tworzy uni-
wersalne produkty, ktre bd atrakcyjne dla szerszej bazy klientw. Takie
rozwizanie wyklucza jednak moliwo tworzenia niepowtarzalnych roz-
wiza w odpowiedzi na konkretne potrzeby jednego klienta. Okazuje si
jednak, e wystarczy podstawowa wiedza i dowiadczenie w realizacji
podobnych projektw, aby opanowa sztuk projektowania i budowy roz-
wiza w peni pasujcych do naszych specyficznych wymaga.
Na przykad w pierwszym projekcie opisanym w tej ksice zbudujemy
mechanizm powiadamiania dla zbiornika na wod, ktry bdzie wysya
wiadomoci poczty elektronicznej w momencie osignicia pewnego poziomu
w zbiorniku. O ile systemy dostpne na rynku oferuj alarmy dwikowe,
nie spotkaem si jeszcze (przynajmniej w lokalnym sklepie) z produktem,
ktry wysyaby podobne komunikaty za porednictwem poczty elektronicznej.
Jeli chcemy zmodyfikowa ten projekt (na przykad poprzez dodanie migaj-
cych diod LED, ktre bd dodatkowo informoway o przekroczeniu stanu
alarmowego), nie musimy kupowa nowego gotowego zestawu dostpnego
na rynku.
Zachcam do spaceru wok domu. Warto przeanalizowa nieefektywne
lub powtarzalne czynnoci, ktre doprowadzaj nas do szau (tak jak Geor-
gea Baileya niezmiennie denerwowao urwane wykoczenie porczy scho-
dw w jego domu). Zanotujmy, co mona poprawi dziki odrobinie po-
mysowoci i automatycznym rozwizaniom. Bdziesz zaskoczony liczb
pomysw, ktre w krtkim czasie przyjd Ci do gowy.

1.4. Uzasadnienie inwestycji


Bdmy szczerzy. Wydawanie dodatkowych pienidzy na czci, ktre mog,
ale nie musz prawidowo dziaa, nie jest dobr inwestycj, szczeglnie
w zestawieniu z zakupem taszych, gotowych urzdze, ktre oferuj te
same lub szersze funkcje od projektowanego systemu. Wiedza i dowiadcze-
nie zdobyte podczas samodzielnej budowy tego rozwizania, rado czerpana
z konstruowania wasnego systemu i satysfakcja odczuwana podczas obser-
wowania dziaajcego mechanizmu oczywicie take maj swoj warto.
Prby usprawiedliwienia takiej inwestycji na przykad przed on wyczulon
Rozdzia 1. Pierwsze kroki  29

na punkcie niepotrzebnych wydatkw mog by do trudne, a argumenty


zaliczane do kategorii satysfakcja mog nie wystarczy.
Podczas analizowania wszelkich nowych koncepcji projektowych warto pod-
j prb znalezienia scenariusza zapewniajcego optymalne wykorzystanie
czasu, wymagajcego moliwie niewielkich inwestycji w potrzebne urz-
dzenia i cechujcego si jak najwikszym potencjaem poznawczym. By
moe trzeba bdzie wielu eksperymentw i iteracji, zanim wybrany sprzt
i oprogramowanie zaczn dziaa zgodnie z naszym pierwotnym wyobrae-
niem. Jeli jednak nie poddamy si zbyt pochopnie, nasza wytrwao zosta-
nie wynagrodzona. Takie ograniczenia nie tylko pozwalaj wypracowa roz-
wizania niewielkim kosztem, ale te wymuszaj na konstruktorze jeszcze
wiksz kreatywno. Wanie dlatego staraem si zrealizowa wszystkie
projekty opisane w tej ksice w warunkach do ograniczonego budetu
i konsekwentnie zachcam do wykorzystywania starych czci elektronicznych
i niepotrzebnych materiaw.
Kady konstruktor powinien odrobi lekcje. Naley sprawdzi w internecie,
czy przypadkiem kto nie prbowa ju zbudowa czego podobnego. Czy
ta prba skoczya si pomylnie? Czy warto byo zainwestowa pienidze
i czas w realizacj tej koncepcji? Czy na rynku s dostpne jakie gotowe
alternatywne rozwizania?
Po stwierdzeniu, e pomys jest unikatowy, warto podj prb oszacowania
kosztw zwizanych zarwno z czasem powicanym na projekt, jak i z mate-
riaami, ktre bdziemy musieli zakupi. Musimy te uwzgldni koszt wszel-
kich narzdzi, ktre bdziemy musieli kupi w celu skonstruowania i przete-
stowania planowanego systemu. Nie naley zaniedbywa tych dodatkowych
wydatkw, szczeglnie jeli dopiero zaczynamy swoj przygod z projektami
zrb to sam. Kiedy bardziej zaangaujemy si w realizacj tego rodzaju
projektw, szybko odkryjemy, e najtasza lutownica i kawaek drutu nie
wystarczy e potrzebujemy wysokiej jakoci miernika lub nawet oscylo-
skopu. Jedn z zalet budowy wasnych rozwiza jest moliwo realizacji
projektu w miejscu zamieszkania. Kady pocztkujcy majsterkowicz szybko
poznaje innych mionikw tej formy spdzania wolnego czasu w swojej
okolicy w ten sposb zyskujemy jednoczenie kompanw do rozmowy,
znajomych, od ktrych moemy poycza przydatny sprzt, rda cennych
wskazwek i towarzyszy zachcajcych do ustawicznego rozwoju.
30  1.5. Przygotowywanie warsztatu

1.5. Przygotowywanie warsztatu


Warunkiem tworzenia dobrych produktw jest waciwe projektowanie.
Realizacja projektw w rodowisku, ktre nie bdzie u nas powodowao
frustracji, z pewnoci uatwi przestrzeganie przyjtych procedur i pozwoli
zachowa zdrowie psychiczne.
Naley pracowa w dobrze owietlonym i wentylowanym pomieszczeniu.
Spenienie tych warunkw jest szczeglnie wane podczas lutowania. Warto
otworzy okno i zainstalowa niewielki wentylator, ktry bdzie wyciga
opary na zewntrz. Jeli otwarcie okna jest niemoliwe, naley przynajmniej
uy wycigu oparw lutowniczych.
Jeli przestrze robocza na to pozwala, warto zadba o duy st, na ktrym
bdzie mona swobodnie rozoy uywane czci elektroniczne. St na-
ley oczywicie umieci blisko gniazdek elektrycznych, a na samym stole
warto umieci listw zasilajc, aby zapewni moliwie atwy dostp.
Uywane czci naley umieci w niewielkich pojemnikach, soikach, opa-
kowaniach po lekach i puszkach we wszystkim, co pomoe uporzdkowa
kondensatory, rezystory, diody LED, przewody, osony, silniki i czujniki oraz
ledzi zapasy potrzebnych czci.
Warto postawi komputer albo w bezporednim ssiedztwie tak przygoto-
wanego warsztatu, albo wrcz na stole warsztatowym. Najwygodniejszym
rozwizaniem bdzie oczywicie laptop. W przypadku komputera stacjo-
narnego naley tak rozplanowa pooenie monitora, myszy i klawiatury
(dwch ostatnich najlepiej bezprzewodowych), aby zajmoway moliwie
niewielk cz przestrzeni roboczej.
Naley konsekwentnie unika baaganu zarwno na stole, jak i pod nim
i wok niego. Porzdek nie tylko ogranicza ryzyko poaru, ale te uatwia
znajdowanie uywanych komponentw, ktre staczaj si ze stou w nie-
znane zawsze wtedy, gdy s najbardziej potrzebne.
I wreszcie naley dba o zachowanie pierwotnego charakteru przestrzeni
roboczej wyznaczone miejsce powinno suy wanie do realizacji pro-
jektu. Niektre projekty przypominaj ukadanie skomplikowanych puzzli.
Czsto potrzebujemy miejsca do przechowywania czciowo zoonych
elementw budowanego systemu i jednoczenie przestrzeni do dalszych
prac. Wanie moliwo przystpienia do pracy w kadej chwili (zamiast
kadorazowego zaczynania od wypakowywania przewodw i czci z wiel-
kiej torby) sprawia, e projekty s rdem radoci, nie frustracji.
Rozdzia 1. Pierwsze kroki  31

1.6. Zapisywanie pomysw


w formie szkicw
W przypywie inspiracji nic nie moe zastpi tradycyjnego owka i kartki
papieru, dziki ktrym mona byskawicznie utrwali nowe pomysy. Kon-
struktorzy, ktrzy wol zapisywa swoje projekty na komputerze, maj do
dyspozycji wiele darmowych narzdzi open source dostpnych dla wszystkich
platform. Sam uywam tych narzdzi do opisywania swoich pomysw
i dokumentowania zrealizowanych projektw:
Narzdzie Freemind doskonale nadaje si do organizowania pomy-
sw, celw i zalenoci1. Ta dojrzaa aplikacja do odwzorowywania
pomysw znacznie uatwia przenoszenie pomysw z gowy do kom-
putera i analizowanie zalenoci pomidzy tymi pomysami. Narz-
dzie pozwala oszczdza czas i pienidze, poniewa uatwia od-
krywanie najwaniejszych pomysw, eliminuje nadmiarowe elementy
i umoliwia nadawanie priorytetw poszczeglnym zadaniom.
Fritzing to aplikacja do rysowania diagramw, ktr zaprojektowa-
no przede wszystkim z myl o dokumentowaniu ukadw na plat-
formie Arduino2. Narzdzie nie jest jednak gotowe i wymaga jeszcze
wielu poprawek. Wiele popularnych czujnikw wci nie jest repre-
zentowanych przez odpowiednie ikony, ale biblioteka obiektw stale
ronie, a w sam projekt angauje si coraz wicej programistw. Sam
uywam tej aplikacji wycznie do dokumentowania projektw na bazie
platformy Arduino wanie dlatego schematy pocze prezen-
towane w tej ksice s generowane za pomoc narzdzia Fritzing.
Inkscape to prosty w uyciu program do rysowania grafiki wektorowej,
ktry uatwia zapisywanie w komputerze rozmaitych koncepcji (take
tych niezwizanych z platform Arduino)3. Mimo e aplikacja Inksca-
pe jest adresowana przede wszystkim do grafikw, dostpne w jej ra-
mach precyzyjne narzdzia pomiarowe wprost doskonale nadaj si do
weryfikacji wstpnych zaoe i szkicowania pomysw na realizacj
projektw.

1
http://freemind.sourceforge.net
2
http://fritzing.org/
3
http://inkscape.org
32  1.6. Zapisywanie pomysw w formie szkicw

Warto pamita o jeszcze innej opcji o tabletach i czytnikach, ktre coraz


czciej przejmuj zadania zastrzeone wczeniej dla papierowych notatek.
Nie zdziwibym si, gdyby okazao si, e take ta ksika jest teraz czytana
na tablecie iPad czy czytniku Kindle. Oprcz poszukiwania informacji ta-
blety wprost idealnie nadaj si do zapisywania pomysw i sporzdzania
wstpnych szkicw dla planowanych projektw. iPad (lub tablet z systemem
Android) ustawiony na odpowiedniej podstawie moe by uywany jako
wygodny podrcznik i notatnik. Takie urzdzenie moe suy do szkico-
wania projektw, ledzenia postpu, ustalania priorytetw i sporzdzania
notatek w trakcie prac.
Oto moje ulubione aplikacje dla iPada, ktrych uywam podczas realizacji
swoich projektw:
Elektor Electronic Toolbox to leksykon czci elektronicznych obejmuj-
cy wiele przydatnych kalkulatorw i narzdzi do konwersji jednostek4.
iCircuit to symulator ukadw elektronicznych, ktry znacznie uatwia
rozumienie i interpretacj ukadw w porwnaniu ze statycznymi
schematami drukowanymi na papierze5.
iThoughts HD to aplikacja stworzona z myl o zapisywaniu pomy-
sw projektanta. Aplikacja oferuje moliwo importowania i eks-
portowania plikw narzdzia Freemind6.
Narzdzie miniDraw to program do rysowania grafiki wektorowej,
ktr mona eksportowa w formacie SVG. Oznacza to, e schematy
rysowane w tym programie mona importowa w aplikacji Inkscape7.
Opisane aplikacje nie su tylko do projektowania i dokumentowania pro-
jektw w wielu dobrze przemylanych i prawidowo realizowanych pro-
jektach mona uywa tych aplikacji take do prowadzenia precyzyjnych
pomiarw i weryfikowania zaoe za pomoc odpowiednich testw.

4
http://www.creating-your-app.de/electronic_toolbox_features.html?&L=1
5
http://icircuitapp.com/
6
http://ithoughts.co.uk
7
http://minidraw.net/
Rozdzia 1. Pierwsze kroki  33

1.7. Zapisywanie, czenie i testowanie


Nie istnieje niestety dobry programowy emulator platformy Arduino. Oka-
zuje si jednak, e programy tworzone dla tej platformy zwykle s na tyle
proste i realizuj na tyle konkretne zadania, e cykle kompilacji, uruchamia-
nia i diagnozowania nie s zbyt dugie. Dobre techniki kodowania i testo-
wania znacznie uatwiaj budow rozwiza wysokiej jakoci. To samo
dotyczy konstruowania i czenia fizycznych systemw, w tym rozwiza
elektronicznych.
Mimo e niemal wszystkie projekty opisane w tej ksice byy konstruowa-
ne bez uycia lutownicy, warto pamita, e trwae konstrukcje wymagaj
dobrych technik lutowania, ktre zagwarantuj waciwe przewodzenie prdu.
Najlepszym rozwizaniem jest konsekwentne sprawdzanie wszystkich po-
cze (na przykad za pomoc uniwersalnych pytek montaowych) przed
trwaym zlutowaniem cze.
Warto te stosowa dobre, sprawdzone techniki testowania kodu. Nieza-
lenie od tego, czy chodzi o kod mikrokontrolera dla platformy Arduino,
czy o skrypty jzyka Ruby lub Python wykonywane na serwerze, warto
stosowa metodyk wytwarzania sterowanego testami (ang. Test-Driven
Development TDD). Istnieje wiele dobrych frameworkw testowych
i ksiek powiconych temu zagadnieniu. Polecam artyku Iana Deesa zaty-
tuowany Testing Arduino Code (wydany w numerze PragPub z kwietnia
2011 roku) oraz ksik Continuous Testing: with Ruby, Rails, and
JavaScript [RC11]8.
Podczas pisania skryptw jzyka Python warto przygotowywa i stosowa
testy jednostkowe (na przykad przy uyciu narzdzia py.test). Podczas
kodowania w jzyku Ruby i tworzenia internetowego interfejsu uytkownika
na bazie frameworku Rails warto rozway uycie narzdzia RSpec (wicej
informacji na temat tego narzdzia mona znale w ksice The RSpec
Book [CADH09]). Take aplikacje tworzone dla systemu Android naley
testowa za pomoc odpowiedniego frameworku9. Nawet podczas pracy
nad maymi aplikacjami stosowanie sprawdzonych metodyk testowania
znacznie uatwia podnoszenie jakoci kodu i jednoczenie pozwala zachowa
zdrowie psychiczne.

8
http://www.pragprog.com/magazines/2011-04/testing-arduino-code
9
http://developer.android.com/guide/topics/testing/testing_android.html
34  1.8. Dokumentowanie pracy

Warto opanowa umiejtno korzystania z multimetru. Podobnie jak pro-


gramowy debuger, multimetr moe by bardzo przydatny podczas prb oceny
wewntrznego dziaania budowanego systemu na przykad do znajdowa-
nia miejsca, w ktrym dochodzi do zwarcia. Oprcz wykrywania proble-
mw multimetr jest przydatny take podczas mierzenia parametrw prdu
elektrycznego. Za pomoc tego urzdzenia moemy na przykad okreli, czy
bateria soneczna dostarcza wystarczajco duo energii elektrycznej (w nie-
przerwany sposb), aby zasili siownik sterowany przez mikrokontroler.
Czytelnicy, ktrzy nie wiedz, jak uywa multimetru, mog wpisa w ulu-
bionej wyszukiwarce internetowej wyraenie voltmeter tutorial video. W inter-
necie opublikowano mnstwo filmw instruktaowych.

1.8. Dokumentowanie pracy


Rcznie rysowane bazgroy s dobrym punktem wyjcia, jednak z czasem
wiele projektw komplikuje si i wymaga uwanego zarzdzania dostpnymi
(ale ograniczonymi) zasobami oraz analizy sprztu, ktry nie dziaa zgodnie
z pierwotnymi zaoeniami. Ostateczny projekt moe si zasadniczo rni
od oryginalnego. Wanie dlatego dysponowanie precyzyjn, czyteln i zwi-
z dokumentacj na kocu projektu jest takie wane, szczeglnie jeli ta
dokumentacja ma by udostpniana innym konstruktorom.
Takie aplikacje jak Fritzing mog bardzo uatwi generowanie czytelnych,
kolorowych schematw pocze. W ten sposb mona duo lepiej udoku-
mentowa dokadn struktur projektu. Nie ma niczego gorszego od wpa-
trywania si w rozmazane, zrobione pod niewaciwym ktem zdjcia
w serwisie Flickr lub nagrania w serwisie YouTube prezentujce przewody
podczone do sabo widocznej pytki, zwaszcza jeli jest to najwaniejszy
element dokumentacji. Dokumentacja fotograficzna lub w formie nagra wi-
deo jest ciekawym uzupenieniem, jednak dobrze zaprojektowany system powi-
nien by udokumentowany take w formie czytelnych schematw pocze.
Kod rdowy powinien zawiera opisowe komentarze, nawet jeli cay
projekt skada si z prostych skryptw i szkicw. W ten sposb mona nie
tylko uatwi interpretacj poszczeglnych funkcji w kodzie przez innych
programistw czy konstruktorw dobre komentarze mog dokumentowa
stan naszej wiedzy i rozmaite koncepcje przede wszystkim dla nas samych.
A jeli dodatkowo udostpniamy swj kod w publicznych repozytoriach, jak
Github czy Sourceforge, dobre komentarze bd wiadczyy o naszym pro-
fesjonalizmie i sprawi, e zyskamy uznanie wrd innych autorw i twrcw.
Rozdzia 1. Pierwsze kroki  35

Po tych wszystkich zaleceniach chciabym podkreli, e najwiksz warto-


ci projektw opisanych w tej ksice jest rado z ich realizacji. Dowiad-
czenie zdobyte podczas prac nad tymi projektami powinno by zacht do
rozwijania proponowanych koncepcji i dostosowywania ich do niepowta-
rzalnych potrzeb i celw projektowych kadego czytelnika.
W nastpnym rozdziale omwi sprzt i oprogramowanie, ktrego bdziemy
uywali podczas realizacji projektw. Zasugeruj te optymalne konfiguracje
poszczeglnych elementw.
36  1.8. Dokumentowanie pracy
Rozdzia 2.
Potrzebne elementy

Z
anim przystpimy do waciwej realizacji projektw opisanych w tej
ksice, musimy przeanalizowa materiay i zalecane metodyki, ktre
bdziemy stosowali podczas budowy tych rozwiza.
Najwaniejsz zasad, ktr stosowaem podczas przygotowywania tej
ksiki, byo zachowanie prostoty i moliwie niewielkich kosztw w przy-
padku wszystkich prezentowanych projektw. Konstruowanie rozwiza
podobnych do konstrukcji Rubea Goldberga, kosztujcych tysice zotych
i uywanych do otwierania puszek z zup, oczywicie moe sprawi twr-
cy mnstwo radoci, jednak nieporwnanie bardziej praktycznym wyjciem
bdzie kupienie otwieracza za zaledwie kilka zotych. Robiem, co w mojej
mocy, aby najlepiej wykorzysta pienidze i czas powicany kademu pro-
jektowi. Zaledwie kilka spord tych projektw wymaga nakadw prze-
kraczajcych dwiecie zotych i zajmuje wicej ni godzin.
Dobrym rozwizaniem jest wielokrotne wykorzystywanie tych samych
elementw. Wielokrotne stosowanie gotowych rozwiza jest oczywicie
prostsze w przypadku oprogramowania, ale take wiele elementw sprz-
towych stwarza tak moliwo. Wanie dlatego tak du popularnoci
ciesz si niedrogie pytki mikrokontrolerw (na przykad Arduino), ktre
stanowi serce wielu takich projektw1. Aby jak najskuteczniej oszczdza
pienidze i ogranicza inwestycje w sprzt, warto podj prb rozpocz-
cia dwch projektw rwnoczenie, aby po pierwszych prbach (ale przed

1
http://arduino.cc/
38  2.1. Znajomo sprztu

zakupem na przykad tuzina pytek Arduino) zdecydowa, ktry z nich ma


wiksze szanse powodzenia. Po zrealizowaniu najciekawszych projektw warto
rozwija zbudowane konstrukcje, doskonali je i czy w dowolny sposb.
Czytelnikw, ktrym uda si stworzy co naprawd ciekawego, zachcam
do dzielenia si swoimi odkryciami na oficjalnym forum tej ksiki.
Wymagania wikszoci projektw polegajcych na tworzeniu oprogramo-
wania s stosunkowo niewielkie wystarczy dostp do komputera oraz
wybr jzyka programowania i frameworkw potrzebnych do dziaania
aplikacji. Jeli jednak projekt wymaga uycia sprztowych czujnikw, sil-
nikw, nadajnikw radiowych i kontrolerw, przebieg procesw projekto-
wania i konstruowania systemu jest nieco bardziej zoony. Kady projekt
skada si w istocie z dwch podstawowych skadnikw: zbioru fizycznych
elementw oraz oprogramowania, ktre interpretuje i przetwarza dane gro-
madzone przez urzdzenia sprztowe. Przeanalizujmy teraz elementy ska-
dajce si na te dwa najwaniejsze aspekty realizacji projektw.

2.1. Znajomo sprztu


Pytki Arduino, czujniki i silniki (nazywane te urzdzeniami wykonaw-
czymi ang. actuators) uywane podczas realizacji projektw mona kupi
w wielu sklepach internetowych (sam zaopatruj si w sklepach Adafruit
Industries i Sparkfun)2. Najbardziej oszczdni konstruktorzy mog zna-
le potrzebne urzdzenia na aukcjach internetowych. Kupowanie uywa-
nych czci od sprawdzonych sprzedawcw jest szczeglnie korzystne, jeli
z rnych wzgldw potrzebujemy starszych elementw platformy An-
droid lub kontrolerw X10. Kupujcy powinien jednak zachowa ostrono
czas na sprawdzenie kupionego urzdzenia od momentu jego zakupu
i dostarczenia jest krtki i zwykle obejmuje zaledwie kilka dni. Okazuje si,
e niektre firmy (na przykad Adafruit i Sparkfun) dbaj o swoj reputacj
`do tego stopnia, e ich dziay obsugi klienta akceptuj praktycznie wszystkie
uzasadnione dania wymiany towaru.
Kady projekt opisany w tej ksice obejmuje podrozdzia Czego potrze-
bujemy, w ktrym wymieniono komponenty sprztowe i programowe
potrzebne do budowy danego rozwizania. Znalezienie i zakupienie niezbd-
nego sprztu w internecie nie powinno stanowi najmniejszego problemu,

2
Patrz odpowiednio http://www.adafruit.com i http://www.sparkfun.com.
Rozdzia 2. Potrzebne elementy  39

a w niektrych projektach dodatkowo wykorzystano skrawki materiaw czy


popularne sprzty domowe, np. suszarki do ubra. Poniej wymieniem
wszystkie elementy elektroniczne potrzebne do realizacji projektw pre-
zentowanych w tej ksice wraz z przyblionymi cenami:
Arduino Uno, Duemilanove lub Diecimila: 80 z;
modu sieciowy (ang. Ethernet shield): 110 z;
modu dwikowy (ang. wave shield) z gonikiem, przewodem i kart
SD: 100 z;
pasywny czujnik ruchu na podczerwie (PIR): 40 z;
czujnik ugicia: 50 z;
rezystancyjny czujnik siy nacisku: 40 z;
analogowy czujnik temperatury TMP36: 5 z;
fotorezystor CdS (powszechnie znany jako fotokomrka): 2 z;
standardowy serwomotor (silnik wykonawczy): 50 z;
rygiel elektryczny zasilany prdem staym 12 V firmy Smarthome:
120 z;
dwa moduy XBee z adapterami: 230 z;
przejciwka FTDI: 50 z;
adowarka soneczna z wbudowanym akumulatorem: 100 z;
interfejs szeregowy X10 CM11A firmy ActiveHome: 150 z;
standardowy przecznik cienny X10 PLW01: 40 z;
konwerter port szeregowy USB: 50 z;
komputer domowy (najlepiej z systemem Linux lub Mac): od 700 do
7000 z w zalenoci od modelu;
bezprzewodowy gonik Bluetooth: 250 z;
telefon G1 z systemem Android: od 120 do 400 z (w zalenoci od
stanu);
smartfon z systemem Android: od 50 do 600 z w zalenoci od
funkcji telefonu i rodzaju umowy;
pyta Sparkfun IOIO ze zczem JST, zcze barrel jack-JST (2-pin)
oraz zasilacz prdu staego 5 V: 180 z;
przewd z msk kocwk USB i msk kocwk mini-USB:
10 z;
przewd z esk kocwk barrel jack 2.1 mm: 10 z;
40  2.1. Znajomo sprztu

szpula przewodu (22 AWG powinien wystarczy): 10 z;


rezystor 10 k: 0,50 z;
rezystor 10 M: 0,50 z;
maa uniwersalna pytka montaowa: 15 z;
tama izolacyjna lub w termokurczliwy: 15 z;
9-woltowy zasilacz prdu staego: 15 z;
12-woltowy zasilacz impulsowy 5A: 75 z;
PowerSwitch Tail II z rezystorem 1 k oraz tranzystor NPN 4222 A:
60 z;
silnik krokowy: 45 z.
Kady z tych elementw moe by wielokrotnie stosowany we wszystkich
projektach opisanych w tej ksice. Jeli efekt ktrego z tych projektw
zostanie trwale zainstalowany w domu konstruktora, trzeba bdzie uzu-
peni zapas czci uytych do budowy tego systemu. Realizacja projektw
z kategorii zrb to sam (ang. do it yourself DIY) jest, podobnie jak
pisanie kodu, zajciem dajcym mnstwo satysfakcji i silnie uzaleniajcym.
Musimy si liczy ze wzrostem wydatkw na czci elektryczne wraz z rosn-
cym zaufaniem we wasne moliwoci.
Spord wszystkich elementw uywanych w tej ksice trzy produkty bd
wspominane szczeglnie czsto: smartfony z systemem Android, platforma
Arduino oraz radia XBee. Wszystkie te elementy zostan krtko omwione
w poniszych punktach. Czytelnikw zainteresowanych dodatkowymi zasto-
sowaniami tej przydatnej elektroniki zachcam do lektury tytuw powi-
conych systemowi Android, platformie Arduino i moduom XBee, ktre
wymieniem w dodatku B. Zaproponowane tam ksiki zawieraj mn-
stwo informacji na temat tych niezwykych, stale ewoluujcych technologii.

Programowanie dla systemu Android


System operacyjny Android utrzymuje gwatowny wzrost popularnoci
(a w niektrych przypadkach wrcz dominacji) na rynkach telekomunika-
cyjnych i systemw wbudowanych. Firma Google ogosia te rozpoczcie
projektu Android@Home i zacza zachca programistw i producen-
tw elektroniki konsumenckiej do rozwaenia opcji stosowania systemu
Android jako technologii bazowej dla systemw inteligentnych domw.
Wielu producentw elektroniki wprowadza na rynek urzdzenia zgodne
Rozdzia 2. Potrzebne elementy  41

z pakietem Android Open Accessory Development Kit (ADK) i wyko-


rzystujce interfejsy zaprojektowane przez firm Google3.
Na potrzeby tej ksiki wybraem pytk IOIO firmy Sparkfun do roli
pytki zgodnej z ADK. W czasie kiedy ta ksika trafiaa do druku, ob-
suga standardu ADK przez pytk IOIO wci znajdowaa si w fazie beta,
a adowanie oprogramowania z obsug tego standardu byo do kopotliwe.
W rozdziale 9. zatytuowanym Zamek do drzwi sterowany przez An-
droida zostanie omwione alternatywne rozwizanie projekt korzy-
stajcy z tradycyjnych wywoa pakietu SDK systemu Android i niestan-
dardowej biblioteki sprztowej obsugiwanej obecnie przez pytk IOIO.
Malejce koszty sprztu potrzebnego do budowy oprogramowania na bazie
pakietu ADK stwarzaj programistom i producentom nowe moliwoci, ktre
wczeniej byy nieosigalne ekonomicznie. Na razie uywany telefon z syste-
mem Android pierwszej generacji poczony z pytk IOIO wci oferuje
wiksze moliwoci i jest nieporwnanie taszy ni platforma ADK oferujca
podobne funkcje (aparat, GPS, Bluetooth, Wi-Fi), na przykad w formie
smartfonu. Do czasu, a urzdzenia zgodne ze standardem ADK staniej
i zyskaj na popularnoci, zdobdziemy ogromn przewag nad konkurencj
opanujemy ekosystem wytwarzania aplikacji dla systemu Android.
Niektre projekty tworzone dla systemu Android wymagaj budowy za-
rwno klienta dziaajcego w tym systemie, jak i aplikacji serwera. Mimo
e aplikacje klienckie mona pisa we frameworkach aplikacji internetowych
niezalenych od urzdze, jak jQuery Mobile4, warto rozumie i mie na
uwadze warto aplikacji natywnych. Budowa oprogramowania od pocztku
na bazie natywnych mechanizmw w przyszoci znacznie uatwi korzy-
stanie z zaawansowanych funkcji telefonu (cz tych funkcji jest niedo-
stpna dla interfejsu standardowych aplikacji internetowych). Co wicej,
aplikacje natywne zwykle s szybciej adowane i szybciej reaguj na pole-
cenie ni ich odpowiedniki dziaajce w przegldarkach internetowych.
Mimo e wczeniejsze dowiadczenie w tworzeniu aplikacji dla systemu
Android nie jest niezbdne do budowy programw na potrzeby przykadw
z tej ksiki, znajomo pakietu Android SDK z pewnoci bdzie sporym
uatwieniem5.

3
http://developer.android.com/guide/topics/usb/adk.html
4
http://jquerymobile.com/
5
http://developer.android.com/sdk
42  2.1. Znajomo sprztu

Programowanie platformy Arduino


Czytelnicy, ktrzy programowali wczeniej w jzyku C lub C++, poczuj si
jak w domu, piszc kod dla mikrokontrolera ATMega 168/328 platformy
Arduino. Pisanie programw dla platformy Arduino (okrelanych mianem
szkicw ang. sketch) jest do proste, jeli tylko opanujemy podstawow
struktur tych aplikacji.
Przeanalizujmy teraz podstawow struktur szkicu platformy Arduino. Po-
dobnie jak programy jzyka C, szkice tej platformy rozpoczynaj si od wyra-
e #include importujcych niezbdne biblioteki kodu. Po tych wyraeniach
nastpuj konstrukcje inicjalizujce zmienne i obiekty globalne, ktre zwy-
kle s uywane w ciele funkcji setup() danego szkicu. Funkcja setup()
zwykle jest uywana do odwoywania si do fizycznych punktw pocze
(nazywanych wtykami ang. pin) oraz do przypisywania wartoci zmien-
nym globalnym zdefiniowanym w sekcji inicjalizacji. Przykadem takiego
przypisania moe by wyraenie int onboard_led = 13; zdefiniowane przed
funkcj setup(). W ten sposb instruujemy platform Arduino, e ma uy
wtyku nr 13 (miejsca instalacji diody LED), tak aby by dostpny w ko-
dzie szkicu. Wtyk mona nastpnie przypisa w ciele funkcji setup() za
pomoc nastpujcego wiersza: pinMode(onboard_led, OUTPUT).
Po przetworzeniu wyrae przypisujcych wartoci zmiennym i zakoczeniu
inicjalizacji programu przez setup() szkic rozpoczyna wykonywanie gw-
nej funkcji loop(). Ciao tej funkcji jest wykonywane w nieskoczono.
To tutaj szkic czeka na wystpienie okrelonego zdarzenia lub wielokrot-
nie wykonuje zdefiniowan czynno. Do omawiania tej struktury oraz
procesu pisania, kompilowania i uruchamiania programw platformy Ar-
duino wrcimy przy okazji analizy pierwszego projektu systemu po-
wiadamiania o poziomie wody.
Do pisania szkicw mona uywa dowolnego edytora tekstu. Najwiksze
uznanie wrd programistw zyskao darmowe, zintegrowane rodowisko
wytwarzania Arduino Integrated Development Environment (IDE) do-
stpne na stronie internetowej platformy Arduino. To napisane w Javie
rodowisko programowania oferuje wszystkie elementy potrzebne do kom-
pilowania szkicw na rozkazy maszynowe mikrokontrolera ATMega. Do
rodowiska s doczone dziesitki przykadowych szkicw, ktre uatwiaj
szybkie opanowanie skadni i dobrze ilustruj bogactwo czujnikw i silnikw
obsugiwanych na platformie Arduino. Opisane rodowisko programowa-
nia napisano w Javie, zatem dziaa identycznie na komputerach z systemami
Windows, Mac i Linux.
Rozdzia 2. Potrzebne elementy  43

Ja pyta...
Czy rodowisko Arduino IDE zawiera wirtualny
emulator?
Inaczej ni w przypadku wikszoci rodowisk wytwarzania aplikacji
dla komputerw i urzdze mobilnych, nie istnieje oficjalny emulator
platformy Arduino. Symulowanie dziaania wielu rnych fizycznych
czujnikw i silnikw obsugiwanych przez platform Arduino byoby
bardzo trudne. Wielu niezalenych producentw i programistw
prbowao stworzy takie narzdzie, jednak wszystkie te rozwizania
albo dziaaj w wybranych systemach operacyjnych, albo emuluj
ukad ATMega zamiast caej platformy Arduino. Uytkownicy sys-
temu operacyjnego Windows maj do wyboru emulatory Virtual
Breadboard i Emulare6 polecam zwaszcza program Virtual Bread-
board z uwagi na jego wirtualn reprezentacj sprztowej platformy
Arduino. rodowisko Virtual Breadboard dodatkowo udostpnia
ograniczony zbir emulowanych czujnikw i innych urzdze, ktre
mona czy na ekranie z wirtualn reprezentacj pytki Arduino.
Zwaywszy na do niski koszt samej platformy Arduino, niewielu
konstruktorw uywa emulatora do innych zada ni testy jednost-
kowe lub jako wygodnej, przenonej reprezentacji platformy sprz-
towej. Zamiast traci czas na eksperymenty z emulatorami lepiej wy-
da pienidze na waciw platform sprztow. Szkice s krtkie,
a okno danych szeregowych rodowiska Arduino IDE jest na tyle wy-
godne i pomocne, e mona na tej podstawie bez trudu diagnozo-
wa i doskonali kod wykonywany na prawdziwym sprzcie.

Programowanie moduw XBee


Inn wan technologi, ktrej bdziemy uywali w wielu projektach pre-
zentowanych w tej ksice, jest urzdzenie radiowe na bazie specyfikacji
cznoci bezprzewodowej IEEE 802.15.4 (znanej szeroko jako XBee).
Komunikacja radiowa XBee wprost idealnie nadaje si do realizacji projek-
tw bezprzewodowych na bazie platformy Arduino z uwagi na niski koszt,

6
Patrz odpowiednio http://www.virtualbreadboard.net i http://emulare.sourceforge.
net/.
44  2.1. Znajomo sprztu

niewielki pobr energii oraz prost w uyciu komunikacj za pomoc in-


terfejsu szeregowego. Moduy XBee niewielkiej mocy s uywane przede
wszystkim do komunikacji na poziomie znakw. Moduy XBee nie mog
si znajdowa w odlegoci wikszej ni 15 metrw (okoo 50 stp).
We wszystkich projektach omawianych w tej ksice, w ktrych zastosowano
komunikacj XBee XBee, uyto albo pojedynczych znakw, albo krtkich
acuchw opisujcych zmian stanu w wyniku zdarzenia wykrytego przez
czujnik. Kada taka zmiana jest nastpnie bezprzewodowo rozgaszana
w celu przekazania do drugiego modemu XBee, ktry zwykle jest poczony
z komputerem lub systemem wbudowanym odpowiedzialnym za przetworze-
nie otrzymanego sygnau. Sam preferuj rozwizanie polegajce na zapi-
sywaniu danych przed waciwym przetworzeniem, poniewa rejestrowanie
zdarze w ten sposb znacznie uatwia diagnozowanie systemu. Po zapisaniu
otrzymanych danych komputer moe przekaza sygna dalej, tumaczc go
na komunikat usugi sieciowej, wiadomo poczty elektronicznej, ruch ser-
womotoru lub dowolne inne dziaanie.
Najbardziej czasochonnymi i wymagajcymi zadaniami zwizanymi ze sto-
sowaniem moduw XBee jest waciwa instalacja sprztu i tzw. parowanie
(ang. pairing) dwch moduw. Niezbdna procedura nie jest co prawda
trywialna, ale te nie jest zbyt trudna. Na szczcie Limor Ladyada Fried,
zaoyciel firmy Adafruit Industries i jeden z najwaniejszych propagatorw
otwartych standardw inynierii elektrycznej, opracowa i udostpni na
swojej stronie internetowej wyjtkowo przydatny podrcznik, w ktrym wy-
jani krok po kroku, jak czy zestawy adapterw XBee oraz moduy ra-
diowe XBee. Wrcimy do tego zagadnienia podczas omawiania pierwszego
uycia moduw XBee (w czasie prac nad projektem systemu karmienia
wierkajcego ptaka).
Warto przy tej okazji wspomnie o firmie Digi International, ktra produkuje
urzdzenia XBee firma zapowiedziaa ostatnio wprowadzenie na rynek
urzdze zgodnych ze standardami 802.11 b/g/n (Wi-Fi), ktre nie bd
wymagay czenia drugiego urzdzenia XBee z docelowym komputerem
PC za porednictwem przewodu FTDI. Okazuje si jednak, e koszt tego
wygodnego rozwizania bdzie zauwaalnie wyszy ni koszt konfiguracji
stosowanej w tej ksice. Czytelnikw zainteresowanych wygodniejszym roz-
wizaniem zachcam do lektury strony powiconej moduom XBee Wi-Fi
w serwisie firmy Digi7.

7
http://www.digi.com/xbeewifi
Rozdzia 2. Potrzebne elementy  45

Podstawy elektroniki, programowanie platformy Arduino i budow sieci


bezprzewodowych omwiono w wielu ksikach (na przykad Building Wire-
less Sensor Networks [Fal10]) i poradnikach dostpnych w internecie. Ten
podrozdzia jest co najwyej przegldem technik niezbdnych do pracy ze
sprztem, ktrego bdziemy uywali w projektach prezentowanych w tej ksi-
ce. W nastpnym podrozdziale przeanalizujemy oprogramowanie, ktre bdzie
nam potrzebne do oywienia opisanych powyej elementw sprztowych.

2.2. Znajomo oprogramowania


Oprcz znajomoci skadni jzyka C/C++ obowizujcej podczas progra-
mowania szkicw platformy Arduino sporym uatwieniem bdzie choby
podstawowa znajomo takich jzykw programowania jak Java, Ruby czy
Python. Duym uatwieniem bdzie rwnie dowiadczenie w pracy z fra-
meworkiem Ruby on Rails. Czytelnikw, ktrzy chcieliby pogbi swoj
wiedz na ten temat, zachcam do lektury dodatku B zatytuowanego
Bibliografia, gdzie mona znale wiele doskonaych tytuw powiconych
tym jzykom i frameworkom.
Nawet czytelnicy, ktrzy nie maj zbyt duej wiedzy na temat tych jzykw, nie
powinni mie problemw z budow i uruchamianiem kodu na potrzeby pre-
zentowanych projektw (i wprowadzaniem drobnych modyfikacji niezbdnych
w przypadku komputerw z systemami Linux i Macintosh). Uytkownicy
systemw Windows bd musieli zainstalowa wybrane dystrybucje jzy-
kw Python i Ruby, rodowisko wykonawcze Javy oraz kilku programw
uytkowych uywanych w tej ksice (naley pamita, e wikszo tych
programw jest tworzona z myl o systemach operacyjnych z rodziny
Unix, zatem nie wszystkie narzdzia s dostpne dla systemu Windows).
Warto wic rozway instalacj wybranej dystrybucji systemu Linux, a do
obsugi systemu OS X wprost doskonale nadaje si komputer Mac Mini.
Ten domowy serwer powinien stanowi stosunkowo niedrogi skadnik kolek-
cji sprztu zakupionego na potrzeby projektw opisanych w tej ksice.
Znajomo Javy bdzie szczeglnie przydatna podczas pisania aplikacji
klient-serwer dla systemu operacyjnego Android (w dalszej czci tej ksiki).
Take dowiadczenie w pracy z jzykami Python i Ruby bdzie sporym
uatwieniem. Jzyk Python jest wstpnie instalowany w systemie Mac i niemal
wszystkich dystrybucjach systemu Linux. Zdecydowana wikszo skryptw
strony serwera opisanych w tej ksice zostaa napisana wanie w Pythonie.
Programici jzykw Java, Perl, PHP i Ruby, ktrzy z rnych wzgldw
46  2.3. Bezpiecznej zabawy!

nie chc rezygnowa ze swoich ulubionych technologii, nie powinni mie


wikszych problemw z przetumaczeniem aplikacji strony serwera na wybra-
ny przez siebie jzyk. Zachcam wszystkich czytelnikw zainteresowanych
przenoszeniem kodu opisanego w tej ksice na inne jzyki do opisania swoich
prb za porednictwem strony internetowej tej ksiki by moe zdobyte
dowiadczenia uatwi prac pozostaym czytelnikom.

2.3. Bezpiecznej zabawy!


Projekty prezentowane w tej ksice celowo zostay tak zaplanowane, aby
ograniczy do minimum lub wrcz wyeliminowa ryzyko raenia prdem.
Staraem si take zminimalizowa niebezpieczestwo uszkodzenia ciaa lub
wyrzdzenia szkd materialnych w wyniku nieprzewidzianych zdarze. Ka-
dy czytelnik powinien jednak pamita o zasadach bezpieczestwa podczas
prac nad kadym projektem wymagajcym czenia urzdze sprztowych.
Ani autor tej ksiki, ani jej wydawca nie moe odpowiada za ewentual-
ne szkody i negatywne skutki budowy i uruchamiania opisanych systemw
(nie moemy te odpowiada za nieprawidowe dziaanie sprztu uytego
przez czytelnikw do modyfikacji tych projektw wicej informacji na
ten temat mona znale w ramce Realizujesz projekty na wasne ryzyko.
Ostrzegaem!). Na kadym kroku podkrelam i ostrzegam jeli nie
jeste elektrykiem z uprawnieniami, hydraulikiem czy stolarzem i jeli nie dys-
ponujesz pen wiedz z danej dziedziny, nie prbuj niczego zmienia nawet
w podstawowych elementach instalacji elektrycznych lub wodno-kanalizacyjnych
w swoim domu. Lepszym rozwizaniem jest wezwanie dowiadczonego fa-
chowca, elektryka z odpowiednimi uprawnieniami. Zaufaj mi. Umiejtno
planowania dziaa i dowiadczenie s najlepszym zabezpieczeniem przed
bdami zatrudniajc specjalist, oszczdzisz pienidze i unikniesz ryzyka
utraty zdrowia. Zlecanie tych podstawowych aspektw fachowcom powoduje
dodatkowo, e mamy wicej czasu na implementacj i optymalizacj wyjt-
kowo wcigajcych i budzcych zazdro systemw inteligentnego domu.
Wystarczy ju tych wymaga i ostrzee. W nastpnym rozdziale przystpi-
my wreszcie do konstruowania i kodowania ciekawych i niepowtarzalnych
projektw automatyzacji domu!
Rozdzia 2. Potrzebne elementy  47

Realizujesz projekty na wasne ryzyko. Ostrzegaem!


Kady czytelnik sam odpowiada za swoje bezpieczestwo. Wszelkie
instrukcje i sugestie zawarte w tej ksice czytelnik wykonuje na
wasne ryzyko. Autor i wydawca tej ksiki nie ponosz adnej odpo-
wiedzialnoci za uszkodzenia, obraenia ani koszty powstae w wy-
niku prawidowego lub nieprawidowego uywania informacji za-
wartych w tej ksice.
To do czytelnika naley odpowiedzialno za sprawdzenie, czy po-
dejmowane czynnoci s zgodne z odpowiednimi przepisami pra-
wa i czy nie wymagaj stosownych licencji. Regulacje i ograniczenia
narzucane przez producentw urzdze i oprogramowania stale
ewoluuj, poniewa zmieniaj si same produkty i technologie.
Oznacza to, e cz projektw prezentowanych w tej ksice moe
nie dziaa w opisany sposb bd moe narusza biece prawa,
regulacje lub umowy licencyjne. Co wicej, w skrajnych przypad-
kach proponowane rozwizania mog powodowa uszkodzenia
albo w inny sposb wpywa na uyte urzdzenia lub otoczenie.
Elektronarzdzia, urzdzenia elektryczne i inne elementy uywane
w opisanych projektach mog by niebezpieczne, jeli s uywane
w niewaciwy sposb, wbrew zaleceniom producenta i (lub) bez
naleytej odziey ochronnej (naley pamita, e cz zdj i opi-
sw narusza zasady bezpiecznego stosowania sprztu i procedur,
aby lepiej prezentowa istot budowanych rozwiza). Kady czy-
telnik musi sam opanowa zasady prawidowego i bezpiecznego
uywania potrzebnych narzdzi. To do czytelnika naley ocena, czy
dysponuje umiejtnociami i wiedz potrzebnymi do realizacji opi-
sanych projektw i wykonywania sugerowanych czynnoci. Wszyst-
kie projekty zostay opracowane z myl o osobach dorosych.
Przed przystpieniem do realizacji kadego projektu naley spraw-
dzi, czy godzimy si na ryzyko zwizane z tym przedsiwziciem.
Jeli na przykad obawiasz si pracy z prdem o napiciu 220 V, powi-
niene zrezygnowa z realizacji projektw wymagajcych takiego
zasilania. Autor tej ksiki z natury rzeczy nie zna lokalnych zarz-
dze obowizujcych w miejscu realizacji projektw przez czytelni-
ka, zatem przed przystpieniem do pracy naley sprawdzi, czy po-
dejmowane dziaania nie naruszaj tych regu. W razie wtpliwoci
warto skontaktowa si z lokalnym specjalist z danej dziedziny.
Czytelnik powinien budowa tylko te projekty, w ktrych przypad-
ku godzi si wzi na siebie pen odpowiedzialno za skutki po-
dejmowanych czynnoci.
Powodzenia i dobrej zabawy!
48  2.3. Bezpiecznej zabawy!
Cz II
Projekty
50  Inteligentny dom
Rozdzia 3.
System
powiadamiania
o poziomie wody

K
ady mieszkaniec rodkowego Zachodu Stanw Zjednoczonych
(w tym ja) by wiadkiem wielu ulewnych deszczw i doskonale wie,
jak po takiej nawanicy wyglda piwnica domu. Dramatyczne relacje
o zalaniach i awariach pomp w czasie najbardziej ulewnych deszczw czsto
kocz si stwierdzeniem: gdybym wiedzia, jak szybko podnosi si poziom
wody w osadniku, miabym wicej czasu na wyniesienie najcenniejszych rze-
czy z piwnicy.
Wyobramy sobie jeszcze inny scenariusz, w ktrym do usuwania wilgoci
z piwnicy jest uywany osuszacz. Niedrogie osuszacze czsto przestaj dziaa
w momencie, w ktrym poziom wody w zbiorniku osiga okrelony poziom.
Niektre modele emituj wtedy sygna dwikowy lub wczaj migajc
diod, jednak ten sposb komunikowania wypenienia zbiornika jest o tyle
nieefektywny, e osuszacze z reguy s instalowane w rzadko odwiedzanych
pomieszczeniach.
Czy nie lepszym i bardziej wygodnym rozwizaniem byoby otrzymywa-
nie wiadomoci poczty elektronicznej w momencie przekroczenia okrelonego
progu w zbiorniku, tak aby waciciel mg podj stosowne dziaania?
(Patrz rysunek 3.1 zatytuowany Niech dom wysya do swojego waciciela
52  3.1. Czego potrzebujemy

wiadomoci). Przejdmy wic do mokrej roboty i zbudujmy system, ktry


bdzie wysya do nas powiadomienia w awaryjnych sytuacjach.

Rysunek 3.1. Niech dom wysya do swojego waciciela wiadomoci, kiedy


poziom wody osignie prg alarmowy, aby mieszkacy mieli
wicej czasu na zabezpieczenie dobytku przed zalaniem.
Projekt moe suy take do monitorowania poziomw
wody w osuszaczach, klimatyzatorach i innych podobnych
urzdzeniach
Rozdzia 3. System powiadamiania o poziomie wody  53

3.1. Czego potrzebujemy


Najwaniejszym elementem potrzebnym do realizacji tego projektu jest
tzw. czujnik ugicia (ang. flex sensor). Rosncy poziom wody spowoduje
wygicie tego czujnika. Poniewa czujnik moe by wyginany w obie stro-
ny, biece wskazania bd odpowiednio rosy lub malay. Stan czujnika
mona odczytywa za pomoc prostego programu platformy Arduino, a sam
czujnik moe by zasilany za porednictwem wtykw Arduino 3,3- lub 5-
woltowych.
Oto kompletna lista potrzebnych elementw (komponenty uywane w tym
projekcie pokazano te na rysunku 3.2 zatytuowanym Czci systemu
powiadamiania o poziomie wody):
1. Arduino Uno,
2. modu sieciowy (Ethernet shield) ,
1

3. czujnik ugicia2,
4. rezystor 10 k3,
5. jednocalowy spawik wdkarski,
6. trzy przewody (zasilanie, masa i wtyk analogowy 0) przycite do
odpowiedniej dugoci,
7. 9-woltowy zasilacz dla platformy Arduino i moduu sieciowego
(po odczeniu przewodu USB),
8. listwa lub deska, do ktrej zostanie przymocowany czujnik ugicia,
9. serwer WWW obsugujcy skrypty jzyka PHP 4.3 lub nowszej
wersji (serwer nie zosta pokazany na rysunku).
Realizacja tego projektu bdzie dodatkowo wymagaa standardowego prze-
wodu USB A-B (brak na rysunku), aby poczy platform Arduino
z komputerem, oraz przewodu Ethernet (ktrego take nie pokazano na
rysunku) potrzebnego do poczenia moduu sieciowego z sieci.

1
http://www.adafruit.com/index.php?main_page=product_info&cPath=
17_21&products_id=201
2
http://www.sparkfun.com/products/8606
3
http://www.makershed.com/ProductDetails.asp?ProductCode=JM691104
54  3.1. Czego potrzebujemy

Rysunek 3.2. Czci systemu powiadamiania o poziomie wody

Poniewa platforma Arduino i modu sieciowy bd uywane w wielu pozo-


staych projektach, koszty sprztu potrzebnego do realizacji tego projektu
(liczone bez tych dwch elementw) nie powinny przekroczy 40 zotych.
Zwaywszy na spokj, ktry zyskamy dziki temu systemowi, i moliwoci
rozbudowy tego systemu, niezbdne nakady s stosunkowo niedue.

Platforma Arduino i sie Ethernet


Cz czytelnikw zapewne wolaaby dysponowa platform Ar-
duino Uno i moduem sieciowym tej platformy w ramach jednego
urzdzenia. W takim przypadku warto rozway zakup pytki Arduino
Uno Ethernet4. Warto jednak pamita, e take w tym przypadku
cyfrowe wtyki 10 13 s zarezerwowane dla moduu sieciowego (po-
dobnie jak w konfiguracji zoonej z odrbnej pytki Arduino i do-
datkowego moduu sieciowego). Co wicej, platforma Arduino Uno
Ethernet wymaga przewodu FTDI do poczenia z komputerem
(zamiast bardziej popularnego przewodu USB A-B)5. Najwiksz
zalet tej platformy jest moliwo czenia mechanizmw na bazie
sieci Ethernet z innym moduem platformy Arduino, o ile ten inny
modu nie wymaga tych samych wtykw co zintegrowany modu
sieciowy.

4
http://www.adafruit.com/products/418
5
https://www.adafruit.com/products/70
Rozdzia 3. System powiadamiania o poziomie wody  55

3.2. Budowa rozwizania


Zanim system powiadamiania o poziomie wody bdzie mg wysya swoje
ostrzeenia, musimy wykona nastpujce zadania:
1. Musimy poczy przewody i rezystory z jednej strony czujnika
ugicia oraz zamocowa spawik wdkarski z drugiej strony tego
czujnika.
2. Musimy podczy czujnik ugicia do analogowego wtyku platformy
Arduino.
3. Musimy napisa program (tzw. szkic) platformy Arduino, ktry
bdzie monitorowa zmiany wartoci odczytywanych przez czujnik
ugicia. Program powinien generowa zdarzenie w momencie wy-
krycia odpowiednio duej zmiany wzgldem wartoci pocztkowej.
4. Naley poczy platform Arduino z moduem sieciowym, tak
aby szkic mg si komunikowa z serwerem WWW, na ktrym
bdzie dziaa odpowiedni skrypt PHP.
5. Naley napisa skrypt PHP, ktry bdzie otrzymywa wartoci
wysyane przez platform Arduino. W razie zmiany poziomu wo-
dy skrypt powinien sformatowa i wysa wiadomo poczty elek-
tronicznej, ktra zaalarmuje adresata odbiorca tej wiadomoci
bdzie mg szybko zareagowa na to ostrzeenie!
Zaczniemy od poczenia elementw sprztowych i przetestowania wskaza
czujnika ugicia.

3.3. czenie
Zacznijmy od sprawdzenia, czy czujnik ugicia dziaa zgodnie z naszymi
oczekiwaniami. Kocwk dodatni czujnika naley poczy z 5-woltowym
wtykiem na pytce Arduino za pomoc przewodu. Kocwka dodatnia to
ta poczona z paskiem cigncym si wzdu caej dugoci czujnika. Ko-
cwka ujemna to ta poczona z czci czujnika przypominajc drabin.
Kocwk ujemn naley podczy do analogowego wtyku 0 za pomoc
drugiego przewodu. Na kocu naley zmostkowa analogowy wtyk 0 z wty-
kiem uziemienia przy uyciu rezystora 10 k, aby obniy natenie prdu
w ukadzie. Warto przeanalizowa rysunek 3.3 zatytuowany Diagram
pocze systemu powiadamiania o poziomie wody, aby upewni si, e
przewody i rezystor zostay poczone z waciwymi wtykami.
56  3.4. Tworzenie szkicu

Rysunek 3.3. Diagram pocze systemu powiadamiania o poziomie wody

Na drugim kocu czujnika ugicia naley zamontowa spawik. Wikszo


spawikw jest oferowana z odczepianym haczykiem, ktry mona przymoco-
wa do plastikowej kocwki czujnika. W razie problemw z przymoco-
waniem spawika do czujnika mona uy kleju termotopliwego lub wa
termokurczliwego, aby spawik dobrze trzyma si czujnika. Warto przy
tym zachowa ostrono, aby podczas czenia ze spawikiem na gorco
nie uszkodzi czujnika. Alternatywnym (i bezpiecznym) rozwizaniem jest
uycie mocnej tamy klejcej, jednak naley pamita, e z czasem sia
kleju moe by sabsza.
Uyte przewody powinny by na tyle dugie, aby mona byo bezpiecznie
zainstalowa platform Arduino i rdo zasilania z dala od zbiornika z wo-
d. Pytka Arduino, ktrej uywam do monitorowania mojego osadnika,
zostaa zamontowana w skrzynce ptora metra wyej, zatem kady z pary
przewodw prowadzcych do czujnika ugicia ma okoo 2 metry dugoci.
Skoro platforma Arduino jest ju prawidowo poczona z czujnikiem, mo-
emy przystpi do pracy nad logiczn warstw tego rozwizania. Zaczniemy
od opracowania prostego programu testowego, ktry sprawdzi, czy czujnik
ugicia jest prawidowo podczony i czy dziaa zgodnie z zaoeniami.

3.4. Tworzenie szkicu


Zanim przystpimy do pisania waciwego kodu, musimy si upewni, e
prawidowa komunikacja z pytk Arduino jest moliwa. Zaraz potem om-
wi sposoby uzyskiwania i przetwarzania na poziomie programu (nazywanego
Rozdzia 3. System powiadamiania o poziomie wody  57

szkicem przez spoeczno programistw platformy Arduino) danych wy-


syanych przez czujnik ugicia.
Nasz pierwszy szkic bdzie wykrywa ewentualne zmiany wskaza czujnika
ugicia. Jeli zmiana bdzie odpowiednio dua (czyli jeli wzrost poziomu
wody spowoduje wygicie czujnika), program wyle danie do skryptu PHP
na serwerze, ktry przetworzy otrzymane dane. Dziaanie tego skryptu
sprowadza si do wysania wiadomoci poczty elektronicznej z informacj
o zmianie poziomu wody.
Niezbdny szkic bdziemy budowali w sposb przyrostowy zaczniemy od
poczenia czujnika ugicia z pytk Arduino oraz pobrania wartoci dla
wyprostowanego czujnika oraz czujnika w pozycjach wygitych w obu kierun-
kach. Po zidentyfikowaniu tych wartoci napiszemy wyraenia warunkowe,
ktre bd wywoyway funkcje wysyajce dania GET protokou HTTP
z danymi do wysania w alarmowej wiadomoci poczty elektronicznej.

Konfiguracja platformy Arduino


Do napisania, skompilowania i pobrania naszego kodu na platform Arduino
uyjemy rodowiska programowania Arduino IDE. Czytelnikom zaintere-
sowanym bardziej wyczerpujcym wprowadzeniem do programowania plat-
formy Arduino polecam doskona ksik Maika Schmidta zatytuowan
Arduino: A Quick Start Guide [Sch11].
Czytelnicy, ktrzy znaj ju t platform lub ktrzy chc od razu zacz swoj
przygod z programowaniem tego systemu, mog ju teraz uruchomi rodo-
wisko Arduino IDE. Wystarczy upewni si, e platforma jest poczona
z komputerem za pomoc przewodu USB oraz e zostaa rozpoznana i wy-
brana na jednym z portw szeregowych zidentyfikowanych w menu Tools/
Serial Port rodowiska Arduino IDE. Konfiguracj mona byskawicznie
przetestowa, korzystajc z przykadowego programu LED Blink dostp-
nego w rodowisku Arduino IDE po wyborze opcji File/Examples/1.Basics/
Blink. Wystarczy wysa ten program na platform Arduino i sprawdzi,
czy jest prawidowo wykonywany.
W razie niepowodzenia naley sprawdzi, czy pytka Arduino jest prawi-
dowo poczona z komputerem i czy jest odpowiednio zasilana przez port
USB. Jeli tak, naley sprawdzi, czy w samym rodowisku Arduino IDE
wybrano waciwy port szeregowy, oraz zaznaczy waciwy typ pytki
Arduino w oknie Tools/Board. Problem mona zwykle rozwiza za po-
moc zaledwie kilku klikni mysz.
58  3.4. Tworzenie szkicu

Szkic dla czujnika ugicia


Skoro platforma Arduino jest ju podczona i przetestowana, moemy
przystpi do pisania szkicu, ktry sprawdzi i zinterpretuje warto opi-
sujc ugicie czujnika. Zacznijmy od zdefiniowania kilku staych, ktrych
bdziemy uywali w dalszej czci programu.
Poniewa musimy uwzgldni moliwo wyginania czujnika w obu kierun-
kach, zdefiniujemy dwie stae nazwane, ktre bd wyznaczay grny i dolny
prg generowania zdarzenia.
Obie stae naley umieci na pocztku szkicu, tak aby w przyszoci mona
je byo atwo zlokalizowa (na przykad w razie koniecznoci zmiany progw).
Zgodnie z konwencj stae zdefiniowane zapisuje si samymi wielkimi literami,
dziki czemu mona je atwo identyfikowa w kodzie rdowym. Wspo-
mniane stae nazwiemy FLEX_TOO_HIGH i FLEX_TOO_LOW. Przedzia wyznaczany
przez ten grny i dolny prg bdzie zalea od kta wygicia czujnika waci-
wego w konkretnym scenariuszu. Zwykle stosuj tolerancj na poziomie
plus/minus piciu jednostek, aby przed wygenerowaniem zdarzenia powia-
domienia byo moliwe pewne ugicie czujnika. Pewna tolerancja (choby na
zaproponowanym przeze mnie poziomie) umoliwi uwzgldnianie takich
zjawisk jak lekki powiew wiatru czy niewielkie wibracje.
Musimy te mie na uwadze diod LED wbudowan na pytce Arduino
oraz analogowy wtyk, do ktrego podczono czujnik ugicia.
Staa FLEX_TOO_HIGH okrela warto przypisanego analogowego wtyku
w czasie, gdy czujnik ugicia jest wygity przed ten prg.
Staa FLEX_TOO_LOW okrela warto przypisanego analogowego wtyku
w czasie, gdy czujnik ugicia jest wygity za ten prg.
Staa ONBOARD_LED jest przypisana do wbudowanej diody LED na pyt-
ce Arduino w miejscu wtyku nr 13. Uyjemy tej diody w roli wizual-
nego wskanika sygnalizujcego odchylenie czujnika ugicia w stop-
niu powodujcym wysanie wiadomoci alarmowej. Takie rozwi-
zanie umoliwia nam wykorzystanie wbudowanej diody LED w roli
wizualnego debugera, ktry bdzie w czytelny sposb potwierdza
wykrycie zdarzenia ugicia.
Staa FLEX_SENSOR jest powizana z analogowym wtykiem na pytce
Arduino, do ktrego podczono czujnik ugicia. W tym przypadku
staa ma warto 0, poniewa rezystor podczono do wtyku nr 0.
Wszystkie te stae zostan zdefiniowane na pocztku szkicu.
Rozdzia 3. System powiadamiania o poziomie wody  59

Plik WaterLevelNotifier/WaterLevelSensor.pde

#define FLEX_TOO_HI 475


#define FLEX_TOO_LOW 465
#define ONBOARD_LED 13
#define FLEX_SENSOR 0

Utworzymy teraz dwie zmienne reprezentujce zmieniajc si warto i stan


czujnika ugicia. Obu zmiennym pocztkowo przypiszemy warto zero.
Zmienna bend_value bdzie reprezentowaa zmieniajce si, analogowe
wskazania czujnika ugicia (zmiany tych wartoci wynikaj wanie
z jego zginania).
Zmienna bend_state bdzie reprezentowaa binarny stan tego czuj-
nika. Jeli czujnik jest prosty, zmienna ma warto zero. Jeli czujnik
jest zgity w jednym z dwch kierunkw, zmienna reprezentujca stan
tego czujnika ma warto jeden.
Zmienne zostan umieszczone w pliku za opisanymi wczeniej wyraeniami
#define.
Plik WaterLevelNotifier/WaterLevelSensor.pde

int bend_value = 0;
byte bend_state = 0;

Po zdefiniowaniu staych i zainicjalizowaniu niezbdnych zmiennych musimy


jeszcze skonfigurowa port szeregowy pod ktem monitorowania cigego
strumienia wartoci uzyskiwanych w gwnej ptli programu. Konfiguracji
wymaga take wbudowana dioda LED, tak abymy mogli obserwowa jej
zapalanie i gaszenie zalenie od wartoci zmiennej bend_state (reprezentujcej
stan czujnika ugicia).
Plik WaterLevelNotifier/WaterLevelSensor.pde

void setup()
{
// na potrzeby komunikatw diagnostycznych w oknie portu szeregowego
Serial.begin(9600);
// ustawia wtyk dla wbudowanej diody LED
pinMode(ONBOARD_LED, OUTPUT);
}

Skoro zdefiniowalimy grny i dolny prg ugicia czujnika, musimy jeszcze


opracowa funkcj, ktra sprawdzi, czy ktry z tych progw nie zosta prze-
kroczony. W razie przekroczenia progu program wczy diod LED wbu-
dowan na pytce Arduino. Po powrocie czujnika ugicia do pozycji wy-
prostowanej funkcja wyczy t diod LED.
60  3.4. Tworzenie szkicu

Plik WaterLevelNotifier/WaterLevelSensor.pde

void SendWaterAlert(int bend_value, int bend_state)


{
digitalWrite(ONBOARD_LED, bend_state ? HIGH : LOW);
if (bend_state)
Serial.print("Poziom wody przekroczy prg, bend_value=");
else
Serial.print("Poziom wody wrci do normalnego stanu bend_value=");
Serial.println(bend_value);
}

Warto zwrci szczegln uwag na pierwszy wiersz tego bloku kodu:


digitalWrite(ONBOARD_LED, bend_state ? HIGH : LOW);. Ta trjargumentowa
operacja sprawdza biecy stan czujnika ugicia na podstawie wartoci
(0 lub 1) przekazanej na wejciu tej funkcji. Zdefiniowane poniej wyraenie
warunkowe wysya odpowiedni komunikat w oknie portu szeregowego rodo-
wiska Arduino IDE. Jeli zmienna bend_state ma warto 1 (HIGH), czujnik
ugicia zosta wygity poza zdefiniowane przez nas wartoci progowe. Innymi
sowy, poziom wody przekroczy przyjty prg. Jeli ta zmienna ma warto
0 (LOW), czujnik ugicia jest wyprostowany (stan wody nie przekracza po-
ziomu progowego).
Pozostaje nam ju tylko napisanie gwnej ptli programu. Stan wtyku
FLEX_SENSOR (zdefiniowanego jako wtyk analogowy nr 0) jest co sekund
sprawdzany pod ktem wzrostu lub spadku wartoci. W razie wykrycia zda-
rzenia ugicia warto zmiennej bend_value jest wysyana do portu szeregowe-
go, zatem moemy j sprawdzi w oknie portu szeregowego rodowiska
Arduino IDE.
Plik WaterLevelNotifier/WaterLevelSensor.pde

void loop()
{
// czeka sekund w kadej iteracji ptli
delay(1000);
// sprawdza napicie na wtyku FLEX_SENSOR
bend_value = analogRead(FLEX_SENSOR);

// wysya warto zmiennej bend_value do portu szeregowego w celu wyznaczenia


// wartoci bazowej
// ten wiersz naley zamieni w komentarz po wyznaczeniu wartoci bazowej
// limity zostay zdefiniowane
Serial.print("bend_value=");
Serial.println(bend_value);

switch (bend_state)
{
case 0: // warto zmiennej bend_value nie przekracza grnego ani dolnego progu
if (bend_value >= FLEX_TOO_HI || bend_value <= FLEX_TOO_LOW)
{
Rozdzia 3. System powiadamiania o poziomie wody  61

bend_state = 1;
SendWaterAlert(bend_value, bend_state);
}
break;
case 1: // warto zmiennej bend_value przekracza grny lub dolny prg
if (bend_value < FLEX_TOO_HI && bend_value > FLEX_TOO_LOW)
{
bend_state = 0;
SendWaterAlert(bend_value, bend_state);
}
break;
}
}

Gwna ptla tego szkicu sprawdza warto czujnika ugicia w jednosekun-


dowych odstpach. Wyraenie switch sprawdza stan tego czujnika repre-
zentowany przez zmienn bend_state. Jeli w poprzedniej iteracji czujnik
by wyprostowany (case 0:), program sprawdza, czy czujnik nie jest teraz
wygity poza grny lub dolny prg. Jeli tak, odpowiednio zmieniamy
warto zmiennej bend_state i wywoujemy funkcj SendWaterAlert. I odwrotnie
jeli w poprzedniej iteracji czujnik by wygity (case 1:), program
sprawdza, czy teraz nie jest wyprostowany. Jeli tak, przypisujemy zmien-
nej bend_state warto zero i przekazujemy nowy stan na wejciu funkcji
SendWaterAlert.

W zalenoci od rodzaju czujnika ugicia i moduu sieciowego, a take od


uytego wtyku napicia wartoci bazowe mog rni si od tych zarejestro-
wanych przeze mnie. Mj czujnik ugicia sygnalizowa warto rwn 470.
Warto zwrci uwag na sposb stosowania rednikw oznaczajcych
koniec wierszy z wyraeniami oraz nawiasw klamrowych wyznaczajcych
bloki wyrae warunkowych. Warto teraz zapisa ten plik. Przed przyst-
pieniem do dalszych dziaa warto te rozway umieszczenie tego i pozo-
staych plikw z kodem rdowym w wybranym systemie kontroli wersji.
Polecam system Git6, jednak take pozostae systemy, jak Mercurial czy
Subversion, z pewnoci bd lepsze od braku jakiegokolwiek systemu kon-
troli wersji.
W dalszej czci tego rozdziau zmienimy funkcj SendWaterAlert tak, aby
wywoywaa inn funkcj, ktra bdzie nawizywaa poczenie ze skryp-
tem PHP na wskazanym serwerze WWW. Wspomniany skrypt wyle
wiadomo poczty elektronicznej z ostrzeeniem dotyczcym monitorowa-
nej zmiennej bend_value. Zanim jednak przejdziemy do implementacji tych

6
http://git-scm.com/
62  3.4. Tworzenie szkicu

rozwiza, warto sprawdzi, czy nasz test przekroczenia progw dziaa pra-
widowo w tym celu przeanalizujemy komunikaty wywietlane w oknie
portu szeregowego rodowiska Arduino IDE.

Uruchamianie szkicu
Po zapisaniu szkicu naley klikn przycisk Verify na pasku narzdzi rodo-
wiska Arduino IDE. Kliknicie tego przycisku spowoduje skompilowanie
szkicu i sprawdzenie ewentualnych bdw skadowych. Po potwierdzeniu
braku bdw naley wysa szkic na platform Arduino, klikajc przycisk
Upload dostpny na pasku narzdzi. Wbudowana dioda LED na pytce
Arduino powinna przez pewien czas miga, aby zasygnalizowa otrzymywa-
nie szkicu. Kiedy dioda przestanie miga, wysany szkic powinien dziaa.
Warto teraz otworzy okno Serial Monitor rodowiska Arduino IDE. Jeli
wyraenie Serial.print("bend_value="); w gwnej ptli szkicu do tej pory
nie zostao umieszczone w komentarzu, moemy obserwowa liczby stale
wywietlane w oknie monitora portu szeregowego (z czstotliwoci okoo
jednej nowej wartoci na sekund). Jeli znaki wywietlane w tym oknie s
nieczytelne, naley sprawdzi, czy zastosowano prawidow szybko transmisji
(w tym przypadku naley zastosowa warto 9600). Biece ustawienia mo-
na sprawdzi na licie rozwijanej widocznej w prawym dolnym rogu okna
tego monitora portu szeregowego. Naley zanotowa wskazania czujnika
ugicia w czasie, gdy jest wyprostowany, wygity w jedn stron i wygity
w drug stron.
W zalenoci od parametrw opornika i rodzaju zastosowanych urzdze
naley zaktualizowa wartoci staych FLEX_TOO_HIGH i FLEX_TOO_LOW zgodnie
z odczytami widocznymi w oknie monitora portu szeregowego. Po zapisa-
niu odpowiednich wartoci progowych naley zapisa program i ponownie
wysa go na platform Arduino, stosujc tak sam procedur jak poprzed-
nio. Zdefiniowanie grnego i dolnego progu potrzebnych do prawidowego
wykrywania stanu wygicia czujnika moe wymaga dwch lub trzech prb.
Po zmodyfikowaniu grnego i dolnego progu tak, aby najlepiej pasoway do
danej konfiguracji, naley obserwowa wbudowan diod LED na pytce
Arduino, aby mie pewno, e dioda zapala si w momencie odpowiednio
mocnego wygicia czujnika w jedn lub drug stron oraz ganie w momen-
cie przywrcenia oryginalnego pooenia (po wyprostowaniu czujnika).
Rozdzia 3. System powiadamiania o poziomie wody  63

Testowanie szkicu
Po dopracowaniu konfiguracji sprztowej i sprawdzeniu, czy wysany szkic
platformy Arduino dziaa prawidowo, moemy wreszcie przeprowadzi
prosty test wody wystarczy nala wod do miski i jednoczenie zanurzy
spawik w wodzie, trzymajc kciukiem i palcem wskazujcym drugi koniec
czujnika ugicia. czenia obu przewodw z czujnikiem ugicia naley oczy-
wicie zabezpieczy za pomoc wodoodpornej tamy izolacyjnej. Sugeruj
zastosowanie wielu warstw tamy, aby nie tylko dysponowa solidnym uchwy-
tem czujnika, ale te ochroni go przed przypadkowymi kroplami wody.
Po prawidowym i bezpiecznym przygotowaniu testu naley sprawdzi, czy
wypieranie przez wod spawika przymocowanego do czujnika ugicia spo-
woduje na tyle due wygicie w jednym z kierunkw, e bdzie powodo-
wao zapalanie diody LED.
Naley uwaa, aby nie zala odsonitego czujnika ugicia. Mimo e
natenie prdu przepywajcego przez pytk Arduino jest stosunkowo
niewielkie, poczenie wody i elektrycznoci moe mie fatalne skutki.
Wszystkie elektroniczne elementy, w tym czujnik ugicia i doczony spawik,
naley umieci w szczelnej torbie foliowej (oczywicie w sposb umoli-
wiajcy zginanie czujnika). Naley zachowa daleko idc ostrono, aby
wykluczy ryzyko zamoczenia odkrytych przewodw lub pocze elek-
trycznych. Woda moe nie tylko uszkodzi sprzt, ale take doprowadzi
do niebezpiecznego poraenia prdem.
Podstawowe elementy systemu powiadamiania o poziomie wody s ju kom-
pletne. Na tym etapie sygnalizacja przekroczenia alarmowego poziomu
wody ogranicza si jednak do zapalenia miniaturowej diody LED na pytce
Arduino. Takie rozwizanie by moe wystarczy w przypadku projektw
akademickich lub konstruktorw pracujcych w bezporednim ssiedztwie
platformy Arduino monitorujcej zbiornik wodny, jednak w naszym przypad-
ku konieczne bdzie znalezienie innego sposobu powiadamiania o rosncym
poziomie wody.
Duo lepszym rozwizaniem bdzie otrzymywanie powiadomie w formie
wiadomoci poczty elektronicznej, szczeglnie jeli system mierzcy poziom
wody znajduje si w rzadko odwiedzanym pomieszczeniu. System moe na-
wet dziaa w zupenie innym miejscu moe na przykad monitorowa
poziom wody w osadniku w domku letniskowym w trakcie ulewnych deszczy.
Realizacja tego zadania bdzie wymagaa doczenia do platformy Ar-
duino moduu sieciowego i napisania kodu, ktry po przekroczeniu progu
64  3.5. Implementacja aplikacji internetowej wysyajcej poczt

ugicia czujnika wyle odpowiedni wiadomo poczty elektronicznej. Zanim


jednak wzbogacimy ten projekt o dodatkowy sprzt, musimy przygotowa
aplikacj odpowiedzialn za wysyanie powiadomie poczt elektroniczn.
Aplikacja bdzie uywana przez nasz szkic platformy Arduino za kadym
razem, gdy trzeba bdzie wysa ostrzeenie.

3.5. Implementacja aplikacji


internetowej wysyajcej
poczt elektroniczn
3.5. Implementacja aplikacji internetowej wysyajcej poczt

Istnieje coraz wicej bibliotek umoliwiajcych wysyanie wiadomoci


poczty elektronicznej bezporednio z poziomu szkicw platformy Arduino.
Wszystkie te biblioteki wymagaj jednak autonomicznego, dedykowanego
serwera poczty elektronicznej, ktry udostpnia niezbdn bram pocztow.
Oznacza to, e nawet jeli kod wysyajcy tego rodzaju wiadomoci mona
skompilowa do postaci szkicu platformy Arduino, warunkiem jego dziaania
(i wysyania przez platform Arduino wiadomoci poczty elektronicznej
adresowanej do wybranych adresatw) jest korzystanie z pomocy odpowied-
niej usugi poredniczcej.
Czytelnicy, ktrzy maj dostp do serwera poczty SMTP i mog wykorzy-
sta ten serwer do przekazywania wiadomoci wychodzcych, mog znale
odpowiednie instrukcje w ksice Maika Schmidta zatytuowanej Arduino:
A Quick Start Guide [Sch11]. Ksika zawiera niezbdny kod i szcze-
gowy opis procedury opracowania odpowiedniego rozwizania. W razie
braku dostpu do dedykowanej bramy SMTP moemy skorzysta z jednej
z wielu ofert hostingu obejmujcych moliwo wysyania wiadomoci poczty
elektronicznej z poziomu skryptw jzyka PHP.
Na potrzeby tego projektu wybraem popularny, wstpnie skonfigurowany
serwer WWW z obsug jzyka PHP i bram wychodzc protokou, czyli
konfiguracj oferowan midzy innymi przez tak popularne firmy hostingowe
jak Dreamhost.net czy Godaddy.com.
Skrypt jzyka PHP uywany do wysyania wiadomoci poczty elektronicznej
skada si z zaledwie kilku prostych wierszy kodu. W pierwszym kroku
przekazujemy na serwer dwa parametry: rodzaj wysyanego powiadomie-
nia oraz zarejestrowan warto czujnika ugicia. W dalszej czci skryptu
konstruujemy wiadomo poczty elektronicznej zoon z adresu odbiorcy,
tematu i waciwej treci powiadomienia. Po wykonaniu tych krokw mo-
emy wysa wiadomo.
Rozdzia 3. System powiadamiania o poziomie wody  65

Plik WaterLevelNotifier/wateralert.php

<?php
// Uzyskuje rodzaj powiadomienia do wysania
// oraz biec warto czujnika ugicia.
$alertvalue = $_GET["alert"];
$flexvalue = $_GET["flex"];

$contact = 'your@emailaddress.com';

if ($alertvalue == "1") {
$subject = "Alarm czujnika poziomu wody";
$message = "Rosncy poziom wody spowodowa, e czujnik ugicia
osign warto " . $flexvalue . ".";
mail($contact, $subject, $message);
echo("<p>Ostrzeenie o poziomie wody zostao wysane.</p>");
} elseif ($alertvalue == "0") {
$subject = "Poziom wody mieci si w normie";
$message = "Poziom wody nie przekracza progw alarmowych.
Czujnik ugicia ma warto " . $flexvalue . ".";
mail($contact, $subject, $message);
echo("<p>Informacja o bezpiecznym poziomie wody zostaa wysana.</p>");
}
?>

Dlaczego w tym projekcie uyto serwera WWW z obsug PHP?


To proste poniewa obsuga skryptw jzyka PHP naley do naj-
bardziej popularnych elementw konfiguracji oferowanych przez
firmy hostingowe. Mimo e sam wol bardziej nowoczesne frame-
worki aplikacji internetowych, jak Django czy Ruby on Rails dostp-
ne na wirtualnych serwerach prywatnych (ang. virtual private server
VPS), technologie tego typu nie s tak powszechnie obsugiwane
przez firmy hostingowe jak obsuga skryptw PHP. Brak odpowied-
nich usug w ofercie hostingowej nie stanowiby problemu, gdyby-
my skonfigurowali serwer WWW w ramach wasnej sieci (zastosu-
jemy takie rozwizanie w rozdziale 7. zatytuowanym Internetowy
wcznik wiata) lub gdybymy mieli dostp do serwera wirtual-
nego VPS. Jeli jednak wemiemy pod uwag koszty konfiguracji
serwera WWW i serwera poczty elektronicznej, ktry bdzie prawi-
dowo przekazywa wiadomoci SMTP, prostszym rozwizaniem jest
zastosowanie opcji z naszego pierwszego projektu.
Do wysyania wiadomoci poczty elektronicznej z poziomu skryptu
jzyka PHP wystarczy jeden plik tego jzyka zawierajcy zaledwie jeden
wiersz kodu. Zainteresowani czytelnicy mog oczywicie podj
prby opracowania odpowiednich rozwiza w swoich ulubionych
frameworkach aplikacji internetowych. W razie sukcesu zachcam do
podzielenia si swoimi odkryciami i dowiadczeniami z pozostaymi
czytelnikami na oficjalnym forum tej ksiki.
66  3.5. Implementacja aplikacji internetowej wysyajcej poczt

Skrypt wywouje wbudowan funkcj mail jzyka PHP, ktra otrzymuje


na wejciu trzy wymagane parametry: odbiorc lub odbiorcw, tytu oraz
waciw tre wiadomoci. Tak, to naprawd takie proste.
Kod naley zapisa w pliku nazwanym wateralert.php i umieszczonym
w katalogu gwnym serwera PHP. Skrypt mona przetestowa, otwierajc
przegldark internetow i wpisujc adres http://NAZWA_SERWERA_
PHP/wateralert.php?alert=1&flex=486. Strona powinna wywietli
komunikat Ostrzeenie o poziomie wody zostao wysane., a odpowiednia
wiadomo poczty elektronicznej powinna trafi do skrzynki odbiorczej
adresata. Jeli komunikat nie zostanie wywietlony lub jeli skrypt nie wy-
le wiadomoci poczty elektronicznej, naley sprawdzi ustawienia serwera
PHP pod ktem poprawnoci konfiguracji serwera WWW i dziaania
bramy poczty. Jeli mimo to test wysyania wiadomoci wykazuje bd,
naley si skontaktowa z dostawc usugi hostingowej, aby upewni si,
e serwer zosta prawidowo skonfigurowany z myl o wysyaniu wiado-
moci z poziomu kodu jzyka PHP.
Wyodrbnienie mechanizmu wysyania wiadomoci poza logik waciwe-
go kodu wykonywanego na platformie Arduino uatwia modyfikowanie
listy adresatw i treci powiadomie.
Skoro dysponujemy ju dziaajc bram komunikatw, moemy poczy
platform Arduino z moduem sieciowym, aby umoliwi komunikacj czuj-
nika ugicia ze wiatem zewntrznym.

Zabezpieczanie powiadomie
Jeli opisany skrypt ma na stae peni funkcj usugi przekazywania
wiadomoci generowanych przez platform Arduino, warto rozway
dodanie warstwy zabezpiecze sygnau transmisyjnego, tak aby tylko
nasz system sprawdzania poziomu wody mg wysya ostrzeenia.
Usug mona zabezpieczy albo za pomoc tak prostego (ale te
sabego) mechanizmu jak przekazywanie hasa w ramach parame-
trw GET protokou HTTP, albo stosujc bezpieczny token transak-
cyjny wymieniany pomidzy serwerem WWW a platform Arduino
podczas uwierzytelniania. Mimo e analiza dobrych mechanizmw
zabezpiecze wykraczaaby poza zakres tematyczny tej ksiki, warto
rozway takie rozwizanie, aby unikn sytuacji, w ktrej publicznie
dostpny skrypt przekazujcy PHP poczt elektroniczn zostanie wyko-
rzystany przez nieproszonych goci.
Rozdzia 3. System powiadamiania o poziomie wody  67

3.6. Dodanie moduu sieciowego


Modu sieciowy naley poczy z pytk Arduino w taki sposb, aby gniazdo
Ethernet znajdowao si na grze i byo skierowane w tym samym kierunku
co gniazdo USB samej platformy Arduino. Po zamontowaniu moduu sie-
ciowego naley przeczy przewody, tak aby zamiast odpowiednich wtykw
na pytce Arduino byy teraz poczone z wtykiem 5-woltowym i wtykiem
analogowym nr 0 (A0) moduu sieciowego.
To samo naley zrobi z rezystorem 10 k uytym do zmostkowania wtykw
uziemienia (Gnd) i A0. Warto teraz ponownie uruchomi testowy program
i zsprawdzi wywietlone wartoci. W moim przypadku odczytana warto
bazowa (dla wyprostowanego czujnika) bya inna ni w konfiguracji platfor-
my Arduino bez moduu sieciowego, zatem warto to sprawdzi. Poniewa
interesuj nas bardziej odchylenia wzgldem tej wartoci bazowej (nie
kalibracja wskaza czujnika), musimy zapisa warto dla wyprostowanego
czujnika i okreli w kodzie rdowym, jakie ugicia (w obu kierunkach),
czyli jakie odchylenia wzgldem wartoci bazowej bd akceptowane, zanim
szkic wyle powiadomienie.
Skoro nasz sprzt jest ju przygotowany do komunikacji sieciowej, moemy
przystpi do uzupenienia naszego szkicu o kod wysyajcy dane o stanie
czujnika ugicia na serwer PHP.

Kodowanie moduu sieciowego


Dane bd wysyane programowo za porednictwem moduu sieciowego.
Najpierw jednak musimy doczy do naszego szkicu referencj zarwno
do biblioteki Arduino Ethernet, jak i do powizanej z ni biblioteki inter-
fejsu SPI (od ang. Serial Peripheral Interface)7. Te dwie biblioteki zawie-
raj kod potrzebny do zainicjalizowania moduu sieciowego i umoliwiaj
nam okrelenie niezbdnych szczegw komunikacji sieciowej. Obie bi-
blioteki s doczane do instalacji rodowiska Arduino IDE, zatem nasze
zadanie sprowadza si do zaimportowania bibliotek SPI.h i Ethernet.h za
pomoc odpowiednich wyrae #include. Oba wyraenia naley umieci
na pocztku szkicu:

7
Patrz odpowiednio strony http://arduino.cc/en/Reference/Ethernet i http://www.
arduino.cc/playground/Code/Spi.
68  3.6. Dodanie moduu sieciowego

Plik WaterLevelNotifier/WaterLevelNotifier.pde

#include <SPI.h>
#include <Ethernet.h>

Po doczeniu bibliotek potrzebnych do obsugi moduu sieciowego moemy


przypisa temu moduowi unikatowe adresy MAC (od ang. Media Access
Control) i IP. Mimo e istniej biblioteki implementujce protok DHCP
opracowane przez spoeczno programistw platformy Arduino, prostszym
rozwizaniem jest przypisanie moduowi sieciowemu staego adresu IP.
Jeli na przykad sie domowa uywa adresu bramy 192.168.1.1, naley przy-
pisa moduowi sieciowemu wysoki adres IP, na przykad 192.168.1.230.
Jeli ten adres ma by na stae uywany jako statyczny adres IP tego moduu,
warto sprawdzi w dokumentacji domowego routera, jak ustawi przedzia
statycznych adresw IP w sieci, w ktrej jest stosowany protok DHCP.
Plik WaterLevelNotifier/WaterLevelNotifier.pde

// konfiguracja parametrw moduu sieciowego


byte MAC[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEF };

// ten adres IP moduu sieciowego naley zastpi adresem


// nalecym do przedziau dostpnego w danej sieci
byte IPADDR[] = { 192, 168, 1, 230 };

// ten adres naley zastpi adresem bramy (routera)


byte GATEWAY[] = { 192, 168, 1, 1 };

// ten adres naley zastpi mask podsieci


byte SUBNET[] = { 255, 255, 255, 0 };

// ten adres IP naley zastpi adresem IP serwera PHP


byte PHPSVR[] = {???, ???, ???, ???};

// inicjalizuje obiekt typu Client i przypisuje go do adresu IP


// serwera PHP (zastosowano standardowy port nr 80 protokou HTTP)
Client client(PHPSVR, 80);

W pierwszym kroku definiujemy stae reprezentujce statyczne adresy MAC


i IP, ktre bd uywane przez konfigurowany modu sieciowy. Staej
GATEWAY naley przypisa adres routera z dostpem do internetu, a staej SUBNET
naley przypisa mask podsieci (w wikszoci sieci domowych maska ma
posta 255.255.255.0). Przed funkcj setup() tego szkicu zadeklarowali-
my take adres IP serwera, na ktrym dziaa nasz skrypt jzyka PHP.
Po zadeklarowaniu potrzebnych staych moemy przystpi do inicjalizacji
moduu sieciowego w ciele funkcji setup() tego szkicu.
Rozdzia 3. System powiadamiania o poziomie wody  69

Plik WaterLevelNotifier/WaterLevelNotifier.pde

void setup()
{
// na potrzeby komunikatw diagnostycznych w oknie portu szeregowego
Serial.begin(9600);

// konfiguruje wbudowan diod LED na wtyku nr 13


pinMode(ONBOARD_LED, OUTPUT);

// inicjalizuje modu sieciowy przy uyciu zdefiniowanych wczeniej adresw MAC i IP


Ethernet.begin(MAC, IPADDR, GATEWAY, SUBNET);
// czeka na inicjalizacj moduu sieciowego
delay(1000);
}

rodowisko Arduino IDE w systemie Linux


i biblioteka moduu sieciowego
W przypadku korzystania ze rodowiska Arduino IDE w wersji dla
systemu Linux stosowanie biblioteki referencyjnej moduu siecio-
wego moe powodowa pewne problemy. Problem mona atwo
wykry, poniewa dane wysyane za porednictwem moduu sie-
ciowego s nieczytelne. Na szczcie istnieje i jest dostpna do po-
brania alternatywna wersja biblioteki Ethernet nazwana Ethernet28.
Wicej informacji na ten temat mona znale w dodatku A zaty-
tuowanym Instalacja bibliotek platformy Arduino. Po zainstalowa-
niu biblioteki Ethernet2 naley zmieni odwoanie do nagwka Ether-
net.h w oryginalnym wyraeniu #include, stosujc w jego miejsce
wyraenie #include Ethernet2.h.

Warto zwrci uwag na sposb uycia obiektu Ethernet w wywoaniu


Ethernet.begin(MAC, IPADDR, GATEWAY, SUBNET);. Wanie w tym wierszu modu
sieciowy jest inicjalizowany przy uyciu przekazanych adresw MAC i IP.
Dysponujemy teraz dziaajcym poczeniem sieciowym. Moemy wresz-
cie przystpi do nastpnego kroku, czyli implementacji mechanizmu wy-
syania da na serwer PHP w momencie przekroczenia wyznaczonego
progu przez czujnik ugicia.

8
http://code.google.com/p/tinkerit/source/browse/trunk/Ethernet2+library/Ethernet2/
70  3.6. Dodanie moduu sieciowego

DNS i DHCP a modu sieciowy


Biblioteka Ethernet nie oferuje wbudowanej obsugi systemu DNS
ani protokou DHCP. Odpowiednie rozwizania najprawdopodobniej
zostan zaimplementowane w najbliszym wydaniu platformy Ar-
duino. Do tego czasu nie moemy identyfikowa serwerw za po-
moc nazw domen, np. www.mojswietnyprojektwykrywaniapoziomu-
wody.pl musimy si posugiwa adresami IP przypisanymi do
odpowiednich serwerw.
Okazuje si jednak, e dziki jednemu z mionikw platformy Ar-
duino, Georgeowi Kaindlowi, korzystanie z systemu DNS i proto-
kou DHCP jest moliwe ju teraz. Czytelnicy, ktrzy wol oszcz-
dzi cenne miejsce w pamici platformy Arduino, powinni zapozna
si z dokumentacj bibliotek moduu sieciowego tej platformy,
gdzie znajd wicej szczegw9.

Wysyanie komunikatu
Do tej pory uywalimy platformy Arduino do odczytywania wartoci
analogowych generowanych przez czujnik ugicia. Zainicjalizowalimy te
modu sieciowy w celu poczenia tej platformy z lokaln sieci komputerow.
W kodzie naszego szkicu wyznaczylimy take miejsce dla funkcji niezbdnej
do wywoania skryptu PHP na serwerze WWW. Moemy teraz przystpi
do implementacji tej funkcji. Funkcja zostanie nazwana ContactWebServer.
Funkcja ContactWebServer otrzyma na wejciu te same dwa parametry, ktre
przekazywalimy na wejciu funkcji SendWaterAlert, czyli band_value i bend_
state. Na kocu funkcji SendWaterAlert naley doda wiersz ContactWebServer
(bend_value, bend_state);, poniewa nasz program bdzie nawizywa komu-
nikacj z wyznaczonym serwerem PHP za kadym razem, gdy czujnik ugicia
zmieni swj stan.
Nasz system jest prawie gotowy. Pozostaje nam ju tylko napisanie ciaa
funkcji ContactWebServer. Kod tej funkcji bdzie odpowiada za nawizanie
poczenia ze skryptem PHP na serwerze WWW i za wysanie na ten ser-
wer odpowiednio sformatowanego dania GET protokou HTTP. Wysyany
acuch musi zawiera wartoci zmiennych bend_state i bend_value. acuch
przygotowany na poziomie szkicu zostanie nastpnie przetworzony po stronie
serwera przez odpowiedni funkcj jzyka PHP.

9
http://gkaindl.com/software/arduino-ethernet
Rozdzia 3. System powiadamiania o poziomie wody  71

Plik WaterLevelNotifier/WaterLevelNotifier.pde

void ContactWebServer(int bend_value, int bend_state)


{
Serial.println("Nawizywanie poczenia z serwerem WWW celu wysania ostrzeenia...");

if (client.connect())
{
Serial.println("Poczono z serwerem PHP");
// generuje danie protokou HTTP
client.print("GET /wateralert.php?alert=");
client.print(bend_state);
client.print("&flex=");
client.print(bend_value);
client.println(" HTTP/1.0");
client.println();
client.stop();
}
else
{
Serial.println("Prba poczenia z serwerem WWW zakoczya si niepowodzeniem");
}
}

Musimy jeszcze przetestowa gotowy szkic. Naley wysa program na


platform Arduino, otworzy w rodowisku programowania okno monitora
portu szeregowego, wygi czujnik ugicia i obserwowa komunikaty. Warto
te ledzi zawarto wybranej skrzynki odbiorczej pod ktem odpowiednich
wiadomoci poczty elektronicznej. Czy na wskazany adres dotary wiadomo-
ci zatytuowane Alarm czujnika poziomu wody i Poziom wody mieci si
w normie oraz czy te wiadomoci odpowiadaj powiadomieniom wywie-
tlanym w oknie monitora portu szeregowego? Jeli nie, warto sprawdzi, czy
platforma Arduino jest poczona z sieci domow w tym celu wystar-
czy wysa sygna ping na adres IP przypisany tej platformie.
Warto sprawdzi adres URL usugi wysyania wiadomoci (odpowiedniego
skryptu PHP) i upewni si, e otrzymujemy wiadomo po wpisaniu
w przegldarce internetowej adresu http://MJSERWERphp/wateralert.
php?alert=1&flex=486. Jeli wszystko dziaa zgodnie z oczekiwaniami,
moemy przystpi do ostatnich korekt tego projektu, aby zapewni jego
pen funkcjonalno.

3.7. czenie wszystkich elementw


Jestemy ju bardzo blisko szczliwego koca. Na tym etapie system sprawdza-
nia poziomu wody powinien wyglda tak jak na rysunku 3.4 zatytuowanym
72  3.7. czenie wszystkich elementw

Gotowy system powiadamiania o poziomie wody. Pozostaje nam ju tylko


trwae i bezpieczne zamontowanie czujnika ugicia w miejscu, w ktrym ma
by monitorowany poziom cieczy i w ktrym bdzie moliwe swobodne zgi-
nanie tego czujnika.

Rysunek 3.4. Gotowy system powiadamiania o poziomie wody

Punkt, w ktrym dwa przewody poczono z kocwkami czujnika ugicia,


musi by na tyle stabilnie zamocowany, aby nie zmieni pooenia w razie
podniesienia si poziomu wody i uniesienia spawika. Jeli to mocowanie
nie bdzie do sztywne, czujnik ugicia pozostanie wyprostowany, a odpo-
wiedni szkic platformy Arduino nie wyle powiadomienia o rosncym pozio-
mie wody. Podstawa czujnika musi wic by stabilna i zabezpieczona przed
obracaniem.
Polecam zastosowanie kleju, wa termokurczliwego lub mocnej tamy klej-
cej. Jeli mimo zastosowanych rodkw podstawa czujnika wci nie jest
do stabilna, warto dodatkowo zastosowa drewniane listwy. Podstaw czuj-
nika (kocwk, do ktrej podczono przewody) naley umieci pomidzy
listwami. Cao naley wielokrotnie oklei tam izolacyjn. Tak usztywnion
kocwk czujnika mona teraz przymocowa do drewnianego supka (np.
o przekroju 24 cm), ktry zostanie zainstalowany w zbiorniku na wod.
W przypadku osadnika w piwnicy konieczne bdzie zdjcie pokrywy, zmie-
rzenie wewntrznej rednicy zbiornika i poproszenie stolarza lub sprzedawcy
w sklepie z materiaami budowlanymi o przycicie drewna do odpowiedniego
ksztatu. Warto przyci listw w taki sposb, aby bya o centymetr dusza,
ni wynosi rednica zbiornika dziki temu caa konstrukcja bdzie sztyw-
niejsza.
Rozdzia 3. System powiadamiania o poziomie wody  73

Podobne rozwizanie mona zastosowa w osuszaczu. Zamiast duego ka-


waka drewna uywanego w roli podstawy dla czujnika ugicia wystarczy
uy cienkiej listwy (na przykad fragmentu drewnianego wieszaka) przy-
citej do rednicy zbiornika na wod zbieran przez osuszacz. Usztywnion
kocwk czujnika ugicia naley zamontowa w rodku gwnej listwy.
W zalenoci od gbokoci zbiornika osuszacza by moe trzeba bdzie
przenie t listw nieco wyej, tak aby czujnik ugicia nie wysya ostrzee
zbyt wczenie, na przykad po zapenieniu poowy zbiornika.
Po uzyskaniu zadowalajcej stabilnoci czujnika ugicia naley zamontowa
spawik i sam czujnik w niewielkiej plastikowej torbie, na przykad w szczel-
nym woreczku niadaniowym. Dziki temu czujnik pozostanie suchy i odpo-
wiednio zabezpieczony na wypadek wzrostu poziomu wody. Przewody pod-
czone do czujnika naley wyprowadzi co najmniej metr ponad miejsce
instalacji czujnika i podczy do panelu Arduino lub moduu sieciowego.
Platform Arduino naley podczy do 9-woltowego zasilacza, a do moduu
Ethernetu naley podczy przewd sieciowy. Po kilku sekundach od
podczenia platformy Arduino do prdu naley przeprowadzi krtki test
ugicia. Jeli w wyniku testu na skrzynk poczty elektronicznej trafi od-
powiednie powiadomienia, nasz system dziaa prawidowo!
Moemy teraz ponownie zainstalowa przykryw monitorowanego zbior-
nika na wod i czeka na powiadomienie o rosncym poziomie wody.

3.8. Nastpne kroki


Gratuluj pomylnej realizacji pierwszego projektu automatyzacji domu przy
uyciu platformy Arduino. Podczas prac nad tym projektem miae okazj
opanowa wiele umiejtnoci, ktre bd przydatne w pozostaych projek-
tach. Miae okazj programowa platform Arduino, pobiera i przetwa-
rza dane generowane przez czujnik ugicia oraz wysya wiadomoci poczty
elektronicznej za porednictwem moduu sieciowego platformy Arduino
i skryptu PHP na serwerze WWW. Wszystkie te techniki bdziemy stoso-
wali w czci pozostaych projektw prezentowanych w tej ksice.
Jedn z najwikszych zalet projektowania i budowy wasnych projektw
jest moliwo dostosowywania tworzonych rozwiza do indywidualnych,
niepowtarzalnych potrzeb. Przekroczenie wyznaczonego poziomu wody ma
powodowa umieszczenie wpisu na Twitterze zamiast wysania wiadomoci
poczty elektronicznej? To aden problem. Wystarczy zastpi fragment kodu
74  3.8. Nastpne kroki

odpowiedzialny za wysyanie wiadomoci poczty elektronicznej kodem za-


czerpnitym z projektu wierkajcy karmnik dla ptakw opisanego w dal-
szej czci tej ksiki. A moe wolisz zastpi elektroniczne wiadomoci ja-
kim wizualnym wskanikiem, na przykad w formie migajcej czerwonej
lampy, aby poczu si jak bohaterowie filmw akcji? To proste. Lamp mo-
na wcza i wycza w staych odstpach czasu za pomoc kodu zaczerp-
nitego z projektu Internetowy wcznik wiata.
Oto kilka innych pomysw na wykorzystanie i rozbudow systemu zoo-
nego z czujnika ugicia:
Zmienne dane analogowe generowane przez czujnik ugicia mona
z powodzeniem wykorzysta nie tylko do oceny stanu czujnika, ale
te do badania kta ugicia. T ciekaw waciwo czujnika mona
wykorzysta w systemie ledzcym i rejestrujcym intensywno
opadw deszczu (na podstawie rosncego poziomu wody w zbiorniku
reprezentowanego przez stopie ugicia czujnika z przymocowanym
spawikiem).
Warto rozway dodanie do szkicu mechanizmu wysyania komuni-
katw w staych odstpach czasu (np. co godzin) i opracowanie
funkcji PHP odpowiedzialnej za otrzymywanie tych komunikatw.
Wysyane komunikaty powinny obejmowa biece wskazania czujnika
ugicia. Zarejestrowane wartoci naley przeanalizowa pod ktem
anomalii, na przykad braku wartoci (czyli wartoci rwnej 0 w wyni-
ku jakiego uszkodzenia) lub wartoci wikszych ni 999 (wskutek
krtkiego spicia). Kade wykrycie takiej wartoci progowej powin-
no powodowa wysanie stosownej wiadomoci poczty elektronicznej.
Co wicej, w razie braku komunikatw wysanych przez platform
Arduino w cigu dwch godzin skrypt PHP powinien poinformowa
uytkownika o prawdopodobnej awarii. Ten rozszerzony mecha-
nizm monitorowania poinformuje nas o ewentualnych problemach
sprztowych wymagajcych naszej interwencji.
Na kalibracj czujnika ugicia mog mie wpyw zmiany temperatury.
System mona uzupeni o czujnik temperatury, tak aby wartoci pro-
gowe byy dobierane dynamicznie zalenie od temperatury otoczenia.
Obawiasz si szkd powodowanych przez silne wiatry (na przykad
uszkodzenia dachu)? Wystarczy zastpi spawik anemometrem po-
dobnym do tych sprzedawanych wraz ze stacjami pogody, zainstalo-
wa ten czujnik na zewntrz budynku i czeka na wiadomoci poczty
elektronicznej generowane w czasie silnego wiatru.
Rozdzia 3. System powiadamiania o poziomie wody  75

Jeli zamontowae drzwiczki dla swojego psa lub kota, moesz za-
montowa czujnik ugicia ponad drzwiczkami i tak skierowa drugi
koniec czujnika, aby swobodnie lizga si po powierzchni drzwiczek
i jednoczenie wychyla si wraz z tymi drzwiczkami. Tak zamontowa-
ny czujnik mona poczy z kamer internetow, aby sprawdzi,
czy rzeczywicie nasze zwierz korzysta z dodatkowego wejcia, czy
raczej nasz dom jest odwiedzany przez nieproszonych goci.
76  3.8. Nastpne kroki
Rozdzia 4.
Elektryczny
pies strujcy

P
amitasz, jak ostatni raz odwiedzie znajomych, ktrzy maj wielkie-
go psa? Czy donone szczekanie niskim tonem, ktre rozlego si
zaraz po naciniciu dzwonka, nie wywoao u Ciebie niepokoju przed
wejciem do mieszkania? Wikszo wacicieli psw docenia czujno
swoich czworononych przyjaci. Psy potrafi byskawicznie reagowa na
ruch i natychmiast przystpowa do dziaania, ktre najczciej polega na
szczekaniu, wychylaniu pyskw zza zason w oknach i innych czynnociach
niezbdnych do sprawdzenia, co dzieje si na zewntrz.
Elektryczny pies strujcy oferuje bardzo podobne korzyci w sferze bezpie-
czestwa i jednoczenie nie ma wad prawdziwych psw, choby w postaci
wszechobecnej sierci (patrz rysunek 4.1 zatytuowany Odstraszanie nie-
chcianych goci za pomoc elektrycznego psa strujcego).
Projekt wymaga poczenia platformy Arduino, moduu dwikowego, pa-
sywnego czujnika ruchu na podczerwie (ang. Passive InfraRed PIR)
oraz silnika wykonawczego. Po zaprogramowaniu i aktywowaniu system
bdzie naladowa wciekego psa, ktry tylko czeka na okazj, eby rzuci si
na niepodanego gocia. Niewielki prt przymocowany do ramion silnika
wykonawczego bdzie naladowa ruchy zdenerwowanego, skaczcego psa.
78  4.1. Czego potrzebujemy

Rysunek 4.1. Odstraszanie niechcianych goci za pomoc elektrycznego


psa strujcego

Fragmenty ubra doczepione na drugim kocu tego kija bd ustawione


w taki sposb, aby powodowa ruch zasony lub firany w oknie. Wykrycie
ruchu bdzie uruchamiao serwomotor, ktry spowoduje ruch kija w gr
i w d. Fragmenty ubra doczepione na kocu tego kija bd powodoway
falowanie zasony w oknie, a z gonika poczonego z moduem dwikowym
bdzie si wydobywao gone, losowo generowane szczekanie i warczenie.
Poczenie dwiku i ruchu bdzie przypominao gonego psa prbujcego
za wszelk cen wystawi pysk za zason.
Gotowy system bdzie w peni przenony, poniewa elektryczny pies stru-
jcy moe by ustawiany w drzwiach, przy oknie lub nawet w pomieszczeniu,
ktre chcemy chroni przed wizytami niepodanych goci.

4.1. Czego potrzebujemy


Projekt wymaga zaledwie kilku komponentw. czny koszt wszystkich cz-
ci nie powinien przekroczy czterystu zotych. Poniewa jednak wszystkie
te elementy mona wykorzysta take w pozostaych projektach opisanych
w tej ksice (oraz we wasnych inicjatywach typu zrb to sam), wspomniane
Rozdzia 4. Elektryczny pies strujcy  79

wydatki mona traktowa jako usprawiedliwion inwestycj. Do skonstru-


owania elektrycznego psa strujcego bdziemy potrzebowali nastpujcych
elementw (patrz rysunek 4.2 zatytuowany Czci elektrycznego psa str-
ujcego):
1. Arduino Uno;
2. pakiet rozszerzajcy platform Arduino o obsug muzyki i dwiku
dostpny w sklepie Adafruit (pakiet obejmuje modu sieciowy, go-
nik, przewd i kart SD)1;
3. standardowy serwomotor z wysokim momentem obrotowym ;
2

4. pasywny czujnik ruchu na podczerwie (PIR);


5. 9-woltowy zasilacz dla platformy Arduino (potrzebny do zasilania
systemu po odczeniu przewodu USB);
6. twardy drewniany kij ze skrawkami materiau lub gumy przyczepio-
nymi na jednym kocu (potrzebnymi do poruszania firan lub za-
son);
7. przewd, drut w plastikowej osonce lub gumki do przymocowania
drewnianego kija do silnika.

Rysunek 4.2. Czci elektrycznego psa strujcego

1
http://www.adafruit.com/products/175
2
http://www.adafruit.com/products/155
80  4.2. Budowa rozwizania

Podczas budowy tego projektu bdziemy potrzebowali take standardowego


przewodu USB A-B do poczenia platformy Arduino z komputerem. Ser-
womotor mona kupi w lokalnym sklepie dla majsterkowiczw, natomiast
czujniki ruchu na podczerwie s dostpne w wielu zwykych sklepach z cz-
ciami elektronicznymi, a take w sklepach internetowych.
Zacznijmy od poczenia trzech najwaniejszych elementw tego projektu,
aby mogy wspdziaa i naladowa agresywne zwierz.

4.2. Budowa rozwizania


To bdzie jeden z najprostszych projektw opisanych w tej ksice, poniewa
ograniczymy si wycznie do platformy Arduino, gotowego moduu rozsze-
rzajcego t platform, jednego czujnika i jednego silnika. Gotowy zmonto-
wany system powinien przypomina konstrukcj pokazan na rysunku 4.3
zatytuowanym Elektryczny pies strujcy. Proces budowy tego systemu
bdzie si skada z nastpujcych krokw:
1. Poczenie platformy Arduino z moduem dwikowym.
2. Podczenie czujnika ruchu PIR do wtyku zasilania, wtyku uziemie-
nia i jednego z dostpnych wtykw cyfrowych moduu dwikowego.
3. Podczenie silnika do wtyku zasilania, wtyku uziemienia i jednego
z pozostaych wtykw cyfrowych moduu dwikowego.
4. Pobranie dodatkowych bibliotek platformy Arduino niezbdnych
do sterowania dziaaniem moduu dwikowego i unikania kon-
fliktw zasobw w zwizku z jednoczesnym wysyaniem rozkazw
do serwomotoru.
5. Napisanie szkicu, ktry w reakcji na wykrycie ruchu przez czujnik
PIR bdzie powodowa losowe ruchy serwomotoru i odtwarza
fragment pliku dwikowego.
Czytelnicy, ktrzy do tej pory nie mieli okazji czy ani testowa moduu
dwikowego, powinni zapozna si z materiaami dostpnymi na stronie
Ladyady3. Po sprawdzeniu dziaania tego moduu mona przystpi do pod-
czania czujnika ruchu na podczerwie oraz urzdzenia wykonawczego (w tym
przypadku serwomotoru) do dostpnych wtykw tego moduu.

3
http://www.ladyada.net/make/waveshield/
Rozdzia 4. Elektryczny pies strujcy  81

Rysunek 4.3. Elektryczny pies strujcy

Ja pyta...
Czy istnieje jaki modu platformy Arduino
odtwarzajcy pliki MP3?
Tak! W sklepie internetowym Sparkfun mona znale rozszerzenie
platformy Arduino nazwane moduem MP3 i przypominajce stan-
dardowy modu dwikowy firmy Adafruit4. Z uwagi na rnice
dzielce niezbdne biblioteki w tym rozdziale skoncentruj si na
implementacji moduu dwikowego. Zainteresowanych czytelnikw
zachcam do samodzielnych eksperymentw z alternatywnym mo-
duem MP3 firmy Sparkfun. Czytelnikw, ktrzy potrzebuj moduu
dwikowego zdolnego do odtwarzania plikw w dodatkowych
formatach, jak Windows Media Audio, MIDI czy Ogg Vorbis, z pew-
noci zainteresuje modu Seeed Music Shield dostpny w sklepie
Maker Shed Seeed Music Shield jest przykadem doskonaej in-
tegracji funkcji odtwarzania plikw audio ze wietnie zaprojekto-
wanym moduem platformy Arduino5.

4
http://www.sparkfun.com/products/9736
5
http://www.makershed.com/ProductDetails.asp?ProductCode=MKSEEED14
82  4.3. System elektrycznego psa strujcego

4.3. System elektrycznego


psa strujcego
Warto teraz przyjrze si poczeniom na rysunku 4.4 zatytuowanym
Schemat pocze w systemie elektrycznego psa strujcego. Schemat
ilustruje sposb czenia przewodw z moduem dwikowym. Sam modu
dwikowy naley umieci na pytce Arduino. Naley pamita, e modu
dwikowy uywa wielu wtykw do samej komunikacji z platform Ardu-
ino, std nie wszystkie wtyki s dostpne dla szkicu tworzonego w ramach
tego projektu. Wystarczy postpowa cile wedug tego schematu, a po-
czenie caego systemu nie powinno sprawi najmniejszego problemu.

Rysunek 4.4. Schemat pocze w systemie elektrycznego psa strujcego

Dodatni kocwk czujnika ruchu PIR naley poczy z wtykiem 3,3 V


na pytce moduu dwikowego. Ujemn kocwk tego czujnika naley
poczy z jednym z wtykw uziemienia moduu dwikowego. Przewd
sterujcy (rodkowy wtyk lub rodkow kocwk czujnika PIR) naley na-
stpnie poczy z cyfrowym wtykiem nr 12 moduu dwikowego.
W nastpnym kroku naley poczy dodatni kocwk serwomotoru z 5-
woltowym wtykiem moduu dwikowego. Ujemn kocwk silnika naley
poczy z drugim dostpnym wtykiem uziemienia na pytce moduu dwi-
Rozdzia 4. Elektryczny pies strujcy  83

kowego. Na kocu naley podczy kocwk sterujc do wtyku cyfro-


wego nr 11 na pytce moduu dwikowego.
Na potrzeby testw mona doczy do przewodw kocwki mskie, po
czym podczy je bezporednio do odpowiednich gniazd moduu dwi-
kowego. Docelowo naley oczywicie zastosowa bardziej niezawodne
poczenia w formie gotowych wtyczek mskich lub eskich. Odpowiednie
wtyczki s dostpne w sklepach oferujcych platformy i moduy Arduino.
Jeli modu dwikowy ma by uywany wycznie do tego projektu, warto
rozway trwae przylutowanie przewodw do wtykw tego moduu, aby
zagwarantowa moliwie najbardziej trwae poczenia elektryczne.
Przed przystpieniem do pisania szkicu mona wykona jeszcze jeden krok.
Musimy albo nagra i zapisa w cyfrowej formie szczekanie i warczenie
jakiego psa (najlepiej w wielu wersjach), albo pobra (z legalnego r-
da) gotowe prbki takich dwikw.
Pierwsze rozwizanie zajmie wicej czasu i bdzie wymagao dostpu do
psa, ktry umie szczeka i warcze na komend. Co wicej, warunkiem na-
grania odpowiednich dwikw bdzie trzymanie mikrofonu bezporednio
obok pyska i kw rozjuszonego zwierzcia! To rozwizanie wymaga co
prawda dodatkowej pracy, jednak uzyskany efekt najprawdopodobniej
bdzie bardziej realistyczny i przekonujcy. Poniewa rdem nagrania
jest prawdziwy, znany nam pies, moemy by pewni, e efekt bdzie wy-
starczajco wiarygodny.
Drugie rozwizanie, polegajce na znalezieniu w internecie rnych pr-
bek dwikw wydawanych przez rozjuszone psy, jest wygodniejsze, ale
te rzadko pozwala uzyska rwnie przekonujcy i wiarygodny efekt. Pro-
blem dotyczy szczeglnie prbek szczekania i warczenia przez psy rnych
ras. Czy to moliwe, aby jeden pies warcza jak wcieky doberman, aby
minut pniej ujada jak may pudelek? Co wicej, pobierajc gotowe prbki
dwikw z internetu, musimy mie na uwadze prawa autorskie twrcw
tych plikw. Polecam serwis internetowy Freesound Project6, w ktrym mo-
na znale mnstwo prbek dwikw dostpnych na zasadach opisanych
w licencji Creative Commons Sampling Plus.

6
http://www.freesound.org
84  4.3. System elektrycznego psa strujcego

Ja pyta...
Jak dziaa czujnik ruchu PIR?
Czujnik PIR wykrywa ruch, porwnujc dwie prbki promieniowania
podczerwonego emitowanego przez poruszajce si ciao, ktre
jest cieplejsze od rodowiska za nim. W momencie, w ktrym jed-
na strona czujnika odczyta wysz warto od drugiej strony, czujnik
wysya do cyfrowego wtyku sygna o wykryciu ruchu. Czujnik pod-
czerwony bdcy sercem czujnika ruchu PIR jest zwykle pokryty sfe-
ryczn soczewk, ktra uatwia koncentrowanie wiata i tym samym
wykrywanie zmian w obrazie podczerwonym (a wic take ruchu).
Szczegowe wyjanienie zasad dziaania czujnikw ruchu PIR wraz
z niezbdnymi podstawami teoretycznymi mona nale na odpo-
wiedniej stronie internetowej serwisu Ladyady7.

Po uzyskaniu piciu plikw dwikowych (niezalenie od ich rda) naley


przekonwertowa je na format, ktry bdzie prawidowo interpretowany
przez modu dwikowy. Zgodnie z instrukcjami dostpnymi na witrynie
internetowej Ladyady8 prbki powinny mie format PCM (WAV), a ich
parametry nie mog przekracza wartoci 22 kHz, 16-bit, mono. W tym
przypadku powinnimy stosowa pliki moliwie najwyszej jakoci, a prze-
strze dostpna na karcie SD z pewnoci nie stanowi powanego ograni-
czenia. aden z wybranych plikw dwikowych nie powinien trwa duej
ni pi sekund, tak aby generowany dwik sprawia wraenie lepiej zsyn-
chronizowanego z ruchami powodowanymi przez serwomotor.
Do zaimportowania, konwersji i zapisania plikw dwikowych w odpowied-
nim formacie mona uy edytora audio, na przykad programu Audacity9.
Aby upewni si, e tak przygotowane pliki s rzeczywicie zgodne z wyma-
ganiami moduu dwikowego, wystarczy skopiowa te pliki na kart SD,
umieci t kart w gniedzie moduu i uruchomi szkic dap_hc.pde (dostp-
ny w serwisie internetowym Ladyady)10. Warto zwrci uwag na pewn

7
http://www.ladyada.net/learn/sensors/pir.html
8
http://www.ladyada.net/make/waveshield/convert.html
9
http://audacity.sourceforge.net/
10
http://www.ladyada.net/make/waveshield/libraryhc.html
Rozdzia 4. Elektryczny pies strujcy  85

zmian, ktr wprowadzimy w demonstracyjnym szkicu Ladyady opracowa-


nym dla moduu dwikowego. Zamiast nowszej biblioteki wavehc, ktrej
uyto w oryginalnym szkicu, zastosujemy nieco starsz bibliotek AF_Wave.
Dziki temu bdziemy mogli uy biblioteki MediaPlayer autorstwa uyt-
kownika avandalen, czonka spoecznoci programistw platformy Arduino11
biblioteka znacznie upraszcza operowanie na plikach wave przy uyciu
moduu dwikowego. Wspomniana biblioteka (oraz biblioteki opracowane
przez innych czonkw spoecznoci programistw platformy Arduino dla
serwomotoru) zostanie omwiona w nastpnym podrozdziale.

4.4. Szkolenie psa


Szkic, ktry opracujemy w tym podrozdziale, bdzie odpowiada za monito-
rowanie czujnika PIR pod ktem zdarze powodowanych przez ruch w za-
sigu tego czujnika. W razie wykrycia ruchu modu odtworzy losowo jeden
z piciu rnych plikw dwikowych zapisanych na karcie SD tego mo-
duu. W tym samym czasie serwomotor wykonuje obroty o maksymalnie 150
stopni (w zalenoci od odtwarzanego dwiku). Drewniany kij naley w taki
sposb przymocowa do serwomotoru, aby obroty tego silnika powodoway
ruch kija w gr i w d. Umieszczenie kija za zason lub firan stworzy
wraenie, e grony pies prbuje przeoy pysk bliej drzwi lub okna, aby
sprawdzi, kto zblia si do domu.
Musimy najpierw doczy plik nagwkowy MediaPlayer.h wraz z dwoma
plikami zalenymi (pgmspace.h, ktry jest czci biblioteki zarzdzania pa-
mici doczanej do standardowej instalacji platformy Arduino, oraz util.h,
ktry jest czci oryginalnej biblioteki AF_Wave moduu dwikowego).
Poniewa klasy biblioteki MediaPlayer uywaj elementw biblioteki AF_Wave,
musimy pobra i rozpakowa plik tej biblioteki, a nastpnie skopiowa wypa-
kowany folder AF_Wave do folderu libraries platformy Arduino12.
Musimy nastpnie uruchomi rodowisko Arduino IDE i utworzy nowy
szkic nazwany ElectricGuardDog. Bibliotek MediaPlayer mona pobra
ze strony internetowej tzw. placu zabaw platformy Arduino13. Pobrany plik
naley nastpnie rozpakowa, a otrzymane w ten sposb pliki MediaPlayer.h,

11
http://www.arduino.cc/playground/Main/Mediaplayer
12
http://www.ladyada.net/media/wavshield/AFWave_18-02-09.zip
13
http://www.arduino.cc/playground/Main/Mediaplayer
86  4.4. Szkolenie psa

MediaPlayer.pde i MediaPlayerTestFunctions.pde naley umieci w folderze


ElectricGuardDog, ktry zosta utworzony przez rodowisko Arduino IDE
podczas tworzenia pliku ElectricGuardDog.pde. Czytelnicy, ktrzy pobrali
pliki projektu udostpnione dla tej ksiki, powinni ju teraz dysponowa
wszystkimi plikami niezbdnymi do dziaania biblioteki Mediaplayer. Bi-
blioteka Mediaplayer znacznie uatwia zarzdzanie odtwarzaniem plikw
dwikowych.
Musimy uy jeszcze jednej biblioteki niestandardowej, aby sterowa ser-
womotorem. Prba kompilacji tego szkicu przy uyciu standardowej klasy
Servo platformy Arduino zakoczyaby si niepowodzeniem i wywietleniem
nastpujcego komunikatu o bdzie:
Servo/Servo.cpp.o: In function `__vector_11':
/Applications/Arduino.app/Contents/Resources/Java/libraries/Servo/Servo.cpp:103:
multiple definition of `__vector_11'

AF_Wave/wave.cpp.o:/Applications/Arduino.app/
Contents/Resources/Java/libraries/AF_Wave/wave.cpp:33: first defined here

Z czego wynika ten bd? Biblioteka AF_Wave przejmuje to samo przerwa-


nie wektorowe co biblioteka standardowa Servo. Na szczcie jeden z czon-
kw spoecznoci programistw platformy Arduino, Michael Margolis,
napisa bibliotek, ktra umoliwia tej platformie sterowanie maksymalnie
omioma serwomotorami jednoczenie. Wspomniana biblioteka eliminuje
przy okazji problem powtarzajcych si zasobw, ktry wystpowa w orygi-
nalnej bibliotece Servo (podczas stosowania cznie z moduem dwikowym).
Po pobraniu biblioteki ServoTimer214 naley rozpakowa i skopiowa za-
warto spakowanego pliku do folderu ServoTimer2 w ramach folderu libraries
platformy Arduino. Warto pamita, e po dodaniu kadej nowej biblioteki
do folderu libraries platformy Arduino naley ponownie uruchomi rodowi-
sko Arduino IDE, tak aby kompilator avr-gcc platformy Arduino mia mo-
liwo rozpoznania nowej biblioteki.
Po zapewnieniu dostpu do biblioteki AF_Wave moduu dwikowego
i biblioteki ServoTimer2 serwomotoru naley umieci na pocztku szkicu
nastpujce odwoania:
Plik ElectricGuardDog/ElectricGuardDog.pde

#include <avr/pgmspace.h>
#include "util.h"
#include "MediaPlayer.h"
#include <ServoTimer2.h>

14
http://www.arduino.cc/playground/uploads/Main/ServoTimer2.zip
Rozdzia 4. Elektryczny pies strujcy  87

Musimy teraz utworzy kilka zmiennych potrzebnych do przypisania wtykw


platformy Arduino i wartoci pocztkowych czujnika i urzdzenia wyko-
nawczego (silnika).
Plik ElectricGuardDog/ElectricGuardDog.pde

int ledPin = 13; // wbudowana dioda LED


int inputPin = 12; // wtyk wejciowy dla czujnika ruchu PIR
int pirStatus = LOW; // warto LOW reprezentuje prg braku wykrytego ruchu
int pirValue = 0; // zmienna uywana do przechowywania odczytanego statusu
// wtyku inputPin
int servoposition = 0; // pocztkowe pooenie serwomotoru

Naley teraz utworzy dwa obiekty skonstruowane na podstawie bibliotek


MediaPlayer i ServoTimer2, aby atwiej sterowa serwomotorem i moduem
dwikowym.
Plik ElectricGuardDog/ElectricGuardDog.pde

ServoTimer2 theservo; // tworzy obiekt theservo klasy ServoTimer2


MediaPlayer mediaPlayer; // tworzy obiekt mediaPlayer
// klasy MediaPlayer

Utworzone zmienne naley teraz przypisa do trybw wtykw platformy Ar-


duino (odpowiednie wyraenia naley umieci w funkcji setup() tworzonego
szkicu). Warto teraz nawiza poczenie z oknem portu szeregowego rodo-
wiska Arduino IDE, aby monitorowa zdarzenia zwizane z wykrywa-
niem ruchu i odtwarzaniem dwiku. W tej czci kodu wywoujemy te
funkcj randomSeed() platformy Arduino, aby okreli warto pocztkow
generatora liczb losowych. Pobierajc warto z wtyku analogowego nr 0
na pytce Arduino, moemy do skutecznie wygenerowa liczb pseudo-
losow zalen od szumu elektrycznego na tym wtyku.
Plik ElectricGuardDog/ElectricGuardDog.pde

void setup() {
pinMode(ledPin, OUTPUT); // ustawia tryb pinMode OUTPUT dla wbudowanej diody LED
pinMode(inputPin, INPUT); // ustawia tryb INPUT dla wtyku inputPin
// (czujnika ruchu PIR)
theservo.attach(7); // czy cyfrowe wyjcie serwomotoru z wtykiem nr 7
randomSeed(analogRead(0)); // przekazuje warto pocztkow dla generatora liczb
// losowych platformy Arduino
Serial.begin(9600);
}

Skoro dysponujemy ju niezbdnymi bibliotekami, zmiennymi, obiektami


i kodem inicjalizujcym, moemy przystpi do implementacji gwnej ptli
szkicu. W najwikszym uproszczeniu musimy w jednosekundowych odstpach
monitorowa czujnik ruchu PIR pod ktem zmiany stanu. W razie wykrycia
ruchu czujnik PIR wyle sygna HIGH na wtyk nr 12. Po spenieniu tego wa-
88  4.4. Szkolenie psa

runku nasz szkic powinien zapali wbudowan diod LED i wysa komuni-
kat o wykryciu ruchu do okna portu szeregowego rodowiska Arduino IDE.
Moemy teraz wygenerowa liczb losow z przedziau od 1 do 5 na pod-
stawie utworzonej wczeniej wartoci pocztkowej generatora. Uzyskan
w ten sposb warto wykorzystujemy do odtworzenia jednego z plikw
dwikowych i wymuszenia na serwomotorze okrelonej liczby obrotw.
Po wykonaniu tej operacji nasz program czeka jedn sekund, przywraca
ustawienie pocztkowe serwomotoru i wykonuje ca ptl od pocztku. Jeli
czujnik PIR nie wykryje ruchu (jeli sygna na wtyku nr 12 jest rwny LOW),
wyczamy wbudowan diod LED, wysyamy do okna monitorowania portu
szeregowego komunikat Brak ruchu, zatrzymujemy odtwarzanie dwiku
i przywracamy warto LOW we fladze pirStatus.
Plik ElectricGuardDog/ElectricGuardDog.pde

void loop(){
pirValue = digitalRead(inputPin); // sprawdza warto czujnika PIR
if (pirValue == HIGH) { // jeli wykryto ruch
digitalWrite(ledPin, HIGH); // wcza wbudowan diod LED
if (pirStatus == LOW) { // wymusza ruch serwomotoru
Serial.println("Wykryto ruch");
// generuje liczb losow z przedziau od 1 do 5, aby wybra przypadkowy
// plik dwikowy,
// po czym odtwarza ten plik i wymusza obrt serwomotoru o liczb stopni
// zalen od wylosowanej wartoci
switch (random(1,6)) {
case 1:
Serial.println("Odtwarzanie pliku 1.WAV");
theservo.write(1250);
mediaPlayer.play("1.WAV");
break;
case 2:
Serial.println("Odtwarzanie pliku 2.WAV");
theservo.write(1400);
mediaPlayer.play("2.WAV");
break;
case 3:
Serial.println("Odtwarzanie pliku 3.WAV");
theservo.write(1600);
mediaPlayer.play("3.WAV");
break;
case 4:
Serial.println("Odtwarzanie pliku 4.WAV");
theservo.write(1850);
mediaPlayer.play("4.WAV");
break;
case 5:
Serial.println("Odtwarzanie pliku 5.WAV");
theservo.write(2100);
mediaPlayer.play("5.WAV");
Rozdzia 4. Elektryczny pies strujcy  89

break;
}

delay(1000); // czeka sekund


theservo.write(1000); // przywraca pocztkow pozycj serwomotoru
pirStatus = HIGH; // ustawia warto HIGH flagi pirStatus, aby zatrzyma
// dziaanie mechanizmu
}
} else {
digitalWrite(ledPin, LOW); // wycza wbudowan diod LED
if (pirStatus == HIGH){
Serial.println("Brak ruchu");
mediaPlayer.stop();
pirStatus = LOW; // ustawia warto LOW flagi pirStatus, aby
// czujnik by przygotowany na zdarzenie ruchu
}
}
}

Po zapisaniu tego kodu w pliku ElectricGuardDog.pde naley otworzy


nowo utworzony folder ElectricGuardDog (w ktrym powinien znajdowa
si plik rdowy ElectricGuardDog.pde). W katalogu ElectricGuardDog
naley umieci take rozpakowane pliki biblioteki MediaPlayer. Warto
te raz jeszcze sprawdzi, czy rozpakowane pliki biblioteki ServoTimer2
znajduj si w katalogu libraries platformy Arduino.
Naley ponownie uruchomi rodowisko Arduino IDE, zaadowa plik
ElectricGuardDog.pde i klikn dostpn na pasku narzdzi ikon Verify.
Jeli wszystko zostanie skompilowane bez adnych bdw, moemy by
pewni, e kod zosta wpisany prawidowo, a niezbdne pliki bibliotek znaj-
duj si w odpowiednich katalogach. W przeciwnym razie naley przeanali-
zowa komunikaty o bdach pod ktem informacji o brakujcych bibliotekach
i uzupeni ewentualne braki.
Po pomylnym skompilowaniu szkicu moemy przystpi do testowania i do-
strajania naszego kodu.

4.5. Testowanie
Czujnik ruchu PIR naley umieci w miejscu, ktre umoliwi wygodne te-
stowanie wykrywania ruchu. Po zainstalowaniu czujnika warto pobra gotowy
szkic i otworzy okno portu szeregowego rodowiska Arduino IDE.
Aby wyzwoli sygna czujnika ruchu, wystarczy pomacha przed nim rk.
Nasz elektryczny pies strujcy powinien zareagowa na ten ruch odtworze-
niem pliku dwikowego i ruchem serwomotoru. Jeli uznamy, e obrt
90  4.6. Spuszczamy psa

serwomotoru powinien by nieco inny, powinnimy zmodyfikowa wywo-


ania metody theservo.write() (na jej wejciu naley przekazywa wartoci
z przedziau od 1000 do 2200). Sugerowany przedzia wartoci wejciowych
wynika z tego, e biblioteka ServoTimer2 operuje na mikrosekundach, nie
na ktach wyraonych w stopniach (jak w przypadku oryginalnej biblioteki
Servo). W tej sytuacji wyznaczenie waciwego kta obrotu wymaga prze-
prowadzenia odpowiednich eksperymentw. Po wybraniu wartoci pasu-
jcych do parametrw uywanego serwomotoru naley przeprowadzi
testy, aby liczba i zakres obrotw tego silnika byy moliwie naturalne.
Skoro przetestowalimy i dobralimy odpowiednie wartoci (i zsynchroni-
zowalimy ruch serwomotoru z odtwarzanymi plikami dwikowymi),
moemy przystpi do montau gotowego systemu.

4.6. Spuszczamy psa


Warto dobrze przemyle miejsce instalacji czujnika ruchu PIR. Umiesz-
czenie czujnika wewntrz, za szyb okna uniemoliwi ledzenie ruchu na
zewntrz budynku, poniewa czujnik nie moe analizowa obrazu pod-
czerwonego przez szyb. W idealnych warunkach czujnik ruchu na pod-
czerwie ma przed sob woln przestrze do monitorowania. Jeli czujnik
ma by zamontowany nad drzwiami wejciowymi, przewody poczone
z czujnikiem naley doprowadzi do platformy Arduino (poczonej z mo-
duem dwikowym) zamontowanej w skrzynce wewntrz domu.
Warto te poeksperymentowa z poziomem gonoci. Niewielki gonik do-
czany do pakietu muzyki i dwiku firmy Adafruit by moe sprawdzi si
podczas testw, ale z pewnoci nie bdzie do gony, aby zwrci uwa-
g osb w ssiednim pokoju (nie mwic o intruzach na zewntrz budynku).
Warto uy gniazda suchawek moduu dwikowego i podczy do systemu
jakie wzmocnione goniki, na przykad magnetofon lub wie stereo. Naley
ustawi gono na takim poziomie, aby kady go sysza donone
szczekanie.
Jeden koniec drewnianego kija naley przymocowa do koa serwomotoru
za pomoc drutu, drutu w plastikowej otoczce lub gumki. Na drugim kocu
kija naley przytwierdzi stare ubranie, skrawki materiau lub gumow oson,
aby zabezpieczy powierzchni, przy ktrej ten gumowy kij bdzie wyko-
nywa ruchy przypominajce rozzoszczonego psa. Efekt wizualny mona
dodatkowo wzmocni, montujc na kocu kija plastikowy pysk psa, ktry
Rozdzia 4. Elektryczny pies strujcy  91

mona kupi na przykad w sklepie z przebraniami dla dzieci. Moemy


puci wodze fantazji! Musimy jednak uwaa, aby elementy na kocu kija
nie byy zbyt cikie dla momentu obrotowego serwomotoru (aby zbyt dua
waga nie utrudniaa wykonywania odpowiednich ruchw).
Cz systemu obejmujc serwomotor i drewniany kij z odpowiednim za-
koczeniem naley umieci bezporednio przy zasonie w oknie, najlepiej
w miejscu dobrze widocznym dla osb zbliajcych si do drzwi wejciowych.
W momencie wykrycia ruchu przez czujnik PIR rozlegnie si gone szczeka-
nie (odtwarzane przez modu dwikowy), a kocwka drewnianego kija
stworzy iluzj psiego pyska poruszajcego si za zason. Z perspektywy
osoby zbliajcej si do drzwi cao bdzie przypominaa rozzoszczone
zwierz, ktre tylko czeka, aby rzuci si na nieproszonego gocia. Dostoso-
wanie wszystkich parametrw tak, aby system dziaa w peni prawidowo,
wymaga troch czasu, jednak po prawidowym skonfigurowaniu tego me-
chanizmu poczenie dwiku i ruchu powinno by bardzo przekonujce!

4.7. Nastpne kroki


Poniej opisaem kilka wasnych pomysw na dodatkowe rozwinicie tego
projektu:
Prbki dwiku szczekajcego psa mona zastpi prbkami klaksonu
samochodowego, dzwonka alarmowego lub dwikw samodestrukcji
zaczerpnitych z filmw science fiction. Plastikowy pysk psa przymo-
cowany do ramienia serwomotoru mona zastpi ruchomym wskani-
kiem laserowym wycelowanym w drzwi wejciowe. Wyobramy sobie,
e nasze drzwi wejciowe s zabezpieczone jak chronione przejcie
z jakiego thrillera science fiction!
System mona uzupeni o dalmierz ultradwikowy, tak aby reak-
cja w formie dwiku i ruchu bya uzaleniona od odlegoci intruza
od domu. Im bliej domu znajdzie si nieproszony go, tym go-
niejsze bd odgosy szczekania i bardziej intensywne ruchy psa
za zason. To naturalne, e blisko intruza wzmaga zo elek-
trycznego psa strujcego.
System elektrycznego psa strujcego mona rozbudowa i przekszta-
ci w ogromnego stracha na wrble zabezpieczonego przed warun-
kami atmosferycznymi. Wystarczy uy wicej serwomotorw pod-
czonych do mocniejszego, zewntrznego rda zasilania. Moemy
92  4.7. Nastpne kroki

przygotowa model samych siebie w skali 1:1, stosujc stary kom-


binezon i rury z PCV poczone z silnikami krokowymi za pomoc
drutw przypominajcych sznurki marionetki w ten sposb mona
wymusza ruchy rk i ng modelu.
System elektrycznego psa strujcego mona z powodzeniem wyko-
rzysta w Halloween. Wystarczy przykry system napdzany serwomoto-
rem przecieradem lub zainstalowa trupi czaszk z ruchom
szczk, ktra bdzie witaa goci straszliwym gosem i nienaturalnymi
ruchami.
System elektrycznego psa strujcego mona poczy z pozostaymi
projektami opisanymi w tej ksice, aby w razie wykrycia ruchu w-
czy wiata, wysa wiadomo poczty elektronicznej bd otworzy
lub zamkn zamek w drzwiach wejciowych.
Rozdzia 5.
wierkajcy
karmnik dla ptakw

M
am dwjk dzieci, ktre wprost uwielbiaj ptaki. Ju jako mae dzie-
ci miay swoje pierwsze papuki. Lubiy te obserwowa dzikie
ptaki konstruujce gniazda i posilajce si w karmniku zamontowa-
nym przy oknie sypialni. Dokarmianie ptakw wie si jednak z pewnym
problemem dzieci cigle zapominaj o uzupenianiu nasion dla ptakw
w karmnikach. Zdarzao si, e z rozmaitych powodw w karmniku brako-
wao nasion przez cae dnie, a nawet tygodnie. Czy nie byoby prociej,
gdyby sam karmnik informowa nas o koniecznoci uzupenienia karmy?
Historia pustego karmnika bya inspiracj dla tego projektu. Czy mona sobie
wyobrazi lepsz form powiadamiania o koniecznoci dosypania nasion ni
wierkanie na Twitterze? Zainteresowani znajomi i krewni mog ledzi
konto karmnika, aby wiedzie, kiedy karmnik jest odwiedzany przez ptaki,
kiedy wymaga uzupenienia karmy i czy nasiona zostay dosypane. (Patrz
rysunek 5.1 zatytuowany Wysyanie powiadomie przez karmnik dla
ptakw za porednictwem Twittera).
94  5.1. Czego potrzebujemy

Rysunek 5.1. Wysyanie powiadomie przez karmnik dla ptakw


za porednictwem Twittera (w czasie, gdy karmnik jest
odwiedzany przez ptaki, oraz w sytuacji, gdy wymaga
uzupenienia nasion)

Skoro planujemy ledzi na Twitterze komunikaty o koniecznoci uzupe-


nienia karmnika, warto rozbudowa ten mechanizm o wasny czujnik in-
stalowany na grzdzie, ktry bdzie rejestrowa wizyty ptakw w karmniku
i analizowa czas ich przebywania na grzdzie. Przed publikacj wpisw
na Twitterze bdziemy rejestrowa te zdarzenia w bazie danych, aby umoli-
wi wizualne prezentowanie wzorcw karmienia ptakw w czasie.
Czy w kwietniu ptaki s bardziej wygodniae ni na przykad w lipcu? Czy
ptaki czciej zagldaj do karmnika rano, czy popoudniami? Ile wynosi
redni czas przebywania ptakw na grzdzie w karmniku? Ile czasu mija
pomidzy kolejnymi wizytami ptakw? Jak czsto musimy uzupenia na-
siona w karmniku? wierkajcy karmnik dla ptakw umoliwia nam pro-
wadzenie ciekawych bada w poszukiwaniu odpowiedzi na te i inne wzorce
zachowa ptakw. Czas wzbi si w powietrze!
Rozdzia 5. wierkajcy karmnik dla ptakw  95

5.1. Czego potrzebujemy


Poniewa wierkajcy karmnik bdzie naszym pierwszym projektem reali-
zowanym na zewntrz, koszty niezbdnego sprztu z kilku powodw bd
nieco wysze. Po pierwsze, jeli nie chcemy wierci dziur przez ca grubo
cian zewntrznych domu ani prowadzi przewodw sieciowych przez otwarte
drzwi czy okna, musimy znale sposb wysyania zdarze notowanych
przez czujniki przy uyciu technik bezprzewodowych. Na szczcie istniej
niskonapiciowe i stosunkowo tanie urzdzenia w formie nadajnikw radio-
wych XBee. Pocztkowa konfiguracja tych urzdze wymaga dodatkowych
nakadw i wikszego wysiku, jednak wspomniane urzdzenia s do nie-
zawodne, cakiem atwo nawizuj poczenia, a raz zainstalowane nie wy-
magaj naszej uwagi.
Po drugie, mimo e moglibymy zastosowa standardow platform Ar-
duino Uno (tak jak na schematach pocze prezentowanych w tym roz-
dziale), wymiary tej pytki mog si okaza zbyt due dla typowego karm-
nika dla ptakw. W tej sytuacji zachcam do wydania minimalnie wikszej
kwoty na zakup pytki Arduino Nano. Instalacja platformy Nano z pew-
noci bdzie prostsza, zwaywszy na ograniczon przestrze w karmniku.
Niewtpliw zalet pytki Nano jest niemal identyczna konfiguracja wtykw
i ukad elementw sprztowych jak w przypadku wikszego brata. Pytka
Nano oferuje wszystkie moliwoci tradycyjnej platformy Arduino, tyle e
zajmuje duo mniej miejsca.
Po trzecie, mimo e zasilanie tych czci elektronicznych za porednic-
twem dugiego przewodu podczonego do zewntrznego gniazdka (zain-
stalowanego z myl o dekoracjach witecznych) jest moliwe, tak zapro-
jektowany system nie bdzie wystarczajco autonomiczny. Co wicej, sys-
tem karmnika dla ptakw to wprost doskonaa okazja do zastosowania
ekologicznego rda energii.
I wreszcie w zwizku z koniecznoci ochrony elektroniki musimy zadba
o dobre zabezpieczenie systemu przed niesprzyjajcymi warunkami atmosfe-
rycznymi. Oto kompletna lista zakupw (komponenty uywane w tym pro-
jekcie pokazano te na rysunku 5.2 zatytuowanym Czci systemu wierka-
jcego karmnika dla ptakw):
1. Platforma Arduino Uno lub Arduino Nano1.

1
http://www.makershed.com/ProductDetails.asp?ProductCode=MKGR1
96  5.1. Czego potrzebujemy

Rysunek 5.2. Czci systemu wierkajcego karmnika dla ptakw

2. Dwa moduy XBee z zestawami adapterw oraz przewd FTDI2.


3. Fotokomrka.
4. Kawaek folii aluminiowej.
5. Przewd.
6. Niewielki panel soneczny z wbudowanym akumulatorem i prze-
wodem USB (na przykad podobny do tego oferowanego w sklepie
Solio)3.
7. Jeden rezystor 10 k i jeden rezystor 10 M warto sprawdzi
kolorowe paski na stosowanych rezystorach: rezystor 10 k powinien
by oznaczony paskami brzowym, czarnym, pomaraczowym i zotym,
natomiast rezystor 10 M powinien by oznaczony paskami brzo-
wym, czarnym, niebieskim i zotym. Potrzebne rezystory pokazano
na rysunku 5.3 zatytuowanym Rezystory uywane w projekcie
wierkajcego karmnika dla ptakw. Na zdjciu wida rwnie foto-
komrk (nazywan take fotorezystorem CdS).
8. Karmnik dla ptakw z otworem na nasiona, w ktrym zmieci si
platforma Nano i modu XBee (zabezpieczone przed czynnikami
pogodowymi).

2
http://www.adafruit.com
3
http://www.solio.com/chargers/
Rozdzia 5. wierkajcy karmnik dla ptakw  97

Rysunek 5.3. Rezystory uywane w projekcie wierkajcego karmnika


dla ptakw

9. Komputer (nie ma go na zdjciu), najlepiej z systemem Linux lub


Mac OS oraz zainstalowanym kompilatorem jzyka Python 2.6
lub nowszym (na potrzeby skryptu przetwarzajcego komunikaty
wysyane przez karmnik dla ptakw).
W razie decyzji o uyciu pytki Arduino Nano zamiast tradycyjnej pytki
Arduino Uno trzeba bdzie dodatkowo zakupi standardowy przewd
USB A-mini B (nie ma go na zdjciu), aby poczy pytk Arduino
Nano z komputerem. Co wicej, poniewa na platformie Arduino Nano
zastosowano wtyki mskie zamiast wtykw eskich (stosowanych w przy-
padku pytki Arduino Uno), zamiast standardowych przewodw bdzie-
my potrzebowali odpowiednich kocwek eskich (ktrych take nie
pokazano na zdjciu). Odpowiednie kocwki uatwi czenie przewo-
dw z wtykami na pytce Nano bez koniecznoci ich trwaego lutowania.
Projekt jest bardziej zoony ni system powiadamiania o poziomie wody,
a najtrudniejszym krokiem procesu budowy tego rozwizania bdzie za-
pewnienie niezawodnej pracy moduw XBee. Mimo to projekt jest wart
niezbdnych nakadw w jego wyniku bdziemy dysponowali nie tylko
supernowoczesnym karmnikiem na miar XXI wieku, ale te skonfiguro-
wanym systemem obejmujcym moduy komunikacji radiowej XBee, ktry
bdzie nam potrzebny w wielu pozostaych projektach. Gotowy zakasa
rkawy? Do dziea!
98  5.3. Czujnik grzdy

5.2. Budowa rozwizania


Poczenie wszystkich elementw tak, aby pasoway do wntrza karmnika,
moe wymaga pewnej pomysowoci, szczeglnie jeli zbiornik na ziarno
nie oferuje dostatecznie duo przestrzeni. Zanim przystpimy do upycha-
nia elektroniki w karmniku, musimy upewni si, e wszystkie komponenty
dziaaj zgodnie z naszymi oczekiwaniami.
1. Zaczniemy od najprostszego kroku, czyli poczenia z pytk Ar-
duino czujnika pojemnociowego z folii aluminiowej oraz napisania
funkcji, ktra w momencie zmiany stanu tego czujnika bdzie wy-
syaa komunikat do okna monitorowania portu szeregowego (a do-
celowo do moduu XBee podczonego do tego portu).
2. W dalszej kolejnoci musimy podczy do pytki Arduino fotoko-
mrk i napisa kod reagujcy na zmiany stanu tego czujnika.
3. Zaraz potem przystpimy do czenia pary moduw radiowych XBee,
tak aby informacje o wspomnianych zdarzeniach byy przekazywane
pomidzy nadajnikiem XBee poczonym z pytk Arduino a odbior-
nikiem XBee poczonym z komputerem za porednictwem prze-
wodu FTDI USB.
4. I wreszcie musimy napisa skrypt jzyka Python, ktry pobierze dane
z bazy danych SQLite, sformatuje je i wyle w formie gotowego wpisu
do publikacji w serwisie Twitter.
Po dopracowaniu i poczeniu wszystkich komponentw bdziemy dyspo-
nowali systemem zoonym z pytki Arduino (najlepiej w wersji Nano),
moduu XBee, czujnika grzdy i fotokomrki cao bdzie zabezpie-
czona przed czynnikami atmosferycznymi i zainstalowana w karmniku dla
ptakw. Po sprawdzeniu, czy wszystko dziaa prawidowo, naley wyj
na dwr i przetestowa ten system w warunkach polowych.

5.3. Czujnik grzdy


Karmniki dla ptakw maja rne ksztaty i wymiary. Zdecydowaem si za-
stosowa wyjtkowo proste rozwizanie w celu wykrywania zdarze ldowa-
nia ptakw na grzdzie karmnika. Mimo e skonstruowanie mechanizmu
wykrywajcego nacisk na grzdzie z pewnoci byoby moliwe, czas potrzeb-
ny na opracowanie tego rozwizania i jego koszty byyby stosunkowo due,
a przecie naszym jedynym celem jest wykrycie, czy co nie usiado na grzdzie.
Rozdzia 5. wierkajcy karmnik dla ptakw  99

Alternatywnym rozwizaniem jest monitorowanie zmian pojemnoci elek-


trycznej.
Wystarczy owin grzd karmnika foli aluminiow oraz poczy t foli
z cyfrowymi wtykami na pytce Arduino przy uyciu rezystora. Na podstawie
wartoci bazowych i zmian wykrywanych przez ten czujnik w momencie ldo-
wania ptaka moemy wyznaczy warto progow, ktrej przekroczenie po-
winno powodowa wygenerowanie i wysanie komunikatu o ldujcym ptaku.

Budowa czujnika
Budowa i testowanie czujnika grzdy to najprostszy element tego projektu.
Wystarczy uy kawaka folii aluminiowej wielkoci poowy opakowania
od listka gumy do ucia i owin grzd. Naley nastpnie poczy jeden
koniec rezystora 10 M z wtykiem cyfrowym nr 7 na pytce Arduino oraz
drugi koniec z wtykiem nr 10. Przewd poczony z foli aluminiow naley
poczy z kocwk rezystora podczon do wtyku cyfrowego nr 7. Od-
powiedni schemat pocze pokazano na rysunku 5.4 zatytuowanym Spo-
sb podczenia czujnika pojemnociowego.

Rysunek 5.4. Sposb podczenia czujnika pojemnociowego

Programowanie czujnika
Naley teraz poczy platform Arduino z komputerem, po czym uruchomi
rodowisko Arduino IDE w celu napisania kodu obsugujcego czujnik.
100  5.3. Czujnik grzdy

Podobnie jak w przypadku projektu systemu powiadamiania o poziomie


wody musimy napisa kod realizujcy nastpujce zadania:
1. Wywietli wartoci odczytane przez czujnik pojemnociowy w oknie
monitora portu szeregowego rodowiska Arduino IDE.
2. Zidentyfikuje warto bazow tego czujnika.
3. Dostosuje natenie prdu w momencie dotykania czujnika palcem.
4. Zarejestruje now warto uywan w roli wartoci progowej gene-
rujcej powiadomienie.
Aby uatwi sobie wykrywanie zmian natenia prdu elektrycznego w mo-
mencie dotknicia folii palcem lub wyldowania ptaka, skorzystamy z rozwi-
zania opracowanego przez jednego z mionikw platformy Arduino
Paula Badgera. Paul napisa bibliotek Arduino, dziki ktrej mierzenie
zmian wartoci przekazywanych przez czujniki pojemnociowe (podob-
nych do folii uywanej w tym projekcie) jest dziecinnie proste. Biblioteka
nazwana Capacitive Sensing4 umoliwia programistom platformy Arduino
przeksztacenie dwch (lub wikszej liczby) wtykw na pytce Arduino
w czujnik pojemnociowy, ktry moe suy do wykrywania pojemnoci
elektrycznej ludzkiego ciaa. Ciao czowieka cechuje si znacznie wik-
sz pojemnoci ni ciao ptaka, std dotknicie czujnika powoduje duo
wiksz zmian wartoci. Poniewa jednak take pojemno elektryczn
ptaka mona zmierzy, wystarczy odpowiednio dostroi warto progow
stosowan przez nasz program.
Naley pobra t bibliotek, rozpakowa jej zawarto i skopiowa pliki
biblioteki do folderu libraries platformy Arduino. Wicej informacji na ten
temat mona znale w dodatku A zatytuowanym Instalacja bibliotek plat-
formy Arduino.
W nastpnym kroku musimy utworzy nowy projekt platformy Arduino
i uy wyraenia #include CapSense.h;.
Z powodu duo mniejszej wielkoci samego ciaa i powierzchni styku ciaa
z foli aluminiow wartoci dla ptaka bd zasadniczo rniy si od wartoci
dla czowieka. Jeli to moliwe, warto zmierzy te rnice przy pomocy
prawdziwego ptaka. Z radoci odkryem, e papuki moich dzieci s na tyle
akome, e ochoczo uczestnicz w testach, pod warunkiem e grzda z czujni-
kiem pozwoli im si dosta do ziaren w karmniku. Moje testowe pomiary

4
http://www.arduino.cc/playground/Main/CapSense
Rozdzia 5. wierkajcy karmnik dla ptakw  101

wykazay, e waciwa warto bazowa powinna mieci si w przedziale


od 900 do 1400 oraz e pojemno elektryczna ciaa ptaka zwiksza t war-
to do ponad 1500. Na podstawie tych wartoci moemy opracowa iden-
tyczny kod warunkowy jak w przypadku systemu powiadamiania o poziomie
wody, tak aby program zmienia stan w odpowiedzi na powiadomienia o ldo-
waniu i odlatywaniu ptakw.
Zacznijmy od napisania kodu, ktry zaaduje bibliotek CapSense i b-
dzie wywietla odczytywane wartoci pojemnoci w oknie monitora portu
szeregowego.
Plik TweetingBirdFeeder/BirdPerchTest.pde

#include <CapSense.h>

#define ON_PERCH 1500


#define CAP_SENSE 30
#define ONBOARD_LED 13

CapSense foil_sensor = CapSense(10,7); // czujnik pojemnociowy


// rezystor mostkujcy wtyki cyfrowe nr 10 i 7
// przewd poczony z rezystorem od strony
// wtyku nr 7
int perch_value = 0;
byte perch_state = 0;

void setup()
{
// na potrzeby komunikatw diagnostycznych w oknie portu szeregowego
Serial.begin(9600);

// ustawia wtyk dla wbudowanej diody LED


pinMode(ONBOARD_LED, OUTPUT);
}

void SendPerchAlert(int perch_value, int perch_state)


{
digitalWrite(ONBOARD_LED, perch_state ? HIGH : LOW);
if (perch_state)
Serial.print("Zdarzenie ldowania na grzdzie, perch_value=");
else
Serial.print("Zdarzenie opuszczenia grzdy, perch_value=");
Serial.println(perch_value);
}

void loop() {
// czeka sekund w kadej iteracji ptli
delay(1000);

// pobiera warto czujnika pojemnociowego


perch_value = foil_sensor.capSense(CAP_SENSE);

switch (perch_state)
102  5.4. Czujnik ziarna

{
case 0: // aden ptak nie siedzi obecnie na grzdzie
if (perch_value >= ON_PERCH)
{
perch_state = 1;
SendPerchAlert(perch_value, perch_state);
}
break;
case 1: // jaki ptak siedzi teraz na grzdzie
if (perch_value < ON_PERCH)
{
perch_state = 0;
SendPerchAlert(perch_value, perch_state);
}
break;
}
}

Warto zwrci uwag na warto staej ON_PERCH (rwn 1500), ktr porw-
nujemy z zarejestrowan wartoci zmiennej perch_value. Z uwagi na r-
nice dotyczce przewodnictwa elektrycznego zastosowanej folii i samej po-
wierzchni czujnika kady powinien dostosowa warto progow reprezento-
wan przez sta ON_PERCH (tak jak dostosowywalimy odpowiednie progi
w projekcie systemu powiadamiania o poziomie wody). Naley te zwrci
uwag na warto 30 przypisan staej CAP_SENSE. Ta warto okrela licz-
b pobra prbnych wartoci w jednym cyklu mierzenia pojemnoci.
Skoro dysponujemy ju dziaajcym czujnikiem grzdy dla ptakw, czas opra-
cowa mechanizm wykrywajcy niski poziom ziarna. Jak to zrobi? Warto
zastosowa fotokomrk.

5.4. Czujnik ziarna


Fotokomrka mierzy intensywno wiata wiksza intensywno prze-
kada si na wysze natenie prdu; sabsze wiato powoduje spadek
tego natenia. Szczegowe wyjanienie dziaania fotokomrek i prze-
wodnik na temat ich stosowania mona znale na stronie internetowej
Ladyady5. Umieszczenie fotokomrki poniej normalnego poziomu ziaren
wsypanych do karmnika umoliwi nam wykrywanie zdarzenia polegajce-
go na spadku poziomu karmy poniej czujnika do fotokomrki bdzie
wwczas docierao wicej wiata, a nasz system bdzie mg wygenerowa
komunikat o koniecznoci uzupenienia ziaren.

5
http://www.ladyada.net/learn/sensors/cds.html
Rozdzia 5. wierkajcy karmnik dla ptakw  103

Przed wywierceniem dziur w karmniku i zainstalowaniem fotokomrki


musimy jeszcze napisa odpowiedni kod i przetestowa go w podobny sposb
jak w przypadku wasnorcznie skonstruowanego czujnika pojemnociowego.
Jedn kocwk fotokomrki naley poczy z wtykiem 5-woltowym na
pytce Arduino; drug kocwk naley poczy z wtykiem analogowym
nr 0. Wtyk analogowy nr 0 na pytce Arduino naley nastpnie zmostko-
wa z wtykiem uziemienia za pomoc rezystora 10 k (patrz rysunek 5.5
zatytuowany Schemat poczenia fotokomrki). Czy opisany schemat
pocze nie wyglda znajomo? Tak identyczn konfiguracj stosowali-
my ju dla innych czujnikw czonych z platform Arduino. Jest to do
typowy wzorzec czenia wielu typw czujnikw z pytk Arduino.

Rysunek 5.5. Schemat poczenia fotokomrki

Po podczeniu fotokomrki naley poczy pytk Arduino z kompute-


rem (za pomoc przewodu szeregowego USB) i uruchomi rodowisko
Arduino IDE. Moemy teraz zastosowa t sam technik co w przypadku
czujnika pojemnociowego, aby przeledzi wartoci dla wtyku analogo-
wego nr 0 (wywietlane w oknie monitora portu szeregowego rodowiska
Arduino IDE) i na tej podstawie wyznaczy wartoci bazowe okreli
warto dla odsonitej fotokomrki. Warto teraz zasoni czujnik palcem,
aby zablokowa dopyw wiata. Naley te zanotowa, jak zmienia si
warto odczytana z fotokomrki.
Tak jak w przypadku testw czujnika pojemnociowego, musimy opraco-
wa pewne procedury i wyraenia warunkowe, ktre sprawdz progi nat-
enia wiata. W praktyce moemy nawet skopiowa i wklei kod testujcy
104  5.4. Czujnik ziarna

czujnik pojemnociowy i ograniczy si do dostosowania nazw zmiennych


oraz przypisania odpowiednich wtykw.
Plik TweetingBirdFeeder/SeedPhotocellTest.pde

#define SEED 500


#define ONBOARD_LED 13
#define PHOTOCELL_SENSOR 0
int seed_value = 0;
byte seed_state = 0;
void setup()
{
// na potrzeby komunikatw diagnostycznych w oknie portu szeregowego
Serial.begin(9600);

// ustawia wtyk dla wbudowanej diody LED


pinMode(ONBOARD_LED, OUTPUT);
}

void SendSeedAlert(int seed_value, int seed_state)


{
digitalWrite(ONBOARD_LED, seed_state ? HIGH : LOW);
if (seed_state)
Serial.print("Uzupenij ziarno, seed_value=");
else
Serial.print("Karma uzupeniona, seed_value=");
Serial.println(seed_value);
}

void loop() {
// czeka sekund w kadej iteracji ptli
delay(1000);

// sprawdza warto fotokomrki ledzcej poziom ziarna


seed_value = analogRead(PHOTOCELL_SENSOR);

switch (seed_state)
{
case 0: // pojemnik na ziarno zosta napeniony
if (seed_value >= SEED)
{
seed_state = 1;
SendSeedAlert(seed_value, seed_state);
}
break;
case 1: // pojemnik na ziarno jest pusty
if (seed_value < SEED)
{
seed_state = 0;
SendSeedAlert(seed_value, seed_state);
}
break;
}
}
Rozdzia 5. wierkajcy karmnik dla ptakw  105

Zmierzenie i ustalenie odpowiedniej wartoci progowej dla fotokomrki


(reprezentowanej przez sta SEED) jest duo prostsze ni w przypadku czujni-
ka pojemnociowego, a uzyskana warto jest bardziej wiarygodna. Mimo
e fotokomrk mona zasoni palcem, aby zmierzy warto w warunkach
braku dopywu wiata, lepszym rozwizaniem bdzie zasypanie czujnika
prawdziwym ziarnem. Jeli z jakiego powodu nie chcemy wierci dziur
w karmniku dla ptakw, aby zainstalowa fotokomrk, moemy umieci
czujnik na dnie papierowego kubka.
Tak jak podczas kalibrowania wartoci progowych czujnika w systemie po-
wiadamiania o poziomie wody, naley doda nastpujce wiersze za wierszem
seed_value = analogRead(PHOTOCELL_SENSOR); w gwnej ptli programu:
Serial.print("seed_value=");
Serial.println(seed_value);

Naley zapisa warto pocztkow zmiennej seed_value, po czym wypeni


pojemnik ziarnem i zmierzy now warto. Na podstawie tych wartoci
naley okreli warto pocztkow i warto progow dla fotokomrki.
Jeli zasonicie fotokomrki nie powoduje adnej zmiany wartoci, warto
raz jeszcze sprawdzi wszystkie poczenia. W przypadku mojej fotokomrki
warto bazowa miecia si w przedziale od 450 do 550. Zasonicie
czujnika palcem powodowao natychmiastowy spadek tej wartoci poniej
100. Kady powinien zastosowa wartoci progowe dobrane na podstawie
wasnych testw. Musimy te pamita o koniecznoci ponownej kalibracji
czujnika ju po zamontowaniu w karmniku dla ptakw.
Skoro dysponujemy ju dziaajcymi mechanizmami monitorowania czujnika
grzdy i fotokomrki, musimy znale sposb sygnalizowania przekroczenia
wartoci progowych przyjtych dla tych czujnikw. Prowadzenie przewo-
du sieciowego od domowego koncentratora do gazi drzewa na zewntrz
budynku byoby niepraktyczne. Sporym wyzwaniem byaby take instala-
cja platformy Arduino z doczonym moduem sieciowym w bardzo ogra-
niczonej przestrzeni karmnika dla ptakw. W tej sytuacji warto zastosowa
wygodny mechanizm komunikacji bezprzewodowej (wymagajcy stosun-
kowo niewiele mocy elektrycznej), ktry w zupenoci wystarczy do prze-
syania powiadomie o przekroczeniu wartoci progowych przez wskaza-
nia czujnikw. Po nawizaniu komunikacji bezprzewodowej moemy uy
wikszej mocy obliczeniowej i wikszych zasobw pamiciowych do przetwa-
rzania i analizy gromadzonych danych.
106  5.5. Komunikacja bezprzewodowa

5.5. Komunikacja bezprzewodowa


Mimo e istniej moduy platformy Arduino obsugujce wszechobecny
standard Wi-Fi (802.11b/g), na przykad WiFly Shield firmy Sparkfun,
w przypadku tej platformy do komunikacji bezprzewodowej czciej sto-
suje si moduy XBee. Pocztkowe nakady zwizane z zakupem zestawu
urzdze XBee mog by do wysokie. Due koszty wynikaj z koniecz-
noci zakupu (oprcz pary moduw XBee) przewodu FTDI USB po-
trzebnego do poczenia jednego z tych moduw z komputerem, tak aby
peni funkcj bezprzewodowego portu szeregowego.
Drugi modu XBee najczciej jest czony z platform Arduino. Istniej
te dodatkowe zestawy upraszczajce czenie tych elementw umoli-
wiajce instalowanie moduw XBee przy uyciu specjalnych wtyczek i wy-
wietlanie stanu transmisji danych za pomoc wbudowanych diod LED.
Takie wizualne wskaniki mog by do przydatne podczas diagnozowa-
nia poczenia pary moduw XBee i usuwania ewentualnych bdw.
Mimo wszystkich trudnoci moliwoci oferowane przez moduy XBee
(niski pobr prdu i stosunkowo duy zasig maksymalnie 50 metrw)
czyni z tych urzdze wprost doskona technologi komunikacji bezprze-
wodowej na potrzeby tego projektu.
Z myl o uproszczeniu czenia moduw XBee firma Adafruit zaprojekto-
waa zestaw adapterw, ktry jednak wymaga przylutowania kilku niewiel-
kich komponentw do pytki Arduino. Adaptery naley stosowa zgodnie
z instrukcjami dostpnymi na stronie internetowej Ladyady6.
Po poczeniu moduw XBee konfiguracja i nawizanie komunikacji po-
midzy par tych moduw nie s trudne. Warto jednak pamita, e jedno
z najbardziej przydatnych narzdzi uatwiajcych konfiguracj tych mo-
duw dziaa tylko w systemie Windows.
Zgodnie z instrukcjami opisujcymi schemat czenia moduw XBee w topo-
logii punkt punkt dostpnymi na stronie Ladyady7 naley poczy wtyki
zasilania, uziemienia (Gnd), odbioru (RX) i transmisji (TX) jednego
moduu XBee z zamontowanym adapterem odpowiednio do wtykw 5V,
Gnd, cyfrowego nr 2 i cyfrowego nr 3 na pytce Arduino. Pytk Arduino
naley nastpnie poczy z komputerem, umieci na platformie program

6
http://www.ladyada.net/make/xbee/
7
http://ladyada.net/make/xbee/point2point.html
Rozdzia 5. wierkajcy karmnik dla ptakw  107

testowy, otworzy okno monitora portu szeregowego rodowiska Arduino


IDE i upewni si, e jest ustawiona odpowiednia szybko transmisji
(9600). Naley nastpnie (jeszcze przed odczeniem platformy Arduino)
poczy komputer z drugim moduem XBee za porednictwem przewodu
FTDI USB. W nastpnym kroku musimy otworzy sesj terminala portu
szeregowego: program Hyperterminal w systemie Windows, polecenie screen
w systemie Mac lub rozmaite programy do obsugi komunikacji szeregowej
dostpne dla systemu Linux, na przykad Minicom8.
Po nawizaniu poczenia szeregowego wystarczy wpisa kilka znakw w
oknie danych wejciowych uytej aplikacji. Jeli oba moduy XBee zostay
prawidowo skonfigurowane, wpisane znaki powinny zosta wywietlone
w oknie monitora portu szeregowego rodowiska Arduino IDE.

Korzystanie z narzdzia screen


Aplikacja screen jest wygodnym narzdziem do monitorowania por-
tu szeregowego dostpnym dla platform na bazie systemu Unix,
czyli systemw Mac OS X i Linux. Aby uy tego programu w systemie
OS X, naley okreli port szeregowy, do ktrego podczono przewd
FTDI USB mona to zrobi za pomoc rodowiska Arduino IDE.
Z menu Tools tego rodowiska naley wybra opcj Serial Port, aby zi-
dentyfikowa przypisany port szeregowy.
W moim przypadku poczenie adaptera FTDI USB z XBee jest ozna-
czone jako urzdzenie /dev/tty.usbserial-A6003SHc, jednak na innym
komputerze to samo poczenie moe by reprezentowane w inny
sposb (w zalenoci od pozostaych urzdze podczonych do
komputera). Po otwarciu aplikacji terminala naley wpisa polecenie
screen /dev/tty.YOURDEVICE 9600. W wyniku tego polecenia zostanie
otwarty port szeregowy i uzyskamy moliwo wpisywania i otrzymy-
wania znakw z szybkoci transmisji 9600. Aby zamkn narzdzie,
naley nacisn kolejno kombinacje klawiszy Ctrl+A oraz Ctrl+\.

Jeli do poczenia moduw XBee z pytk Arduino i przewodem FTDI


uyto odpowiednich adapterw, w czasie bezprzewodowej transmisji znakw
pomidzy moduami XBee powinny miga diody LED (zielona podczas
wysyania danych i czerwona podczas odbioru danych).

8
http://alioth.debian.org/projects/minicom/
108  5.5. Komunikacja bezprzewodowa

Jeli w oknie odbieranych danych nie wida adnych znakw, naley jeszcze
raz sprawdzi przewody czce modu XBee z odpowiednimi wtykami na
pytce Arduino. Warto te zamieni te moduy miejscami, aby sprawdzi, czy
oba urzdzenia s rozpoznawane po poczeniu z komputerem za pomoc
przewodu FTDI USB. W oknie terminala aplikacji portu szeregowego
naley wpisa polecenie AT i sprawdzi, czy w odpowiedzi otrzymamy po-
twierdzenie OK.
Jeli moduy XBee wci nie mog nawiza poczenia, warto poprosi
o pomoc sprzedawc, u ktrego zakupiono ten sprzt.
Po udanej prbie nawizania komunikacji przez par moduw XBee mo-
emy ponownie podczy fotokomrk i czujnik pojemnociowy do pytki
Arduino i poczy kod obsugujcy ten modu z kodem analizujcym warunki
progowe obu czujnikw. Kompletny schemat pocze tego systemu pokaza-
no na rysunku 5.6 zatytuowanym wierkajcy karmnik dla ptakw z czuj-
nikami i moduem XBee podczonymi do platformy Arduino.

Rysunek 5.6. wierkajcy karmnik dla ptakw z czujnikami i moduem


XBee podczonymi do platformy Arduino
Rozdzia 5. wierkajcy karmnik dla ptakw  109

Warto rozway uycie uniwersalnej pytki montaowej lub zlutowanie


czujnikw, uytych przewodw i odpowiednich wtykw na pytce Arduino.
Czytelnicy, ktrzy do testw wol uywa pytki uniwersalnej, musz pami-
ta, e taka pytka najprawdopodobniej nie zmieci si w karmniku, zatem
przewody czce elementy systemu trzeba bdzie przylutowa dopiero po
instalacji w miejscu docelowym. W zalenoci od pooenia i orientacji
pytki Arduino Uno lub Nano wewntrz karmnika by moe bdziemy
musieli uy dla adaptera XBee prostych wtykw zamiast standardowych
wtykw wygitych w prawo. Naszym celem jest umieszczenie wszystkich
potrzebnych elementw wewntrz karmnika w sposb gwarantujcy bez-
pieczestwo i jednoczenie moliwo konserwacji systemu. Warto przy tym
pamita, e w przeciwiestwie do pytki Arduino Uno pytka Arduino Na-
no stosuje mskie wtyki. Oznacza to, e aby lepiej poczy mskie wtyki na
pytce Nano, naley zastosowa przewody z eskimi kocwkami.

Koczenie szkicu
Musimy odczytywa wartoci obu czujnikw czujnika pojemnociowe-
go z folii aluminiowej oraz fotokomrki. Pocztkowo odczytywane warto-
ci bd trafiay do okna monitora portu szeregowego rodowiska Arduino
IDE, a docelowo (po wprowadzeniu drobnej zmiany w kodzie) bd wy-
syane przez modu XBee. Na tym etapie naszym celem jest poczenie
kodu sprawdzajcego wyznaczone wczeniej wartoci progowe dla czujni-
ka pojemnociowego i fotokomrki z kodem wysyajcym do moduu
XBee ostrzeenia o przekroczeniu tych wartoci. Po dodaniu tej logiki do
napisanego wczeniej kodu testujcego stan grzdy i pojemnika na nasiona
moemy zakoczy prac nad szkicem dla tego projektu.
Plik TweetingBirdFeeder/TweetingBirdFeeder.pde

#include <CapSense.h>;
#include <NewSoftSerial.h>

#define ON_PERCH 1500


#define SEED 500
#define CAP_SENSE 30
#define ONBOARD_LED 13
#define PHOTOCELL_SENSOR 0

// ustawia wtyki cyfrowe na potrzeby szeregowego wysyania/odbioru danych


// przez modu XBee
NewSoftSerial XBeeSerial = NewSoftSerial(2, 3);
CapSense foil_sensor = CapSense(10,7); // czujnik pojemnociowy
// rezystor mostkujcy wtyki cyfrowe
// nr 10 i 7
110  5.5. Komunikacja bezprzewodowa

// przewd poczony z rezystorem


// od strony wtyku nr 7
int perch_value = 0;
byte perch_state = 0;
int seed_value = 0;
byte seed_state = 0;

void setup()
{
// na potrzeby komunikatw diagnostycznych w oknie portu szeregowego
Serial.begin(9600);

// na potrzeby transmisji danych za porednictwem moduu XBee


XBeeSerial.begin(9600);

// ustawia wtyk dla wbudowanej diody LED


pinMode(ONBOARD_LED, OUTPUT);
}

void SendPerchAlert(int perch_value, int perch_state)


{
digitalWrite(ONBOARD_LED, perch_state ? HIGH : LOW);
if (perch_state)
{
XBeeSerial.println("przylot");
Serial.print("Zdarzenie ldowania na grzdzie, perch_value=");
}
else
{
XBeeSerial.println("odlot");
Serial.print("Zdarzenie opuszczenia grzdy, perch_value=");
}
Serial.println(perch_value);
}

void SendSeedAlert(int seed_value, int seed_state)


{
digitalWrite(ONBOARD_LED, seed_state ? HIGH : LOW);
if (seed_state)
{
XBeeSerial.println("dosyp");
Serial.print("Uzupenij ziarno, seed_value=");
}
else
{
XBeeSerial.println("ziarnoWNormie");
Serial.print("Karma uzupeniona, seed_value=");
}
Serial.println(seed_value);
}

void loop() {
// czeka sekund w kadej iteracji ptli
delay(1000);
Rozdzia 5. wierkajcy karmnik dla ptakw  111

// sprawdza warto czujnika pojemnociowego na grzdzie


perch_value = foil_sensor.capSense(CAP_SENSE);

// sprawdza warto fotokomrki ledzcej poziom ziarna


seed_value = analogRead(PHOTOCELL_SENSOR);

switch (perch_state)
{
case 0: // aden ptak nie siedzi na grzdzie
if (perch_value >= ON_PERCH)
{
perch_state = 1;
SendPerchAlert(perch_value, perch_state);
}
break;
case 1: // jaki ptak siedzi teraz na grzdzie
if (perch_value < ON_PERCH)
{
perch_state = 0;
SendPerchAlert(perch_value, perch_state);
}
break;
}

switch (seed_state)
{
case 0: // pojemnik na ziarno zosta napeniony
if (seed_value >= SEED)
{
seed_state = 1;
SendSeedAlert(seed_value, seed_state);
}
break;
case 1: // pojemnik na ziarno jest pusty
if (seed_value < SEED)
{
seed_state = 0;
SendSeedAlert(seed_value, seed_state);
}
break;
}
}

Warto zwrci uwag na odwoania do biblioteki obsugujcej czujnik pojem-


nociowy i nowej biblioteki obsugujcej komunikacj za porednictwem
portu szeregowego na pocztku tego szkicu. Zmienne, ktre bd uyway
odwoa do tych bibliotek, zainicjalizowano w tym samym miejscu, w ktrym
ustawiono wartoci zmiennych progowych. W dalszej czci kodu konfigu-
rujemy poczenia z oknem monitora portu szeregowego i moduem XBee,
a take z wbudowan diod LED na pytce Arduino (wtyk nr 13). Po za-
koczeniu inicjalizacji program uruchamia ptl i czeka na przekroczenie
wartoci progowych dla czujnikw grzdy i (lub) ziarna. W razie wykrycia
112  5.5. Komunikacja bezprzewodowa

zmiany warunkw szkic wyle odpowiednie komunikaty zarwno do okna


monitorowania portu szeregowego w rodowisku Arduino IDE, jak i do
moduu komunikacji radiowej XBee.
Jeli zarwno czujnik pojemnociowy, jak i fotokomrka prawidowo prze-
kazuj wartoci, naley przekierowa dane z okna monitorowania portu
szeregowego rodowiska Arduino IDE do moduu XBee poczonego
z platform Arduino. Warto jeszcze otworzy okno aplikacji testujcej port
szeregowy w trybie ledzenia moduu XBee podczonego za pomoc
przewodu FTDI i sprawdzi, czy wszystko dziaa prawidowo jeli tak,
dane wywietlane w oknie monitora portu szeregowego rodowiska Arduino
IDE powinny by widoczne take w aplikacji portu szeregowego na kom-
puterze, do ktrego podczono przewd FTDI. Czy komunikacja bez-
przewodowa nie jest wspaniaa?
Na tym etapie sprzt potrzebny do realizacji tego projektu jest prawidowo
poczony i przetestowany caa konstrukcja powinna przypomina
karmnik mojego autorstwa pokazany na rysunku 5.7 zatytuowanym Pa-
puka moe pomc w testowaniu i diagnozowaniu wartoci progowych
czujnika grzdy dla zdarze ldowania i odlatywania ptakw.

Rysunek 5.7. Papuka moe pomc w testowaniu i diagnozowaniu


wartoci progowych czujnika grzdy dla zdarze ldowania
i odlatywania ptakw

Zanim jednak przystpimy do instalowania tego sprztu w karmniku dla pta-


kw, musimy zbudowa jeszcze jeden wany komponent. Uyjemy jzyka
Rozdzia 5. wierkajcy karmnik dla ptakw  113

programowania Python do napisania krtkiego programu, ktry bdzie na-


suchiwa komunikatw o ldujcych ptakach, sprawdza stan pojemnika
z nasionami i publikowa stosowne wpisy na Twitterze. Przejdmy wic do
pisania odpowiedniego kodu.

5.6. wierkanie w Pythonie


Istnieje wiele jzykw programowania, w ktrych mona zaimplementowa
mechanizm monitorowania i interpretacji komunikatw przychodzcych
do konsoli portu szeregowego oraz wysyania komunikatw za porednic-
twem portu szeregowego. Istnieje te wiele bibliotek Twittera dla rnych
jzykw programowania.
Wybraem jzyk Python dla tego i wielu innych skryptw prezentowanych
w tej ksice, poniewa jzyk ten ma atw w interpretacji skadni, jest do-
mylnie instalowany wraz z systemami operacyjnymi Linux i Mac OS X
oraz oferuje wiele przydatnych bibliotek (na przykad SQLite) w swojej
podstawowej dystrybucji, zatem nie wymaga doinstalowywania tych kom-
ponentw. Czytelnikom, ktrzy chc si nauczy programowania w jzyku
Python, polecam ksik Python. Wprowadzenie [LA03].
W tym projekcie bdziemy potrzebowali prostego skryptu o nazwie twe-
etingbirdfeeder.py, ktry bdzie realizowa nastpujce zadania:
1. Rejestrowanie zdarze (wraz z dat i godzin) ldowania i odlo-
tw ptakw na podstawie komunikatw wysyanych przez czujnik
grzdy. Dane maj by zapisywane w tabeli birdfeeding bazy da-
nych tweetingbirdfeeder.
2. Rejestrowanie daty i godziny zdarze polegajcych na wykryciu
braku ziaren i uzupenieniu pojemnika na karm. Dane maj by
zapisywane w tabeli seedstatus, ktra take naley do bazy danych
tweetingbirdfeeder.
3. Nasuchiwanie danych przychodzcych i wysyanie komunikatw
za porednictwem nadajnika XBee poczonego z komputerem przy
uyciu przewodu FTDI. Reagowanie na zdarzenia poprzez zapisy-
wanie danych wraz z datami, godzinami i rejestrowanymi warunkami.
4. Nawizywanie poczenia z Twitterem za porednictwem usugi
uwierzytelniania OAuth i wysyanie wpisw na temat karmienia pta-
kw i poziomu ziaren w karmniku.
114  5.6. wierkanie w Pythonie

Na potrzeby tego projektu bdziemy musieli zainstalowa tylko dwie do-


datkowe biblioteki Pythona: pyserial i python-twitter.
Oprcz publikowania wpisw na wybranym koncie na Twitterze warto
zadba o odpowiedni wizualizacj trendw opisywanych w tych wpisach,
na przykad czstotliwoci wizyt ptakw w karmniku, liczby tych odwie-
dzin wedug dat i godzin oraz redniego czasu pomidzy uzupenianiem
karmy. Takie rozwizanie umoliwi nam ledzenie trendw na podstawie
danych zarejestrowanych w cigu godziny, doby, miesica i roku. Warunkiem
prezentacji tego rodzaju statystyk jest gromadzenie danych w odpowiednim
formacie.

Konfiguracja bazy danych


Poniewa poczwszy od wersji 2.5, jzyk Python oferuje wbudowan obsug
baz danych SQLite i poniewa nasze dane nie wymagaj wyszukanego,
autonomicznego serwera bazy danych, baza SQLite jest wprost idealnym
rozwizaniem dla tego projektu. Mimo e wartoci mona by zapisywa
w zwykym pliku CSV (z danymi oddzielonymi przecinkami), uycie bazy
danych SQLite ma dwie zasadnicze zalety. Po pierwsze, ten sposb prze-
chowywania danych uatwi wykonywanie zapyta analitycznych w przyszo-
ci. Po drugie, baza danych oferuje wiksz elastyczno w zakresie gro-
madzenia danych o rnych rodzajach zdarze i zarzdzania tymi danymi
w wielu przypadkach wystarczy tylko doda odpowiednie kolumny do
tabeli.
Do utworzenia bazy danych w formacie pliku sqlite3 naley uy polecenia
wiersza polece sqlite3. Narzdzie jest domylnie instalowane wraz z syste-
mem Mac OS X. W wikszoci systemw Linux naley pobra to narzdzie
z repozytorium aplikacji waciwego danej dystrybucji. W dystrybucjach syste-
mu Linux na bazie Debiana, na przykad w systemie Ubuntu, instalacja apli-
kacji wymaga uycia polecenia sudo apt-get install sqlite3 libsqlite3-dev.
Uytkownicy systemu Windows bd musieli pobra narzdzie sqlite3.exe
z witryny internetowej bazy danych SQLite9.
Po zainstalowaniu systemu bazy danych naley wpisa polecenie sqlite3
w oknie terminala. Polecenie spowoduje wywietlenie komunikatw podob-
nych do tych pokazanych poniej:

9
http://www.sqlite.org/download.html
Rozdzia 5. wierkajcy karmnik dla ptakw  115

SQLite version 3.7.6


Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

Instalacja systemu SQLite na komputerze czytelnika oczywicie moe mie


inny numer wersji.
Musimy teraz wpisa wyraenie jzyka SQL tworzce now baz danych.
W tym celu naley opuci powok polece sqlite, wpisujc kolejno znaki
.q i naciskajc klawisz waciwy znakowi powrotu karetki. Zaraz potem nale-
y ponownie uruchomi narzdzie sqlite3, tym razem podajc nazw bazy
danych, ktra ma zosta otwarta.
Baz danych dla tego projektu nazwiemy tweetingbirdfeeder, a jej dane
bd przechowywane w pliku nazwanym tweetingbirdfeeder.sqlite. Poniewa
wspomniana baza danych jeszcze nie istnieje, system SQLite automatycznie
utworzy odpowiedni plik. Plik bazy danych zostanie utworzony w katalogu,
z ktrego uruchomiono narzdzie sqlite3. Jeli na przykad polecenie sqlite3
wpisalimy z poziomu katalogu home, plik nowej bazy danych zostanie
utworzony wanie w tym katalogu.
W bazie danych tweetingbirdfeeder.sqlite naley teraz utworzy now tabel
nazwan birdfeeding. Struktur tej tabeli pokazano poniej:

Nazwa Typ Klucz Automatyczne Dopuszczalne Unikatowa?


kolumny danych gwny? zwikszanie? wartoci puste?

id INTEGER TAK TAK NIE TAK


time DATETIME NIE NIE NIE NIE
event TEXT NIE NIE NIE NIE

Odpowiedni tabel moemy utworzy, wpisujc nastpujce wyraenie jzy-


ka SQL w wierszu polece narzdzia sqlite:
[~]$ sqlite3 tweetingbirdfeeder.sqlite
SQLite version 3.7.6
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> CREATE TABLE "birdfeeding" ("id" INTEGER PRIMARY KEY NOT NULL UNIQUE,
"time" DATETIME NOT NULL,"event" TEXT NOT NULL);

Po utworzeniu tabeli birdfeeding potrzebujemy jeszcze jednej tabeli o po-


dobnej strukturze. Nowa tabela, nazwana seedstatus, bdzie naleaa do tej
samej bazy danych:
116  5.6. wierkanie w Pythonie

Nazwa Typ Klucz Automatyczna Dopuszczalne Unikatowa?


kolumny danych gwny? inkrementacja? wartoci puste?

id INTEGER TAK TAK NIE TAK


time DATETIME NIE NIE NIE NIE
event TEXT NIE NIE NIE NIE

Tak jak w przypadku tabeli birdfeeding, utworzenie nowej tabeli seedstatus


wymaga wpisania odpowiedniego wyraenia jzyka SQL w wierszu polece
narzdzia sqlite:
[~]$ sqlite3 tweetingbirdfeeder.sqlite
SQLite version 3.7.6
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> CREATE TABLE "seedstatus" ("id" INTEGER PRIMARY KEY NOT NULL,
"time" DATETIME NOT NULL ,"event" TEXT NOT NULL );

Dodatek SQLite Manager


Mimo e narzdzia systemu SQLite obsugiwane z poziomu wiersza
polece oferuj wszystkie elementy niezbdne do tworzenia baz da-
nych i zarzdzania tymi bazami, w pewnych przypadkach prostszym
rozwizaniem jest korzystanie z aplikacji oferujcej graficzny inter-
fejs uytkownika. Aplikacje z takim interfejsem s szczeglnie przydat-
ne, jeli musimy przewija du liczb wierszy w jednym oknie. Istnieje
wiele aplikacji open source umoliwiajcych przegldanie baz danych
SQLite i oferujcych graficzny interfejs uytkownika. Uytkownikw prze-
gldarki internetowej Mozilla Firefox zachcam do instalacji dodatku SQ-
Lite Manager, ktry mona stosowa na wielu rnych platformach10.
Instalacja tego dodatku jest bardzo prosta. Z menu przegldarki Fire-
fox naley wybra opcj Dodatki, po czym znale dodatek SQLite Ma-
nager i klikn przycisk Zainstaluj. Po zainstalowaniu dodatku naley
otworzy zakadk Rozszerzenia w oknie dodatkw i klikn przycisk Opcje
dla dodatku SQLite Manager. Utworzenie nowej bazy danych sprowa-
dza si do kliknicia ikony New Database na pasku narzdzi dodatku
SQLite Manager. Rwnie proste jest zapisywanie i otwieranie plikw
baz danych SQLite.

10
https://addons.mozilla.org/en-US/firefox/addon/sqlite-manager/
Rozdzia 5. wierkajcy karmnik dla ptakw  117

Dysponujemy ju gotow baz danych, zatem moemy przystpi do pracy


nad kodem importujcym t baz oraz wspomniane wczeniej biblioteki Se-
rial i Twitter. Musimy te przygotowa skrypt nasuchujcy zdarze przesy-
anych za porednictwem portu szeregowego i rejestrujcy te dane (wraz ze
znacznikami czasowymi) w odpowiedniej tabeli bazy danych.
Procedura przechwytywania zdarzenia powinna si zakoczy publikacj
wpisu na Twitterze. Zanim jednak bdziemy mogli wysya takie wpisy
z poziomu programu, musimy utworzy konto na Twitterze i zarejestrowa
si, aby uzyska klucz interfejsu Twitter API wraz z powizanymi danymi
uwierzytelniajcymi standardu OAuth. Przejdmy wic do procesu uzyski-
wania klucza do wspomnianego interfejsu API.

Dane uwierzytelniajce interfejsu API Twittera


Zanim bdziemy mogli umieszcza wpisy na Twitterze, musimy oczywicie
zaoy konto w tym serwisie. Co wicej, zanim bdziemy mogli wysya wpisy
z poziomu naszego programu, a konkretnie funkcji lub bibliotek jzyka
programowania obsugujcych standard uwierzytelniania OAuth11, musimy
utworzy identyfikator aplikacji przypisany do odpowiedniego konta na
Twitterze. Mimo e mona wykorzysta do tego celu istniejce konto na
Twitterze, moim zdaniem lepszym rozwizaniem jest utworzenie zupenie
nowego konta specjalnie na potrzeby tego projektu. Dziki temu uytkownicy
ledzcy moje dotychczasowe konto nie bd niepokojeni eksperymentalnymi
powiadomieniami w zwizku z tworzonymi projektami. Takie rozwizanie
umoliwia te bardziej selektywny wybr odbiorcw postw publikowanych
przez tworzon aplikacj. Po rozwaeniu wszystkich argumentw naley
utworzy nowe konto i uzyska identyfikator aplikacji wygenerowany spe-
cjalnie dla projektu wierkajcego karmnika dla ptakw.
Musimy teraz otworzy stron dev.twitter.com, zalogowa si przy uyciu
nowych danych uwierzytelniajcych i wybra opcj Create an app. Na otwar-
tej stronie Create an application naley poda unikatow nazw nowej
aplikacji, opis zoony z co najmniej dziesiciu znakw oraz adres strony in-
ternetowej rejestrowanej aplikacji. Czytelnicy, ktrzy nie dysponuj wasnymi
witrynami internetowymi oferujcymi moliwo pobrania aplikacji, mog
wpisa jaki tymczasowy adres. Naley nastpnie zaznaczy pole Client under
Application Type i wybra opcj Read & Write z menu Default Access

11
http://oauth.net/
118  5.6. wierkanie w Pythonie

Type. Mona te wskaza niestandardow ikon aplikacji, jednak ten krok


nie jest wymagany. Po wpisaniu tekstu zabezpieczenia CAPTCHA na-
ley klikn przycisk Create your Twitter application na dole strony. Przed
przejciem do nastpnego kroku naley jeszcze zapozna si z warunkami
korzystania z interfejsu Twitter API i zaakceptowa proponowane zapisy.
Po zaakceptowaniu dania wygenerowany zostanie unikatowy klucz API,
klucz konsumenta standardu OAuth oraz klucz tajny konsumenta. Aby
uzyska dostp do tokenu dostpu (oauth_token) i klucza tajnego tokenu
dostpu (oauth_token_secret), naley klikn opcj My Access Token wi-
doczn po lewej stronie. Obie wartoci naley skopiowa i zapisa w bez-
piecznym, odpowiednio chronionym pliku. Obie wartoci bd potrzebne
do komunikacji z nowym kontem na Twitterze z poziomu kodu programu.
Oczywicie naley zadba o zachowanie tych wartoci w cisej tajemnicy!
Nie chcemy przecie, aby jaki zoliwy, pozbawiony skrupuw uytkownik
przej nasz tajny token, wykorzystywa go do wysyania spamu do naszych
przyjaci i doprowadza do pasji ca spoeczno uytkownikw Twittera.
Skoro dysponujemy ju kontem na Twitterze i poprawnym kluczem interfejsu
API tego serwisu, moemy wykorzysta uzyskane dane uwierzytelniajce
w kodzie aplikacji jzyka Python napisanej dla naszego wierkajcego karm-
nika dla ptakw.

Biblioteka Python-Twitter
Mimo e mamy dostp do Twittera za porednictwem interfejsu API, wci
nie dysponujemy mechanizmem komunikacji z Twitterem z poziomu skryp-
tw jzyka Python. Warto wykorzysta do tego celu rozwizania dostpne
w bibliotece Python-Twitter12. Aby zainstalowa obie biblioteki potrzebne
do realizacji tego projektu, czyli Pyserial i Python-Twitter, naley pobra
najnowsze wersje tych bibliotek i uy standardowego polecenia sudo python
setup.py install. W przypadku instalowania tych bibliotek w systemie Mac
OS X 10.6 (Snow Leopard) lub nowszym mona skorzysta z ju zainsta-
lowanego narzdzia instalacyjnego Pythona nazwanego easy_install. Aby
jednak unikn problemw zwizanych z 64-bitowymi wersjami bibliotek,
odpowiednie polecenie naley poprzedzi flag architektury i386, aby zain-
stalowa bibliotek Python-Twitter bez adnych bdw. Kompletne polece-
nie dla tej biblioteki powinno mie nastpujc posta: sudo env ARCHFLAGS="-
arch i386" easy_install python-twitter.

12
http://code.google.com/p/python-twitter/
Rozdzia 5. wierkajcy karmnik dla ptakw  119

Na tym etapie wszystkie niezbdne konta s skonfigurowane, a biblioteki


zainstalowane. Moemy wic dokoczy projekt, czyli napisa skrypt jzy-
ka Python odpowiedzialny za nasuchiwanie komunikatw za porednictwem
moduu XBee podczonego do portu szeregowego, zapisywanie tych komu-
nikatw w bazie danych i publikowanie odpowiednich postw na Twitterze.
Sprbujmy wic napisa skrypt Python implementujcy ten zoony proces.
Plik TweetingBirdFeeder/tweetingbirdfeeder.py

# importuje biblioteki Pythona: DateTime, Serial, SQLite3 i Twitter


from datetime import datetime
import serial
import sqlite3
import twitter

# importuje modu os w celu wyczyszczenia okna terminala i uruchomienia programu


# w systemie Windows naley uy polecenia "cls"; w systemach Linux i OS X naley
uy polecenia "clear"
import os

if sys.platform == "win32":
os.system("cls")
else:
os.system("clear")

# nawizuje poczenie z portem szeregowym; nazw URZDZENIE_SZEREGOWE naley zastpi


# nazw portu szeregowego, do ktrego podczono modu XBee (za pomoc przewodu FTDI)
XBeePort = serial.Serial('/dev/tty.URZDZENIE_SZEREGOWE', \
baudrate = 9600, timeout = 1)

# nawizuje poczenie z baz danych SQLite


sqlconnection = sqlite3.connect("tweetingbirdfeeder.sqlite3")

# tworzy kursor bazy danych


sqlcursor = sqlconnection.cursor()

# inicjalizuje obiekt interfejsu Twitter API


api = twitter.Api('klucz_konsumenta_OAuth', 'klucz_tajny_konsumenta_OAuth', \
'token_dostpu_OAuth', 'klucz_tajny_tokenu_dostpu_OAuth')

def transmit(msg):
# uzyskuje i odpowiednio formatuje biec dat i godzin
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

# sprawdza rodzaj komunikatu i przypisuje odpowiednie parametry odpowiedzi


if msg == "przylot":
tweet = "Jaki ptak wyldowa na grzdzie!"
table = "birdfeeding"
if msg == "odlot":
tweet = "Ptak odlecia z grzdy!"
table = "birdfeeding"
if msg == "dosyp":
tweet = "Pojemnik na ziarno dla ptakw jest pusty."
120  5.6. wierkanie w Pythonie

table = "seedstatus"
if msg == "ziarnoWNormie":
tweet = "Ziarno w karmniku zostao uzupenione."
table = "seedstatus"

print "%s - %s" % (timestamp.strftime("%Y-%m-%d %H:%M:%S"), tweet)

# zapisuje odpowiednie zdarzenie w bazie danych SQLite


try:
sqlstatement = "INSERT INTO %s (id, time, event) \
VALUES(NULL, \"%s\", \"%s\")" % (table, timestamp, msg)
sqlcursor.execute(sqlstatement)
sqlconnection.commit()
except:
print "Nie mona zapisa zdarzenia w bazie danych."
pass

# publikuje informacj na Twitterze


try:
status = api.PostUpdate(msg)
except:
print "Nie mona opublikowa postu na Twitterze"
pass

# gwna ptla programu


try:
while 1:
# nasuchuje znakw przychodzcych (wysyanych przez modu radiowy XBee
# zainstalowany w karmniku)
message = XBeePort.readline()

# w zalenoci od rodzaju otrzymanego komunikatu


# rejestruje odpowiednie zdarzenie w bazie danych i publikuje post na Twitterze
if "przylot" in message:
transmit("przylot")
if "odlot" in message:
transmit("odlot")
if "dosyp" in message:
transmit("dosyp")
if "ziarnoWNormie" in message:
transmit("ziarnoWNormie")

except KeyboardInterrupt:
# przerywa program w momencie wykrycia nacinicia kombinacji klawiszy Ctrl+C
print("\nProgram nasuchujcy komunikatw wierkajcego karmnika dla ptakw koczy prac.\n")
sqlcursor.close()
pass

Po zaadowaniu niezbdnych bibliotek datetime, serial, sqlite i twitter


czycimy okno terminala (za pomoc polecenia cls w systemie Windows
lub polecenia clear w pozostaych systemach operacyjnych) i nawizujemy
poczenie z moduem XBee (poczonym z portem szeregowym kompu-
tera za pomoc przewodu FTDI). Zaraz potem nawizujemy poczenie
Rozdzia 5. wierkajcy karmnik dla ptakw  121

z utworzonym wczeniej plikiem bazy danych tweetingbirdfeeder.sqlite3 i roz-


poczynamy wykonywanie nieskoczonej ptli while do momentu nacini-
cia kombinacji klawiszy Control-C, ktra powoduje zamknicie programu.
Jeli modu XBee otrzyma i prawidowo rozpozna komunikat, skrypt wywoa
funkcj def transmit(msg), ktra odpowiada za analiz skadniow zmiennej
msg, dodanie opisu danego zdarzenia, zapisanie odpowiedniego komunikatu
w bazie danych oraz opublikowanie postu na Twitterze.
Jeli platforma Arduino jest uruchomiona i jeli para moduw XBee nawi-
zaa poczenie i jest zasilana, moemy przetestowa wykrywanie przekra-
czania wartoci progowych, kilkukrotnie dotykajc czujnik grzdy i zasaniajc
fotokomrk, tak aby system wysa kilka sygnaw o tych zdarzeniach. Jeli
w oknie terminala nie zostay wywietlone adne bdy zwizane z wykony-
waniem tego skryptu, warto otworzy plik tweetingbirdfeeder.sqlite3 w oknie
Browse and Search narzdzia SQLite Manager i sprawdzi, czy informacje
o zdarzeniach dotyczcych obu czujnikw zostay zarejestrowane i oznaczone
odpowiednimi znacznikami czasowymi. Jeli wszystkie te mechanizmy za-
dziaay prawidowo, warto jeszcze zalogowa si na Twitterze (do konta
uywanego do publikowania komunikatw o tych zdarzeniach) i sprawdzi,
czy wszystkie posty zostay opublikowane we waciwej kolejnoci.
Nasz system jest prawie gotowy. Pozostao nam ju tylko kilka usprawnie
elementw sprztowych.

5.7. Koczenie projektu


Aby zapewni pen funkcjonalno tego projektu, musimy jeszcze zabezpie-
czy niezbdne urzdzenia (w tym przypadku pytk Arduino poczon
z moduem XBee) przed warunkami atmosferycznymi i zainstalowa w karm-
niku dla ptakw, zamontowa fotokomrk blisko podstawy karmnika, wsy-
pa ziarno do karmnika, poczy pytk Arduino i modu XBee ze rdem
zasilania oraz umieci cao na zewntrz budynku, ale w zasigu drugiego
moduu XBee (podczonego do komputera).
Kady, kto nie mieszka w strefie klimatycznej z rzadkimi opadami deszczu,
powinien dobrze zabezpieczy urzdzenia elektryczne przed dziaaniem wody.
W moich testw wynika, e umieszczenie tych elementw elektronicznych
w dwch szczelnych workach w zupenoci wystarczy do zabezpieczenia pyt-
ki Arduino i moduu XBee przed deszczem. Jeli jednak nie planujemy
zasilania tych komponentw za pomoc 9-woltowej baterii, ktr mona by
122  5.7. Koczenie projektu

umieci wraz z elektronik w workach (takie rozwizanie sprawdzioby si


w przypadku krtkich sesji gromadzenia danych, jednak nasz system bar-
dzo szybko wyczerpaby bateri), musimy doprowadzi do pytki Arduino
przewd zapewniajcy stay dopyw energii.
Aby doprowadzi przewd zasilajcy, wystarczy zrobi niewielki otwr
w workach foliowych, jednak takie rozwizanie narazi cay system na dziaa-
nie wilgoci. Aby zminimalizowa ryzyko zalania elementw elektronicznych,
warto zabezpieczy miejsce czenia workw z przewodem mocno nacignit
foli spoywcz, tak aby szczelnie zamkn worek i zabezpieczy czenie
przed poluzowaniem lub wylizgniciem si wskutek zmieniajcej si pogody.
Stosowanie odpowiednio zabezpieczonego przewodu zasilajcego (na przy-
kad przewodu sprzedawanego z myl o zasilaniu lampek w okresie wit
Boego Narodzenia) bdzie tasze i atwiejsze do testowania. Konstruktorzy
szczeglnie dbajcy o rodowisko naturalne mog jednak zainwestowa
nieco wiksze rodki w alternatywne rozwizanie w technologi energii
odnawialnej w formie fotowoltaicznego systemu zasilania.
Przed zakupem odpowiedniego przenonego systemu zasilania energi so-
neczn warto sprawdzi, czy produkt generuje napicie 5 V, jest odpo-
wiednio wytrzymay i zawiera wbudowany akumulator, ktry bdzie groma-
dzi energi. Dobrym przykadem stosunkowo niedrogich rozwiza tego
typu s zasilacze z serii Solio Bolt13.
Czytelnicy, ktrzy wol systemy fotowoltaiczne zawierajce akumulatory
o wikszych pojemnociach, musz by przygotowani na nieco wiksze koszty.
Takie firmy jak Sunforce Products maj w ofercie rozmaite rozwizania pod-
trzymujce napicie, ukady adowania akumulatorw i sterowniki projek-
towane z myl o wikszym obcieniu14.
Panel soneczny naley zamontowa w odpowiedniej odlegoci od karmnika,
tak aby by wystawiony na promienie soneczne. Jeli to moliwe, panel naley
zamontowa pod ktem dziewidziesiciu stopni do promieni sonecznych,
aby uzyska jak najwicej energii. W zalenoci od strefy klimatycznej i red-
niego poziomu nasonecznienia by moe trzeba bdzie poszuka alternatyw-
nych lub uzupeniajcych rozwiza, jak adowarka zasilana przez turbin
wiatrow lub nawet dynamo napdzane si mini.

13
http://www.solio.com/chargers/
14
http://www.sunforceproducts.com/results.php?CAT_ID=1
Rozdzia 5. wierkajcy karmnik dla ptakw  123

W ramach tego projektu udao nam si osign cakiem sporo zupenie no-
wych celw od zastosowania fotokomrki i wasnorcznie zbudowanego
czujnika pojemnociowego, przez opanowanie sztuki czenia w pary modu-
w XBee i nawizywania komunikacji bezprzewodowej midzy nimi, po
napisanie skryptu rejestrujcego dane w ustrukturyzowanej bazie danych,
reagujcego na zdarzenia i publikujcego posty na Twitterze za porednic-
twem interfejsu API tego serwisu. Zastosowalimy take autonomiczny sys-
tem zasilania pytki Arduino i moduu XBee oraz zabezpieczylimy te wra-
liwe komponenty elektroniczne przed szkodliwym dziaaniem warunkw
atmosferycznych.
Te cenne lekcje z pewnoci wykorzystamy przynajmniej w projektach
realizowanych w czci pozostaych rozdziaw.

5.8. Nastpne kroki


Czujnik pojemnociowy i fotokomrk mona wykorzysta w najrniejszych
projektach automatyzacji domu. Poniej opisaem zaledwie kilka pomysw,
ktre warto rozway:
Pytk Arduino z podczonymi fotokomrk i moduem XBee mona
umieci (wraz z bateriami) w lodwce lub zamraarce, aby wykry-
wa, jak czsto i jak dugo drzwi lodwki s otwarte. Na podstawie
zgromadzonych danych mona obliczy energi tracon w poszczegl-
nych miesicach w zwizku ze zbyt czstym zagldaniem do lodwki.
W razie stwierdzenia, e koszty traconej w ten sposb energii s zbyt
wysokie, system moe wysa wiadomoci poczty elektronicznej lub
powiadomienia na Twitterze przypominajce domownikom o gazach
cieplarnianych i globalnym ociepleniu.
Jeli uznamy, e szukanie wcznika wiata w ciemnociach jest zbyt
kopotliwe, by moe powinnimy zastosowa czujnik pojemnociowy
z folii aluminiowej i zainstalowa ten wcznik na cianie przy
wejciu do piwnicy lub garau bd na poziomej powierzchni stou
na wprost wejcia.
Na podstawie wartoci analogowych odczytywanych z fotokomrki
mona mierzy cykle dni i nocy oraz poziom nasonecznienia, aby
w ten sposb zgromadzi dane przydatne na przykad w ogrodnictwie.
124  5.8. Nastpne kroki

Czy sadzenie okrelonych gatunkw kwiatw, owocw lub warzyw


w odpowiednio wybranym okresie pozwoli przyspieszy lub opni
wzrost rolin? Jak dugo roliny byy wystawione na pene soce,
a przez ile dni niebo byo zachmurzone?
Oprcz wymienionych pomysw istnieje jeszcze mnstwo sposobw ana-
lizowania danych gromadzonych na podstawie zdarze dotyczcych na-
szego karmnika dla ptakw. Moemy uy biblioteki jzyka Python gene-
rujcej wykresy (na przykad CairoPlot) do wizualizacji redniego czasu
przebywania ptaka w karmniku15. Ile czasu zajo ptakom zjedzenie caego
ziarna? Jaki wpyw na godziny przylotw i czas przebywania w karmniku
miaa pogoda na zewntrz? Czy zmiana rodzaju ziarna wpyna na czas
przebywania ptakw w karmniku i czstotliwo przylotw?
Warto rozway udostpnienie wpisw na Twitterze innym entuzjastom pta-
kw, aby zbudowa szerok sie spoecznociow uytkownikw czytajcych
i przekazujcych dalej dane generowane przez nasz karmnik. By moe wzor-
ce zaobserwowane w jednym karmniku bd nieco inne ni w przypadku
karmnikw zamontowanych na innych obszarach geograficznych znajomi
z serwisu spoecznociowego by moe bd zainteresowani wspln ana-
liz trendw dotyczcych populacji ptakw, cykli migracyjnych i pozostaych
czynnikw wpywajcych na zachowania naszych upierzonych przyjaci.

15
http://cairoplot.sourceforge.net/
Rozdzia 6.
Wykrywacz
dostarczania paczek

K
ady, kto po caym dniu pracy wraca do domu i odkrywa, e czeka na
niego jaka wana przesyka kurierska, wie, jakie to przyjemne uczu-
cie. Nawet jeli uwanie ledzilimy paczk w internecie i spodzie-
walimy si jej tego dnia, po stwierdzeniu, e przesyka bezpiecznie do-
tara do naszego domu, czujemy si troch jak po otrzymaniu prezentu uro-
dzinowego.
Jeszcze lepszym rozwizaniem byoby informowanie adresata o dostarcze-
niu przesyki nie tyle w momencie jej pozostawienia w domu odbiorcy, co
w chwili potwierdzenia tego zdarzenia przez kuriera. (Patrz rysunek 6.1
zatytuowany Otrzymywanie wiadomoci poczty elektronicznej po dostar-
czeniu przesyki). Co bdzie, jeli kurier zostawi przesyk pod niewaci-
wym adresem? Bez obaw. System wykrywania dostarczania paczek wyle
wiadomo poczty elektronicznej w momencie pozostawienia paczki przed
drzwiami. Takie powiadomienia mona bez trudu filtrowa, tak aby od-
powiednie wiadomoci pozostaway aktywne do momentu potwierdzenia
odbioru przesyki na stronie internetowej.
126  6.1. Czego potrzebujemy

Rysunek 6.1. Otrzymywanie wiadomoci poczty elektronicznej


po dostarczeniu przesyki

W tym projekcie uyjemy elementw, ktre stosowalimy wczeniej w roz-


dziale 5. zatytuowanym wierkajcy karmnik dla ptakw, oraz mecha-
nizmu monitorowania i powiadamiania podobnego do rozwizania z roz-
dziau 4. zatytuowanego Elektryczny pies strujcy. Zamiast uywa
czujnika ruchu na podczerwie (PIR) nasz wykrywacz paczek bdzie si
kierowa wskazaniami czujnika nacisku. W momencie umieszczenia na mo-
nitorowanym miejscu dla paczek (na przykad na wycieraczce) przedmiotu
o wadze zblionej do niewielkiej przesyki (czyli wacej okoo p kilo-
grama) czujnik wysya powiadomienie za porednictwem moduu XBee
podczonego do portu szeregowego. Odpowiednie powiadomienie jest na-
stpnie przetwarzane przez skrypt jzyka Python, ktry rejestruje w dzienniku
zdarze informacj o paczce i wysya wiadomo poczty elektronicznej.
Warto te rozway implementacj bardziej niezawodnego rozwizania,
ktre odczeka godzin i potwierdzi zgoszenie dostawy na stronie interne-
towej firmy kurierskiej, aby na tej podstawie wysa sprawdzon wiado-
mo o paczce.
Rozdzia 6. Wykrywacz dostarczania paczek  127

6.1. Czego potrzebujemy


Wikszo elementw potrzebnych do budowy tego projektu stosowalimy
ju we wczeniejszych projektach opisanych w tej ksice wyjtkiem jest
czujnik siy nacisku (ktry bywa bdnie nazywany czujnikiem cinienia).
Warto przeanalizowa kompletn list niezbdnych komponentw (potrzebne
czci pokazano te na rysunku 6.2 zatytuowanym Czci systemu wy-
krywania dostarczonych paczek.

Rysunek 6.2. Czci systemu wykrywania dostarczonych paczek

1. platforma Arduino Diecimila, Nano lub Uno;


2. para moduw radiowych XBee oraz odpowiedni przewd FTDI;
3. rezystor 10 k;
4. czujnik siy nacisku , na przykad podobny do tego pokazanego na
1

rysunku 6.3 (zatytuowanym Rezystory projektu wykrywacza do-


starczonych paczek) wraz z rezystorem 10 k2;
5. 9-woltowy zasilacz dla platformy Arduino (potrzebny do zasilania
systemu po odczeniu przewodu USB);

1
http://www.adafruit.com/products/166
2
Firma Sparkfun ma w ofercie kwadratowy czujnik o jeszcze wikszej powierzchni:
http://www.sparkfun.com/products/9376.
128  6.2. Budowa rozwizania

Rysunek 6.3. Rezystory projektu wykrywacza dostarczonych paczek

6. dwie drewniane lub plastikowe pytki (najlepiej poczone);


7. komputer (nie ma go na zdjciu), najlepiej z systemem Linux lub
Mac OS oraz zainstalowanym kompilatorem jzyka Python 2.6
lub nowszym (na potrzeby skryptu przetwarzajcego przychodzce
komunikaty i korzystania z usug sieciowych oferowanych przez po-
pularne firmy logistyczne).
W zalenoci od typu pytki Arduino wybranego dla tego projektu bdziemy
dodatkowo potrzebowali standardowego przewodu USB z kocwkami
A-B lub A-mini B, aby poczy platform Arduino z komputerem.
Czytelnicy, ktrzy realizowali projekty opisane w dotychczasowych rozdzia-
ach, nie powinni mie najmniejszych problemw ze skonstruowaniem wy-
krywacza dostarczonych paczek. Projekt prezentowany w tym rozdziale jest
w istocie zmodyfikowan wersj systemu wierkajcego karmnika dla pta-
kw. Zamiast czujnika natenia wiata (fotokomrki) w tym projekcie
uyjemy czujnika nacisku zainstalowanego w odpowiednim miejscu. Rozbu-
dujemy te skrypt jzyka Python z poprzedniego projektu, tak aby uzyski-
wa dane z serwisw internetowych popularnych firm kurierskich. Spraw-
dzanie stanu przesyek na stronach firm kurierskich pozwoli dodatkowo
potwierdzi komunikaty o dorczeniach. Do dziea!

6.2. Budowa rozwizania


Konstrukcja rozwiza sprztowych na potrzeby tego projektu bardzo przy-
pomina rozwizania zbudowane w ramach projektu wierkajcego karmni-
ka dla ptakw. Take tym razem uyjemy jzyka Python do opracowania
skryptu dziaajcego na serwerze, jednak w tym przypadku skrypt bdzie
Rozdzia 6. Wykrywacz dostarczania paczek  129

zawiera wiele niestandardowych pakietw potrzebnych do komunikacji


z usugami sieciowymi wybranych firm kurierskich na potrzeby tego pro-
jektu zaimplementowaem mechanizmy wsppracujce z serwisami popu-
larnych w Stanach Zjednoczonych firm Federal Express (FedEx) i United
Parcel Service (UPS). Realizacja tego projektu wymaga nastpujcych
krokw:
1. Naley podczy czujnik siy nacisku do dostpnego wtyku analogo-
wego na pytce Arduino i zidentyfikowa warto progow dla od-
powiedniej siy dziaajcej na ten czujnik.
2. Naley podczy modu XBee do pytki Arduino i (po wykryciu
przekroczenia wartoci progowej wybranej dla czujnika siy nacisku)
przesa komunikat do innego moduu XBee poczonego z kom-
puterem.
3. Po otrzymaniu komunikatu o zdarzeniu przekroczenia wartoci pro-
gowej skrypt wstrzymuje dziaanie na dziesi minut, aby da czas
na aktualizacj bazy danych w systemie ledzenia przesyek firmy
kurierskiej. Skrypt musi nastpnie przeszuka tabel bazy danych pod
ktem znanych numerw przesyek kurierskich firm FedEx i UPS.
Naley uy usug sieciowych firm FedEx i UPS do sprawdzenia,
czy informacja o dostarczeniu przesyki zostaa potwierdzona.
4. W razie znalezienia dopasowania naley zaktualizowa odpowiedni
wiersz w lokalnej bazie danych, tak aby zawiera potwierdzenie do-
starczenia przesyki oraz dat i godzin tego zdarzenia.
5. Naley wysa (za porednictwem bramy Gmail SMTP firmy
Google) wiadomo poczty zawierajc godzin wykrycia dostar-
czenia przesyki i numery paczek, ktrych status zosta prawidowo
potwierdzony w serwisie firmy kurierskiej. W razie braku pasujcego
numeru przesyki musimy zasygnalizowa problem w ciele tej wia-
domoci.
Zacznijmy od poczenia elementw sprztowych tego ukadu. Tworzeniem
niezbdnego oprogramowania zajmiemy si w dalszej czci tego rozdziau.

6.3. czenie sprztu


Czytelnicy, ktrzy zrealizowali projekt wierkajcego karmnika dla ptakw,
wiedz ju, jak poczy modu XBee i czujnik do pytki Arduino. W razie
potrzeby przypomnienia sobie odpowiednich rozwiza warto wrci do
130  6.3. czenie sprztu

podrozdziau 5.5 zatytuowanego Komunikacja bezprzewodowa. Za-


miast podcza do wtyku analogowego na pytce Arduino czujnik natenia
wiata wraz z rezystorem 10 k, tym razem podczymy czujnik siy naci-
sku. (Patrz rysunek 6.4 zatytuowany Schemat pocze systemu wykry-
wania dostarczonych paczek). Jedn kocwk czujnika naley poczy
z wtykiem zasilania 3,3 V. Drug kocwk naley poczy z wtykiem ana-
logowym nr 0. Wtyk analogowy nr 0 naley nastpnie zmostkowa z wtykiem
uziemienia za pomoc rezystora 10 k.

Rysunek 6.4. Schemat pocze systemu wykrywania dostarczonych paczek

Modu XBee naley podczy do pytki Arduino w taki sam sposb jak
w projekcie wierkajcego karmnika dla ptakw. Kocwk zasilania mo-
duu XBee naley poczy z wtykiem zasilania 5,5 na pytce Arduino.
Kocwk uziemienia moduu XBee naley poczy z drugim dostpnym
wtykiem uziemienia na pytce Arduino. Kocwk danych przychodz-
cych tego moduu naley poczy z wtykiem cyfrowym nr 2, a kocwk
danych wychodzcych z wtykiem cyfrowym nr 3. Po poczeniu wszyst-
kich elementw nasz system powinien wyglda tak jak rozwizanie poka-
zane na rysunku 6.5 zatytuowanym Wykrywacz dostarczonych paczek.
Musimy jeszcze poczy komputer z portem URL platformy Arduino,
aby nie tylko zapewni zasilanie caego ukadu, ale te umoliwi napisa-
nie, uruchomienie i przetestowanie szkicu utworzonego dla tego projektu.
Rozdzia 6. Wykrywacz dostarczania paczek  131

Rysunek 6.5. Wykrywacz dostarczonych paczek

6.4. Pisanie kodu


Projekt obejmuje dwa komponenty kodu rdowego. Pierwszym takim
komponentem bdzie szkic monitorujcy stan czujnika siy nacisku pod ktem
pooenia na nim czego, czego waga przekracza przyjt warto progow.
W takim przypadku szkic musi wysa zdarzenie wraz z wartoci odczytan
przez ten czujnik za porednictwem portu szeregowego i podczonego do
niego moduu XBee.
Drugim komponentem programowym bdzie skrypt jzyka Python oczeku-
jcy na zdarzenie przekroczenia wartoci progowej zidentyfikowanej dla
czujnika siy nacisku. Jeli warto progowa zostaa przekroczona, skrypt
musi zarejestrowa warto przesan przez czujnik (wraz z dat i godzin
tego zdarzenia) w bazie danych SQLite. Jeli baza danych zawiera list
znanych numerw ledzonych przesyek, skrypt powinien przeszuka te
numery i sprawdzi usugi sieciowe firm kurierskich FedEx i UPS pod
ktem pasujcych wartoci. Program musi nastpnie wysa wiadomo
poczty elektronicznej zawierajc informacj o zdarzeniu dostarczenia paczki
i ewentualne potwierdzenie tego zdarzenia pobrane z serwisu firmy kurierskiej.
132  6.5. Szkic systemu wykrywania dostarczonych paczek

6.5. Szkic systemu wykrywania


dostarczonych paczek
Kod tego szkicu jest w istocie zmienion wersj programu, ktry napisalimy
dla projektu wierkajcego karmnika dla ptakw. Jedn z najwikszych zalet
projektw budowanych na bazie platformy Arduino jest moliwo wielo-
krotnego stosowania raz napisanych szkicw operujcych na czujnikach
czy urzdzeniach wykonawczych. Podstawowe zasady dziaania czujnikw
i urzdze wykonawczych s takie same zmienia si tylko rodzaj czujnika
czy silnika oraz konkretne wartoci (odczytywane przez czujnik i sterujce
silnikiem).
Poniewa zdecydowan wikszo kodu tego szkicu omwiem ju przy okazji
analizy projektu wierkajcego karmnika dla ptakw, nie bdziemy traci
czasu na ponown analiz wszystkich aspektw tego rozwizania. Warto
jednak zwrci uwag na jedn zmienn zastosowan w nowym szkicu:
force_value. Tak jak w przypadku wszystkich czujnikw stosowanych w pozo-
staych projektach, czujnik siy nacisku wymaga kalibracji pod ktem okrelo-
nej konfiguracji (konkretnego typu czujnika, rodzaju zastosowanych przewo-
dw, napi wystpujcych w ukadzie i sposobu instalacji samego czujnika).
Plik PackageDeliveryDetector/PackageDeliveryDetector.pde

#include <NewSoftSerial.h>

#define FORCE_THRESHOLD 400


#define ONBOARD_LED 13
#define FORCE_SENSOR 0

// ustawia wtyki cyfrowe na potrzeby szeregowego wysyania/odbioru danych


// przez modu XBee
NewSoftSerial XBeeSerial = NewSoftSerial(2, 3);
int force_value = 0;
byte force_state = 0;

void setup()
{
// na potrzeby komunikatw diagnostycznych w oknie portu szeregowego
Serial.begin(9600);

// na potrzeby transmisji danych za porednictwem moduu XBee


XBeeSerial.begin(9600);

// ustawia wtyk dla wbudowanej diody LED


pinMode(ONBOARD_LED, OUTPUT);
}
void SendDeliveryAlert(int force_value, int force_state)
{
digitalWrite(ONBOARD_LED, force_state ? HIGH : LOW);
Rozdzia 6. Wykrywacz dostarczania paczek  133

if (force_state)
Serial.print("Dostarczono przesyk, force_value=");
else
Serial.print("Zabrano przesyk, force_value=");
Serial.println(force_value);
XBeeSerial.println(force_value);
}
void loop()
{
// czeka sekund w kadej iteracji ptli
delay(1000);

// sprawdza napicie na wtyku FORCE_SENSOR


force_value = analogRead(FORCE_SENSOR);

switch (force_state)
{
case 0: // sprawdza, czy dostarczono paczk
if (force_value >= FORCE_THRESHOLD)
{
force_state = 1;
SendDeliveryAlert(force_value, force_state);
}
break;
case 1: // sprawdza, czy zabrano paczk
if (force_value < FORCE_THRESHOLD)
{
force_state = 0;
SendDeliveryAlert(force_value, force_state);
}
break;
}
}

Mimo e dysponujemy ju podstawowym szkicem, wci musimy przetesto-


wa ten kod na konkretnej pytce Arduino i sprawdzi, czy czujnik siy naci-
sku prawidowo reaguje na zdarzenia zmiany wagi. Musimy te zadba
o prawidow komunikacj radiow pary moduw XBee, czyli o prawidowe
przekazywanie wartoci odczytywanych przez czujnik siy nacisku (za pored-
nictwem wtyku analogowego nr 0) oraz komunikatu o wadze.

6.6. Testowanie szkicu wykrywajcego


dostarczanie paczek
Po zainstalowaniu i uruchomieniu tego szkicu na platformie Arduino naley
otworzy okno monitorowania portu szeregowego w rodowisku Arduino
IDE i cisn czujnik siy nacisku kciukiem i palcem wskazujcym. Zdarzenie
dostarczenia paczki powinno zosta zasygnalizowane w oknie monitora portu
134  6.7. Skrypt przetwarzajcy komunikaty o przesykach

szeregowego. Naley teraz puci czujnik siy nacisku i odczeka kilka se-
kund. W oknie monitora portu szeregowego powinna zosta wywietlona
warto mniejsza ni 400 wraz z komunikatem o braku paczki. W razie bra-
ku odpowiednich komunikatw warto raz jeszcze sprawdzi wszystkie po-
czenia. By moe bdziemy musieli zwikszy lub zmniejszy warto pro-
gow force_sensor_value, aby wyeliminowa wpyw przypadkowych od-
czytw analogowych czujnika wskutek drga lub nieoczekiwanych waha.
Naley rwnie sprawdzi, czy moduy radiowe XBee s prawidowo po-
czone i czy komunikuj si ze sob. Warto te uy polecenia screen (opi-
sanego ju w rozdziale 5. zatytuowanym wierkajcy karmnik dla pta-
kw) do obserwacji komunikatw wysyanych przez czujnik siy nacisku
w reakcji na jego ciskanie palcami. Przesyane w ten sposb informacje po-
winny by takie same jak te wywietlane w oknie monitora portu szeregowego
w ramach rodowiska Arduino IDE. Po sprawdzeniu wszystkich elementw
moemy przystpi do pisania skryptu jzyka Python, ktry bdzie odpo-
wiada za nasuchiwanie komunikatw przychodzcych do docelowego
moduu XBee (poczonego z komputerem za pomoc przewodu FTDI)
i na tej podstawie podejmowa odpowiednie dziaania.

6.7. Skrypt przetwarzajcy komunikaty


o przesykach
Take tym razem wykorzystamy kod napisany na potrzeby projektu wierka-
jcego karmnika dla ptakw (opisanego w rozdziale 5.). Oprcz skopio-
wania rozwiza odpowiedzialnych za monitorowanie portu szeregowego
i nawizywanie pocze z baz danych SQLite musimy jeszcze rozszerzy
ten skrypt o dodatkowe elementy. Po pierwsze, musimy doda mechanizm
przeszukiwania bazy danych pod ktem znanych, ledzonych numerw prze-
syek. Po otrzymaniu powiadomienia za porednictwem moduu XBee
podczonego do portu szeregowego (za pomoc przewodu FTDI) skrypt
odczeka kilka minut, po czym przeszuka numery ledzonych paczek w celu
identyfikacji waciwej przesyki. W niektrych firmach kurierskich aktualiza-
cja systemu i wprowadzenie informacji o dostarczeniu paczki moe zaj
nawet ponad godzin. W przypadku Poczty Stanw Zjednoczonych taka
aktualizacja zajmuje nawet dob, zatem sprawdzanie stanu zwykych paczek
pocztowych w ten sposb nie ma wikszego sensu.
Rozdzia 6. Wykrywacz dostarczania paczek  135

Po przeszukaniu tabeli bazy danych i uzyskaniu numerw ledzonych paczek


za porednictwem usug sieciowych firm kurierskich moemy doda infor-
macj o potwierdzeniu stanu przesyki do generowanej wiadomoci poczty
elektronicznej. Wiadomo poczty elektronicznej powinna zawiera stosown
informacj take w razie wystpienia bdu podczas poszukiwania numeru
przesyki lub w przypadku braku potwierdzenia dostarczenia paczki w syste-
mie firmy kurierskiej.
Na koniec uyjemy usugi Gmail do wysania wiadomoci do waciwego
adresata. Czytelnicy, ktrzy nie dysponuj kontem usugi Gmail, bd musieli
utworzy takie konto na potrzeby tego projektu. Alternatywnym rozwiza-
niem jest uycie innego serwera poczty elektronicznej z obsug wiadomoci
wychodzcych SMTP wystarczy zastpi bram SMTP usugi Gmail
adresem dowolnego innego serwera. Zanim jednak bdziemy mogli przy-
stpi do pisania kodu jzyka Python, musimy przygotowa struktur bazy
danych, w ktrej bdziemy zapisywali zdarzenia zwizane z dostarczaniem
przesyek, numery ledzonych przesyek, opisy paczek i potwierdzenia
dostarczenia.

6.8. Tworzenie bazy danych systemu


wykrywania przesyek
Na potrzeby tego projektu musimy utworzy dwie tabele. Pierwsza tabela
bdzie zawieraa zarwno histori zdarze wykrywanych przez czujnik siy
nacisku (w momencie kadzenia i podnoszenia paczek), jak i zarejestro-
wane wartoci przekraczajce przyjty prg. Druga tabela bdzie zawieraa
znane numery ledzonych przesyek wraz z polem reprezentujcym dat
i godzin potwierdzenia dorczenia przez kuriera (w systemie firmy kurier-
skiej). Podobne rozwizanie stosowalimy ju w projekcie wierkajcego
karmnika dla ptakw (opisanym w rozdziale 5.), zatem podczas tworzenia
bazy danych o paczkach uyjemy tych samych technik.
Plik bazy danych utworzymy za pomoc narzdzia sqlite3. Do tak utwo-
rzonej bazy danych packagedelivery dodamy dwie opisane powyej tabele.
Jak ju wspomniaem, w pierwszej tabeli bdziemy przechowywa infor-
macje o zdarzeniach zarejestrowanych przez czujnik siy nacisku oraz daty
i godziny wystpowania tych zdarze. Struktur odpowiedniej tabeli bazy
danych pokazano poniej:
136  6.8. Tworzenie bazy danych systemu wykrywania przesyek

Nazwa Typ Klucz Automatyczna Dopuszczalne Unikatowa?


kolumny danych gwny? inkrementacja? wartoci puste?

id INTEGER TAK TAK NIE TAK


time DATETIME NIE NIE NIE NIE
event TEXT NIE NIE NIE NIE

Czy ta tabela nie wyglda znajomo? Tak tabela bardzo przypomina


struktur utworzon podczas realizacji projektu wierkajcego karmnika
dla ptakw. Oglne zasady dziaania obu mechanizmw s takie same,
poniewa w obu projektach musimy uzyskiwa sygna o zdarzeniu i zapi-
sywa informacje na jego temat w ustrukturyzowanej formie. Tym razem
zdarzenie reprezentuje otrzymanie przesyki.
Odpowiedni tabel moemy utworzy, wpisujc nastpujce wyraenie jzy-
ka SQL w wierszu polece narzdzia sqlite:
[~]$ sqlite3 packagedelivery.sqlite
SQLite version 3.7.6
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> CREATE TABLE "deliverystatus" ("id" INTEGER PRIMARY KEY NOT NULL UNIQUE,
"time" DATETIME NOT NULL,"event" TEXT NOT NULL);

Musimy jeszcze utworzy tabel o nazwie tracking, ktra bdzie zawieraa


numery ledzonych przesyek, opisy zawartoci poszczeglnych paczek,
status procesu dostarczania tych przesyek oraz dat dostarczenia potwier-
dzon na podstawie danych systemu firmy kurierskiej. Tabela powinna
mie nastpujc struktur:
Nazwa Typ Klucz Automatyczna Dopuszczalne Unikatowa?
kolumny danych gwny? inkrementacja? wartoci puste?

id INTEGER TAK TAK NIE TAK


tracking_ TEXT NIE NIE NIE NIE
number

description TEXT NIE NIE NIE NIE


delivery_ BOOLEAN NIE NIE NIE NIE
status

delivery_ DATETIME NIE NIE NIE NIE


date
Rozdzia 6. Wykrywacz dostarczania paczek  137

Aby utworzy t tabel w bazie danych packagedelivery, naley wpisa


nastpujce wyraenie jzyka SQL w wierszu polece narzdzia sqlite3:
[~]$ sqlite3 packagedelivery.sqlite
SQLite version 3.7.6
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> CREATE TABLE "tracking" ("id" INTEGER PRIMARY KEY NOT NULL UNIQUE,
"tracking_number" TEXT NOT NULL, "description" TEXT NOT NULL,
"delivery_status" BOOL NOT NULL, "delivery_date" DATETIME);

Skoro dysponujemy ju tabelami bazy danych, moemy przej do nastpne-


go kroku, czyli pobrania pakietw jzyka Python potrzebnych do opracowa-
nia skryptu przetwarzajcego komunikaty o paczkach.

6.9. Instalacja niezbdnych pakietw


Pythona
Aby uproci ledzenie paczek dostarczanych przez firmy kurierskie FedEx
i UPS, uyjemy pakietu jzyka Python o nazwie packagetrack. Wspomniany
pakiet jest w istocie opakowaniem uatwiajcym analiz skadniow da-
nych w formacie XML udostpnianych przez usugi sieciowe firm kurier-
skich dziki temu pakietowi implementacja mechanizmw przetwarza-
nia danych jest nieporwnanie prostsza. Mimo e mona by uy do tego
celu jednej z bibliotek Pythona przetwarzajcych kod stron internetowych
(na przykad biblioteki Beautiful Soup), takie rozwizanie nie byoby
niezawodne. Najwiksze firmy kurierskie (jak FedEx czy UPS) udostpniaj
interfejsy API swoich usug sieciowych midzy innymi po to, aby zniechci
programistw do przetwarzania zwykych stron internetowych i powodo-
wania nadmiernego obcienia serwerw WWW. Przed przystpieniem
do instalacji biblioteki packagetrack naley skorzysta z istniejcych kont
klienta firm UPS i FedEx do uzyskania dostpu do odpowiednich inter-
fejsw API. Czytelnicy, ktrzy nie dysponuj jeszcze numerem konta i nazw
uytkownika, musz odwiedzi strony internetowe wybranych firm kurierskich
i utworzy nowe konta. Proces tworzenia konta wymaga podania prawido-
wego numeru karty kredytowej (podana karta bdzie w przyszoci suya
do rozliczania wysyanych paczek).
Po uzyskaniu prawidowej nazwy uytkownika, hasa i numeru konta wystar-
czy odwiedzi strony internetowe przeznaczone dla programistw i zareje-
strowa si w celu uzyskania klucza interfejsu API usugi sieciowej (w przy-
padku FedEx) lub numeru licencji (w przypadku UPS). W odpowiedzi na
138  6.9. Instalacja niezbdnych pakietw Pythona

danie klucza na stronie firmy FedEx zostan dodatkowo wygenerowane


dane uwierzytelniajce. Uzyskane w ten sposb wartoci bd potrzebne
podczas wywoa interfejsw API usug sieciowych wybranych firm ku-
rierskich.
Moemy teraz przystpi do instalacji najnowszej wersji pakietu packagetrack.
Zamiast uzyska ten pakiet za porednictwem polecenia easy_install,
czyli prostego narzdzia do pobierania i instalacji pakietw Pythona, po-
lecam uycie polecenia git, aby skopiowa odgazienie tego projektu utwo-
rzone przez Michaela Stell3. Oprcz pakietu packagetrack w wersji roz-
wijanej przez Michaela naley pobra take niezbdny pakiet dodatkowy
przystosowany do wsppracy z t wersj, czyli pakiet python-fedex rozwizu-
jcy problem analizy skadniowej danych udostpnianych przez firm FedEx
w formacie XML4. Sam pakiet python-fedex dodatkowo uywa pewnej
biblioteki jzyka Python nazwanej suds. Wspomniana biblioteka jest prost
implementacj protokou SOAP (od ang. Simple Object Access Protocol)
dla jzyka Python pakiet python-fedex uywa jej do analizy skadniowej
danych udostpnianych przez usug sieciow firmy FedEx w formacie XML.
Aby automatycznie pobra i zainstalowa pakiet suds, naley uy polecenia
sudo easy_install suds.

Musimy nastpnie zainstalowa oba pakiety (python-fedex i packagetrack)


za pomoc polecenia sudo python setup.py install uytego w oknie terminala.
Aby upewni si, e oba pakiety zostay prawidowo zainstalowane, wy-
starczy uruchomi interpreter Pythona, wpisujc polecenie python w oknie
terminala. Po wywietleniu znakw zachty >>> naley wpisa polecenie import
packagetrack i nacisn klawisz Return. Jeli nie zostanie wywietlony aden
komunikat o bdzie, moemy by pewni, e oba pakiety zostay prawidowo
zainstalowane.
Wszystkie pozostae pakiety, ktrych bdziemy uywali w skrypcie wykry-
wacza dostarczonych przesyek, s doczane do standardowych dystrybucji
jzyka Python 2.5 i nowszych. Po spenieniu wymaga zwizanych z biblio-
tek packagetrack i niezbdnymi kluczami dostpu do interfejsu API usugi
sieciowej firmy kurierskiej moemy przystpi do pisania skryptu odpowie-
dzialnego za monitorowanie przesyek.

3
https://github.com/alertedsnake/packagetrack
4
https://github.com/alertedsnake/python-fedex
Rozdzia 6. Wykrywacz dostarczania paczek  139

6.10. Pisanie skryptu


Skrypt monitorujcy dostarczanie paczek musi wykonywa wiele funkcji
musi nasuchiwa zdarze wysyanych przez sprzt monitorujcy poja-
wianie si paczek, reagowa na te zdarzenia poprzez wysyanie wiadomo-
ci poczty elektronicznej oraz wykonywa wszystkie operacje pomocnicze.
Mwic dokadniej, skrypt musi podejmowa nastpujce dziaania:
1. Powinien nasuchiwa zdarze przekroczenia wartoci progowej (czyli
zdarze wskazujcych na pooenie lub zabranie paczki) wysanych
przez oprogramowanie obsugujce komunikacj z moduem radio-
wym XBee (za porednictwem portu szeregowego).
2. Skrypt powinien te docza znaczniki czasowe do zdarze wyge-
nerowanych przez czujnik siy nacisku oraz umieszcza kompletne
dane w tabeli deliverystatus.
3. W razie otrzymania wysokiej wartoci (czyli w przypadku dostarcze-
nia paczki) skrypt musi przeszuka numery ledzonych przesyek
zapisane w tabeli bazy danych. W razie otrzymania niskiej wartoci
(czyli w przypadku zabrania paczki z czujnika) skrypt powinien wy-
sa wiadomo poczty elektronicznej informujc o tym fakcie, po
czym wrci do stanu nasuchiwania zdarze dostarczenia paczki.
4. W razie otrzymania wysokiej wartoci skrypt powinien odczeka
pewien czas, po czym sprawdzi tabel ledzonych przesyek
dziki temu kurier bdzie mia czas na aktualizacj odpowiednich
rekordw w systemie firmy kurierskiej.
5. Skrypt musi iteracyjnie przeszuka numery ledzonych przesyek
i sprawdzi w systemie firmy kurierskiej (za porednictwem odpo-
wiedniej usugi sieciowej), czy dostarczenie paczki zostao potwier-
dzone przez kuriera.
6. Jeli wynik zwrcony przez usug sieciow firmy kurierskiej potwier-
dza dostarczenie przesyki, skrypt powinien zmieni status w rekor-
dzie odpowiedniej paczki w tabeli lokalnej bazy danych na 1 (czyli
warto logiczn oznaczajc, e paczka trafia do adresata).
7. Skrypt powinien wysa wiadomo poczty elektronicznej za pored-
nictwem bezpiecznej bramy SMTP usugi Gmail. Ciao tej wiadomo-
ci musi zawiera informacj o stanie przesyki. Musimy pamita,
e warunkiem prawidowego funkcjonowania tego mechanizmu jest
dysponowanie dostpem do aktywnego konta usugi Gmail.
140  6.10. Pisanie skryptu

8. Skrypt powinien wrci do stanu oczekiwania na nastpne zdarze-


nia dostarczania paczek.
Poniej pokazano kompletny skrypt implementujcy wymienione kroki.
Plik PackageDeliveryDetector/packagedeliverydetector.py

from datetime import datetime


import packagetrack
from packagetrack import Package
import serial
import smtplib
import sqlite3
import time
import os
import sys
# Nawizuje poczenie z portem szeregowym
XBeePort = serial.Serial('/dev/tty.URZDZENIE_SZEREGOWE', \
baudrate = 9600, timeout = 1)

def send_email(subject, message):


recipient = 'ADRESAT_POCZTY@DOMENA.PL'
gmail_sender = 'NAZWA_KONTA_GMAIL@gmail.com'
gmail_password = 'HASO_DO_KONTA_GMAIL'

# Nawizuje bezpieczne poczenie TLS z bram SMTP usugi Gmail


gmail_smtp = smtplib.SMTP('smtp.gmail.com',587)
gmail_smtp.ehlo()
gmail_smtp.starttls()
gmail_smtp.ehlo

# Loguje si do usugi Gmail


gmail_smtp.login(gmail_sender, gmail_password)

# Formatuje wiadomo
mail_header = 'To:' + recipient + '\n' + 'From: ' + gmail_sender + '\n' \
+ 'Subject: ' + subject + '\n'
message_body = message
mail_message = mail_header + '\n ' + message_body + ' \n\n'

# Wysya sformatowan wiadomo


gmail_smtp.sendmail(gmail_sender, recipient, mail_message)
print("Wiadomo zostaa wysana")

# Zamyka poczenie
gmail_smtp.close()

def process_message(mg):
try:
# Naley pamita o koniecznoci uycia prawidowej cieki do pliku
# packagedelivery.sqlite
connection = sqlite3.connect("packagedelivery.sqlite")
cursor = connection.cursor()
Rozdzia 6. Wykrywacz dostarczania paczek  141

# Uzyskuje i odpowiednio formatuje biec dat i godzin


timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
sqlstatement = "INSERT INTO delivery (id, time, event) \
VALUES(NULL, \"%s\", \"%s\")" % (timestamp, msg)
cursor.execute(sqlstatement)
connection.commit()
cursor.close()
except:
print("Wystpi problem podczas prby dostpu do tabeli delivery " \
+ "w bazie danych packagedelivery")

if (msg == "Delivery"):

# Czeka 5 minut (300 sekund) przed sprawdzeniem stanu przesyki


# w systemach firm kurierskich
time.sleep(300)

try:
connection = sqlite3.connect("packagedelivery.sqlite")
cursor = connection.cursor()
cursor.execute('SELECT * FROM tracking WHERE '\
+ 'delivery_status=0')
results = cursor.fetchall()
message = ""

for x in results:
tracking_number = str(x[1])
description = str(x[2])
print tracking_number

package = Package(tracking_number)
info = package.track()
delivery_status = info.status
delivery_date = str(info.delivery_date)

if (delivery_status.lower() == 'delivered'):
sql_statement = 'UPDATE tracking SET \
delivery_status = "1", delivery_date = \
"' + delivery_date + \
'" WHERE tracking_number = "' \
+ tracking_number + '";'
cursor.execute(sql_statement)
connection.commit()
message = message + description \
+ ' paczka oznaczona numerem ' \
+ tracking_number \
+ ' zostaa dostarczona dnia ' \
+ delivery_date +'\n\n'

# Zamyka kursor
cursor.close()
142  6.10. Pisanie skryptu

# Potwierdzono dostarczenie przesyki, mona wysa wiadomo poczty


# elektronicznej
if (len(message) > 0):
print message
send_email('Potwierdzenie dostarczenia przesyki', message)
else:
send_email('Wykryto dostarczon przesyk', 'System ' \
+ 'wykry zdarzenie dostarczenia paczki, ' \
+ 'jednak dla adnej ze ledzonych przesyek z niepotwierdzonym ' \
+ 'numerem (zarejestrowanych w bazie danych) ' \
+ 'nie potwierdzono dostarczenia do adresata ' \
+ 'w systemie firmy kurierskiej.')

except:
print("Wystpi problem podczas prby dostpu do tabeli tracking " \
+ "w bazie danych packagedelivery")

else:
send_email('Zabrano paczk', 'Wykryto zdarzenie zabrania paczki.')

if sys.platform == "win32":
os.system("cls")
else:
os.system("clear")

print("Wykrywacz dostarczonych paczek czeka na zdarzenia...\n")


try:
while 1:
# Nasuchuje znakw przychodzcych do moduu radiowego XBee
XBee_message = XBeePort.readline()

# W zalenoci od rodzaju otrzymanego komunikatu


# rejestruje zdarzenie w bazie danych i przeszukuje ledzone przesyki
if "Delivery" in XBee_message:
# Uzyskuje i odpowiednio formatuje biec dat i godzin
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print("Wykryto zdarzenie dostarczenia paczki - " + timestamp)
process_message("Delivery")

if "Empty" in XBee_message:
# Uzyskuje i odpowiednio formatuje biec dat i godzin
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print("Wykryto zdarzenie zabrania paczki - " + timestamp)
process_message("Empty")

except KeyboardInterrupt:
print("\nWykrywacz dostarczonych paczek koczy dziaanie.\n")
pass

Dziaanie skryptu rozpoczyna si od zaimportowania pakietw po-


trzebnych do dziaania niestandardowej biblioteki packagetrack i zaim-
portowania standardowych bibliotek Pythona: serial, smtplib, sqlite3,
time, os i sys.
Rozdzia 6. Wykrywacz dostarczania paczek  143

Skrypt identyfikuje port szeregowy, do ktrego podczono modu ra-


diowy XBee. Wspomniany modu radiowy bdzie nasuchiwa komu-
nikatw przychodzcych wysyanych przez drugi modu XBee (po-
czony z pytk Arduino, z ktr poczono czujnik siy nacisku). a-
cuch '/dev/tty.URZDZENIE_SZEREGOWE' naley zastpi waciw ciek
do moduu XBee podczonego do portu szeregowego komputera.
Funkcja send_mail jest uywana w ciele funkcji process_message, zatem musi
by zadeklarowana jako pierwsza. acuchy ADRESAT_POCZTY@DOMENA.PL, NA-
ZWA_KONTA_GMAIL i HASO_DO_KONTA_GMAIL naley zastpi prawidowymi
danymi uwierzytelniajcymi dla stosowanego konta usugi Gmail.
Wikszo dziaa realizowanych przez ten skrypt jest wykonywana
w ciele funkcji process_message. Funkcja nawizuje poczenie z baz
danych packagedelivery.sqlite systemu SQLite i zapisuje w odpowiedniej
tabeli rodzaj otrzymanego zdarzenia. W przypadku otrzymania komuni-
katu o dostarczeniu paczki skrypt czeka pi minut, po czym wysya
dania do usug sieciowych firm kurierskich FedEx i UPS, aby da
kurierowi czas na zmian statusu przesyki na centralnych serwerach tych
firm. Funkcja wykonuje nastpnie zapytanie na tabeli tracking bazy
danych packagedelivery.sqlite, aby uzyska numery wszystkich ledzonych,
ale jeszcze niedostarczonych przesyek. Znalezione numery s kolejno
wysyane do odpowiednich usug sieciowych. W razie otrzymania po-
twierdzenia dostarczenia przesyki pozytywna odpowied systemu firmy
kurierskiej jest rejestrowana w bazie danych wraz z dat tego potwier-
dzenia, a generowana wiadomo poczty elektronicznej jest uzupeniana
o stosowny dopisek (sama wiadomo jest nastpnie wysyana za po-
moc funkcji send_email).
To jest gwna ptla tego skryptu. Dziaanie ptli rozpoczyna si od
wyczyszczenia ekranu, oczekiwania na komunikat "Delivery" lub "Empty"
wysany przez modu XBee poczony z pytk Arduino i wywoania
funkcji process_message w celu przetworzenia tego komunikatu.
Wykrycie nacinicia kombinacji klawiszy Ctrl-C powoduje przerwanie
wykonywania skryptu.
Skrypt naley zapisa w pliku packagedelivery.py i uruchomi za pomoc
polecenia python packagedelivery.py. W razie wystpienia bdw naley
sprawdzi skadni i wcicia w kodzie, poniewa w jzyku Python formato-
wanie ma wpyw na interpretacj kodu. Jeli skrypt zostanie uruchomiony
bez adnych problemw, moemy przystpi do jego testowania.
144  6.11. Testowanie skryptu przetwarzajcego komunikaty o paczkach

6.11. Testowanie skryptu


przetwarzajcego komunikaty
o paczkach
Skoro dysponujemy ju gotowym skryptem Pythona, kontem klienta firmy
FedEx i (lub) UPS oraz zarejestrowanymi kluczami dostpu do interfejsw
API usug sieciowych tych firm kurierskich, moemy przystpi do testw
funkcjonalnych szkicu i wspomnianego skryptu. W tabeli trackingstatus
bazy danych packagedelivery naley umieci prawidowe, aktualne numery
ledzonych przesyek wysanych za porednictwem firmy FedEx lub UPS.
Moemy uy do tego celu wtyczki SQLite Manager dla przegldarki in-
ternetowej Firefox, ktr wczeniej wykorzystalimy take do tworzenia tabel
tej bazy danych. Wystarczy wybra wtyczk SQLite Manager z menu
Narzdzia przegldarki Firefox, po czym otworzy plik packagedelivery.sqlite.
W lewej kolumnie naley klikn tabel trackingstatus, po czym zaznaczy
zakadk Browse & Search. Naley nastpnie klikn przycisk Edit, aby
doda lub zmieni rekordy reprezentujce numery ledzonych przesyek.
Jeli wolimy korzysta z szybszego (ale te mniej atrakcyjnego wizualnie)
narzdzia wiersza polece sqlite3, numery ledzonych paczek moemy
doda za pomoc nastpujcego wyraenia jzyka SQL (identyfikator
NUMER_LEDZONEJ_PRZESYKI oczywicie naley zastpi prawidowym nume-
rem przesyki dostarczanej przez firm FedEx lub UPS):
sqlite> INSERT INTO tracking("tracking_number","description","delivery_status")\
VALUES ("NUMER_LEDZONEJ_PRZESYKI", "ledzona paczka","0");

Warto jeszcze sprawdzi, czy nowy rekord rzeczywicie zosta prawidowo


dodany do tabeli tracking wystarczy uy nastpujcego wyraenia select:
sqlite> select * from tracking;
1|NUMER_LEDZONEJ_PRZESYKI|ledzona paczka|0|

Aby przetestowa iteracyjne wyszukiwanie danych w tabeli przez skrypt jzy-


ka Python, warto doda ewentualne dodatkowe numery przesyek dostar-
czanych przez firmy FedEx i UPS. Podczas testw mona stosowa wy-
mylone numery, ktre nie reprezentuj paczek aktualnie wystpujcych
w systemach ledzenia przesyek firm kurierskich. W praktyce najlepszym
rozwizaniem (przynajmniej z perspektywy testw) bdzie umieszczenie
w bazie zarwno paczek w wysyce, jak i przesyek ju dostarczonych
dziki temu bdziemy mogli sprawdzi, czy skrypt prawidowo aktualizuje
rekordy dla przesyek, ktrych odbir zosta odpowiednio potwierdzony.
Rozdzia 6. Wykrywacz dostarczania paczek  145

Nadesza chwila prawdy. Naley wczy zasilanie pytki Arduino z pod-


czonym moduem XBee. Musimy si te upewni, e docelowy modu XBee
jest poczony z komputerem za pomoc przewodu FTDI. Po sprawdzeniu
wszystkich pocze moemy uy polecenia python packagedelivery.py.
Naley teraz delikatnie nacisn czujnik siy nacisku i poczeka, a skrypt
przetworzy zapytania dotyczce numerw przesyek. Jeli wszystko dziaa
prawidowo, powinnimy otrzyma wiadomo poczty elektronicznej z konta
usugi Gmail, ktre wybralimy do roli bramy SMTP. Wiadomo powinna
zawiera informacje o dostarczonych przesykach. Moemy ponownie uy
zapytania select * from tracking; w wierszu polece narzdzia sqlite3, aby
sprawdzi, czy warto w polu zmienia si z dotychczasowej liczby 0 (false)
na warto 1 (true) i czy odpowiedni znacznik czasowy (okrelajcy moment
waciwego dostarczenia paczki) zosta prawidowo zarejestrowany w polu
deliver_time.

W razie bdu podczas dziaania tego skryptu lub w razie braku odpowiednich
wartoci w bazie danych naley przywrci oryginalny stan tabeli tracking
i zastosowa dostpne metody diagnozowania tego skryptu (najprostsz
z nich jest umieszczenie w odpowiednich miejscach kodu wywoa funkcji
print()), aby sprawdzi, ktre miejsca kodu powoduj problemy.

Po wielokrotnym udanym wykonaniu testw moemy przystpi do instalacji


elementw sprztowych tego systemu w wygodnym miejscu przed domem
(najlepiej pooonym moliwie blisko gniazdka elektrycznego).

6.12. Instalacja systemu


Musimy najpierw wybra waciwe miejsce dla pytki, pod ktr zainstalujemy
czujnik siy nacisku. Pracownicy wikszoci amerykaskich firm kurierskich
pozostawiaj przesyki przed drzwiami domu adresata, z lewej lub prawej
strony, tak aby nie blokowa wejcia. Aby zasugerowa kurierowi zostawianie
paczek w wybranym przez nas miejscu, wystarczy umieci w widocznym
miejscu strzak lub inny znak wskazujcy prostoktn pytk, pod ktr
umiecilimy czujnik siy nacisku.
Jeszcze lepszym rozwizaniem bdzie zakup lub budowa specjalnego pojem-
nika na paczki z czujnikiem siy nacisku zainstalowanym na dnie. Istnieje
wiele niedrogich, wytrzymaych i wodoodpornych pojemnikw, ktre po
zamkniciu pokrywy mog nawet peni funkcj awy do siedzenia. Wy-
starczy odrobina dodatkowej pracy, aby take pytk Arduino z moduem
146  6.13. Nastpne kroki

radiowym XBee umieci w bezpiecznej, wodoodpornej obudowie, ktra


zostanie zamontowana wewntrz pojemnika na paczki.
Elementy elektroniczne naley oczywicie zainstalowa z boku, tak aby wci-
skanie wikszych paczek do waciwego pojemnika nie powodowao uszko-
dze. Warto te przygotowa notatk dla kurierw z prob o umieszczanie
przesyek w tak przygotowanym pojemniku. W zalenoci od czstotliwoci
otrzymywania paczek kurierzy operujcy na danym terenie powinni do
szybko przyzwyczai si do nietypowej formy pozostawiania paczek.
Poniewa wykrywacz paczek znajduje si w bezporednim ssiedztwie gw-
nego wejcia, znalezienie w pobliu zewntrznego gniazdka elektrycznego
nie powinno stanowi adnego problemu. Jeli system znajduje si w miejscu
naraonym przez wikszo dnia na bezporednie dziaanie soca, warto
nawet rozway zasilanie elementw elektronicznych bateri soneczn
(tak jak w przypadku projektu wierkajcego karmnika dla ptakw).
Jeli wszystkie elementy s prawidowo zainstalowane i zasilane, warto samo-
dzielnie przetestowa wykrywacz. Naley wyprbowa dziaanie systemu
dla paczek o rnych ksztatach, wymiarach i wagach, aby sprawdzi, jak
nasza konfiguracja reaguje w poszczeglnych scenariuszach. Zapewnienie
spjnego dziaania systemu moe wymaga przesunicia czujnika siy nacisku
w inne miejsce. Skuteczno wykrywania mona znacznie poprawi, dodajc
jeden lub nawet dwa dodatkowe czujniki siy nacisku (poprawa bdzie
szczeglnie widoczna w przypadku mniejszych paczek, ktre nie zawsze
bd trafiay na rodek pytki).
Wykrywacz dostarczonych przesyek jest teraz kompletny i gotowy do prze-
twarzania informacji o paczkach. Przy najbliszej okazji bdziemy mogli
si przekona, jak wygodny moe by system informujcy nas o dugo wycze-
kiwanej przesyce, ktra wanie trafia pod drzwi naszego domu.

6.13. Nastpne kroki


Wykrywacz paczek mona do atwo rozbudowa o elementy rozszerzajce
jego moliwoci poza powiadamianie o przychodzcych przesykach ku-
rierskich. Oto kilka pomysw na dalszy rozwj tego systemu.
Biecy projekt przygotowano z myl o pojedynczej paczce przed
przetworzeniem nastpnej paczki system musi wyzerowa swj stan.
Szkic i skrypt jzyka Python mona rozszerzy o obsug wielu pa-
czek dostarczanych przez wielu kurierw. Jeli na przykad jeden
Rozdzia 6. Wykrywacz dostarczania paczek  147

kurier dostarcza paczk, powodujc przekroczenie wartoci progowej,


wystarczy ustali now warto progow, tak aby kolejna przesyka
bya przetwarzana i sprawdzana jeszcze przed zabraniem przez ad-
resata pierwszej paczki.
W momencie przekroczenia wartoci progowej czujnika siy nacisku
system moe robi zdjcie przesyki i wysya je w formie zacznika do
wiadomoci poczty elektronicznej z odpowiednim powiadomieniem.
Baz danych uywan przez skrypt Pythona mona rozszerzy o mo-
liwo przechowywania wynikw zapyta adresowanych do usug
sieciowych firm kurierskich. Warto te rozway uycie frameworku
Django do stworzenia interfejsu uytkownika umoliwiajcego analiz
danych o przesykach ledzonych i dostarczonych w przeszoci.
Jeli umiecimy czujnik siy nacisku pod wycieraczk, bdziemy otrzy-
mywali informacj o gociach jeszcze przed naciniciem dzwonka.
Aby zdalnie otwiera drzwi przed zaufanymi gomi, system naley
uzupeni o kamer internetow i elektryczny zamek (patrz rozdzia 9.
zatytuowany Zamek do drzwi sterowany przez Androida).
Czytelnicy, ktrzy szczeglnie czsto otrzymuj paczki, mog zasto-
sowa alternatywne formy powiadomie (poza poczt elektroniczn
i Twitterem). Wystarczy zaimplementowa usug dostarczania po-
wiadomie dla systemu Android lub aplikacj przystosowan do
wsppracy z usug iMessage dla systemu iOS, ktra bdzie na-
tychmiast powiadamiaa o dostarczonych paczkach.
Wymiary wykrywacza mona atwo zmniejszy, stosujc konfiguracj
pytki Arduino Nano i moduu XBee opisan w rozdziale 5. zatytu-
owanym wierkajcy karmnik dla ptakw. Wystarczy zastpi
czujnik siy nacisku czujnikiem ruchu PIR, aby otrzymywa powia-
domienia o umieszczeniu listw w skrzynce pocztowej.
Wykrywacz paczek mona poczy z systemem psa strujcego z roz-
dziau 4. zatytuowanego Elektryczny pies strujcy. Wskazania
czujnika siy nacisku mona wykorzysta w roli sygnau dla psa stru-
jcego do szczekania i nerwowych ruchw za zason. Po pocze-
niu tego systemu z laserem i dalmierzem precyzyjnie okrelajcym po-
oenie celu dysponowalibymy mechanizmem witania goci na bazie
najnowszych technologii.
148  6.13. Nastpne kroki
Rozdzia 7.
Internetowy
wcznik wiata

W
yobramy sobie, e po dugim dniu w pracy wracamy do domu
i wczamy wiata, telewizj i wszystkie urzdzenia jednocze-
nie, korzystajc z aplikacji zainstalowanej na naszym telefonie
komrkowym. System moe obejmowa wszystkie urzdzenia elektryczne
zasilane przez standardowe gniazdka.
W tym rozdziale sprbujemy urzeczywistni to marzenie przy uyciu kompu-
tera podczonego do internetu, aplikacji internetowej na bazie frameworku
Ruby on Rails, aplikacji zainstalowanej na smartfonie z systemem Android
oraz duo starszej technologii znanej jako X10. Zbudujemy aplikacj
zdalnego wcznika wiata dla systemu Android, ktra umoliwi nam w-
czanie i wyczanie wiata za porednictwem ekranu dotykowego smartfonu
(patrz rysunek 7.1 zatytuowany atwe sterowanie owietleniem domu
i urzdzeniami elektrycznymi). Po zakoczeniu tego projektu bdziemy
mogli sterowa urzdzeniami domowymi nie tylko z dowolnego miejsca
w domu, ale take z kadego miejsca, w ktrym bdziemy mieli dostp do
internetu (o ile serwer z aplikacj na bazie frameworku Rails bdzie pu-
blicznie dostpny).
150  7.1. Czego potrzebujemy

Rysunek 7.1. atwe sterowanie owietleniem domu i urzdzeniami


elektrycznymi za porednictwem wasnej aplikacji
dla smartfonw

7.1. Czego potrzebujemy


X10 to nazwa firmy, ktra od wielu lat sprzedaje wasne zastrzeone wcz-
niki elektryczne. Co ciekawe, technologia stosowana podczas produkcji tych
wcznikw nie ulega zasadniczym zmianom od wprowadzenia na rynek
tych produktw ponad trzydzieci lat temu. Mimo swojego wieku wczniki
elektryczne X10 wci stanowi jedn z najwaniejszych technologii au-
tomatyzacji domw o ich popularnoci decyduje niska cena i moliwo
wysyania i planowania sygnaw wczania i wyczania zasilania za po-
moc komputera.
Zamiast uywa niewygodnej oryginalnej aplikacji do sterowania urzdze-
niami X10 dla systemu Windows, skorzystamy z dostpnego za darmo na-
rzdzia open source nazwanego Heyu. Narzdzie Heyu (stworzone i roz-
wijane przez Daniela Suthersa i Charlesa Sullivana) oferuje interfejs wier-
sza polece do monitorowania i wysyania rozmaitych polece protokou
Rozdzia 7. Internetowy wcznik wiata  151

X10 do interfejsu CM11A. Odpowiednie rozkazy s nastpnie przeka-


zywane do wskazanych wcznikw X10.
Do realizacji tego projektu najlepiej nadaje si system operacyjny Linux lub
Mac, poniewa w obu tych systemach mona atwo kompilowa kod rdo-
wy bez koniecznoci wprowadzania dodatkowych modyfikacji. Nie istnieje
wersja narzdzia Heyu przeniesiona do systemu Windows i w najbliszej
przyszoci nie naley oczekiwa powstania takiej wersji. Czytelnicy korzy-
stajcy z systemu Windows powinni rozway uruchomienie jakiej dys-
trybucji systemu Linux na maszynie wirtualnej za pomoc odpowiedniego
programu, na przykad VirtualBox1.
Do budowy tego projektu bd potrzebne nastpujce elementy (patrz
rysunek 7.2 zatytuowany Czci internetowego wcznika wiata):

Rysunek 7.2. Czci internetowego wcznika wiata

1. Interfejs komputerowy X10 CM11A2 naley pamita, e


w przeciwiestwie do starszego interfejsu CM11A, ktry korzysta
z portu szeregowego, model X10 CM15A czy si z komputerem
za porednictwem portu USB i jako taki nie wsppracuje z opro-
gramowaniem Heyu. Wicej informacji na ten temat mona znale
w sekcji pyta i odpowiedzi produktu Heyu3.

1
https://www.virtualbox.org/
2
http://www.x10.com
3
http://www.heyu.org/heyu_faq.html
152  7.1. Czego potrzebujemy

2. Standardowy wcznik cienny X10 PLW01.


3. Przewd czcy port szeregowy z portem USB.
4. Telefon lub tablet z systemem operacyjnym Android (na tym
urzdzeniu bdzie uruchamiana aplikacja kliencka projektu inter-
netowego wcznika wiata).
5. Komputer (nie ma go na zdjciu), najlepiej z systemem Linux lub
Mac OS oraz zainstalowanym jzykiem Ruby 1.8.7 lub nowszym.
Podczas realizacji tego projektu bdziemy jeszcze potrzebowali nastpuj-
cego oprogramowania:
narzdzia Heyu 2.9.3 lub nowszego4,
frameworku Ruby on Rails 3.0 lub nowszego5,
rodowiska programowania Eclipse ,
6

zestawu narzdzi Android SDK 1.5 lub nowszego7,


wtyczki Android Development Tools (ADK) dla rodowiska Eclipse .
8

Sercem konfiguracji zoonej z urzdze X10 sterowanych komputerowo


jest modu sterownika. Modu udostpnia interfejs niezbdny do przesyania
rozkazw do urzdze X10 oraz informacji zwrotnych (na przykad o wykry-
ciu ruchu) przez urzdzenia X10 oferujce odpowiednie rozwizania. Istnieje
wiele interfejsw tego typu, na przykad X10 Firecracker (znany take
jako CM17A) oraz oryginalny interfejs komputerowy X10 oznaczony sym-
bolem CM11A. Wikszo dostpnych obecnie programw open source
do sterowania urzdzeniami X10 obsuguje oba wymienione interfejsy
(i wiele innych interfejsw), jednak z mojego dowiadczenia wynika, e ob-
suga interfejsu CM11A jest zdecydowanie najbardziej popularna. Wanie
dlatego na potrzeby tego projektu polecam stosowanie interfejsu CM11A.
Dysponujemy ju niezbdnym sprztem i oprogramowaniem, zatem moemy
przystpi do analizy technik czenia wszystkich tych elementw, tak aby
byo moliwe wczanie i wyczanie wiata z poziomu aplikacji systemu
Android dziaajcej na smartfonie.

4
http://heyu.org
5
http://www.rubyonrails.com
6
http://eclipse.org
7
http://developer.android.com/sdk
8
http://developer.android.com/sdk/eclipse-adt.html
Rozdzia 7. Internetowy wcznik wiata  153

Jak dziaaj urzdzenia X10?


Podstawow zasad dziaania urzdze X10 jest wysyanie unika-
towych impulsw za porednictwem istniejcych przewodw elek-
trycznych do urzdze zdolnych do interpretacji otrzymywanych
kodw i waciwego reagowania na te sygnay. Kade urzdzenie
ma przypisywany wasny unikatowy kod (reprezentujcy dany dom
i samo urzdzenie na przykad H8). Warunkiem aktywacji wcznika
zasilania X10 jest wysanie tego unikatowego identyfikatora przez
interfejs sterujcy podczony do gniazdka elektrycznego. Zastosowa-
nie istniejcej instalacji elektrycznej sprawia, e sterowanie urzdze-
niami sprowadza si do wysyania (za porednictwem interfejsu ste-
rujcego) sekwencji impulsw trafiajcych do waciwych urzdze
przez te przewody. Docelowe urzdzenie X10 rozpoznaje adreso-
wane do siebie impulsy na podstawie unikatowego kodu adresata.
Kod funkcji moe mie posta prostego rozkazu wczenia lub wy-
czenia, ktry przecza stan docelowego moduu X10. Zmiana te-
go stanu powoduje z kolei wczenie lub wyczenie zasilania lampy
lub innego urzdzenia podczonego do tego moduu. Oprcz pod-
stawowych kodw wczania i wyczania zasilania istnieje moliwo
wysyania wielu innych rozkazw, ktre mog na przykad powodo-
wa przyciemnienie wiata do 25 procent maksymalnego natenia
czy nawet jednoczesne wczenie lub wyczenie wszystkich urz-
dze X10. Bardziej szczegowe wyjanienie moliwych rozwiza
wraz z list dostpnych kodw mona znale na stronie interne-
towej narzdzia Heyu9.

7.2. Budowa rozwizania


Warunkiem zdalnego sterowania lampami kontrolowanymi przez urzdzenia
X10 jest przystosowanie do wsplnego dziaania wielu bardzo rnych
technologii. Zastosujemy nastpujce rozwizania:
1. Przetestujemy interfejs komputerowy i moduy technologii X10 za
pomoc aplikacji Heyu.

9
http://www.heyu.org/docs/protocol.txt
154  7.3. czenie

2. Opracujemy aplikacj na bazie frameworku Ruby on Rails, ktra


bdzie penia funkcj internetowego interfejsu uytkownika dla
wybranego podzbioru polece narzdzia Heyu.
3. Utworzymy aplikacj mobiln dla systemu Android, ktra bdzie
komunikowaa si z aplikacj na bazie frameworku Rails w celu
wczania i wyczania wiata za pomoc przecznika dostpne-
go na ekranie dotykowym smartfonu lub tabletu.
Zacznijmy od poczenia elementw sprztowych technologii X10 i spraw-
dzenia, czy moemy sterowa tymi urzdzeniami za porednictwem apli-
kacji Heyu.

7.3. czenie
Interfejs X10 CM11A naley podczy do gniazdka elektrycznego nie-
daleko komputera, tak aby przewd tego interfejsu siga komputera. Po-
niewa interfejs CM11A uywa 9-wtykowego zcza szeregowego i wymaga
zastosowania adaptera USB port szeregowy wraz z odpowiednim ste-
rownikiem (patrz rysunek 7.3 zatytuowany Interfejs X10 CM11A ste-
rujcy internetowym wcznikiem wiata). Uytkownicy komputerw
z systemem operacyjnym Mac OS X 10.6 lub nowszym mog pobra ste-
rownik PL-2303 z witryny internetowej Prolific10. Komputery z najnowszymi
dystrybucjami systemu Linux nie powinny mie najmniejszych problemw
z identyfikacj interfejsu PL-2303 i nawizywaniem poczenia z tym in-
terfejsem.
Naley teraz podczy adapter USB port szeregowy do komputera i do
interfejsu CM11A (podczonego wczeniej do prdu). Musimy jeszcze
okreli urzdzenie reprezentujce port szeregowy (urzdzenie przypisane
do tego interfejsu przez system operacyjny). W tym celu naley znale od-
powiednie urzdzenie tty w katalogu /dev za pomoc polecenia ls /dev/tty*
wpisanego w oknie terminala. Jeszcze prostszym rozwizaniem jest uru-
chomienie rodowiska Arduino IDE i wybranie opcji Tools/Serial Port.

10
http://www.prolific.com.tw/eng/downloads.asp?ID=31l
Rozdzia 7. Internetowy wcznik wiata  155

Rysunek 7.3. Interfejs X10 CM11A sterujcy internetowym wcznikiem


wiata

W moim przypadku interfejs CM11A jest reprezentowany przez urz-


dzenie /dev/tty.usbserial (patrz rysunek 7.4 zatytuowany Adapter USB
port szeregowy widoczny w menu Tools rodowiska Arduino IDE).
Warto zwrci uwag na ciek do nowego urzdzenia cieka bdzie
nam potrzebna w odwoaniach do tego urzdzenia w pliku konfiguracyjnym
narzdzia Heyu.

Rysunek 7.4. Adapter USB port szeregowy widoczny w menu Tools


rodowiska Arduino IDE
156  7.3. czenie

Skoro interfejs CM11A jest ju podczony do komputera i prawidowo


rozpoznawany przez system operacyjny, moemy pobra kod rdowy
narzdzia Heyu z witryny internetowej Heyu.org i rozpakowa plik .tar za
pomoc polecenia tar -zxvf heyu-2.9.3.tar.gz. W nastpnym kroku naley
wykona cykl polece ./Configure; make; make install, aby zainstalowa
skompilowan aplikacj. Przed przystpieniem do dalszych krokw uyt-
kownicy systemu Mac musz zainstalowa narzdzia programistyczne tego
systemu11. Uytkownicy systemu Linux powinni si upewni, e dysponuj
niezbdnym kompilatorem gcc i narzdziem make. Na przykad w przypadku
dystrybucji Linuksa na bazie systemu Debian (jak Ubuntu) naley uy
polecenia sudo apt-get install build-essential w oknie terminala, aby
pobra i zainstalowa narzdzia kompilatora i linkera. Po zainstalowaniu
potrzebnych elementw wystarczy zastosowa standardow sekwencj polece
./Configure, make i sudo make install, aby skompilowa kod rdowy i zain-
stalowa plik wykonywalny heyu wraz z niezbdnymi bibliotekami.
Oprcz pliku wykonywalnego heyu w katalogu /etc/heyu zostanie zainstalo-
wany take plik konfiguracyjny x10.conf. Naley teraz otworzy ten plik
w trybie edycji (na przykad za pomoc polecenia sudo vi /etc/heyu/x10.conf).
Plik konfiguracyjny x10.conf zawiera wiele ciekawych opcji, jednak z na-
szego punktu widzenia najwaniejsza jest zidentyfikowana wczeniej cieka
do portu szeregowego, do ktrego podczono interfejs CM11A.
# Port szeregowy, do ktrego podczono interfejs CM11A.
# ciek domyln jest /dev/ttyS0.
TTY /dev/tty.usbserial

Warto reprezentujc port szeregowy, do ktrego podczono urzdzenie


CM11A, mona ustawi za pomoc ulubionego edytora tekstu. Po wprowa-
dzeniu zmiany naley zapisa plik i sprawdzi ustawienia, uruchamiajc silnik
narzdzia Heyu w oknie terminala za pomoc nastpujcego polecenia:
> heyu engine

Jeli nie zostan zgoszone adne bdy, jestemy na dobrej drodze


demon silnika znalaz odpowiednie urzdzenie i prawidowo dziaa w tle.
Moemy te uy polecenia heyu info, aby uzyska wicej informacji na
temat konfiguracji narzdzia Heyu. Warto teraz wpisa w tym samym oknie
terminala nastpujce polecenie:
> heyu monitor

11
http://developer.apple.com/technologies/tools/
Rozdzia 7. Internetowy wcznik wiata  157

W ten sposb moemy monitorowa komunikacj interfejsu CM11A


z pozostaymi urzdzeniami X10. Jeli dla wcznika ciennego PLW01
ustawiono kod domu H3, wystarczy teraz wpisa nastpujce polecenie:
> heyu on h3

Polecenie powinno wczy ten wcznik i zamkn obwd obejmujcy wy-


brane urzdzenie elektryczne (na przykad lamp zawieszon pod sufi-
tem). Take w oknie terminala, w ktrym uruchomilimy wczeniej proces
monitorowania narzdzia Heyu, powinny zosta wywietlone nastpujce
komunikaty:
07/25 12:45:34 sndc addr unit 3 : hu H3 (_no_alias_)
07/25 12:45:34 sndc func On : hc H

Wcznik mona teraz wyczy, wysyajc polecenie off do urzdzenia H3:


> heyu off h3
07/25 12:50:17 sndc addr unit 3 : hu H3 (_no_alias_)
07/25 12:50:18 sndc func Off : hc H

Jeli wymienione polecenia nie wcz ani nie wycz wiata, warto spraw-
dzi inny modu X10, na przykad AM486 Appliance. Jeli take ten
modu nie zadziaa prawidowo, naley sprbowa umieci interfejs kom-
puterowy X10 bliej wcznika ciennego (najlepiej w taki sposb, aby oba
elementy byy podczone do przewodw w tym samym pomieszczeniu).
Zdecydowana wikszo problemw, ktre napotykaem podczas realizacji
projektw na bazie technologii X10, miaa bezporedni zwizek z charakte-
rem samego protokou X10, gdzie obowizuje zasada odpal i zapomnij.
Jeli podejrzewamy, e rdem problemu moe by niewaciwe dziaanie
urzdze X10, warto wymieni wybrane urzdzenia i sprawdzi, czy nowe
elementy cokolwiek zmieniy. By moe warto poprosi o pomoc elektryka,
ktry sprawdzi ewentualne zakcenia i inne problemy z instalacj elek-
tryczn mogce utrudnia przekazywanie impulsw protokou X10 po-
midzy interfejsem CM11A a stosowanymi moduami X10.
Po sprawdzeniu, czy komputer komunikuje si z interfejsem CM11A za
porednictwem wiersza polece narzdzia Heyu, moemy zaimplementowa
dostpne rozkazy w ramach aplikacji internetowej. Odpowiednio zapro-
jektowana aplikacja internetowa zapewni atwy dostp do punktw ko-
cowych technologii X10 z poziomu przegldarki internetowej (a docelowo
take z poziomu aplikacji dla systemu Android).
158  7.4. Pisanie kodu klienta w formie aplikacji internetowej

Problemy zwizane z technologi X10


Mimo e X10 jest najczciej stosowan (i najintensywniej reklamo-
wan) technologi spord niedrogich rozwiza w zakresie automa-
tyzacji domw, warto pamita o ograniczeniach tej technologii.
Oprcz problemw wynikajcych z zasady odpal i zapomnij obo-
wizujcej w protokole X10 (urzdzenie, ktre wysya sygnay, nie
moe sprawdza, czy te sygnay dotary do adresata i czy dane dzia-
ania zostay zrealizowane) jednym z najwaniejszych problemw jest
przesyanie sygnaw za porednictwem domowej sieci elektrycznej.
Domowe instalacje elektryczne s naraone na zakcenia, a jako
przesyania impulsw z czasem spada. Na skuteczno moduw
X10 mog mie wpyw take popularne listwy antyprzepiciowe
i inne zabezpieczenia, ktre traktuj impulsy generowane przez te
urzdzenia tak jak inne zakcenia i prbuj filtrowa znieksztacenia,
przywracajc oryginalne parametry instalacji. W zalenoci od od-
legoci, na ktr musimy przesya sygnay protokou X10, moemy
stan przed koniecznoci instalacji dodatkowych moduw X10,
ktre zagwarantuj prawidowe dostarczanie rozkazw do waciwych
odbiorcw. Mimo tych utrudnie standard X10 wci pozostaje
najbardziej efektywn kosztowo i najprostsz w implementacji tech-
nologi automatyzacji domu. Chocia od wprowadzenia technologii
X10 na rynek mino ponad trzydzieci lat i w tym czasie opracowano
wiele konkurencyjnych rozwiza, adne z nich nie moe si rwna
z t technologi w kwestii kosztw i atwoci instalacji.

7.4. Pisanie kodu klienta


w formie aplikacji internetowej
Internetowy wcznik wiata wymaga utworzenia prostej aplikacji na ba-
zie frameworku Ruby on Rails, ktra bdzie zapewniaa odpowiedni in-
terfejs uytkownika (pocztkowo za porednictwem przegldarki interne-
towej). Poniewa docelowym rozwizaniem bdzie obsuga wcznika za
porednictwem aplikacji dla systemu Android, nie bdziemy traci zbyt
duo czasu na opracowywanie interfejsu uytkownika w formie aplikacji
internetowej.
Sam framework Rails najlepiej dziaa na komputerach z systemami Mac
i Linux (jest nawet domylnie instalowany w systemie Mac OS X 10.6).
Warto jednak pamita, e wraz z systemem operacyjnym nie jest instalo-
Rozdzia 7. Internetowy wcznik wiata  159

wana najnowsza wersja tego frameworku. Poniewa ten projekt wymaga


frameworku Rails 3.0 lub nowszego, ponisze instrukcje i wskazwki nie
sprawdz si w przypadku starszych wersji tego frameworku. Aby pobra
i skonfigurowa najnowsz wersj frameworku Ruby on Rails na lokalnym
komputerze, naley postpowa zgodnie z instrukcjami zawartymi na stro-
nie internetowej tego frameworku.
Po zainstalowaniu frameworku aplikacji sieciowych Rails naley utworzy
nowy katalog, przej do tego katalogu i utworzy nowy projekt na bazie
frameworku Rails za pomoc nastpujcych polece:
> mkdir ~/projects/ruby/rails/homeprojects/
> cd ~/projects/ruby/rails/homeprojects
> rails new x10switch
create
create README
create Rakefile
create config.ru
create .gitignore
create Gemfile
create app
create app/controllers/application_controller.rb
create app/helpers/application_helper.rb
create app/mailers
create app/models
...
create vendor/plugins
create vendor/plugins/.gitkeep

Naley teraz przej do nowego katalogu x10switch i utworzy nowy kon-


troler o nazwie command zawierajcy akcj nazwan cmd() za pomoc
tej akcji bdziemy zarzdzali interakcj pomidzy interfejsem aplikacji
internetowej a aplikacj terminala Heyu.
> cd x10switch
> rails generate controller Command cmd

create app/controllers/command_controller.rb
route get "command/cmd"
invoke erb
create app/views/command
create app/views/command/cmd.html.erb
invoke test_unit
create test/functional/command_controller_test.rb
invoke helper
create app/helpers/command_helper.rb
invoke test_unit
create test/unit/helpers/command_helper_test.rb
160  7.4. Pisanie kodu klienta w formie aplikacji internetowej

Naley teraz znale plik app/controllers/command_controller.rb w pliku


tym naley umieci kod sprawdzajcy parametry on i off oraz podejmujcy
odpowiednie dziaania:
class CommandController < ApplicationController
def cmd
@result = params[:cmd]

if @result == "on"
%x[/usr/local/bin/heyu on h3]
end

if @result == "off"
%x[/usr/local/bin/heyu off h3]
end
end
end

Konstrukcja %x suy do uruchamiania aplikacji z argumentami wiersza


polece. Oznacza to, e wyraenie %x[/usr/local/bin/heyu on h3] powoduje
wysanie przez narzdzie Heyu kodu rozkazu on do wcznika X10 ozna-
czonego kodem H3. Podobnie konstrukcja %x[/usr/local/bin/heyu off h3]
powoduje wyczenie tego samego wcznika.
Musimy jeszcze otworzy do edycji plik app/views/command/cmd.html.erb
i umieci w odpowiednim miejscu nastpujcy wiersz (jest to wbudowany
kod jzyka Ruby wywietlajcy wynik dania On i Off):
wiato powinno teraz by w stanie <%= @result %>.

Aplikacj na bazie frameworku Rails mona by oczywicie rozszerzy


o atrakcyjny, przyjazny interfejs uytkownika dostpny za porednictwem
pliku public/index.html oraz o bardziej wyczerpujce komunikaty opisujce
skutki podejmowanych dziaa implementacj odpowiednich rozwiza
pozostawiam zainteresowanym czytelnikom. Poniewa wcznik docelowo
ma by kontrolowany za porednictwem klienckiej aplikacji mobilnej, nie
ma sensu inwestowanie czasu w budow wyszukanego interfejsu uytkownika
aplikacji internetowej, ktrej praktycznie w ogle nie bdziemy uywali.
Naley jeszcze zmodyfikowa plik config/routes.rb i zastpi wiersz get
"command/cmd"nastpujc konstrukcj:
match "/command/:cmd", :to => 'command#cmd'

W ten sposb wymuszamy na aplikacji na bazie frameworku Rails waciwy


sposb interpretacji da przychodzcych jako rozkazw wczania i wy-
czania. Po zapisaniu tego pliku moemy wreszcie przystpi do pierwszych
testw!
Rozdzia 7. Internetowy wcznik wiata  161

Podczas konfigurowania nowszej wersji frameworku Ruby on Rails (na


przykad Rails 3.1) w systemie operacyjnym Linux by moe bdziemy
musieli zainstalowa kilka dodatkowych pakietw (w terminologii jzyka
Ruby nazywanych klejnotami ang. gem) potrzebnych do uruchomienia
tego frameworku. W tym celu naley otworzy do edycji plik Gemfile wy-
generowany w katalogu x10switch i doda nastpujce wiersze:
gem 'execjs'
gem 'therubyracer'

Po zapisaniu zmian naley wpisa nastpujce polecenie:


> bundle install

Polecenie spowoduje pobranie i instalacj dodatkowych plikw uywa-


nych przez silnik JavaScriptu w ramach frameworku Rails 3.1. Po udanej
instalacji obu klejnotw moemy przystpi do uruchamiania i testowania
naszej aplikacji X10switch na bazie frameworku Rails.

7.5. Testowanie klienta


aplikacji internetowej
Po poczeniu interfejsu komputerowego X10 z portem szeregowym kom-
putera i przygotowaniu niezbdnej konfiguracji moemy uruchomi serwer
i aplikacj na bazie frameworku Rails 3 za pomoc nastpujcych polece:
> cd ~/projects/ruby/rails/homprojects/x10switch
> rails s

=> Booting WEBrick


=> Rails 3.0.5 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2011-03-18 16:49:31] INFO WEBrick 1.3.1
[2011-03-18 16:49:31] INFO ruby 1.8.7 (2009-06-12) [universal-darwin10.0]
[2011-03-18 16:49:31] INFO WEBrick::HTTPServer#start: pid=10313 port=3000

Naley teraz otworzy przegldark internetow na lokalnym komputerze


i wpisa nastpujcy adres:
http://localhost:3000/command/on

Jeli wszystko dziaa prawidowo, w oknie przegldarki powinien zosta


wywietlony komunikat wiato powinno teraz by w stanie on (patrz
rysunek 7.5 zatytuowany Strona wywietlona w przegldarce internetowej
powinna informowa o biecym stanie wiata).
162  7.6. Pisanie kodu klienta dla systemu Android

Rysunek 7.5. Strona wywietlona w przegldarce internetowej powinna


informowa o biecym stanie wiata

Jeszcze waniejsze jest wysanie przez narzdzie Heyu polecenia do urz-


dzenia X10, ktremu przypisano kod H3. Innymi sowy, w wyniku tego
testu powinno si wczy odpowiednie wiato. Aby wyczy to wiato,
wystarczy wpisa w polu adresu przegldarki nastpujce polecenie:
http://localhost:3000/command/off

Jeli wiato zgaso, moemy by z siebie naprawd dumni! Prawidowe


wczanie i wyczanie wiata oznacza, e wszystko zostao odpowiednio
poczone i zaprogramowane. Jeli zdecydujemy si rozbudowa aplikacj
Rails o obsug dodatkowych polece, wystarczy w kodzie klasy CommandCon-
troller doda wicej wyrae if @result == ... zawierajcych polecenia,
ktre maj by wysyane za porednictwem narzdzia Heyu. Dodatkowe
polecenia mog polega na ciemnianiu wiata do 30% maksymalnej
jasnoci, wczaniu urzdze elektrycznych na pewien czas oraz zarzdza-
niu wieloma rnymi kombinacjami wczania i wyczania urzdze.
Czytelnikw zainteresowanych lepszym poznaniem technik programowa-
nia aplikacji internetowych przy uyciu frameworku Ruby on Rails zachcam
do lektury ksiki Programming Ruby: The Pragmatic Programmers Guide
[TFH09].
Skoro serwer aplikacji internetowej dziaa prawidowo, czas przystpi do
budowy mobilnego klienta.

7.6. Pisanie kodu klienta


dla systemu Android
Cz czytelnikw zapewne zastanawia si, jaki jest sens budowy aplikacji
klienckiej dla systemu Android, skoro moemy uy napisanej aplikacji inter-
netowej za porednictwem przegldarki dostpnej w tym systemie. Jeli
jedynym celem budowanego systemu jest wczanie i wyczanie wiata,
dodatkowy klient w formie aplikacji systemu Android rzeczywicie nie jest
potrzebny. Interfejs aplikacji internetowej w dotychczasowej formie spenia
Rozdzia 7. Internetowy wcznik wiata  163

swoj funkcj i moe by dodatkowo rozbudowany o elementy technologii


AJAX i atrakcyjne efekty wizualne HTML5/CSS3. Jeli jednak aplikacja
ma oferowa dodatkowe funkcje, na przykad wcza zasilanie na podstawie
odlegoci od telefonu lub uruchamia usug systemu Android monitorujc
przychodzce zdarzenia X10 (na przykad zdarzenia wykrycia ruchu) i od-
twarza dwik alarmowy na telefonie, sama dynamiczna strona internetowa
nie wystarczy.
Czytelnicy, ktrzy jeszcze tego nie zrobili, powinni teraz pobra, zainstalowa
i skonfigurowa rodowisko programowania Eclipse, najnowszy pakiet narzdzi
Android SDK oraz wtyczk ADK dla rodowiska Eclipse. Szczegowe
instrukcje mona znale na stronie internetowej pakietu narzdzi Android
SDK12.
Musimy jeszcze utworzy urzdzenie wirtualne systemu Android (ang. An-
droid Virtual Device AVD), ktre umoliwi nam testowanie aplikacji
klienckiej w emulatorze Androida przed wysaniem tego programu na wa-
ciwe urzdzenie z tym systemem13. Zachcam do utworzenia systemu AVD
emulujcego system operacyjny Android 1.5 (API Level 3), czyli wersj
zainstalowan na najwikszej liczbie telefonw z systemem Android.
Po uruchomieniu rodowiska programowania Eclipse naley wybra opcj
File/New/Android Project. W zalenoci od stosowanej wersji rodowiska
Eclipse odpowiednia opcja Android Project moe by dostpna po wybraniu
opcji File/New/Other/Android. Projekt naley nazwa LightSwitch, a z listy
Build Target naley wybra system operacyjny Android 1.5. W zalenoci
od poziomu urzdzenia z systemem Android, na ktrym chcemy wdroy
budowan aplikacj, moemy wybra wysz wersj Androida. Poniewa
jednak program LightSwitch bdzie do prosty, system Android 1.5 powi-
nien w zupenoci wystarczy w roli platformy dla tej przykadowej aplikacji.
W obszarze Properties naley wpisa nazw aplikacji (w tym przypadku Light
Switch) oraz nazw pakietu (w tym przypadku com.mysampleapp.lightswitch).
Naley te zaznaczy pole wyboru Create Activity i wpisa nazw Light-
Switch. Istnieje moliwo okrelenia minimalnej wersji pakietu SDK
(w polu Min SDK Version), jednak w tym przypadku tworzymy aplikacj
dla jednej z najbardziej popularnych wersji Androida, zatem moemy bez
obaw pozostawi to pole puste. Przed przystpieniem do dalszych zada

12
http://developer.android.com/sdk
13
http://developer.android.com/guide/developing/devices/managing-avds.html
164  7.6. Pisanie kodu klienta dla systemu Android

naley sprawdzi, czy zawarto okna dialogowego New Android Project


wyglda tak jak na rysunku 7.6 zatytuowanym Okno dialogowe nowego
projektu dla systemu Android z ustawionymi parametrami.

Rysunek 7.6. Okno dialogowe nowego projektu dla systemu Android


z ustawionymi parametrami

Bardziej dowiadczeni programici aplikacji dla systemu Android, ktrzy


wypracowali odpowiednie praktyki testowania swoich rozwiza, zapewne
klikn teraz przycisk Next, aby skonfigurowa zasoby na potrzeby odpowied-
niego projektu testowego. Z uwagi na ograniczenia czasu i miejsca przyst-
pimy do realizacji waciwego projektu i od razu klikniemy przycisk Finish.
Po wygenerowaniu szkieletu kodu aplikacji Light Switch przez wtyczk An-
droid Development Tools Eclipse naley dwukrotnie klikn plik main.xml
w folderze res/layout, aby otworzy ten plik w edytorze formularzy Androida.
Rozdzia 7. Internetowy wcznik wiata  165

Naley przecign kontrolk ToggleButton z palety widgetw formularza


(Form Widgets) na ukad graficzny pliku main.xml. Na tym etapie nie musimy
si martwi o idealne pooenie kontrolki. W tym przypadku dziaanie aplika-
cji po klikniciu tego przycisku jest duo waniejsze ni wygld programu.
Poniewa aplikacja nie wymaga adnych dodatkowych elementw poza pod-
stawowymi funkcjami znanymi ju z wczeniejszych wyda systemu opera-
cyjnego Android, moemy zmieni wersj tego systemu, wybierajc opcj
Android 1.5 z listy rozwijanej widocznej w prawym grnym rogu edytora
formularza. Moemy oczywicie usun domylny element Hello world
typu TextView z projektowanego ukadu. Po zakoczeniu projektowania uka-
du jego struktura powinna przypomina t pokazan na rysunku 7.7 zatytu-
owanym Ukad graficznego formularza aplikacji Light Switch. Naley
teraz zapisa plik main.xml.

Rysunek 7.7. Ukad graficznego formularza aplikacji Light Switch

Naley teraz rozwin wze src/com.mysampleapp.lightswitch i dwukrotnie


klikn plik LightSwitch.java. Poniewa chcemy uy widgetu ToggleSwitch,
musimy najpierw zaimportowa klas android.widget.ToggleButton.
Musimy nastpnie doda biblioteki java.net.URL i java.io.InputStream,
poniewa bdziemy tworzyli obiekty klasy URL przekazywane do obiektu
klasy InputStream jzyka Java. Sekcja wyrae importujcych niezbdne
biblioteki w pliku LightSwitch.java powinna mie nastpujc posta:
166  7.6. Pisanie kodu klienta dla systemu Android

package com.mysampleapp.lightswitch;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ToggleButton;
import android.view.View;
import java.net.URL;
import java.io.InputStream;

Moemy teraz przystosowa klas LightSwitch do obsugi kontrolki typu


ToggleSwitch w tym celu musimy znale odpowiedni obiekt wedug
identyfikatora dla zdarzenia OnCreate klasy LightSwitch i doda metod moni-
torujc zdarzenia wczania i wyczania tego wcznika:
public class LightSwitch extends Activity {
/** Metoda wywoywana podczas pierwszego tworzenia obiektu czynnoci. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final String my_server_ip_address_and_port_number =
"192.168.1.100:3344";
final ToggleButton toggleButton =
(ToggleButton) findViewById(R.id.toggleButton1);
toggleButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v) {
if (toggleButton.isChecked()) {
try {
final InputStream is = new URL("http://"+
adres_ip_i_numer_portu_serwera +"/command/on").openStream();
}
catch (Exception e) {
}
} else {
try {
final InputStream is = new URL("http://"+
adres_ip_i_numer_portu_serwera +"/command/off").openStream();
}
catch (Exception e) {
}
}
}
});
}
}

acuch adres_ip_i_numer_portu_serwera naley oczywicie zastpi adresem


IP i numerem portu, na ktrym zostaa wdroona aplikacja na bazie frame-
worku Rails napisana w podrozdziale 7.4 Pisanie kodu klienta w formie
aplikacji internetowej. To wszystko! Warto teraz uruchomi t aplikacj
w emulatorze systemu Android, aby upewni si, e moe by prawidowo
kompilowana i prawidowo wywietla formularz na ekranie.
Rozdzia 7. Internetowy wcznik wiata  167

7.7. Testowanie aplikacji klienckiej


dla systemu Android
Najwyszy czas przetestowa t aplikacj z prawdziwym wcznikiem wiata
X10. Jeli aplikacja internetowa na bazie frameworku Rails dziaa zgod-
nie z naszymi zaoeniami, wystarczy uruchomi serwer tej aplikacji w tej
samej sieci lub podsieci, w ktrej dziaa emulator systemu Android (patrz
rysunek 7.8 zatytuowany Uruchamianie aplikacji Light Switch).

Rysunek 7.8. Uruchamianie aplikacji Light Switch

Naley uy tego samego numeru portu, ktry zdefiniowano w ramach


acucha adres_ip_i_numer_portu_serwera w kodzie aplikacji dla systemu
Android. Jeli na przykad zastosowano acuch 192.168.1.100:3344, adres
IP serwera ma posta 192.168.1.100, za numer portu jest rwny 3344.
Podczas uruchamiania serwera z aplikacj na bazie frameworku Rails naley
przekaza nastpujcy parametr wiersza polece:
> rails s -p3344

Skoro serwer z aplikacj na bazie frameworku Rails dziaa na porcie 3344


i czeka na dania przychodzce (wysyane w ramach tej samej sieci lokalnej
co emulator systemu Android lub urzdzenie z tym systemem), moemy
teraz nacisn przycisk przecznika On/Off.
Hm, nic si nie dzieje. Dlaczego?
168  7.7. Testowanie aplikacji klienckiej dla systemu Android

Okazuje si, e do prawidowego dziaania aplikacji Light Switch potrzebne


jest ustawienie jeszcze jednej wanej opcji. Musimy mie na uwadze model
bezpieczestwa aplikacji systemu Android i zasygnalizowa, e nasza aplika-
cja bdzie uywaa poczenia z internetem (poczenie jest niezbdne do
przekazywania wychodzcych da protokou HTTP do wiata zewntrz-
nego). W tym celu naley dwukrotnie klikn plik AndroidManifest.xml
i doda nastpujcy wiersz przed znacznikiem zamykajcym </manifest>:
<uses-permission android:name="android.permission.INTERNET">
</uses-permission>

Cay plik AndroidManifest.xml powinien teraz mie nastpujc posta:


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mysampleapp.lightswitch"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<activity android:name=".LightSwitch"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET">
</uses-permission>
</manifest>

Naley ponownie skompilowa aplikacj Light Switch z nowymi uprawnie-


niami, po czym klikn przycisk przecznika. Jeli wszystko dziaa zgodnie
z planem, aplikacja serwera na bazie frameworku Rails powinna zwrci
nastpujcy komunikat o otrzymaniu prawidowego dania:
Started GET "/command/on" for 192.168.1.101 at Sat Mar 21 19:48:10 -0500 2011
Processing by CommandController#cmd as HTML
Parameters: {"cmd"=>"on"}
Rendered command/cmd.html.erb within layouts/application (11.7ms)
Completed 200 OK in 53ms (Views: 34.7ms | ActiveRecord: 0.0ms)

Nacinicie przycisku powinno te spowodowa wczenie wiata! Warto


teraz ponownie nacisn przycisk przecznika. Tym razem powinnimy
otrzyma podobny komunikat dla polecenia off:
Started GET "/command/off" for 192.168.1.101 at Sat Mar 26 19:52:30 -0500 2011
Processing by CommandController#cmd as HTML
Parameters: {"cmd"=>"off"}
Rendered command/cmd.html.erb within layouts/application (13.2ms)
Completed 200 OK in 1623ms (Views: 40.0ms | ActiveRecord: 0.0ms)
Rozdzia 7. Internetowy wcznik wiata  169

Tym razem nacinicie przycisku powinno spowodowa wyczenie wiata.


W niektrych, do rzadkich przypadkach prba instalacji aplikacji Light
Switch na telefonie z systemem Android moe powodowa wywietlenie
komunikatu o wyganiciu wanoci klucza diagnostycznego. Model bez-
pieczestwa systemu Android wyklucza moliwo uruchamiania kodu
bez podpisanego klucza. Podpisany klucz powinien zosta automatycznie
wygenerowany i skonfigurowany podczas instalacji zestawu narzdzi An-
droid SDK; jeli jednak otrzymamy komunikat o wyganiciu wanoci
tego klucza, powinnimy przeprowadzi procedur generowania nowego
klucza (opisan w dokumentacji zestawu narzdzi Android SDK)14.
Wicej informacji na temat procedur instalacji oprogramowania tworzone-
go w rodowisku Eclipse na urzdzeniach z systemem Android mona
znale w dokumentacji zestawu narzdzi Android SDK (w czci doty-
czcej uruchamiania aplikacji na emulatorze i waciwych urzdzeniach)15.

7.8. Nastpne kroki


Gratulacje! Skoro moemy ju sterowa lamp lub dowolnym innym urz-
dzeniem elektrycznym za porednictwem graficznego przecznika na ekranie
dotykowym telefonu z systemem Android, mamy przed sob zupenie nowe
moliwoci w zakresie automatyzacji domu.
Aplikacj klienck dla systemw mobilnych mona rozbudowa o mechani-
zmy sterowania wieloma wcznikami X10 w moliwie atwy i elegancki spo-
sb (na przykad z uwzgldnieniem pory dnia, wsprzdnych odczytywa-
nych przez wbudowany modu GPS, tak aby wiato na ganku zapalao
si po zapadniciu ciemnoci i tylko wtedy, gdy znajdujemy si w promie-
niu piciu metrw od drzwi wejciowych). Mimo e w tej ksice nie b-
dziemy tworzyli podobnej aplikacji uwzgldniajcej pooenie uytkowni-
ka, dysponujemy ju wszystkimi elementami skadowymi takiego systemu,
zatem kady czytelnik moe sam sprbowa zrealizowa odpowiedni pro-
jekt. Zainteresowanych czytelnikw zachcam do lektury ksiki Hello,
Android Eda Burnettea [Bur10], w ktrej mona znale kilka naprawd
przydatnych przewodnikw. Ciekawe pomysy i dokumentacj projektw
warto te zgasza na oficjalnej stronie internetowej tej ksiki!

14
http://developer.android.com/guide/publishing/app-signing.html
15
http://developer.android.com/guide/developing/building/building-eclipse.html
170  7.8. Nastpne kroki

Opisan konfiguracj mona udoskonali na wiele innych sposobw, aby


system sterowania by bardziej niezawodny i przyjazny dla uytkownika.
Poniej opisano kilka pomysw na rozbudow tego projektu:
Warto rozway poprawienie mechanizmu przechwytywania b-
dw i generowania odpowiednich komunikatw. Zdarzenia stan-
dardu X10 maj charakter odpal i zapomnij, zatem dania nie
powoduj zwracania adnych odpowiedzi informujcych o sukcesie
lub porace. W tej sytuacji istnieje spora przestrze dla udoskona-
le usugi sieciowej, tak aby uwzgldniaa niemal wszystkie poten-
cjalne problemy przynajmniej do momentu wysania waciwego
polecenia protokou X10. Przed wysaniem komunikatu naleaoby
przechwyci i zgosi ewentualne bdy poczenia interfejsu kom-
puterowego X10. wiadomo niewaciwego dziaania interfejsu
X10 jest nieporwnanie bardziej przydatna ni samo odkrycie, e
uycie wcznika nie powoduje adnej zmiany (bez wyjanienia przy-
czyn tego stanu rzeczy).
Warto zainwestowa w dodatkowe moduy X10, w tym moduy lamp
(dwukierunkowy LM14A oraz tzw. Socket Rocket LM15A),
gniazdo cienne (SR227) i moduy obcionych urzdze (HD243).
Narzdzie Heyu moe wysya zdarzenia do wielu urzdze X10
jednoczenie. Mona na przykad uy jednego wywoania metody
do wczenia wiata w kuchni, wczenia tostera, uruchomienia eks-
presu do kawy i wentylatora sufitowego. Co wicej, aplikacja kliencka
na telefonie komrkowym moe otrzyma powiadomienie o gotowej
kawie i opieczonej bagietce.
Czytelnicy, ktrzy wol lejsze frameworki aplikacji internetowych
jzyka Ruby, powinni rozway zastpienie serwera Ruby on Rails
frameworkiem Sinatra16. Mimo e Sinatra wci nie cieszy si tak
popularnoci jak framework Rails, z pewnoci warto sprawdzi
moliwoci tego wyjtkowo zgrabnego rozwizania.
Interfejsy uytkownika aplikacji mobilnych mona wzbogaci o bar-
dziej eleganck i funkcjonaln cz frontow, ktra bdzie obej-
mowaa wiele przecznikw, symboli urzdze, przyciskw otwie-
rajcych bram garaow itp.

16
http://www.sinatrarb.com/
Rozdzia 7. Internetowy wcznik wiata  171

Rozwizania opisane w tym rozdziale mona wykorzysta do rozsze-


rzenia funkcji rozmaitych innych systemw (na przykad do wzbo-
gacenia telefonu o funkcje pilota telewizyjnego) lub projektw opi-
sanych w tej ksice (na przykad projektu z rozdziau 8. zatytuo-
wanego Automatyzacja dziaania zasony lub z rozdziau 9. zatytu-
owanego Zamek do drzwi sterowany przez Androida).
172  7.8. Nastpne kroki
Rozdzia 8.
Automatyzacja
dziaania zasony

J
ednym z najbardziej popularnych efektw w filmach science fiction jest
automatyczne otwieranie i zamykanie rozmaitych przegrd, a take
podnoszenie i opuszczanie zason w oknach. Okazuje si, e to, co
kiedy byo wyobraeniem o przyszoci, nie jest dzisiaj niczym szczeglnym
i stale zyskuje na popularnoci. W tym projekcie skonstruujemy system,
ktry bdzie podnosi i opuszcza zasony w zalenoci od natenia wia-
ta i temperatury. Zasony s podnoszone w reakcji na rosnc temperatu-
r, a opuszczane po wykryciu wiata sonecznego (patrz rysunek 8.1 za-
tytuowany Automatyczne zasony okienne).
Podstawowym elementem sprztowym potrzebnym do realizacji tego pro-
jektu bdzie silnik krokowy to sterowane przez pytk Arduino urz-
dzenie bdzie wykonywao okrelon liczb obrotw w kierunku zgodnym
z ruchem wskazwek zegara i w kierunku przeciwnym do tego ruchu. Od-
powiednie poczenie wau silnika krokowego do linki systemu podnosze-
nia i opuszczania zason umoliwi sterowanie zasonami zalenie od sy-
gnaw wysyanych przez pytk Arduino.
Przeanalizujmy teraz pozostae elementy skadowe niezbdne do budowy
tego projektu.
174  8.1. Czego potrzebujemy

Rysunek 8.1. Automatyczne zasony okienne... podnoszone i opuszczane


zalenie od nasonecznienia i temperatury

8.1. Czego potrzebujemy


Czci potrzebne do realizacji tego projektu s do proste. Do najwaniej-
szych komponentw nale czujniki wiata i temperatury, silnik krokowy
i pytka Arduino. Reszta elementw jest potrzebna do odpowiedniego
zamontowania i zasilania tego systemu. Wymagane komponenty pokazano
na rysunku 8.2 zatytuowanym Czci systemu automatycznej zasony
okiennej. Potrzebne nam s nastpujce elementy:
1. cztery dwucalowe ktowniki do zamontowania silnika krokowego;
2. dwubiegunowy silnik krokowy zasilany napiciem 12 V ;
1

3. modu silnika platformy Arduino ;


2

4. zasilacz 12 V3;

1
https://www.adafruit.com/products/324
2
http://www.adafruit.com/products/81
3
https://www.adafruit.com/products/352
Rozdzia 8. Automatyzacja dziaania zasony  175

Rysunek 8.2. Czci systemu automatycznej zasony okiennej

5. dwustronna tama piankowa redukujca wibracje zamontowanego


silnika krokowego;
6. gumowe, rowkowe koo pasowe do nawijania linki zasony;
7. przewd czcy czujniki i silnik krokowy z moduem silnika;
8. analogowy czujnik temperatury TMP36 (powikszone zdjcie
fotokomrki i czujnika temperatury pokazano na rysunku 8.3 za-
tytuowanym Czujniki potrzebne do budowy systemu automa-
tycznej zasony)4;
9. rezystor 10 k (takie rezystory oznacza si zwykle brzowym,
czarnym, pomaraczowym i zotym paskiem);
10. fotokomrka (tego samego typu co w rozdziale 5. zatytuowanym
wierkajcy karmnik dla ptakw);
11. Arduino Uno;
12. maa pytka uniwersalna, na ktrej zostan zamontowane fotokomr-
ka i czujnik temperatury;
13. standardowy przewd USB A-B (nie ma go na rysunku) do po-
czenia platformy Arduino z komputerem.

4
https://www.adafruit.com/products/165
176  8.1. Czego potrzebujemy

Rysunek 8.3. Czujniki potrzebne do budowy systemu automatycznej zasony

W tym projekcie zakadam, e czytelnik dysponuje ju zawieszonymi za-


sonami oraz systemem ich podnoszenia i opuszczania. Czytelnicy, ktrzy
nie dysponuj jeszcze roletami, mog skorzysta z porad publikowanych
w wielu serwisach internetowych, ktre dokadnie wyjaniaj, jak prawi-
dowo zawiesi zasony i jak zamontowa system ich regulacji. Ten projekt
najlepiej sprawdza si w przypadku zason zawieszonych na karniszach
i podnoszonych za pomoc jednej nieprzerwanej linki. Pocignicie linki
z lewej strony powoduje podcignicie prawej strony zasony (i odwrotnie).
Naley tak dobra rednic koa pasowego, aby najlepiej pasowao do konfi-
guracji zasony. W przypadku pojedynczej zasony zawieszonej z prostym
systemem podnoszenia rowkowe koo pasowe o rednicy jednego cala powin-
no w zupenoci wystarczy. Koa pasowe w rnych rozmiarach czsto mo-
na znale wrd elementw wyjtych z rozmaitych urzdze, czci samo-
chodowych, a nawet w niektrych sklepach dla zakadw rzemielniczych.
W idealnej konfiguracji rodkowy otwr koa pasowego powinien by dobrze
dopasowany do wau silnika krokowego, tak aby koo nie zsuwao si i nie
lizgao si na wale w czasie dziaania silnika. Czytelnicy, ktrzy mieszkaj
blisko sklepu z takimi urzdzeniami, powinni zabra ze sob wiele rnych
k pasowych, aby na miejscu dopasowa silnik krokowy (w ten sposb
mona oszczdzi sporo czasu i nerww). Po znalezieniu najlepszego
silnika i dopasowaniu koa pasowego moemy przystpi do czenia ele-
mentw projektu.
Rozdzia 8. Automatyzacja dziaania zasony  177

8.2. Budowa rozwizania


Realizacja tego projektu wymaga wykonania wielu zada. Po pierwsze,
musimy przetestowa silnik krokowy za pomoc szkicu na bazie biblioteki
AFMotor firmy Adafruit. Zakadam, e dysponujesz ju odpowiednio skon-
struowanym moduem silnika. Szczegowe informacje na temat budowy
i stosowania takiego moduu mona znale na stronie internetowej firmy
Adafruit5.
Po sprawdzeniu dziaania silnika krokowego (wa silnika powinien obra-
ca si w obie strony zalenie od rozkazw wysyanych przez szkic plat-
formy Arduino) moemy przystpi do podczania fotokomrki. W tym
projekcie zastosujemy ten sam schemat obsugi fotokomrki, ktry z po-
wodzeniem by uywany w projekcie wierkajcego karmnika dla ptakw.
W momencie, w ktrym fotokomrka wykrywa natenie wiata przekra-
czajce ustalony przez nas prg, wa silnika krokowego obraca si okrelo-
n liczb razy w kierunku zgodnym z ruchem wskazwek zegara. Po wy-
kryciu spadku natenia wiata poniej ustalonej wartoci progowej wa
silnika krokowego wykonuje tyle samo obrotw w przeciwnym kierunku.
Obrt wau wprowadza w ruch koo pasowe, co z kolei powoduje podno-
szenie i opuszczanie zasony okiennej.
Oprcz natenia wiata musimy jeszcze uwzgldni temperatur w po-
koju, na wypadek gdyby przekroczya wyznaczon warto progow. Jeli
w pomieszczeniu robi si zbyt gorco, warto wymusi obroty wau silnika
w kierunku przeciwnym do ruchu wskazwek zegara, aby opuci zason,
mimo e na dworze jest jasno. Po wykryciu spadku temperatury do kom-
fortowego poziomu wa silnika powinien wykona odpowiedni liczb
obrotw w kierunku zgodnym z ruchem wskazwek zegara, aby ponownie
podnie zason.
Po uruchomieniu i przetestowaniu obu czujnikw naley zamontowa koo
pasowe na wale silnika krokowego. Po nawiniciu linki sterujcej zaso-
nami moemy wskaza waciwe miejsce montau silnika (wraz z koem
pasowym) na cianie. Naley tak dobra miejsce instalacji silnika kroko-
wego, aby linka sterujca zasonami bya odpowiednio nacignita i aby
nie lizgaa si po obracanym kole pasowym. Pozostaje nam jeszcze kali-
bracja liczby obrotw wau silnika krokowego potrzebnych do podniesienia
i opuszczenia zasony. Po wyznaczeniu odpowiednich wartoci moemy

5
http://www.ladyada.net/make/mshield/make.html
178  8.3. Stosowanie silnika krokowego

jeszcze okreli szybko dziaania silnika krokowego (liczb obrotw na


minut), aby zasona bya podnoszona i opuszczana w odpowiednim tempie.
Po omwieniu tych krokw moemy wreszcie przystpi do pisania szkicu
odpowiedzialnego za sterowanie silnikiem krokowym.

8.3. Stosowanie silnika krokowego


Dziaanie silnikw elektrycznych polega na wprawianiu w ruch central-
nych waw przez pole elektromagnetyczne. Zmiany pola magnetycznego
wok cewek otaczajcych wa powoduj zmian si wprawiajcych wa
w ruch obrotowy (w jednym albo drugim kierunku). Silniki krokowe dodat-
kowo podnosz precyzj sterowania obrotami wau, poniewa wprowadzaj
pojcie kroku, czyli dokadnie okrelonego kta obrotu. Ta cecha silnikw
krokowych czyni z tych urzdze doskonay wybr wszdzie tam, gdzie
jest wymagana precyzyjna kontrola.
Silniki krokowe stosuje si w drukarkach atramentowych, ploterach i dyskach
twardych; urzdzenia tego typu mona spotka take w rozmaitych systemach
przemysowych.
Na potrzeby tego projektu zostanie uyty popularny dwubiegunowy silnik
krokowy zasilany prdem 12 V, 350 mA. Peen obrt podzielono na 200
krokw. Silnik powinien oferowa moment obrotowy niezbdny do podnie-
sienia niemal wszystkich rodzajw zason (poza tymi najciszymi). Skoro
wybrany silnik ma by zasilany prdem 12 V, musimy zaopatrzy si
w 12-woltowy zasilacz (napicie 5 V dostarczane przez sam pytk Arduino
w tym przypadku nie wystarczy). Okazuje si, e pytka Arduino dysponuje
elektronik potrzebn do bezpiecznego podczenia zasilacza 12-woltowego,
ktry bdzie zasila zarwno t pytk, jak i modu silnika oraz sam silnik
krokowy.
Poniej opisaem kroki potrzebne do przygotowania silnika krokowego do
waciwego programowania (zakadam, e dysponujesz ju dziaajcym mo-
duem silnika firmy Adafruit):
1. Naley podczy cztery przewody 12-woltowego, dwubiegunowe-
go silnika krokowego. W przypadku silnika krokowego zalecanego
przez firm Adafruit przewody powinny tworzy nastpujc se-
kwencj: czerwony, ty, zielony, brzowy. Odpowiedni przykad
pokazano na rysunku 8.4 zatytuowanym Sposb czenia dwu-
biegunowego silnika krokowego.
Rozdzia 8. Automatyzacja dziaania zasony  179

Rysunek 8.4. Sposb czenia dwubiegunowego silnika krokowego

2. Naley umieci modu silnika na pytce Arduino Uno.


3. Do gniazda zasilania pytki Arduino naley podczy zasilacz
12-woltowy.
4. Naley poczy pytk Arduino z komputerem za pomoc prze-
wodu USB.
Skoro dysponujemy ju poczonym sprztem, moemy si skoncentrowa
na pisaniu szkicu platformy Arduino, ktry bdzie sterowa prac silnika
krokowego.

8.4. Programowanie silnika krokowego


Aby silnik krokowy dziaa zgodnie z naszymi oczekiwaniami, musimy zaim-
portowa bibliotek, ktra znacznie upraszcza sterowanie przyrostowym
obracaniem wau tego silnika w wybranym kierunku i z okrelon szybkoci.
Okazuje si, e sterowanie silnikiem krokowym jest bardzo proste dziki
bibliotece moduu silnika AFMotor firmy Adafruit6. Jak w przypadku wikszoci
bibliotek tej firmy, naley rozpakowa pobrany plik ZIP, zmieni nazw
wypakowanego folderu (AFMotor) i umieci ten folder w folderze libraries
rodowiska Arduino IDE. Wicej informacji na ten temat mona znale
w dodatku A zatytuowanym Instalacja bibliotek platformy Arduino.

6
https://github.com/adafruit/Adafruit-Motor-Shield-library
180  8.4. Programowanie silnika krokowego

Po zainstalowaniu biblioteki AFMotor naley uruchomi rodowisko progra-


mowania Arduino IDE. Sprbujmy napisa szkic, ktry przetestuje dzia-
anie silnika krokowego. Kod tego szkicu bdzie wykonywa nastpujce
zadania:
1. Zaaduje bibliotek AFMotor.
2. Utworzy obiekt silnika krokowego biblioteki AFMotor, po czym ustawi
poczenie i okreli liczb krokw na obrt (czyli w praktyce szybko
obracania wau tego silnika).
3. Obrci wa w kierunku zgodnym z ruchem wskazwek zegara i w kie-
runku przeciwnym do tego ruchu, korzystajc z dwch cewek. Opi-
sane dziaanie, ktre okrela si mianem aktywacji dwucewkowej
(ang. double-coil activation), zapewnia wyszy moment obrotowy
ni stosowanie jednej cewki. Dodatkowy moment obrotowy z pew-
noci przyda si podczas nawijania linki sterujcej zasonami.
Kompletny kod opisanego szkicu pokazano poniej:
Plik CurtainAutomation/StepperTest.pde

#include <AFMotor.h>

AF_Stepper motor(48, 2);

void setup() {
Serial.begin(9600);
Serial.println("Pocztek testu silnika krokowego...");
// Za pomoc funkcji setSpeed mona ustawi szybko obracania wau silnika
motor.setSpeed(20);
}

void loop() {
// funkcja step()
motor.step(100, FORWARD, DOUBLE);
motor.step(100, BACKWARD, DOUBLE);
}

Warto pamita, e ten kod testowy jest w istocie fragmentem przykadowego


kodu dostpnego na stronie internetowej Ladyady powiconej moduowi
silnika7.
Szkic naley teraz zapisa i wysa na platform Arduino. Jeli wszystko za-
dziaa prawidowo, silnik krokowy powinien obraca si zgodnie z kierun-
kiem ruchu wskazwek zegara i przeciwnie do tego ruchu a do momentu
odcicia zasilania lub wysania nowego szkicu. Jeli wa silnika krokowego

7
http://www.ladyada.net/make/mshield/use.html
Rozdzia 8. Automatyzacja dziaania zasony  181

nie obraca si, naley najpierw sprawdzi przewody czce silnik z moduem
silnika. Warto te sprawdzi, czy pytka Arduino na pewno jest pod-
czona do zasilacza 12-woltowego, poniewa warunkiem dziaania silnika
jest dostarczenie odpowiedniego napicia. W razie problemw z okreleniem
kierunku obrotw silnika wystarczy przymocowa do wau kawaek wstki.
Obracajca si wstka powinna uatwi jednoznaczne stwierdzenie, czy
wa rzeczywicie obraca si w obu kierunkach.
Dysponujemy ju dziaajcym silnikiem krokowym, zatem moemy przystpi
do uzupenienia systemu o czujniki temperatury i wiata, tak aby ten sil-
nik mg dziaa w reakcji na zmieniajc si sytuacj.

8.5. Doczanie czujnikw


Moemy teraz poczy dziaajcy silnik krokowy z fotokomrk, ktr stoso-
walimy ju w projekcie wierkajcego karmnika dla ptakw. Wskazania
fotokomrki bd odczytywane w jednosekundowych odstpach. W zalenoci
od natenia wiata na zewntrz czujnik bdzie powodowa podniesienie
lub opuszczenie zasony. Zastosujemy take czujnik temperatury, aby unikn
podnoszenia zasony w sytuacji, gdy w pomieszczeniu jest zbyt gorco, lub aby
opuci zason, jeli temperatura w pokoju przekracza wyznaczony poziom.
Na szczcie modu krokowy nie uywa adnych wtykw analogowych na
pytce Arduino to dla nas o tyle wane, e wtyki analogowe bd nam
potrzebne do mierzenia natenia wiata i temperatury za pomoc odpo-
wiednich czujnikw. W tej sytuacji moemy podczy jedn kocwk
fotokomrki do wtyku zasilania 5 V oraz drug kocwk do wtyku analogo-
wego nr 0. Tak jak podczas realizacji projektu wierkajcego karmnika dla
ptakw, musimy zmostkowa wtyk analogowy nr 0 z uziemieniem za pomoc
rezystora 10 k. W tym przypadku najprostszym rozwizaniem bdzie
podczenie czujnikw za porednictwem pytki uniwersalnej. Zalet pytki
jest take moliwo stabilnego zamocowania fotokomrki i skierowania jej
w stron okna (w celu sprawdzania natenia wiata na zewntrz).
Czujnik temperatury ma trzy kocwki: pierwsz kocwk naley poczy
z wtykiem zasilania 5 V, rodkow kocwk z wtykiem analogowym nr 5,
natomiast trzeci (praw) kocwk z wtykiem uziemienia. Dziki moduowi
silnika poczenie wszystkich elementw jest znacznie prostsze. Schemat
niezbdnych pocze pokazano na rysunku 8.5 zatytuowanym Schemat
pocze silnika krokowego i czujnikw na potrzeby automatycznej zasony.
182  8.6. Pisanie szkicu

Warto pamita, e chocia schemat przedstawia pytk Arduino, w rzeczy-


wistoci przewody s podczone do moduu silnika zamontowanego ponad
t pytk (wanie dlatego przewody czce pytk z silnikiem krokowym
oraz przewody prowadzce do wtyku analogowego nr 5 i wtykw zasilania
5 V podczono po prawej stronie ukadu).

Rysunek 8.5. Schemat pocze silnika krokowego i czujnikw na potrzeby


automatycznej zasony

Wartoci odczytywane przez te dwa czujniki bd sprawdzane co sekund.


Ewentualna reakcja na zmieniajce si warunki bdzie podejmowana tylko
w razie przekroczenia wyznaczonych wartoci progowych. Sprbujmy napisa
szkic, ktry zrealizuje opisane dziaania.

8.6. Pisanie szkicu


W szkicu na potrzeby tego projektu zostan zastosowane rozwizania i pomysy
zaczerpnite z dwch innych projektw. Obsuga danych odczytywanych
przez czujniki pochodzi z projektu wierkajcego karmnika dla ptakw, na-
tomiast maszyna stanw obejmujca status podniesionej i opuszczonej za-
sony pochodzi z systemu powiadamiania o poziomie wody. Kompletny szkic
pokazano poniej.
Rozdzia 8. Automatyzacja dziaania zasony  183

Plik CurtainAutomation/CurtainAutomation.pde

#include <AFMotor.h>
#define LIGHT_PIN 0
#define LIGHT_THRESHOLD 800
#define TEMP_PIN 5
#define TEMP_THRESHOLD 72
#define TEMP_VOLTAGE 5.0
#define ONBOARD_LED 13

int curtain_state = 1;
int light_status = 0;
double temp_status = 0;

boolean daylight = true;


boolean warm = false;

AF_Stepper motor(100, 2);

void setup() {
Serial.begin(9600);
Serial.println("Konfigurowanie systemu automatycznej zasony...");
// ustawia szybko obrotw wau silnika krokowego na poziomie 100 obrotw na minut
motor.setSpeed(100);
// inicjalizacja silnika
// motor.step(100, FORWARD, SINGLE);
// motor.release();
delay(1000);
}

void Curtain(boolean curtain_state) {


digitalWrite(ONBOARD_LED, curtain_state ? HIGH : LOW);
if (curtain_state) {
Serial.println("Podnoszenie zasony...");
// Warto sprawdzi w dziaaniu wartoci SINGLE, DOUBLE, INTERLEAVE i MICROSTOP
motor.step(800, FORWARD, SINGLE);
} else {
Serial.println("Opuszczanie zasony...");
motor.step(800, BACKWARD, SINGLE);
}
}

void loop() {

// sprawdza warto fotokomrki


light_status = analogRead(LIGHT_PIN);
delay(500);

// wysya warto zmiennej light_status do portu szeregowego


Serial.print("Warto fotokomrki = ");
Serial.println(light_status);
Serial.println("");

// sprawdza temperatur
int temp_reading = analogRead(TEMP_PIN);
184  8.6. Pisanie szkicu

delay(500);

// przelicza odczytane napicie na stopnie Celsjusza i Fahrenheita


float voltage = temp_reading * TEMP_VOLTAGE / 1024.0;
float temp_Celsius = (voltage - 0.5) * 100 ;
float temp_Fahrenheit = (temp_Celsius * 9 / 5) + 32;
// wysya warto zmiennej temp_status do portu szeregowego
Serial.print("Temperatura (w stopniach Celsjusza) = ");
Serial.println(temp_Celsius);
Serial.print("Temperatura (w stopniach Fahrenheita) = ");
Serial.println(temp_Fahrenheit);
Serial.println("");

if (light_status > LIGHT_THRESHOLD)


daylight = true;
else
daylight = false;

if (temp_Fahrenheit > TEMP_THRESHOLD)


warm = true;
else
warm = false;

switch (curtain_state)
{
case 0:
if (daylight && !warm)
// podnosi zason
{
curtain_state = 1;
Curtain(curtain_state);
}
break;
case 1:
if (!daylight || warm)
// opuszcza zason
{
curtain_state = 0;
Curtain(curtain_state);
}
break;
}
}

Referencja do biblioteki AFMotor uywanej do sterowania silnikiem kro-


kowym, ktry poczono z moduem silnika firmy Adafruit.
W pocztkowej sekcji szkicu zdefiniowano wiele wartoci. Takie roz-
wizanie znacznie uatwi zmian wartoci staych LIGHT_THRESHOLD
i TEMP_THRESHOLD, tak aby wyznaczay lepsze progi uruchamiania silnika
krokowego.
Rozdzia 8. Automatyzacja dziaania zasony  185

Zmienne reprezentujce stan zasony (a take wartoci odczytane


przez fotokomrk i czujnik temperatury oraz zmienne logiczne daylight
i warm) s wykorzystane w wyraeniach warunkowych gwnej ptli do
okrelania, czy na dworze jest jasno i czy temperatura w pomieszczeniu
jest odpowiednia. W tej czci szkicu dodatkowo tworzymy obiekt motor
klasy AF_Stepper, ustawiajc przy okazji liczb krokw w kadym obrocie
(w tym przypadku bdzie to 100 krokw) oraz port moduu, do ktre-
go podczono ten silnik (w tym przypadku port nr 2).
W tym miejscu inicjalizujemy port szeregowy, za ktrego porednictwem
wartoci odczytywane przez czujnik natenia wiata i temperatury bd
wysyane do okna monitora portu szeregowego w ramach rodowiska
Arduino IDE. W tej czci kodu okrelono take szybko dziaania
silnika (w tym przypadku na poziomie 100 obrotw na minut).
Funkcja Curtain zostanie wywoana w momencie przekroczenia wartoci
progowej natenia wiata lub temperatury. Stan zasony (podniesiona
lub opuszczona) jest reprezentowany w odpowiedniej zmiennej, dziki
czemu nie ma potrzeby uruchamiania silnika co sekund nawet w razie
przekroczenia wartoci progowej. Skoro zasona zostaa ju podniesiona,
jej ponowne podnoszenie nie miaoby adnego sensu. Co wicej, takie
dziaanie narazioby na uszkodzenie silnik krokowy, koo pasowe lub link
sterujc zason.
Jeli funkcja Curtain otrzymuje warto true za porednictwem argu-
mentu curtain_state, silnik krokowy wykonuje obroty w kierunku prze-
ciwnym do ruchu wskazwek zegara, aby podnie zason. Warto
false przekazana za porednictwem tego parametru powoduje obrt
silnika w kierunku zgodnym z ruchem wskazwek zegara i tym samym
opuszczenie zasony.
Do wizualizacji stanu zasony uyjemy dodatkowo diody LED na pytce
Arduino. Jeli zasona jest uniesiona, dioda pozostaje zapalona. W prze-
ciwnym razie dioda ganie. Poniewa modu silnika zasania grn cz
pytki Arduino, wbudowana dioda LED nie jest zbyt dobrze widoczna,
ale w zupenoci wystarczy do celw diagnostycznych.
Wikszo dziaa jest podejmowana w gwnej ptli tego szkicu. Program
odczytuje wskazania fotokomrki i czujnika temperatury co sekund,
konwertuje napicie przekazywane przez czujnik temperatury na stopnie
Celsjusza i Fahrenheita (dla osb, ktre nie s przyzwyczajone do systemu
metrycznego). Jeli warto przekazana przez czujnik natenia wiata
przekracza warto progow LIGHT_THRESHOLD (okrelon w sekcji #define
186  8.6. Pisanie szkicu

tego szkicu), przyjmujemy, e jest dzie (daytime = true). Nie chcemy


jednak podnosi zasony, jeli w pomieszczeniu jest gorco, poniewa
wiato soneczne dodatkowo nagrzewaoby wntrze. Jeli wic odczytana
temperatura przekracza warto progow TEMP_THRESHOLD, zasony pozo-
staj opuszczone do czasu ochodzenia powietrza w pomieszczeniu. Po
sprawdzeniu stanu zmiennej curtain_state moemy przekaza nowy
stan na wejciu funkcji Curtain, aby (zalenie od sytuacji) podnie lub
opuci zason.
Szkic naley teraz sprawdzi, pobra i uruchomi na platformie Arduino.
Na tym etapie warto pozostawi pytk Arduino poczon z komputerem
i otworzy okno monitora portu szeregowego rodowiska Arduino IDE,
aby sprawdzi wartoci odczytywane przez czujniki wiata i temperatury.
Moemy teraz sprawdzi, czy przekroczenie wartoci progowych powo-
duje oczekiwane dziaania, tj. aktywuje silnik krokowy (patrz rysunek 8.6
zatytuowany Test szkicu automatycznej zasony).

Rysunek 8.6. Test szkicu automatycznej zasony

Aby przetestowa dziaanie szkicu automatycznej zasony, warto najpierw


zasoni palcem fotokomrk i sprawdzi, czy silnik krokowy obraca wa
w kierunku przeciwnym do ruchu wskazwek zegara. Po odsoniciu foto-
Rozdzia 8. Automatyzacja dziaania zasony  187

komrki wa powinien wykona tyle samo obrotw w kierunku zgodnym


z ruchem wskazwek zegara. Naley teraz skierowa strumie ciepego po-
wietrza (na przykad za pomoc suszarki do wosw) na czujnik temperatury.
Przekroczenie progu powinno spowodowa wczenie silnika krokowego
i obroty w kierunku zgodnym z ruchem wskazwek zegara. Takie dziaanie
docelowo bdzie powodowao opuszczenie zasony. Przed usuniciem
rda ciepa naley ponownie zasoni palcem fotokomrk. Dopiero po
zasoniciu czujnika wiata naley usun rdo ciepa. Silnik krokowy
nie powinien si uruchomi.
Moemy teraz odsoni fotokomrk. Jeli powietrze otaczajce czujnik tem-
peratury zdyo si schodzi, wa silnika powinien zacz si obraca
w kierunku przeciwnym do ruchu wskazwek zegara. Jeli silnik nie zostanie
wczony, naley skierowa na czujnik temperatury strumie chodnego po-
wietrza system powinien zareagowa zaraz po wykryciu spadku tempe-
ratury poniej przyjtego progu. Na tej podstawie moemy sprawdzi, czy
szkic prawidowo reaguje na przekroczenie wartoci progowych natenia
wiata i temperatury. W wyniku tych testw by moe bdziemy musieli
nieznacznie zmieni te wartoci progowe, aby system waciwie reagowa na
natenie wiata i temperatur w pomieszczeniu. Niewykluczone, e bdzie-
my musieli wyznaczy pewne przedziay wskaza czujnikw wiata i tem-
peratury. W przeciwnym razie silnik krokowy bdzie wielokrotnie podnosi
i opuszcza zason w zwizku z nastpujcymi po sobie wzrostami i spad-
kami wartoci powyej i poniej progu.
Po sprawdzeniu, czy czujniki prawidowo przesyaj swoje wartoci i czy wa
silnika krokowego obraca si zaraz po przekroczeniu wartoci progowych,
moemy zainstalowa oba czujniki na parapecie okiennym oraz silnik kro-
kowy na cianie obok zasony. Po sprawdzeniu dziaania systemu moemy
przeoy czujniki w inne miejsce warto przetestowa rne pooenie czuj-
nikw (jedynym ograniczeniem jest dugo przewodw czcych te czujniki
z pytk Arduino). Warto te upewni si, e przewody i czujniki nie s
zainstalowane w miejscach, w ktrych mog zosta przypadkowo nadepnite
lub spowodowa potknicie si domownika.

8.7. Instalacja sprztu


Podczas instalacji czujnikw w docelowym miejscu mona zastosowa t sam
pytk uniwersaln, ktrej uywalimy podczas testw szkicu systemu auto-
matycznej zasony. Do umieszczenia tej pytki w wybranym miejscu uyem
188  8.7. Instalacja sprztu

dwustronnej pianki. Pytka z czujnikami skierowanymi w stron okna wygl-


da troch jak supernowoczesna doniczka z kwiatami. Warto te pamita
o problemie nagrzewania si dziaajcego silnika krokowego dla bezpie-
czestwa silnik naley zamontowa w odpowiedniej odlegoci od atwo-
palnych materiaw. Silnik krokowy nie powinien si znajdowa zwaszcza
w bezporednim ssiedztwie podnoszonej i opuszczanej zasony!
Naley zmierzy odlego dzielc planowane miejsce instalacji pytki z czuj-
nikami na parapecie od miejsca instalacji pytki Arduino z moduem silnika.
Pytk Arduino mona zamontowa na stole, w obudowie lub nawet bez-
porednio na cianie. Polecam przycicie przewodw w taki sposb, aby mie
pewien zapas w razie koniecznoci przeniesienia pytki Arduino w inne miej-
sce. Musimy te mie na uwadze miejsce instalacji zasilacza 12-woltowego
i moliwo doprowadzenia przewodu elektrycznego zasilajcego pytk
Arduino, modu silnika oraz sam silnik krokowy.
Rowkowe koo pasowe naley zainstalowa na wale silnika krokowego. Na to
koo naley nastpnie nawin link sterujc zason. Silnik krokowy
naley umieci na tyle nisko, aby linka bya odpowiednio nacignita na
kole pasowym. Przed trwaym zamontowaniem silnika krokowego naley
przytwierdzi ten silnik do czterech ktownikw (za pomoc dwustronnej
tamy piankowej). Tama pozwoli te czasowo przymocowa silnik do
ciany przed ostatecznym przykrceniem ktownikw. Tama piankowa ma
te za zadanie wytumi wibracje przenoszone na cian i wyciszy silnik
krokowy w czasie obracania waem. Warto wykorzysta moliwo tymczaso-
wego przymocowania silnika krokowego do ciany, aby sprawdzi, czy wy-
brane miejsce nie spowoduje zbyt duego lub zbyt maego naprenia linki
nacignitej na koo pasowe. Linka nie moe by zbyt napita w zu-
penoci wystarczy naprenie zapobiegajce swobodnemu lizganiu si tej
linki na kole pasowym.
Przed ostatecznym przykrceniem ktownikw do ciany warto dla pew-
noci wykona jeszcze kilka testw. Naley przede wszystkim sprawdzi,
czy linka nacignita na koo pasowe jest odpowiednio nacignita i czy tarcie
podczas pracy silnika krokowego wystarczy do podnoszenia i opuszczania
zasony. Po wybraniu najlepszego miejsca montau silnika krokowego
naley przykrci ktowniki do ciany.
Musimy jeszcze skalibrowa szybko dziaania silnika krokowego i liczb
obrotw, ktre ten silnik musi wykona, aby w peni podnie lub opuci
zason. Warto na pocztku wprowadza drobne poprawki (naley przy
tym pamita, aby stosowa t sam liczb obrotw zarwno dla ruchu
Rozdzia 8. Automatyzacja dziaania zasony  189

w kierunku zgodnym z ruchem wskazwek zegara, jak i dla ruchu w prze-


ciwnym kierunku). Liczb obrotw potrzebnych do podniesienia i opusz-
czenia zasony mona oszacowa, mierzc odlego pokonywan przez
link sterujc podczas kadego obrotu koa pasowego. Uzyskan warto
naley podzieli przez czn odlego pokonywan przez zason podczas
penej operacji podnoszenia lub opuszczania. W ten sposb otrzymamy
czn liczb obrotw wau silnika krokowego, ktre naley zapisa w pro-
gramie, aby w peni podnie lub opuci zason.
Podczas jednego obrotu wau silnika krokowego zasona pokonuje odlego
5 centymetrw.
czna odlego, jak zasona musi pokona podczas penego podniesienia
lub opuszczenia, wynosi 90 centymetrw.
90 cm / 5 cm = 18 obrotw

Po skalibrowaniu systemu warto oznaczy link sterujc zason w miejscach,


w ktrych ta linka dotyka koa pasowego po cakowitym podniesieniu i opusz-
czeniu zasony. Takie oznaczenie powinno bardzo uatwi ponown kali-
bracj linki w razie jej przesunicia si po pewnym czasie funkcjonowania
systemu. Tak skonfigurowany system moe wyglda podobnie do rozwiza-
nia pokazanego na rysunku 8.7 zatytuowanym Zainstalowany i skali-
browany system automatycznej zasony.

Rysunek 8.7. Zainstalowany i skalibrowany system automatycznej zasony

System naley kilkakrotnie przetestowa, zakrywajc fotokomrk i sztucznie


ocieplajc powietrze wok czujnika temperatury (chuchajc na ten czujnik
lub kierujc strumie powietrza z suszarki do wosw). Warto zwrci
uwag na moment uruchomienia procedury podnoszenia lub opuszczania
190  8.8. Nastpne kroki

zasony. Jeli system jest zbyt czuy i na przykad podnosi zason w reakcji na
wewntrzne wiato odbijane od szyby, by moe trzeba bdzie umieci
fotokomrk w innym miejscu. Sam zamontowaem ten czujnik w rogu okna
za pomoc czarnej tamy izolacyjnej. W ten sposb ograniczyem ryzyko
interpretowania wiata zapalanego wewntrz pomieszczenia jako coraz
janiej wieccego soca.
Warto pozwoli temu systemowi swobodnie dziaa przez kilka dni, obser-
wujc reakcje zasony na wiato soneczne i temperatur w pomieszczeniu.
Na tej podstawie bdzie mona dostosowa wartoci progowe czujnikw
temperatury i natenia wiata. Po prawidowym skonfigurowaniu wszystkich
ustawie bdziemy mogli si ograniczy do sprawdzania co kilka tygodni
pooenia linki sterujcej i ewentualnej ponownej kalibracji systemu. Po
pewnym czasie automatyczne zasony nie bd ju wymagay adnych
interwencji. Kiedy gocie po raz pierwszy zobacz automatycznie podnoszone
i opuszczane zasony, z pewnoci bd pod ogromnym wraeniem.

8.8. Nastpne kroki


Modu silnika moe obsugiwa maksymalnie dwa silniki krokowe jedno-
czenie. Moliwoci tego moduu mog by przydatne w wikszych po-
mieszczeniach z dodatkowymi oknami. Take systemy sterowania zasonami
mona czy, tak aby pojedynczy silnik krokowy mg jednoczenie pod-
nosi i opuszcza wiele zason. Kombinacj silnikw krokowych i moduw
silnikw mona z powodzeniem stosowa w wielu innych projektach au-
tomatyzacji domu.
Koo pasowe silnika krokowego mona poczy z bardziej wyrafino-
wanymi systemami zasaniania okna obejmujcymi zarwno rolety
zamontowane bezporednio przy oknie, jak i zainstalowane nieco dalej
zasony rozsuwane na boki. Szkic tego systemu mona by tak zapro-
jektowa, aby silnik krokowy najpierw podnosi lub opuszcza rolet,
a nastpnie rozsuwa lub zasuwa dekoracyjn zason. W konfiguracji
tego systemu naleaoby uwzgldni temperatur i wiato (na przy-
kad w ciepy, soneczny dzie naleaoby rozsun zason, ale po-
zostawi opuszczon rolet).
System mona by take rozbudowa o czujnik ruchu PIR pod-
czony do pytki Arduino z moduem silnika, tak aby zasony byy
podnoszone i opuszczane po wykryciu ruchu w pomieszczeniu.
Rozdzia 8. Automatyzacja dziaania zasony  191

System automatycznego sterowania zasonami mona wzbogaci o ob-


sug sieci zastosowanie moduu sieciowego Arduino pozwoli pod-
nosi i opuszcza zasony za pomoc smartfonu. Warto te rozway
napisanie skryptu, ktry bdzie podnosi i opuszcza zasony w wy-
znaczonych godzinach.
Jeli nie odczymy pytki Arduino z moduem silnika od komputera
(na czas konfiguracji oba urzdzenia byy poczone przewodem USB),
bdziemy mogli zdalnie sterowa zasonami dziki komunikacji USB
port szeregowy. Oznacza to, e moemy opracowa aplikacj serwera
udostpniajc metody podnoszenia i opuszczania zasony w formie
usug sieciowych, ktre bd wywoywane z poziomu aplikacji klienc-
kiej uruchamianej na smartfonie. Rozszerzenie tego rozwizania o skrypt
dziaajcy na serwerze, ktry bdzie podnosi i opuszcza zason
w okrelonych dniach i o okrelonych godzinach nie bdzie stanowio
adnego problemu.
System mona do atwo przebudowa z myl o Halloween wy-
starczy zastpi fotokomrk i czujnik temperatury czujnikiem ruchu.
Do linki sterujcej mona przyczepi wielkie papierowe pajki, ktre
bd si poruszay w gr i w d w momencie wykrycia ruchu.
Silnik krokowy mona wykorzysta do skonstruowania systemu wieszania
i przechowywania ubra w garderobie z unikatowym znacznikiem RFID
przypisanym do kadego wieszaka. Ubrania mona zawiesi albo w przy-
padkowy sposb, albo uporzdkowa wedug pory dnia, miesica lub pory
roku oraz biecej temperatury na zewntrz. Po zbudowaniu fizycznego
systemu warto opracowa aplikacj dla smartfonu lub tabletu, ktra umoliwi
uytkownikowi wybr waciwego ubrania (na przykad w formie przewija-
nych zdj), tak aby po otwarciu szafy odpowiedni element garderoby wisia
w rodku i na pierwszym planie.
192  8.8. Nastpne kroki
Rozdzia 9.
Zamek do drzwi
sterowany
przez Androida

M
asz dosy noszenia przy sobie tradycyjnych metalowych kluczy
do swojego domu? Zapewne nie rozstajesz si ze swoim smartfo-
nem. Czy nie byoby wygodniej, gdyby drzwi wejciowe do domu
mona byo otwiera za porednictwem aplikacji dziaajcej na tym smartfo-
nie? Czy nie warto pomyle o dodatkowym zabezpieczeniu polegajcym
na fotografowaniu (za pomoc tej samej aplikacji) osb otwierajcych drzwi
i wysyaniu tych zdj do waciciela domu w formie zacznikw poczty
elektronicznej? (Patrz rysunek 9.1 zatytuowany Bezprzewodowe otwie-
ranie drzwi wejciowych za pomoc smartfonu).
W tym projekcie uyjemy niedrogiego telefonu z systemem Android pierwszej
generacji. Smartfon zostanie poczony z pytk IOIO (czyt. jo-jo) firmy
Sparkfun i przecznikiem przekanikowym sterujcym ryglem elektrycznym.
Telefon z systemem Android pierwszej generacji bdzie peni funkcj
serwera reagujcego na dania odblokowania drzwi wysyane za porednic-
twem drugiego telefonu z systemem Android, na ktrym bdzie dziaaa od-
powiednia aplikacja kliencka. Po otrzymaniu dania odblokowania zam-
ka telefon wystpujcy w roli serwera robi zdjcie za pomoc wbudowanego
aparatu i wysya fotografi jako zacznik wiadomoci poczty elektronicznej.
Do dziea!
194  9.1. Czego potrzebujemy

Rysunek 9.1. Bezprzewodowe otwieranie drzwi wejciowych


za pomoc smartfonu

9.1. Czego potrzebujemy


Pocztkowo planowaem wykorzysta w tym projekcie wasnorcznie skon-
struowany przecznik przekanikowy (przy uyciu popularnych czci). Tak
zbudowany przecznik mia suy do wczania i wyczania zasilania elek-
trycznego rygla drzwi wejciowych. Po przeanalizowaniu potencjalnych za-
groe zwizanych z niewaciwym podczeniem przewodw i zym za-
bezpieczeniem caego obwodu zdecydowaem jednak o wyborze bezpiecz-
niejszego, nieco mniej ambitnego rozwizania.
Zamiast ryzykowa poraenie prdem elektrycznym, uyjemy gotowego pro-
duktu, ktry zaprojektowano specjalnie z myl o tego rodzaju zastosowaniach.
Urzdzenie nazwane PowerSwitch Tail II to prosty przecznik zawierajcy
przekanik umoliwiajcy sterowanie standardowymi urzdzeniami elektrycz-
nymi. Przekanik moe by sterowany sygnaami 5 V generowanymi przez
wtyk cyfrowy dostpny na pytce mikrokontrolera (na przykad Arduino) lub
jak w tym przypadku przez pytk IOIO na bazie mikrokontrolera
PIC. Wykorzystanie obwodu przekanika w ramach przecznika Power-
Rozdzia 9. Zamek do drzwi sterowany przez Androida  195

Switch Tail jest nieporwnanie prostsze i bezpieczniejsze od budowy wasne-


go ukadu tego typu, a koszty gotowego produktu s porwnywalne z kosz-
tami czci potrzebnych do samodzielnego skonstruowania przecznika
przekanikowego.
Zamiast korzysta z pytki Arduino podczonej do komputera, do prze-
twarzania danych uyjemy telefonu z systemem Android poczonego z pyt-
k IOIO firmy Sparkfun. Opisane urzdzenia bd realizoway te same
zadania co pytka Arduino poczona z komputerem PC, jednak bd
zajmoway zdecydowanie mniej miejsca, bd lejsze i nie bd potrzeboway
tyle energii elektrycznej co stale wczone komputer i platforma Arduino.
Czym waciwie jest pytka IOIO? Jest to most sprztowy umoliwiajcy ko-
munikacj telefonw z systemem Android z dowolnymi czujnikami i silnikami
podczonymi do tej pytki. Pytka IOIO czy si z telefonem, korzystajc
z mechanizmw diagnostycznych systemu Android dostpnych za pored-
nictwem portu USB. W ten sposb mona wysya i otrzymywa sygnay
do i z procesora PIC zamontowanego na pytce IOIO.
Ytai Ben-Tsvi (inynier oprogramowania z firmy Google) zaprojektowa co
prawda pytk IOIO jeszcze przed wydaniem przez Google oficjalnej spe-
cyfikacji Open Accessory Protocol (ADK)1, jednak pracuje nad jej dostoso-
waniem do specyfikacji ADK. Specyfikacja ADK jest czci szerszego
projektu Android@Home firmy Google. Inwestycja w zakup tej pytki nie
tylko uatwi realizacj projektu prezentowanego w tym rozdziale, ale te
przyda si w przyszoci, podczas budowy rozwiza na bazie interfejsw
API projektu Android@Home. Co jeszcze waniejsze, pytka IOIO do-
skonale sprawdza si w przypadku niestandardowych projektw (w tym
projektu, ktry zbudujemy w tym rozdziale).
Ponisza lista zawiera wszystkie czci potrzebne do skonstruowania zamka
do drzwi sterowanego przez Androida (patrz rysunek 9.2 zatytuowany
Czci potrzebne do budowy zamka sterowanego przez Androida (w tym
gotowe produkty)):
1. Przecznik PowerSwitch Tail II (PN 80135)2.
2. Przewd z esk kocwk barrel jack 2,1 mm potrzebny do bez-
piecznego podczenia 12-woltowego zasilacza do elektrycznego rygla3.

1
http://accessories.android.com
2
http://www.sparkfun.com/products/10747
3
http://www.adafruit.com/products/327
196  9.1. Czego potrzebujemy

Rysunek 9.2. Czci potrzebne do budowy zamka sterowanego


przez Androida (w tym gotowe produkty)

3. Zasilacz DC 5 V, 1 A4.
4. Zasilacz impulsowy 12 V, 5 A do zasilania elektrycznego rygla5.
5. Trzy przewody.
6. Smartfon z systemem operacyjnym Android i wbudowanym apa-
ratem fotograficznym (najlepiej oryginalny telefon Android G1).
Odpowiednie urzdzenie mona bez trudu znale na aukcjach
internetowych w cenie poniej 300 z. Warto przy tym pamita, e
nie wszystkie telefony z systemem Android s zgodne z pytk IOIO.
Szczegowe informacje mona znale na grupach dyskusyjnych
powiconych pytce IOIO6.
7. Przewd barrel jack-JST (2-pin), ktry zostanie podczony do zcza
ktowego JST na pytce IOIO7.

4
http://www.sparkfun.com/products/8269
5
http://www.adafruit.com/products/352
6
https://groups.google.com/group/ioio-users?pli=1
7
http://www.sparkfun.com/products/8734
Rozdzia 9. Zamek do drzwi sterowany przez Androida  197

8. Pyta Sparkfun IOIO Board i zcze ktowe JST8.


9. Rygiel elektryczny firmy Smarthome zasilany prdem staym 12 V9.
10. Standardowy przewd USB A-Mini B potrzebny do poczenia
telefonu G1 Android z portem USB na pytce IOIO.
Bdziemy potrzebowali take drugiego urzdzenia z systemem Android
(telefonu, tabletu itp.), na ktrym bdzie dziaaa aplikacja kliencka Door
Lock. Do opracowania niezbdnego oprogramowania wykorzystamy rodo-
wisko programowania Eclipse IDE, pakiet Android SDK 1.5 lub nowszy
oraz wtyczk Android Development Tools (ADK) dla rodowiska Eclipse.
Wicej informacji na temat elementw potrzebnych do wytwarzania opro-
gramowania dla systemu Android mona znale w rozdziale 7. zatytuo-
wanym Internetowy wcznik wiata.
Ten projekt naley co prawda do najbardziej kosztownych przedsiwzi
opisanych w tej ksice, ale jest take jednym z najbardziej elastycznych
rozwiza (szczeglnie w kontekcie moliwoci ponownego wykorzysta-
nia i rozbudowy zakupionych elementw). Dopiero po opanowaniu sztuki
sterowania pytk IOIO z poziomu telefonu z systemem Android zrozu-
miemy entuzjazm towarzyszcy pracownikom firmy Google opisujcym
potencja projektu Android@Home. W tym rozdziale dowiemy si take,
jak atwo budowa nowe kategorie aplikacji automatyzacji domu potrzebne do
implementowania wasnych niepowtarzalnych pomysw. Zanim jednak b-
dziemy mogli przystpi do realizacji tych ambitnych projektw, musimy
dobrze zrozumie podstawy. Wanie wprowadzeniu podstaw zostanie
powicony nastpny podrozdzia.

9.2. Budowa rozwizania


Ten projekt jest do skomplikowany jego realizacja z pewnoci bdzie
najwikszym wyzwaniem w tej ksice. Zdecydowan wikszo czasu
powicimy na czenie i testowanie elementw sprztowych skadajcych
si na ten projekt. Po przetestowaniu sprztu przystpimy do programowania
telefonu z systemem Android, tak aby komunikowa si z pytk IOIO,

8
Patrz odpowiednio http://www.sparkfun.com/products/10748 i http://www.
sparkfun.com/products/8612.
9
http://www.smarthome.com/5192/Electric-Door-Strike-Mortise-Type/p.aspx
198  9.2. Budowa rozwizania

wbudowanym aparatem fotograficznym oraz moduem sieci bezprzewo-


dowej. W nastpnym kroku napiszemy prost aplikacj klienck dla urz-
dze z systemem Android, ktra bdzie uruchamiana na innym telefonie
lub tablecie w celu wysania do pytki IOIO sygnau o koniecznoci w-
czenia przecznika PowerSwitch Tail (ktry z kolei uruchomi elektryczny
rygiel, aby odblokowa drzwi). Poniej opisano kroki skadajce si na
proces czenia elementw, programowania i wdraania zamka do drzwi
sterowanego przez Androida:
1. Naley podczy zcze JST do pytki Sparkfun IOIO w taki spo-
sb, aby byo moliwe zasilanie tej pytki za pomoc 5-woltowego
zasilacza.
2. Naley podczy do pytki IOIO telefon Android G1 za pomoc
przewodu USB.
3. Elektryczny rygiel firmy Smarthome (zasilany prdem staym 12 V)
naley podczy do 12-woltowego zasilacza za pomoc przewodu
z esk kocwk barrel jack 2,1 mm.
4. Przecznik PowerSwitch Tail naley podczy do pytki IOIO
za pomoc trzech przewodw poczonych ze zczami zasilania,
sterowania i uziemienia.
5. Musimy zaprogramowa telefon z systemem Android, aby wysya
sygna do przecznika PowerSwitch Tail za porednictwem pytki
IOIO.
6. W momencie wysyania sygnau do przecznika PowerSwitch Tail
aplikacja musi dodatkowo zrobi zdjcie za pomoc wbudowanego
aparatu fotograficznego.
7. Uzyskany w ten sposb obraz naley przesa na wskazany adres
poczty elektronicznej (w formie zacznika do wiadomoci).
8. Musimy napisa aplikacj klienck dla drugiego urzdzenia z sys-
temem Android, ktra bdzie suya do odblokowywania elektrycz-
nego rygla.
9. Naley zainstalowa elektryczny rygiel do drzwi w ocienicy i po-
prowadzi przewd zasilajcy do najbliszego gniazdka.
10. Elementy sterujce (przecznik PowerSwitch Tail i pytk IOIO)
naley umieci w atwo dostpnej, montowanej na cianie skrzynce,
ktr bdzie mona otworzy na wypadek koniecznoci wymiany
jakiego komponentu.
Rozdzia 9. Zamek do drzwi sterowany przez Androida  199

11. Musimy zamontowa telefon z systemem Android, ktry bdzie


peni funkcj serwera tego systemu, blisko wejcia i skierowa obiek-
tyw wbudowanego aparatu na drzwi, aby fotografowa wchodzce
osoby.

Nastpca pytki IOIO?


Firma Sparkfun zapowiedziaa now pytk, ktra bdzie zgodna ze
specyfikacj ADK i ktra zostanie zbudowana na bazie pakietu Ar-
duino Mega ADK korzystajcego z protokou Open Accessory firmy
Google. Nowa pytka, nazwana Electric Sheep10, oferuje dodatkowo
wbudowane zcze FTDI i gniazdo zasilania DC, co wyklucza koniecz-
no stosowania dodatkowych elementw (jak w przypadku trady-
cyjnej pytki IOIO). Warto jednak podkreli, e nowa pytka jest
dwukrotnie drosza od pytki IOIO i zuywa wicej energii. Zalet
pytki Electric Sheep jest dua liczba analogowych i cyfrowych wtykw
oraz moliwo programowania przy uyciu zestawu narzdzi ADK
firmy Google i oprogramowania Arduino Android Handbag11. Naley
oczekiwa, e wikszy potencja i lepsze przystosowanie do projektu
Android@Home z czasem doprowadzi do zastpienia pytki IOIO.

Najbardziej czasochonnym zadaniem bdzie przylutowanie zcza ktowego


JST do pytki IOIO i podczenie wszystkich przewodw czcych pytk
IOIO z przecznikiem PowerSwitch Tail. Wszystkie pozostae zadania
sprowadzaj si do umieszczania kocwek przewodw w odpowiednich
gniazdach. W szczeglnoci naley podczy wtyki zasilania 5 V do pytki
IOIO; wtyki telefonu z systemem Android do pytki IOIO za porednictwem
przewodu USB; przecznik PowerSwitch Tail (sterowany przez pytk
IOIO) do gniazdka ciennego z jednej strony i 12-woltowego zasilacza
z drugiej strony oraz elektryczny rygiel do 12-woltowego zasilacza.
Musimy najpierw przylutowa zcze ktowe JST do pytki IOIO. Z per-
spektywy klientw korzystajcych z urzdze firmy Sparkfun byoby oczy-
wicie duo prociej, gdyby to zcze znajdowao si ju na pytce. Moe-
my jednak potraktowa to zadanie jako jeden z odprajcych aspektw
tego projektu (o ile nie popenimy jakiego fatalnego bdu i przypadkowo
nie spalimy elektroniki na pytce). Lutowanie tego zcza na szczcie nie

10
http://www.sparkfun.com/products/10745
11
http://handbagdevices.com/
200  9.2. Budowa rozwizania

jest zbyt trudne, a po zakoczeniu tego zadania zasilanie pytki i telefonu


z systemem Android bdzie nieporwnanie prostsze.
Po przylutowaniu zcza JST do pytki IOIO naley podczy do tej
pytki przewd barrel jack-JST (2-pin) oraz 5-woltowy zasilacz. Musimy
nastpnie poczy pytk IOIO z telefonem Android G1 za pomoc prze-
wodu USB. Poowa pracy za nami!
Naley teraz poczy przewd dodatni i przewd ujemny elektrycznego
rygla odpowiednio do dodatniej i ujemnej kocwki przewodu z wtykiem
eskim barrel jack 2,1 mm. Przewody dodatnie s oznaczone biaym
paskiem wzdu izolacji. Odsonite czci tych przewodw naley zabezpie-
czy za pomoc tamy izolacyjnej lub (to rozwizanie bdzie lepsze) wem
termokurczliwym. Przewd z kocwk barrel jack musimy jeszcze podczy
do 12-woltowego zasilacza.
Rygiel mona przetestowa, podczajc 12-woltowy zasilacz do standardo-
wego gniazdka elektrycznego. Zaraz po wczeniu zasilania powinna si
zapali dioda na zasilaczu, a sam rygiel powinien wydawa charakterystyczne
dwiki. atwo zauway, e w tym czasie zapadka sprynowa zamka nie
jest blokowana przez rygiel (drzwi mona otwiera i zamyka bez wiksze-
go oporu). Po wycigniciu 12-woltowego zasilacza z gniazdka rygiel powi-
nien wrci do pierwotnego stanu, w ktrym jest nieruchomy. Po unieru-
chomieniu rygla zapadka zamka jest skutecznie blokowana.
Moemy teraz poczy przecznik PowerSwitch Tail z pytk IOIO. Nale-
y podczy przewody zgodnie ze schematem pokazanym na rysunku 9.3
zatytuowanym Schemat pocze systemu zamka otwieranego przez An-
droida. Przewd poczony z wtykiem uziemienia na pytce IOIO naley
poczy z ujemn kocwk przecznika PowerSwitch Tail.
rodkow kocwk (sterowania) przecznika PowerSwitch Tail naley
poczy z wtykiem cyfrowym nr 3 na pytce IOIO. Dlaczego nie z wty-
kiem nr 0, 1 lub 2? Poniewa nie wszystkie pytki IOIO mog obsugiwa
sygnay 5 V potrzebne do zasilania przekanika w ramach przecznika
PowerSwitch Tail. Pobieranie takiego prdu z wtyku, ktry nie jest przy-
stosowany do napicia 5 V, moe spowodowa uszkodzenie pytki IOIO.
Warto poszuka niezbdnych informacji w serwisie wiki pytki IOIO lub
po prostu obrci pytk i znale odpowiednio oznaczone wtyki12. Biae
kko wok wtyku oznacza, e dany wtyk moe obsugiwa sygnay 5 V.

12
https://github.com/ytai/ioio/wiki
Rozdzia 9. Zamek do drzwi sterowany przez Androida  201

Rysunek 9.3. Schemat pocze systemu zamka otwieranego przez Androida

Po poczeniu wszystkich przewodw pytka IOIO powinna wyglda tak jak


na rysunku 9.4 zatytuowanym Schemat poczenia pytki IOIO z prze-
cznikiem przekanikowym.

Rysunek 9.4. Schemat poczenia pytki IOIO z przecznikiem


przekanikowym

I wreszcie naley poczy przewodem dodatni kocwk przecznika


PowerSwitch Tail z dowolnym spord trzech pinw 5 V w lewym dolnym
naroniku pytki IOIO. Obwd jest teraz kompletny.
Na tym etapie nic si nie wydarzy do momentu zaprogramowania niezbd-
nych rozkazw wczajcych i wyczajcych wtyk nr 3 (i wysyajcych odpo-
wiednie sygnay do przecznika PowerSwitch Tail). Warto wic przystpi
202  9.3. Sterowanie zamkiem z poziomu Androida

do napisania prostego programu dla systemu Android program bdzie


wywietla na ekranie przecznik, ktrego nacinicie spowoduje odpo-
wiedni zmian stanu wtyku nr 3.

9.3. Sterowanie zamkiem


z poziomu Androida
Zanim przystpimy do pisania rozbudowanej aplikacji serwera dla telefo-
nu z systemem Android, musimy napisa program testowy, ktry sprawdzi
obwd skonstruowany w poprzednim podrozdziale.
Musimy najpierw upewni si, e na komputerze zainstalowane s rodo-
wisko programowania Eclipse z wtyczk dla zestawu narzdzi Android
SDK oraz narzdzia Android Development Tools. Szczegowy opis
procedury konfiguracji tego zestawu SDK i rodowiska IDE mona zna-
le w rozdziale 7. zatytuowanym Internetowy wcznik wiata. Mo-
emy nastpnie pobra projekt demonstracyjny o nazwie HelloIOIO (projekt
jest dostpny na stronie internetowej z materiaami pomocniczymi dla pytki
IOIO)13. Projekt HelloIOIO jest prost aplikacj wczajc i wyczajc
diod LED na pytce IOIO. Na potrzeby tego projektu zmodyfikujemy t
prost aplikacj poprzez zadeklarowanie dodatkowego obiektu ToggleButton
w pliku ukadu main.xml. Musimy te doda do pliku MainActivity.java
cztery wiersze kodu opisujce now akcj (nazwan ToggleButton) skojarzon
z wtykiem cyfrowym nr 3 na pytce IOIO.
Aby zaimportowa projekt HelloIOIO firmy Sparkfun do rodowiska Eclipse,
naley wybra opcj File/Import/Existing Projects. Alternatywnym rozwi-
zaniem jest zaadowanie ju zmodyfikowanego projektu HelloIOIO-PTS
(dostpnego wraz z kodem rdowym dla tej ksiki), ktry zawiera ju
wszystkie modyfikacje opisane w tym podrozdziale.
Wszystkie projekty dla pytki IOIO s tworzone na bazie biblioteki niestan-
dardowej IOIOLib. Oznacza to, e wspomnian bibliotek naley doda
do kadego projektu dla pytki IOIO. W tym celu naley wykona nast-
pujce kroki:
1. Naley zaimportowa pakiet IOIOLib do rodowiska Eclipse, wy-
bierajc opcj File/Import/Existing Projects into Workspace.

13
http://www.sparkfun.com/tutorials/280
Rozdzia 9. Zamek do drzwi sterowany przez Androida  203

2. W panelu Eclipse Package Explorer naley zaznaczy projekt Hello-


IOIO.
3. Naley teraz wybra opcj Properties z menu Project rodowiska
Eclipse.
4. W lewej kolumnie wywietlonego okna dialogowego Properties
naley wybra pozycj Android.
5. Naley teraz klikn przycisk Add. Na ekranie powinno zosta wy-
wietlone okno dialogowe Project Selection z list obejmujc projekt
IOIOLib. Naley zaznaczy pozycj IOIOLib i klikn przycisk OK.
Jeli biblioteka IOIOLib zostaa prawidowo zaimportowana, w sekcji Library
okna dialogowego Properties powinien pojawi si zielony znak akceptacji
(patrz rysunek 9.5 zatytuowany Prawidowo zaimportowana i wskazywana
biblioteka IOIOLib).

Rysunek 9.5. Prawidowo zaimportowana i wskazywana biblioteka IOIOLib

Po ustawieniu prawidowej referencji do biblioteki IOIOLib moemy przy-


stpi do edycji pliku /res/layout/main.xml nalecego do projektu HelloIOIO.
Do ju istniejcego ukadu naley doda obiekt ToggleButton, kopiujc
gotowy opis elementu TextView, ktry obejmuje opis kontrolki przecznika
204  9.3. Sterowanie zamkiem z poziomu Androida

ToggleButtonpotrzebnej do wczania i wyczania diody LED na pytce


IOIO. Dodatkowy element naley wklei za oryginaln sekcj TextView.
Warto identyfikatora skopiowanego przycisku przecznika naley zmie-
ni na android:id="@+id/powertailbutton". Identyfikator bdzie nam po-
trzebny w odwoaniach w kodzie zmodyfikowanej klasy MainActivity.
Zmieniony plik main.xml powinien teraz mie nastpujc posta:
Plik AndroidDoorLock/HelloIOIO-PTS/res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/txtLED"
android:id="@+id/title"/>
<ToggleButton android:text="ToggleButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button">
</ToggleButton>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/txtPowerTail"
android:id="@+id/title"/>
<ToggleButton android:text="ToggleButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/powertailbutton">
</ToggleButton>
</LinearLayout>

Musimy jeszcze doda do klasy MainActivity kod drugiego przycisku, kt-


ry bdzie wcza i wycza sygna adresowany do przecznika Power-
Switch Tail. Pierwszym dodatkowym elementem jest wiersz powertailbutton_
= (ToggleButton) findViewById(R.id.powertailbutton);, ktry kojarzy obiekt
powertailbutton_ z przyciskiem przecznika powertailbutton zdefiniowanym
w pliku main.xml.
Moemy teraz doda referencj do obiektu nowego przycisku sterujcego
przecznikiem PowerSwitch Tail (i dodanego do interfejsu uytkownika
aplikacji) odpowiedni zapis naley umieci w kodzie klasy MainActivity
w pliku /src/ioio/examples/hello/pts/MainActivity.java:
Rozdzia 9. Zamek do drzwi sterowany przez Androida  205

Plik AndroidDoorLock/HelloIOIO-PTS/src/ioio/examples/hello/pts/MainActivity.java

private ToggleButton button_;


private ToggleButton powertailbutton_;

Obiekt powertailbutton_ naley skonstruowa w metodzie OnCreate klasy


MainActivity:
Plik AndroidDoorLock/HelloIOIO-PTS/src/ioio/examples/hello/pts/MainActivity.java

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button_ = (ToggleButton) findViewById(R.id.button);
powertailbutton_ = (ToggleButton) findViewById(R.id.powertailbutton);
}

Oznacza to, e po utworzeniu gwnego okna aplikacji przycisk sterujcy


przecznikiem PowerSwitch Tail bdzie dostpny za porednictwem klasy
MainActivity. Pozostaje nam ju tylko napisanie kodu nasuchujcego akcji
zwizanych z przyciskiem powertailbutton_ (czyli zdarze wczania i wy-
czania tego przycisku):
Plik AndroidDoorLock/HelloIOIO-PTS/src/ioio/examples/hello/pts/MainActivity.java

class IOIOThread extends AbstractIOIOActivity.IOIOThread {


/** Wbudowana dioda LED. */
private DigitalOutput led_;
private DigitalOutput powertail_;
/**
* Metoda wywoywana podczas nawizywania kadego poczenia z pytk IOIO.
* Metoda zwykle suy do otwierania wtykw.
*
* @throws ConnectionLostException
* W razie utraty poczenia z pytk IOIO.
* @see ioio.lib.util.AbstractIOIOActivity.IOIOThread#setup()
*/
@Override
protected void setup() throws ConnectionLostException {
led_ = ioio_.openDigitalOutput(0, true);
powertail_ = ioio_.openDigitalOutput(3,true);
}
/**
* Metoda wielokrotnie wywoywana w czasie, gdy poczenie z pytk IOIO
* jest aktywne.
*
* @throws ConnectionLostException
* W razie utraty poczenia z pytk IOIO.
*
* @see ioio.lib.util.AbstractIOIOActivity.IOIOThread#loop()
*/
@Override
protected void loop() throws ConnectionLostException {
led_.write(!button_.isChecked());
206  9.3. Sterowanie zamkiem z poziomu Androida

powertail_.write(!powertailbutton_.isChecked());
try {
sleep(10);
} catch (InterruptedException e) {
}
}
}

Inicjalizacja obiektu powertail_ klasy DigitalOutput.


Przypisuje obiekt powertail_ do wtyku cyfrowego nr 3 na pytce IOIO.
Wcza lub wycza sygna cyfrowy (zmienia stan na wysoki lub niski)
wtyku nr 3 na pytce IOIO w odpowiedzi na wczenie lub wyczenie
widocznego na ekranie telefonu przycisku dla przecznika przekani-
kowego PowerSwitch Tail.
Wczenie przycisku dla przecznika PowerSwitch Tail powoduje, e obiekt
powertailbutton_ wysya sygna 5 V za porednictwem wtyku cyfrowego nr 3.
Wysanie tego sygnau powoduje z kolei wczenie zasilania przecznika
przekanikowego i tym samym zwolnienie elektrycznego rygla zasilanego
12-woltowym zasilaczem.
Naley teraz zapisa zmiany, skompilowa aplikacj systemu Android oraz
zainstalowa zmodyfikowany program HelloIOIO w telefonie. Warto te
jeszcze raz sprawdzi, czy obwd czcy wszystkie urzdzenia z elektrycz-
nym ryglem jest prawidowo zainstalowany i zasilany. Moemy nastpnie
poczy telefon z pytk IOIO za pomoc przewodu USB i uruchomi
zmodyfikowany program HelloIOIO na telefonie z systemem Android.
Jeli nacinicie przycisku niczego nie zmieni, naley sprawdzi, czy w telefo-
nie wczono tryb diagnostyczny (USB Debugging). Warto te sprawdzi, czy
wszystkie przewody s prawidowo podczone. Czytelnicy, ktrzy maj
dostp do multimetru lub oscyloskopu, mog dodatkowo sprawdzi, czy
po wczeniu widocznego na ekranie telefonu przycisku dla przecznika Po-
werSwitch Tail napicie na cyfrowym wtyku nr 3 rzeczywicie wynosi 5 V.
Jeli napicie wyjciowe jest nisze, sygna od pytki IOIO do przecznika
przekanikowego PowerSwitch Tail bdzie zbyt saby, zatem zasilanie
elektrycznego rygla nie zostanie wczone.
Skoro wszystkie elementy sprztowe dziaaj prawidowo, moemy przystpi
do dostosowywania zamka do otwierania za porednictwem internetu (po-
przez danie odpowiedniego adresu URL serwera WWW). Kod serwera
musimy doda do zmodyfikowanego programu HelloIOIO.
Rozdzia 9. Zamek do drzwi sterowany przez Androida  207

9.4. Pisanie kodu serwera


dla systemu Android
Czas przystpi do pisania serwera systemu zamka do drzwi. Zamiast uru-
chamia skrypty jzyka Python (odpowiedzialne za przetwarzanie da
przychodzcych) na komputerze PC, w tym projekcie wykorzystamy moc
obliczeniow samego smartfonu z systemem Android. Nawet starsze telefony
z systemem Android oferuj wiksz moc obliczeniow od tradycyjnych
komputerw z czasw poprzedzajcych wydanie systemu operacyjnego
Android o zaledwie kilka lat.
Zastosowanie telefonu z systemem Android, ktry bdzie peni funkcj
serwera projektu, ma jeszcze kilka innych zalet:
Zuycie energii elektrycznej jest nieporwnanie nisze ni w przypad-
ku komputera stacjonarnego, zatem cay system jest bardziej przyjazny
dla rodowiska.
Telefon dysponuje wbudowanym moduem komunikacji bezprzewo-
dowej Wi-Fi, zatem mona go umieci w dowolnym miejscu w za-
sigu punktu dostpowego.
Telefon dysponuje wbudowanym aparatem fotograficznym, ktry
mona zaprogramowa przy uyciu standardowych wywoa zestawu
SDK, aby robi zdjcia i przetwarza otrzymywane w ten sposb
obrazy.
Telefon dysponuje te innymi mechanizmami, jak modu Bluetooth
czy syntezator mowy, ktre wykorzystamy w projekcie systemu na-
dajcego gos naszemu domowi.
Aplikacja serwera WWW dziaajca na serwerze musi wykonywa nast-
pujce operacje:
1. Musi uruchomi instancj standardowej usugi sieciowej i nasuchi-
wa da przychodzcych na okrelony adres URL.
2. Po otrzymaniu dania wysanego na ten adres URL program przez
pi sekund wysya sygna w celu zasilania wtyku nr 3 na pytce
IOIO. Sygna powinien spowodowa zwolnienie elektrycznego
rygla na czas potrzebny do otwarcia drzwi.
3. Po piciu sekundach program powinien uy aparatu wbudowanego
w urzdzenie serwera do zrobienia zdjcia osoby wchodzcej przez
odblokowane drzwi.
208  9.4. Pisanie kodu serwera dla systemu Android

Ja pyta...
Czym jest intencja systemu Android?
Zgodnie z dokumentacj systemu Android dla programistw intencja
to abstrakcyjny opis operacji do wykonania14. W najwikszym skr-
cie intencje su do wysyania i odbierania komunikatw przekazy-
wanych pomidzy dziaaniami i usugami systemu Android. Inten-
cje umoliwiaj take wysyanie komunikatw do tej samej aplika-
cji, ktra je generuje, jednak zdecydowanie czciej su do wy-
syania komunikatw z jednej aplikacji (na przykad przegldarki
internetowej, ktra pobraa plik audio) do innej aplikacji (na przykad
odtwarzacza muzycznego).
Jeli zarejestrowano wiele aplikacji otrzymujcych okrelone komuni-
katy, na ekranie moe by wywietlane okno dialogowe z prob
o wybr waciwej aplikacji, do ktrej ma by adresowany dany
komunikat. Kady dowiadczony uytkownik urzdzenia z systemem
Android wielokrotnie mia do czynienia ze wspomnianym oknem
dialogowym. System operacyjny Android umoliwia uytkowni-
kom zaznaczenie w tym oknie dialogowym pola wyboru aplikacji
domylnej, tak aby podobne pytania nie byy ponownie wywie-
tlane i nie denerwoway waciciela telefonu.
Konieczno proszenia uytkownika o wskazanie docelowej apli-
kacji powoduje, e w przypadku w peni autonomicznych operacji
(na przykad wysyania wiadomoci poczty elektronicznej) mecha-
nizm intencji jest dalece nieoptymalny. Problem w tym, e aplikacja
wysyajca tego rodzaju komunikaty (w tym przypadku aplikacja
poczty elektronicznej) moe wymaga od uytkownika wykonania
dodatkowych czynnoci (na przykad kliknicia przycisku Wylij w pro-
gramie poczty elektronicznej, aby ostatecznie wysa wiadomo
poczty elektronicznej wygenerowan przez program rdowy).

4. Uzyskany w ten sposb plik graficzny naley wysa w formie zacz-


nika do wiadomoci poczty elektronicznej wysyanego do wskazanego
adresata.

14
http://developer.android.com/reference/android/content/Intent.html
Rozdzia 9. Zamek do drzwi sterowany przez Androida  209

5. Oprogramowanie serwera powinno wrci do stanu bezczynnoci


i czeka na nastpne prawidowo sformatowane danie przychodzce,
aby od nowa rozpocz cay ten cykl.
Aby skonstruowa ten serwer WWW, wykorzystamy fragmenty kodu pro-
jektu open source GNU GPLv3 Android Web Server dostpnego w serwi-
sie Google Code15. Posuymy si take gotowym kodem (dziki uprzejmoci
Jona Simona) do wysyania wiadomoci poczty elektronicznej z zacznikami
z poziomu aplikacji systemu Android bez koniecznoci stosowania intencji16.
Poniewa wikszo intencji wymaga dodatkowych czynnoci uytkownika,
opisany mechanizm nie zda egzaminu w przypadku autonomicznego serwe-
ra WWW. Poczenie tych dwch projektw z kodem obsugujcym pytk
IOIO umoliwi naszemu programowi autonomiczne nasuchiwanie da
odblokowania drzwi i reagowanie na te dania. W tym projekcie wykorzy-
stamy take fragmenty kodu programu Camera Sample napisanego przez
Krishnaraja Varm kod pobiera zdjcie z moduu aparatu i zapisuje je
na karcie SD woonej do urzdzenia z systemem Android17. Wanie ten
plik graficzny wylemy w formie zacznika do wiadomoci poczty elektro-
nicznej. Zanim jednak przystpimy do pracy nad programem dla systemu
Android, ktry poczy te wszystkie elementy, musimy opracowa mecha-
nizm dostpu do adresu IP przypisanego do danego telefonu.

Ustawianie statycznego adresu IP


Konwersja adresu IP wbudowanego moduu Wi-Fi telefonu z dynamicznego
na statyczny znacznie uatwi powtarzalne lokalizowanie telefonu w lokalnej,
domowej sieci bezprzewodowej. Czytelnicy, ktrzy do tej pory nie utwo-
rzyli przedziau statycznych adresw IP w konfiguracji swojego routera,
mog albo zdefiniowa taki przedzia, albo ustawi adres telefonu wikszy
ni 200 (o ile sie domowa nie obejmuje duej liczby urzdze dajcych
adresw IP od serwera DHCP w ramach routera bezprzewodowego).

15
http://code.google.com/p/android-webserver/
16
http://www.jondev.net/articles/Sending_Emails_without_User_Intervention_
%28no_Intents%29_in_Android
17
http://code.google.com/p/krvarma-android-samples/
210  9.4. Pisanie kodu serwera dla systemu Android

Dostp do konfiguracji wikszoci telefonw z systemem Android mona


uzyska, wybierajc ikon Ustawienia i przechodzc do menu Komunikacja.
Naley nastpnie wybra opcj Ustawienia Wi-Fi i nacisn przycisk menu
samego telefonu, aby wywietli menu z opcjami Skanuj i Zaawansowane.
Naley teraz klikn opcj Zaawansowane. Na ekranie zostan wywie-
tlone opcje umoliwiajce modyfikacj wielu ustawie sieciowych, w tym
pole wyboru Uyj statycznego adresu. Naley zaznaczy to pole wyboru,
aby umoliwi ustawienie adresu IP, adresu bramy i maski podsieci (patrz
rysunek 9.6 zatytuowany Konfiguracja urzdzenia z systemem Android
ustawiajca statyczny adres IP). Opcje naley dostosowa do konfiguracji
routera sieci bezprzewodowej. Jeli na przykad router sieci bezprzewodowej
udostpnia przedzia adresw, poczwszy od 192.168.1.2, najprawdopo-
dobniej bdziemy mogli zastosowa nastpujce ustawienia:
adres IP: 192.168.1.230,
brama: 192.168.1.1,
maska sieci: 255.255.255.0.

Rysunek 9.6. Konfiguracja urzdzenia z systemem Android ustawiajca


statyczny adres IP

Naley jeszcze ustawi wartoci opcji DNS1 i DNS2, przypisujc im adresy


wybranych serwerw DNS (w mojej konfiguracji wykorzystaem publiczne
serwery DNS firmy Google), jednak najlepiej uy w tej roli tych samych
serwerw nazw domen, ktre s stosowane przez pozostae urzdzenia
w danej sieci (w ten sposb uatwimy sobie konserwacj sieci lokalnej). Po
wpisaniu wszystkich statycznych adresw naley klikn przycisk Menu
urzdzenia z systemem Android i wybra opcj Zapisz.
Rozdzia 9. Zamek do drzwi sterowany przez Androida  211

Warto jeszcze przetestowa statyczny adres IP telefonu, wysyajc na ten


adres sygna ping za porednictwem innego komputera w tej sieci. Po prawi-
dowym ustawieniu adresu IP polecenie ping powinno potwierdzi po-
prawno konfiguracji. W razie problemw warto raz jeszcze sprawdzi
wszystkie ustawienia i upewni si, e zmiany zostay zapisane. Po potwier-
dzeniu poprawnoci konfiguracji adresu IP moemy przystpi do pisania
i testowania kodu serwera WWW dziaajcego w systemie Android.

Tworzenie serwera WWW dla systemu Android


W systemie Android dziaa zmodyfikowana wersja wirtualnej maszyny Javy
(JVM), zatem mamy do dyspozycji wiele bibliotek standardowych Javy.
Dostp do tych bibliotek jest dla nas o tyle wany, e jedna z nich znacznie
uatwia tworzenie i uruchamianie serwera WWW za pomoc zaledwie kilku
wierszy kodu.
eby nie traci miejsca w tej ksice na prezentacj zawartoci dziesitek
plikw skadajcych si na kompletny kod tego programu, udostpniony zo-
sta do pobrania plik DoorLockServer.zip. Po pobraniu i rozpakowaniu
tego pliku naley zaimportowa odpowiedni projekt do rodowiska Eclipse
ze skonfigurowanym zestawem narzdzi Android SDK (za pomoc opcji
File/Import). Podczas analizy plikw zawartych w tym archiwum atwo za-
uway plik nazwany AndroidDoorLockServerActivity.java. Warto zwrci
uwag na dwa wiersze kodu w ciele metody private void startServer(int
port), w ktrych wykorzystano adres IP, numer portu i domylny mecha-
nizm komunikatw systemu Android do uruchomienia serwera WWW na
telefonie.
server = new Server(ipAddress,port,mHandler);
server.start();

Przytoczone wyraenia importuj referencj do obiektu klasy ServerSocket


i wymuszsaj na systemie Android nasuchiwanie na porcie nr 80 usta-
wionego wczeniej statycznego adresu IP. Zarzdzanie serwerem wymaga
oczywicie wielu dodatkowych operacji, jak uruchamianie i zatrzymywanie
serwera za porednictwem interfejsu uytkownika, przeksztacenie serwera
w usug systemu Android, ktra bdzie dziaaa w tle, unikanie przecho-
dzenia telefonu w tryb upienia, przetwarzanie da przychodzcych czy
obsuga bdw.
Skoro dysponujemy ju podstawowymi wymaganiami dotyczcymi serwera
WWW dziaajcego na urzdzeniu z systemem Android, moemy przystpi
212  9.4. Pisanie kodu serwera dla systemu Android

do czenia istniejcych rozwiza z funkcjami pytki IOIO opracowanymi


w podrozdziale 9.3 zatytuowanym Sterowanie zamkiem z poziomu An-
droida.

Serwer WWW i pytka IOIO


Sytuacja robi si do interesujca. Poczenie aplikacji testowej dla pytki
IOIO, ktr napisalimy w podrozdziale 9.3 zatytuowanym Sterowanie
zamkiem z poziomu Androida, z serwerem WWW opracowanym w po-
przednim punkcie umoliwi wczanie zasilania wtyku nr 3 na pytce IOIO
za porednictwem dania protokou HTTP. W ten sposb nasz system
bdzie sygnalizowa przecznikowi PowerSwitch Tail konieczno w-
czenia zasilania elektrycznego rygla. W najwikszym skrcie przeniesiemy
odpowiedni funkcj obsugujc pytk IOIO do kodu odpowiedzialnego
za obsug da protokou HTTP po stronie serwera WWW. Elek-
tryczny rygiel bdzie zasilany (umoliwiajc otwarcie drzwi) na przykad
poprzez wywoanie adresu URL http://192.168.1.230.
Nie chcemy jednak, by drzwi byy otwarte na stae (taki byby wynik pozosta-
wienia wczonego wtyku nr 3), zatem po pewnym czasie nasz system wyczy
zasilanie. Na potrzeby naszych testw pi sekund powinno w zupenoci
wystarczy. Do wstrzymania wykonywania programu na okrelony czas uy-
jemy funkcji Thread.sleep() systemu Android. Dowiadczeni programici
aplikacji dla systemu Android doskonale wiedz, e ten sposb wstrzymywa-
nia wykonywania programu jest dalece niedoskonay, poniewa uniemo-
liwia waciwe reagowanie interfejsu uytkownika. Poniewa jednak w tym
przypadku urzdzenie z systemem Android bdzie uywany w roli serwera,
nie klienta, nie musimy traci czasu na optymalizacj interfejsu uytkowni-
ka. Ustawiem piciosekundowe opnienie (Thread.sleep(5000)), jednak
rwnie dobrze mona zmieni t warto, aby rygiel by blokowany nieco
szybciej lub pniej (zalenie od przebiegu testw).
Tak jak w poprzednim punkcie warto przeanalizowa kod zawarty w pliku
DoorLockServer.zip. Po otwarciu tego projektu w rodowisku Eclipse warto
zwrci uwag na klas AndroidDoorLockServerActivity. Z naszego punktu
widzenia szczeglnie interesujcy jest blok try aktywujcy zasilanie przecz-
nika PowerSwitch Tail na pi sekund i wywoujcy funkcj camerasurface.
startTakePicture(), ktra robi zdjcie za pomoc wbudowanego aparatu
w urzdzeniu z systemem Android.
Rozdzia 9. Zamek do drzwi sterowany przez Androida  213

Plik AndroidDoorLock/DoorLockServer/src/com/mysampleapp/
androiddoorlockserver/AndroidDoorLockServerActivity.java

@Override
protected void loop() throws ConnectionLostException {

if (mToggleButton.isChecked()) {
if (LockStatus.getInstance().getLockStatus()) {
try {
powertail_.write(false);
// wstrzymuje dziaanie na 5 sekund
// (przez ten czas zamek jest otwarty)
sleep(5000);
powertail_.write(true);
LockStatus.getInstance().setMyVar(false);
// Robi zdjcie i wysya je w formie zacznika
// do wiadomoci e-mail
camerasurface.startTakePicture();
} catch (InterruptedException e) {
}
}else {
try {
sleep(10);
} catch (InterruptedException e) {
}
}
} else {
powertail_.write(true);
}
}

Moemy teraz skompilowa i uruchomi projekt DoorLockServer na


urzdzeniu z systemem Android. Musimy jeszcze uruchomi serwer WWW
na tym urzdzeniu. Warto raz jeszcze sprawdzi, czy urzdzenie jest prawi-
dowo poczone z pytk IOIO i czy ta pytka jest prawidowo podczona
do przecznika PowerSwitch Tail. Moemy teraz wpisa adres IP naszego
serwera WWW w dowolnej przegldarce internetowej z dostpem do sieci
lokalnej. Jeli wszystko poszo zgodnie z planem, elektryczny rygiel powinien
zosta odblokowany na kilka sekund, po czym ponownie zablokowany. Super!
Mamy za sob dwie trzecie zada skadajcych si na ten projekt. Ostatni
komponent tego systemu bdzie odpowiada za robienie zdj implemen-
tacja tego rozwizania jest moliwa, poniewa wikszo urzdze z sys-
temem Android (przynajmniej wikszo telefonw z tym systemem) zawiera
wbudowany aparat. Wykorzystamy dostpne urzdzenia sprztowe do robie-
nia zdjcia osoby wchodzcej do domu kilka sekund po daniu otwarcia
drzwi (i odblokowaniu elektrycznego rygla); zdjcie zostanie nastpnie wy-
sane do waciwego adresata w formie zacznika do wiadomoci poczty
214  9.4. Pisanie kodu serwera dla systemu Android

elektronicznej. Dziki temu bdziemy wiedzie nie tylko, kiedy miao miejsce
danie otwarcia drzwi wejciowych, ale te kto wszed do domu po automa-
tycznym odblokowaniu zamka.

Robienie zdjcia
Na potrzeby tego aspektu projektu naley przeanalizowa zawarto pliku
CameraSurface.java w rozpakowanym katalogu DoorLockServer. Najwa-
niejsze funkcje potrzebne do utworzenia obiektu powierzchni aparatu i uzy-
skania obrazu zostay do dobrze udokumentowane w zestawie narzdzi
Android SDK. Co wicej, w internecie istniej dosownie setki przyka-
dw kodu i poradnikw dotyczcych uzyskiwania plikw graficznych ze
zdjciami w systemie Android18. Mechanizm pobierania obrazw w ramach
aplikacji serwera WWW opracowaem na bazie przykadowego kodu pro-
gramisty aplikacji systemu Android Krishnaraja Varmy.
Konfiguracja aparatu uywanego w kodzie aplikacji systemu Android wymaga
zaimportowania wielu przestrzeni nazw tego systemu. W tym celu musimy
wykona kilka dodatkowych krokw przygotowujcych powierzchni wy-
wietlania. Oto najwaniejsze biblioteki uywane w czci programu od-
powiedzialnej za uzyskanie obrazu (w ramach pliku DoorLockServer.zip):
Plik AndroidDoorLock/DoorLockServer/src/com/mysampleapp/androiddoorlockserver/
CameraSurface.java

import android.content.Context;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.GestureDetector.OnGestureListener;

Oprcz dostpu do urzdzenia aparatu fotograficznego musimy jeszcze


zaimplementowa mechanizm wywietlania podgldu zrobionego zdjcia
na ekranie telefonu. W tym celu musimy najpierw zainicjalizowa zmienne
klatki i powierzchni aparatu:
private FrameLayout cameraholder = null;
private CameraSurface camerasurface = null;

18
http://developer.android.com/reference/android/hardware/Camera.html
Rozdzia 9. Zamek do drzwi sterowany przez Androida  215

Zmienne bd nam potrzebne do prawidowej alokacji obiektw powierzchni


i klatki aparatu:
camerasurface = new CameraSurface(t is);
cameraholder.addView(camerasurface, new
LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));

Krishnaraj uy wywoa zwrotnych, aby wstrzyma wykonywanie pewnych


operacji do czasu zakoczenia przetwarzania. Wspomniany mechanizm
umoliwi na przykad oczekiwanie na ustawienie autofocusu, na zamknicie
migawki oraz na sprawdzenie, czy dane obrazu zostay prawidowo zapi-
sane na karcie SD. Zastosowanie wywoa zwrotnych gwarantuje nam, e
wymienione zdarzenia bd wystpoway jedno po drugim i e adna z tych
operacji nie rozpocznie si przed zakoczeniem poprzedniej.
Plik AndroidDoorLock/DoorLockServer/src/com/mysampleapp/androiddoorlockserver/
CameraSurface.java

public void startTakePicture(){


camera.autoFocus(new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
takePicture();
}
});
}

public void takePicture() {


camera.takePicture(
new ShutterCallback() {
@Override
public void onShutter(){
if(null != callback) callback.onShutter();
}
},
new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera){
if(null != callback) callback.onRawPictureTaken(data, camera);
}
},
new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera){
if(null != callback) callback.onJpegPictureTaken(data, camera);
}
});
}

Dane s zapisywane na karcie SD w ciele metody onJpegPictureTaken.


Poniewa plik graficzny ma by wysany w formie zacznika do wiadomoci
poczty elektronicznej i poniewa kolejne zdjcia nie wymagaj archiwizacji
216  9.4. Pisanie kodu serwera dla systemu Android

na karcie SD, dane s za kadym razem zapisywane w jednym, tak samo


nazwanym pliku.
FileOutputStream outStream = new
FileOutputStream(String.format("/sdcard/capture.jpg"));

outStream.write(data);
outStream.close();

Czytelnicy, ktrzy wol, aby kade kolejne zdjcie byo trwale zapisywane
na karcie SD (zamiast nadpisywa tak samo nazwany plik z poprzednim
zdjciem), mog dopisywa do nazwy pliku graficznego przyrostek znacznika
czasowego oto rozwizanie zastosowane w oryginalnym kodzie Krish-
naraja:
FileOutputStream outStream = ne FileOutputStream(String.format(
"/sdcard/%d.jpg", System.currentTimeMillis()));

Takie rozwizanie nie jest jednak zalecane, jeli na karcie SD nie ma dosta-
tecznie duo przestrzeni i jeli nie planujemy przechowywa tych samych
obrazw w telefonie i w skrzynce odbiorczej poczty elektronicznej. Czytel-
nicy, ktrzy zdecyduj si na stosowanie tego schematu nazewnictwa, mu-
sz pamita o koniecznoci rejestrowania nazw plikw z odpowiednimi
znacznikami czasowymi, aby na tej podstawie wybiera waciwe zaczniki
do wysyanych wiadomoci. Przeanalizujmy teraz sposb doczania obra-
zw do wiadomoci poczty elektronicznej i wysyania tych wiadomoci.

Wysyanie wiadomoci
Skoro ju pobralimy i zapisalimy na karcie SD tymczasowy plik obrazu
ze zdjciem (zrobionym za pomoc wbudowanego aparatu), musimy jesz-
cze uy autonomicznego mechanizmu doczania tego zdjcia do tworzo-
nej wiadomoci (bez koniecznoci angaowania uytkownika). Na szczcie
moemy uy do tego celu kodu JavaMail for Android autorstwa Jona Simo-
na. Projekt obejmuje midzy innymi funkcj wysyania wiadomoci poczty
elektronicznej w systemie Android. W tym celu musimy pobra i doda
do projektu zalenoci (pliki jar) potrzebne do dziaania JavaMail for
Android i kodu Jona obsugujcego wiadomoci poczty elektronicznej19.
Odpowiedni kod moemy zmodyfikowa z myl o wysyaniu zacznikw
z plikami graficznymi. Musimy najpierw zaimportowa wiele bibliotek
Javy uywanych przez klas JavaMail:

19
http://code.google.com/p/javamail-android/
Rozdzia 9. Zamek do drzwi sterowany przez Androida  217

import java.util.Date;
import java.util.Properties;
import javax.activation.CommandMap;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.activation.MailcapCommandMap;
import javax.mail.BodyPart;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

Metody public Mail(String user, String pass) i public void addAttachment


(String filename) throws Exception umoliwiaj nam atwe wysyanie plikw
ze zdjciami do wyznaczonego adresata. Wysyanie wiadomoci poczty
elektronicznej jest bardzo proste wystarczy ustawi w ciele metody onJpeg
PictureTaken() (w pliku AndroidDoorLockServerActivity.java) nazw uyt-
kownika, haso, adres odbiorcy i parametry zacznika:
try
GMailSender mail = new GMailSender("NAZWA_KONTA_GMAIL@gmail.com",
"HASO_DO_KONTA_GMAIL");
mail.addAttachment(Environment.getExternalStorageDirectory() +
"/capture.jpg");
String[] toArr = {"ADRES_ODBIORCY_WIADOMOCI@gmail.com"};
mail.setTo(toArr);
mail.setFrom("NAZWA_KONTA_GMAIL@gmail.com");
mail.setSubject("Nowe zdjcie");
mail.setBody("System zrobi zdjcie - patrz zacznik");
if(mail.send()) {
Toast.makeText(AndroidDoorLockServerActivity.this,
"Wiadomo e-mail zostaa prawidowo wysana.",
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(AndroidDoorLockServerActivity.this,
"Wiadomo e-mail nie zostaa wysana.",
Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Log.e("SendMail", e.getMessage(), e);
}

acuchy NAZWA_KONTA_GMAIL@gmail.com, HASO_DO_KONTA_GMAIL i ADRES_ODBIORCY_


WIADOMOCI@gmail.com naley oczywicie zastpi danymi pasujcymi do
naszego konta Gmail. Warto pamita o moliwoci wysyania wiadomo-
ci do uytkownikw, ktrzy nie posuguj si adresem usugi Gmail rw-
nie dobrze mona powiadamia uytkownikw innych kont pocztowych.
218  9.4. Pisanie kodu serwera dla systemu Android

Na proces wysyania wiadomoci skada si jeszcze kilka innych wyrae


przygotowawczych. Warto dobrze przeanalizowa pobrany kod, aby lepiej
zrozumie wszystkie zalenoci i procesy potrzebne do wysania wiadomo-
ci poczty elektronicznej z urzdzenia z systemem Android bez udziau
uytkownika.

Ustawianie uprawnie dostpu do urzdze


Nasz system jest prawie gotowy. Poczenie czterech odrbnych progra-
mw dla systemu Android w jedn aplikacj umoliwi nasuchiwanie da
przychodzcych protokou HTTP, odblokowywanie elektrycznego rygla
za porednictwem pytki IOIO, robienie zdj za pomoc wbudowanego
aparatu urzdzenia z systemem Android oraz wysyanie tych zdj w formie
zacznikw do wiadomoci poczty elektronicznej.
Dysponujemy ju kodem odpowiedzialnym za robienie zdj i wysyanie ich
za porednictwem wiadomoci poczty elektronicznej, pozostaje nam ju tylko
zaimplementowanie mechanizmw dostpu do aparatu, moduu komunikacji
bezprzewodowej Wi-Fi i obsugi sieci. Oznacza to, e plik AndroidMani-
fest.xml musi zawiera nie tylko uprawnienia dostpu do stosu sieci i ko-
munikacji bezprzewodowej w technologii Wi-Fi, ale take uprawnienia
dostpu do wbudowanego aparatu i karty SD:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mysampleapp.androiddoorlockserver"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="3" />
<uses-permission android:name="android.permission."></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE">
</uses-permission>
<uses-permission android:name="android.permission.INTERNET">
</uses-permission>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application android:icon="@drawable/icon"
android:label="@string/app_name">
<activity android:name=".AndroidDoorLockServerActivity"
android:label="@string/app_name"
android:screenOrientation="landscape">
<intent-filter>
Rozdzia 9. Zamek do drzwi sterowany przez Androida  219

<action android:name="android.intent.action.MAIN" />


<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

Po ustawieniu adresu IP sieci lokalnej oraz nazwy usytkownika, hasa


i docelowego adresu poczty elektronicznej moemy skompilowa, zainsta-
lowa i uruchomi aplikacj serwera systemu zamka sterowanego przez
Androida na smartfonie z tym systemem.

Testowanie serwera
Serwer tego projektu mona przetestowa, uzyskujc dostp do jego adresu
URL z poziomu przegldarki internetowej. Warto sprawdzi, czy elek-
tryczny zamek rzeczywicie zosta otwarty, czy aparat zrobi zdjcie i czy
to zdjcie zostao wysane do wybranego adresata w formie zacznika
wiadomoci poczty elektronicznej. Jeli wszystko dziaa zgodnie z oczekiwa-
niami, moemy sobie pogratulowa dobrze wykonanej pracy. Zwaywszy
na licz zalenoci wystpujcych w tym projekcie, prawidowe poczenie
wszystkich tych elementw ju za pierwszym razem mona potraktowa
jako dobry powd do witowania. Jeli co nie dziaa prawidowo, warto
uwanie przeanalizowa kad funkcj z osobna. Czy serwer WWW od-
powiada na dania? Czy przecznik PowerSwitch Tail wcza zasilanie
elektrycznego rygla? Czy migawka aparatu fotograficznego zamyka si?
Warto pamita, e w zalenoci od szybkoci poczenia sieciowego i mo-
duu komunikacji bezprzewodowej Wi-Fi wbudowanego w telefon z syste-
mem Android wysanie zdjcia za porednictwem poczty elektronicznej
moe zaj nawet minut.
Podczas realizacji tego projektu udao nam si osign cakiem sporo
ju teraz moglibymy uywa systemu zdalnie otwieranego zamka poprzez
wpisywanie odpowiedniego adresu URL w przegldarce internetowej.
Warto jednak powici jeszcze dosownie chwil na opracowanie wasnej
aplikacji klienckiej, ktra bdzie uzyskiwaa dostp do wspomnianego adresu
URL (podobnie jak w przypadku projektu internetowego wcznika wiata).
Dziki temu bdziemy mogli otworzy drzwi za pomoc zaledwie jednego
kliknicia. Docelowo moglibymy zgromadzi wicej funkcji automatyzacji
domu w jednym programie mobilnym, ktry umoliwi dostp do rnych
projektw za porednictwem jednego zbiorczego interfejsu.
220  9.5. Pisanie aplikacji klienckiej dla systemu Android

9.5. Pisanie aplikacji klienckiej


dla systemu Android
Napisanie kodu aplikacji klienckiej dla systemu Android, ktra bdzie wysy-
aa polecenia odblokowania drzwi do programu serwera, nie jest niczym
trudnym. W tym podrozdziale ponownie uyjemy kodu aplikacji klienckiej
systemu Android z projektu internetowego wcznika wiata, aby zapewni
uytkownikowi atwy dostp do funkcji zwalniajcej elektryczny rygiel. Tym
razem uyjemy zwykego przycisku (zamiast przecznika), poniewa za-
implementowalimy ju mechanizm odblokowywania zamka na pi sekund.
Skoro dysponujemy mechanizmem czasowym, stosowanie przecznika nie
jest konieczne. Innym elementem, ktry dodamy do tej aplikacji, jest kod
wczajcy modu sieci bezprzewodowej (o ile nie jest aktywny).
Po uruchomieniu programu sprawdzamy, czy dostp do moduu sieci bez-
przewodowej Wi-Fi jest moliwy. Jeli ten modu jest wyczony, wczamy
go i czekamy, a program kliencki nawie poczenie z sieci. Umoliwiamy
uytkownikowi nacinicie wywietlonego przycisku Otwrz drzwi po
wykryciu nacinicia tego przycisku aplikacja uzyskuje dostp do adresu
URL serwera i zwalnia elektryczny rygiel. W najwikszym uproszczeniu
aplikacja kliencka wykonuje nastpujce kroki:
1. Musimy utworzy w rodowisku Eclipse projekt aplikacji dla sys-
temu Android nazwany DoorLockClient.
2. Naley sprawdzi (w gwnej ciece programu), czy modu ko-
munikacji bezprzewodowej Wi-Fi jest wczony. Jeli modu Wi-
Fi jest wyczony, musimy aktywowa ten modu.
3. Naley doda przycisk do opisu ukadu main.xml i oznaczy nowy
przycisk etykiet Otwrz drzwi.
4. Musimy powiza obiekt przycisku w ramach klasy DoorLock z me-
tod nasuchujc zdarzenia nacinicia tego przycisku. Jeli pro-
gram musi wczy modu Wi-Fi, przycisk Otwrz drzwi powinien
by niedostpny przez kilka sekund ten czas jest potrzebny na
uwierzytelnienie interfejsu Wi-Fi w bezprzewodowym punkcie dost-
powym i uzyskanie adresu IP urzdzenia klienckiego.
5. Naley doda wywoanie dania adresowanego na adres URL
serwera systemu otwierania drzwi (na przykad na adres 192.168.
1.230).
Rozdzia 9. Zamek do drzwi sterowany przez Androida  221

Kwestie bezpieczestwa
Jedn z zalet wasnej, niestandardowej aplikacji klienckiej dla systemu
Android jest moliwo zabezpieczenia (cho trzeba przyzna, e
niezbyt skutecznego) dostpu do zdalnie sterowanego zamka. Po-
niewa adres URL serwera WWW, na ktry wysyamy danie otwarcia
drzwi, nie jest wywietlany na ekranie smartfonu, adres ten pozostanie
ukryty przynajmniej dla uytkownikw, ktrzy nie potrafi odnale
odpowiednich zapisw w kodzie rdowym. Opisane zabezpieczenie
nie gwarantuje jednak skutecznoci, poniewa sam adres URL jest wy-
syany na serwer w formie zwykego tekstu. Jedno z rozszerze tego
projektu, ktre zaproponuj w dalszej czci tego rozdziau (w pod-
rozdziale Nastpne kroki), bdzie dotyczyo wanie dodania lepszych
mechanizmw zabezpiecze. Dodanie hasa lub (co byoby jeszcze
lepsze) jakiego wyszukanego schematu uwierzytelniania wedug
wielu czynnikw znacznie podniosoby warto tego systemu.

Zaczniemy od tej samej procedury, ktr zastosowalimy ju w podroz-


dziale 7.6 zatytuowanym Pisanie kodu klienta dla systemu Android.
Najpierw musimy utworzy w rodowisku Eclipse projekt aplikacji systemu
Android (patrz rysunek 9.7 zatytuowany Konfiguracja nowej aplikacji
klienckiej systemu zamka sterowanego przez Androida).
Moemy teraz doda przycisk o nazwie unlockbutton, przypisa mu etykiet
Otwrz drzwi i tak ustawi jego szeroko, aby wypenia ukad LinearLayout
macierzystego kontenera. Plik main.xml powinien mie nastpujc posta:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<Button android:id="@+id/unlockbutton" android:layout_height="wrap_content"
android:text="Otwrz drzwi" android:layout_width="fill_parent"></Button>
</LinearLayout>

Wprowadzone zmiany naley zapisa. Naley teraz otworzy plik DoorLock-


Client.java i umieci w nim referencje do obiektu unlockbutton klasy Button
i odpowiedniej metody nasuchujcej zdarze. Musimy te doda kod spraw-
dzajcy aktywno moduu Wi-Fi oraz w razie potrzeby aktywujcy
ten modu. Kompletny kod zawarty w pliku DoorLockClient.java pokazano
na poniszym listingu:
222  9.5. Pisanie aplikacji klienckiej dla systemu Android

Rysunek 9.7. Konfiguracja nowej aplikacji klienckiej systemu zamka


sterowanego przez Androida

Plik AndroidDoorLock/DoorLockClient/src/com/mysampleapp/doorlockclient/
DoorLockClient.java

package com.mysampleapp.doorlockclient;

import java.io.InputStream;
import java.net.URL;
import android.net.wifi.WifiManager;
import android.widget.Button;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class DoorLockClient extends Activity {


/** Metoda wywoywana podczas pierwszego tworzenia danej aktywnoci. */
@Override
Rozdzia 9. Zamek do drzwi sterowany przez Androida  223

public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button unlockbutton = (Button) findViewById(R.id.unlockbutton);

findViewById(R.id.unlockbutton).setOnClickListener(mClickListenerUnlockButton);
try {
WifiManager wm =
(WifiManager) getSystemService(WIFI_SERVICE);
if (!wm.isWifiEnabled()) {
unlockbutton.setEnabled(false);
wm.setWifiEnabled(true);
// Czeka 17 sekund na aktywacj moduu Wi-Fi
// i nawizanie poczenia
Thread.sleep(17000);
unlockbutton.setEnabled(true);
}
} catch (Exception e) {
Log.e("LightSwitchClient", "Error: " + e.getMessage(), e);
}
}
View.OnClickListener mClickListenerUnlockButton =
new View.OnClickListener() {
public void onClick(View v) {
try {
final InputStream is =
new URL("http://192.168.1.230:8000").openStream();
}
catch (Exception e) {
}
}
};
}

Importujemy referencje do uniwersalnych bibliotek java.io.InputStream


i java.net.URL oraz do bibliotek stworzonych specjalnie z myl o systemie
Android: android.widget.Button i android.net.wifi.WifiManager.
Dodajemy referencj do obiektu unlockbutton klasy Button, po czym
przypisujemy temu obiektowi metod widoku mClickListenerUnlockButton.
Musimy sprawdzi stan moduu Wi-Fi jeli ten modu jest nieak-
tywny, naley go wczy. Przycisk unlockbutton pozostanie nieaktywny
przez siedemnacie sekund, aby umoliwi inicjalizacj i nawizanie
poczenia przez modu Wi-Fi.
Naley utworzy metod widoku OnClickListener dla przycisku unlock-
button.

W odpowiedzi na kliknicie przycisku unlockbutton aplikacja powinna


wysa danie na adres serwera uruchomionego na drugim urzdzeniu
z systemem Android.
224  9.5. Pisanie aplikacji klienckiej dla systemu Android

Zanim bdziemy mogli przetestowa t aplikacj, musimy zrealizowa


jeszcze jedno zadanie. Cz czytelnikw zapewne pamita sposb ustawiania
w systemie Android uprawnie dostpu do sieci na potrzeby aplikacji klienc-
kiej projektu internetowego wcznika wiata. To samo musimy zrobi na
potrzeby programu klienckiego projektu drzwi otwieranych przez Androida.
Musimy te nada tej aplikacji uprawnienia dostpu do stanu moduu Wi-Fi.
Odpowiednie uprawnienia naley zdefiniowa w pliku AndroidManifest.xml,
ktry po wprowadzeniu niezbdnych zmian powinien mie nastpujc
posta:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mysampleapp.doorlockclient"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

<application android:icon="@drawable/icon" android:label="@string/app_name">


<activity android:name=".DoorLockClient"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

Po zapisaniu projektu moemy przystpi do testw na urzdzeniu z syste-


mem Android. Warto najpierw przetestowa dziaanie programu w sytuacji,
gdy modu Wi-Fi jest wczony. W takim przypadku przycisk powinien by
dostpny natychmiast po uruchomieniu aplikacji. Naley teraz zamkn
program (najlepiej za pomoc Menedera zada, aby mie pewno, e
instancja programu zostanie zniszczona i nie bdzie dziaa w tle). Warto
teraz wyczy modu Wi-Fi i ponownie uruchomi aplikacj klienck tego
projektu. Tym razem przycisk Otwrz drzwi powinien by przez jaki czas
zablokowany w oczekiwaniu na uruchomienie moduu Wi-Fi i nawizanie
poczenia sieciowego. Jeli modu komunikacji radiowej jest wczony,
moemy rozpocz testy z uyciem serwera systemu otwierania drzwi.
Wystarczy klikn przycisk Otwrz drzwi. W cigu jednej, dwch sekund
elektryczny rygiel powinien otworzy si na blisko pi sekund (po tym czasie
zostanie ponownie zamknity). Jeli system dziaa prawidowo, moemy
sobie pogratulowa dobrze wykonanej pracy! W przeciwnym razie musimy
Rozdzia 9. Zamek do drzwi sterowany przez Androida  225

sprawdzi, czy zastosowane urzdzenie z systemem Android rzeczywicie


uzyskao poczenie sieciowe. Wystarczy sprawdzi dostp do odpowiedniego
adresu URL z poziomu przegldarki internetowej systemu Android. Jeli
dostp do tego adresu URL jest niemoliwy, naley sprawdzi, czy serwer
systemu otwierania drzwi nadal dziaa i czy urzdzenie serwera ma przypisa-
ny waciwy (zdefiniowany przez nas wczeniej) adres IP. Warto sprbowa
uzyska dostp do tego adresu URL za porednictwem innego systemu,
aby sprawdzi, czy pozostae urzdzenia podczone do sieci domowej
maj dostp do serwera tego projektu.

9.6. Testy i instalacja


Aplikacja kliencka dla systemu Android wysya danie na adres URL ser-
wera po naciniciu przycisku interfejsu uytkownika, zatem jestemy ju
bardzo blisko szczliwego koca tego projektu. Aby przetestowa mechani-
zmy sterowania ryglem i robienia zdj, naley podczy do prdu serwer
projektu (telefon z systemem Android) i upewni si, e wszystkie poczenia
pomidzy tym telefonem, pytk IOIO i przecznikiem PowerSwitch
Tail s prawidowe. danie do tego serwera naley wysa za pomoc
innego urzdzenia z systemem Android (i uruchomion aplikacj klienck
projektu). Warunkiem prawidowego przetestowania obsugi da jest po-
czenie obu urzdze z systemem Android (serwera i klienta) do sieci bez-
przewodowej obsugiwanej przez ten sam punkt dostpowy Wi-Fi. Po po-
czeniu projekt moe wyglda podobnie do mojego systemu (patrz rysunek 9.8
zatytuowany Testowanie systemu sterowania zamkiem).

Rysunek 9.8. Testowanie systemu sterowania zamkiem


226  9.7. Nastpne kroki

Musimy jeszcze zainstalowa mechanizm elektrycznego rygla w ocienicy


drzwi wejciowych. Instalacja rygla moe by do kopotliwa, szczeglnie
dla czytelnikw, ktrzy nie przepadaj za prac w drewnie ani prowadzeniem
w cianach. Czytelnikw planujcych instalacj tego systemu na stae go-
rco zachcam do poproszenia o pomoc sprawdzonego stolarza i elektryka.
Bezpieczestwo domowej instalacji elektrycznej (i nasze zdrowie psychiczne)
z pewnoci jest warte tych dodatkowych wydatkw.
Podczas instalacji rygla warto zadba o umieszczenie telefonu z systemem
Android, pytki IOIO i przecznika PowerSwitch Tail w atwo dostpnym
miejscu. Nie musz chyba mwi, e wymienionych elementw nie naley
umieszcza pod tynkiem taka instalacja nie tylko utrudniaby wymian
ewentualnych uszkodzonych komponentw w przyszoci, ale te rodziaby
powane ryzyko poarowe w razie niewaciwego zaizolowania przewo-
dw. Polecam zakup odpowiedniej skrzynki w sklepie z elektronik. Skrzyn-
ka powinna by na tyle dua, aby pomieci wszystkie elementy i ewentu-
alne dodatkowe urzdzenia, ktre mog by potrzebne w przyszoci (jeli
na przykad zdecydujemy si rozbudowa ten system o dodatkowe elementy).
Musimy konsekwentnie przestrzega zasad bezpiecznego czenia przewodw.
Po poczeniu obwodu i umieszczeniu komponentw w docelowych miejscach
zwykle lutuj wszystkie elementy i zabezpieczam odsonite powierzchnie
przewodzce (w tym kocwki i przewody) za pomoc wa termokurczliwe-
go, aby unikn ryzyka zwarcia. Czytelnicy, ktrzy mog liczy na pomoc elek-
tryka, koniecznie powinni zasign jego opinii na temat zalecanych praktyk
i poprosi o rady podczas czenia tego systemu.

9.7. Nastpne kroki


Gratulacje! Wanie zakoczye jeden z najbardziej zoonych projektw
opisanych w tej ksice. Zrobie spory postp, zyskujc przy tym duo
nowej wiedzy i dowiadczenia. Potrafisz teraz automatyzowa prac wielu
rnych urzdze elektrycznych w swoim domu. W ostatnim projekcie opisa-
nym w tej ksice poczymy wiele spord zaprezentowanych wczeniej
technik, aby utworzy aplikacj nasuchujc wielu zdarze i komunikujc
si z uytkownikiem za porednictwem syntezatora mowy. Zanim przyst-
pimy do tego projektu, warto rozway rozszerzenie systemu drzwi stero-
wanych przez Androida o nastpujce elementy:
Rozdzia 9. Zamek do drzwi sterowany przez Androida  227

Moemy zaimplementowa system Perfect Paper Passwords Stevea


Gibsona, ktry uzupeni ten projekt o bezpieczniejszy schemat
uwierzytelniania z uwzgldnieniem wielu czynnikw (w tym hase
jednorazowych)20. System Perfect Paper Passwords umoliwia na
przykad udostpnianie jednorazowych kodw osobom, ktre z r-
nych wzgldw musz wej do naszego domu, na przykad lekarzom
odbywajcym wizyty domowe, osobom zatrudnionym do sprztania
domu czy fachowcom wykonujcym niezbdne naprawy.
Do pytki IOIO mona dodatkowo podczy czujnik PIR, aby wy-
krywa ruch i wysya informacje o tego rodzaju zdarzeniach. Projekt
w oryginalnej formie co prawda dziaa do podobnie, jednak robio-
ne zdjcia nie zawsze bd przedstawiay osob wchodzc do domu
(jeli na przykad drzwi zostan celowo lub przypadkiem otwarte
z pewnym opnieniem). Warto wykorzysta dostpno duej liczby
analogowych i cyfrowych wtykw na pytce IOIO, aby podczy
czujnik ruchu PIR podobny do tego z rozdziau 4. zatytuowanego
Elektryczny pies strujcy.
Istnieje moliwo podczenia wielu elektrycznych rygli do serwera
WWW tego systemu i odblokowywania poszczeglnych zamkw za
pomoc rnych adresw URL. Do otwierania drzwi wejciowych
moe suy na przykad adres http://192.168.1.230/drzwi wejsciowe,
natomiast do otwierania drzwi do piwnicy mona uywa adresu
http://192.168.1.230/drzwi_do_piwnicy.
Telefonu z systemem Android mona z powodzeniem uywa do sterowania
wieloma innymi urzdzeniami. Serwer poczony z pytk IOIO moe suy
do wczania i wyczania wiate, urzdze AGD, komputerw i dowolnych
innych urzdze elektrycznych. Program serwera WWW mona rozsze-
rzy o mechanizmy rejestrowania zdarze, wysyania wiadomoci poczty
elektronicznej z powiadomieniami o zmianach stanu i wykrywania zmiany
orientacji (za pomoc wbudowanego kompasu i akcelerometru), jeli urz-
dzenie, na ktrym dziaa ten serwer, zostanie przez kogo poruszone.

20
https://www.grc.com/ppp.htm
228  9.7. Nastpne kroki
Rozdzia 10.
Dajmy przemwi
naszemu domowi

C
zy nie byoby wspaniale, gdybymy podczas zbliania si do drzwi
wejciowych byli pozdrawiani przez nasz dom i informowani o wa-
nych zdarzeniach, ktre miay miejsce podczas naszej nieobecnoci?
A moe nasz dom powinien odpowiada na pytania o stan skrzynki odbior-
czej poczty elektronicznej, polecenia sprawdzenia prognozy pogody lub da-
nia odtworzenia ulubionej kolejki plikw muzycznych? Dom mgby te go-
no powiadamia domownikw o zdarzeniach wykrywanych przez czujniki,
na przykad o przekroczeniu poziomu wody w zbiorniku lub o koniecznoci
dosypania nasion dla ptakw w karmniku (odpowiednio z pierwszego i dru-
giego projektu). (Patrz rysunek 10.1 zatytuowany Powiadamianie o zda-
rzeniach).
Ten projekt tchnie nowe ycie w te z pozoru dziwaczne projekty. Utworzymy
centralny wze odpowiedzialny za obsug komunikacji pomidzy wszyst-
kimi systemami zbudowanymi w tej ksice i za gosowe porozumiewanie
si z uytkownikiem.
Otrzymywanie wiadomoci poczty elektronicznej i wpisw na Twitterze
oczywicie ma swoje zalety, jednak moliwo prowadzenia konwersacji
z wasnym domem byaby jeszcze ciekawsza. Byoby wspaniale, gdybymy
mogli gono zada pytanie ktra godzina? bd wypowiedzie jakie
230  10.1. Czego potrzebujemy

Rysunek 10.1. Powiadamianie o zdarzeniach niech nasz dom sam


informuje nas o zdarzeniach zwizanych z funkcjonowaniem
zaprojektowanych przez nas systemw automatyzacji

polecenie, na przykad wcz wiata lub pu muzyk, i gdyby nasz dom


reagowa, generujc odpowiedni odpowied lub wykonujc nasze polecenie.
Wanie opisane mechanizmy zrealizujemy w ramach projektu opisanego
w tym rozdziale. Projekt poczy opracowane wczeniej projekty internetowe-
go wcznika wiata i drzwi sterowanych przez Androida oraz umoliwi
sterowanie tymi rozwizaniami za pomoc polece gosowych.
Przy okazji realizacji tego projektu przeanalizujemy moliwoci implementacji
dodatkowych polece gosowych, jak wybr wykonawcy i albumu do od-
tworzenia przez zestaw stereo, zwikszanie i zmniejszanie gonoci itp.

10.1. Czego potrzebujemy


Mimo e ten sam projekt rwnie dobrze moglibymy zaimplementowa
w systemie Windows (przy uyciu interfejsu Speech API firmy Microsoft)
lub w systemie Linux (za pomoc projektu open source Festival), zdecydowa-
em si wybra platform Mac, poniewa uwaam, e mechanizm prze-
ksztacania tekstu na gos (ang. Text-to-Speech TTS) dostpny w systemie
Rozdzia 10. Dajmy przemwi naszemu domowi  231

OS X 10.7 (Lion) jest najlepszy spord rozwiza dostpnych w tych


trzech systemach operacyjnych. Wikszo uytkownikw komputerw Mac
w ogle nie wie o istnieniu tego mechanizmu ani tym bardziej o moliwoci
pobrania dodatkowych gosw dla systemu OS X.
Poniej wymieniem urzdzenia i czci, ktrych bdziemy potrzebowali
do realizacji tego projektu:
komputer Apple Mac z systemem operacyjnym OS X 10.7 (Lion)
lub nowszym;
domowy sprzt stereo ze standardowym wejciem 3,5 mm lub RCA;
jeden z nastpujcych przewodw:
przewd stereo mski-mski do poczenia komputera Mac z do-
mowym sprztem stereo lub
przewd stereo z przejciwk RCA wtyk suchawkowy 3,5 mm
(jeli system stereo obsuguje tylko wejcie RCA) lub
bezprzewodowy gonik Bluetooth, na przykad Supertooth DISCO ;
1

bezprzewodowy mikrofon i stacja odbiorcza, na przykad Radio Shack


Wireless Lapel Microphone System2;
przejciwka USB wejcie suchawkowe 3,5 mm do wysyania sy-
gnau od bezprzewodowej stacji mikrofonu do komputera Mac, na
przykad iMic firmy Griffin Technology3.
Zanim bdziemy mogli posucha gosw swojego komputera, musimy zna-
le sposb odtwarzania dwikw z komputera Mac przy uyciu zestawu
gonikowego (niezalenie od tego, czy ten zestaw poczono bezporednio
z komputerem, za porednictwem systemu stereo, czy przy uyciu systemu
gonikw bezprzewodowych Bluetooth).

10.2. Konfiguracja gonikw


Gonik uywany do wzmocnienia sygnau audio generowanego przez
komputer jest jednym z najwaniejszych czynnikw decydujcych o sukcesie
tego projektu. Gonik musi by na tyle gony, aby dwik by syszalny

1
http://www.supertooth.net/AU/produitmusique.htm
2
http://www.radioshack.com/product/index.jsp?productId=2131022
3
http://store.griffintechnology.com/imic
232  10.2. Konfiguracja gonikw

co najmniej w kilku pomieszczeniach (w idealnych warunkach dwik


powinien by syszalny w caym domu). W tym podrozdziale przeanalizuje-
my zarwno przewodowe, jak i bezprzewodowe systemy nagonienia.
Najprostszym sposobem poczenia komputera Mac z domowym systemem
stereo jest uycie przewodu mski-mski z przejciwk RCA wtyk su-
chawkowy 3,5 mm. Przewd bdzie czy wyjcie suchawkowe kompute-
ra Mac ze wzmacniaczem stereo i (lub) wtykiem wejciowym odbiornika.
Jeli domowy system stereo nie udostpnia wtyku jack 3,5 mm, musimy
zastosowa przewd audio z kocwk esk 3,5 mm i kocwk msk
RCA. Przewd powinien by na tyle dugi, aby wygodnie poczy kompu-
ter z systemem stereo warto wic mie na uwadze docelowy rozkad urz-
dze podczas kupowania tego przewodu w sklepie ze sprztem audio-wideo.
Jeli komputer i system stereo dzieli wiele pomieszcze, niezbdny prze-
wd musi by do dugi, a instalacja caego systemu wymaga wywiercenia
wielu otworw w cianach. Jeli nie chcemy instalowa komputera w tym
samym pomieszczeniu, w ktrym znajduje si system stereo, i jeli nie mamy
zamiaru prowadzi przewodw przez ciany, powinnimy rozway zasto-
sowanie bezprzewodowej alternatywy. Polecam wykorzystanie zewntrznych
gonikw Bluetooth, ktre oferuj najwiksz elastyczno spord do-
stpnych rozwiza.
Konfiguracja poczenia gonika Bluetooth i komputera Mac jest do pro-
sta. Wystarczy wczy modu komunikacji Bluetooth na komputerze Mac
za porednictwem panelu ustawie systemu Bluetooth. Naley nastpnie
wczy zasilanie zewntrznego gonika Bluetooth i skonfigurowa go w taki
sposb, aby komunikowa si z komputerem. Konfiguracja zwykle spro-
wadza si do przytrzymania wcinitego przycisku zasilania do momentu,
w ktrym odpowiednia dioda na goniku Bluetooth zacznie miga. Nastpny
krok polega na klikniciu przycisku Skonfiguruj nowe urzdzenie w panelu
ustawie Bluetooth systemu Mac. System powinien automatycznie wykry
goniki Bluetooth. W przypadku gonika Supertooth DISCO w systemie
Mac zostanie wywietlone urzdzenie ST DISCO R58 (patrz rysunek 10.2
zatytuowany Nawizywanie poczenia z bezprzewodowym gonikiem
Bluetooth).
Rozdzia 10. Dajmy przemwi naszemu domowi  233

Rysunek 10.2. Nawizywanie poczenia z bezprzewodowym gonikiem


Bluetooth

Naley teraz wybra nazw gonika. W zalenoci od stosowanego go-


nika Bluetooth poczenie albo moe by nawizywane automatycznie,
albo moe wymaga podania czterocyfrowego kodu potwierdzenia (na przy-
kad 0000 lub 1234). W przypadku gonika Supertooth DISCO mj sys-
tem Mac automatycznie skonfigurowa odpowiednie urzdzenie bez ko-
niecznoci stosowania jakichkolwiek kodw.
Po prawidowym wykryciu i skonfigurowaniu urzdzenia na ekranie po-
winien si pojawi komunikat potwierdzenia udanego nawizania po-
czenia z gonikiem. Naley klikn opcj Dwik w Preferencjach syste-
mowych i wybra gonik w zakadce Wyjcie. Warto teraz otworzy aplikacj
muzyczn iTunes w systemie Mac, aby odtworzy jaki plik muzyczny
i sprawdzi, czy dwik rzeczywicie zostanie odtworzony przez bezprzewo-
dowy gonik. Testy komunikacji z urzdzeniem mona zakoczy, klikajc
opcj Mowa w preferencjach systemowych i wybierajc zakadk Synteza
mowy. Naley teraz klikn przycisk Odtwrz. Jeli usyszymy z gonikw
wygenerowany komunikat tekstowy, moemy przyj, e system Mac jest
prawidowo skonfigurowany. Musimy jeszcze ustawi poziom gonoci gene-
rowanego dwiku, tak aby komunikaty byy syszalne na wyznaczonym
obszarze.
Bezprzewodowa konfiguracja systemu audio ma swoje wady i zalety. Jeli zale-
y nam na wygodzie oferowanej przez transmisj dwiku bez konieczno-
ci instalacji okablowania, zewntrzny gonik Bluetooth jest najlepszym
234  10.3. Wsuchajmy si w gos systemu

rozwizaniem. Jeli jednak jako dwiku ma dla nas wiksze znaczenie ni


wygoda transmisji bezprzewodowej, tylko przewodowe poczenie komputera
ze wzmacniaczem stereo zapewni oczekiwany efekt. Jeli mamy szczcie
i instalujemy system w pomieszczeniach, w ktrych zainstalowano ju
okablowanie dla systemu nagonienia, poczenie komputera z tym sys-
temem jest oczywistym rozwizaniem.

Zalety komunikacji bezprzewodowej Bluetooth


Moliwo bezprzewodowego wysyania sygnau audio za pomoc
technologii Bluetooth jest oferowana przez wikszo komputerw
Mac. Ten wyjtkowo elastyczny sposb czenia urzdze umoli-
wia swobodn instalacj komputera i zewntrznego gonika Blu-
etooth w wybranych miejscach. Zamiast prowadzi przewd audio
pomidzy komputerem a systemem stereo moemy zastosowa bez-
przewodow komunikacj Bluetooth o zasigu okoo 10 metrw.

Musimy jeszcze tak skonfigurowa system Mac, aby nasuchiwa polece


gosowych i reagowa, odtwarzajc odpowiednie odpowiedzi gosowe. Po-
zostaje nam jeszcze napisanie skryptu jzyka AppleScript, ktry wykorzy-
sta wbudowany serwer rozpoznawania mowy systemu OS X do nasu-
chiwania i wykonywania wydawanych polece.

10.3. Wsuchajmy si w gos systemu


Zanim bdziemy mogli na gos wydawa polecenia systemowi Mac, musimy
najpierw wczy serwer rozpoznawania mowy w ramach tego systemu.
Warto pamita, e serwer rozpoznawania mowy nie dziaa prawidowo
w wersjach 10.5 i 10.6 systemu; zosta ostatecznie poprawiony dopiero
w wersji 10.7 Lion. Poczwszy od tej wersji, system Mac ponownie sta si
skuteczn platform rozpoznawania mowy.
Aby skonfigurowa mechanizm rozpoznawania mowy w systemie Mac, nale-
y klikn ikon Mowa (Speech) w panelu preferencji systemowych (System
Preferences); patrz rysunek 10.3 zatytuowany Dostp do ustawie roz-
poznawania i syntezy mowy w systemie OS X.
Rozdzia 10. Dajmy przemwi naszemu domowi  235

Rysunek 10.3. Dostp do ustawie rozpoznawania i syntezy mowy


w systemie OS X

Naley teraz wybra zakadk Rozpoznawanie mowy (Speech Recognition)


i wczy Mwione komunikaty (Speakable Items); patrz rysunek 10.4 zaty-
tuowany Wczanie mwionych komunikatw.

Rysunek 10.4. Wczanie mwionych komunikatw


236  10.3. Wsuchajmy si w gos systemu

Warto przeczyta wskazwki wywietlone po pierwszym wczeniu tej


opcji, aby podczas definiowania szczegowych ustawie mie na uwadze
zalecenia projektantw tych rozwiza. Algorytmy rozpoznawania mowy
nie s wystarczajco skuteczne, aby atwo rozumie i rozpoznawa rne
dialekty, akcenty i poziomy gonoci, jednak odpowiednie technologie s
stale rozwijane.
Z moich dowiadcze wynika, e podczas wydawania polece systemowi
Mac naley mwi gono i wyranie, a poszczeglne sowa polece naley
wypowiada nienaturalnie wolno. Co wicej, polecenia naley wypowiada
w warunkach niemal penego braku innych dwikw w tle. Warto poekspe-
rymentowa z mikrofonami zainstalowanymi w rnych miejscach (w szcze-
glnoci w rnych odlegociach od ust wydajcego polecenia) i rnymi
pauzami dzielcymi kolejne wyrazy, aby sprawdzi, jak mechanizm rozpo-
znawania mowy radzi sobie ze sownictwem zdefiniowanym w naszym
skrypcie. Warto pamita, e zgodnie z domylnymi ustawieniami mikrofonu
w systemie Mac domylnie jest uywany wewntrzny mikrofon. W dalszej
czci tego rozdziau zmienimy odpowiednie opcje, aby wymusi stosowanie
interfejsu iMic (na razie mona pozostawi ustawienia domylne).
Po aktywacji opcji mwionych komunikatw na ekranie komputera zostanie
wywietlony okrgy symbol mikrofonu. Wspomniany symbol jest w istocie
oknem rozpoznawania mowy. Aby aktywowa system rozpoznawania mowy,
naley przytrzyma wcinity klawisz Escape. Wymaganie przytrzymywania
tego klawisza wyeliminujemy wraz z uruchomieniem skryptu implementu-
jcego system mwicego domu i konfiguracj bezprzewodowego mikrofonu;
na razie pozostawimy ustawienia domylne, aby uatwi diagnozowanie
tego skryptu.
Przed zamkniciem panelu ustawie mowy musimy ustawi jeszcze jedn
opcj. W tym celu naley klikn zakadk Synteza mowy (Text to Speech)
i wybra jedn z opcji dostpnych na licie rozwijanej Gos systemowy (System
Voice); patrz rysunek 10.5 zatytuowany Ustawienia syntezatora mowy.
Dostpne gosy mona sprawdzi, klikajc przycisk Odtwrz (Play). Do-
mylny gos oznaczono imieniem Alex. Gos Aleksa jest cakiem dobry, jed-
nak sam wol eski gos Samanthy z amerykask wymow. Poniewa pliki
gosw s do due, firma Apple nie dostarcza wszystkich dostpnych go-
sw wraz z systemem Lion. Dodatkowe gosy mona pobra, wybierajc opcj
Dostosuj (Customize) z listy rozwijanej Gos systemowy (System Voice).
Rozdzia 10. Dajmy przemwi naszemu domowi  237

Rysunek 10.5. Ustawienia syntezatora mowy

Kliknicie tej opcji spowoduje wywietlenie nowego okna dialogowego z list


gosw dostpnych do pobrania za darmo z serwera firmy Apple (patrz rysu-
nek 10.6 zatytuowany Wybr gosu systemu Lion)4.

Rysunek 10.6. Wybr gosu systemu Lion

4
Uytkownicy polskiej wersji systemu OS X Lion mog wybra syntezator mowy
Agata przyp. tum.
238  10.4. Kalibracja mikrofonu bezprzewodowego

Uytkownik ma do wyboru wiele gosw, z ktrych kady mona sprawdzi


jeszcze przed pobraniem, klikajc przycisk Odtwarzaj (Play). Po wybra-
niu ulubionego gosu musimy uzbroi si w cierpliwo na czas pobierania
i konfiguracji potrzebnych plikw na danym komputerze (czas potrzebny
na wykonanie tych krokw zaley od parametrw poczenia internetowego
i szybkoci procesora). Na przykad plik z gosem Samanthy zajmuje po-
nad 450 megabajtw.
Po pobraniu i zainstalowaniu plikw z wybranym gosem moemy dodatko-
wo dostosowa opcje odtwarzania tego gosu za pomoc suwaka Szybko
mwienia (Speaking Rate); zmiana pooenia tego suwaka powoduje szybsze
lub wolniejsze generowanie dwiku. Na tym etapie sugeruj zachowanie
domylnej szybkoci mwienia w razie potrzeby zawsze mona wrci do
tych ustawie ju po poczeniu i sprawdzeniu caego systemu obejmujcego
mikrofon i goniki. Skoro mowa o mikrofonie, nasze nastpne zadanie
polega na podczeniu mikrofonu bezprzewodowego i jego kalibracji pod
ktem rozpoznawania mowy.

10.4. Kalibracja mikrofonu


bezprzewodowego
Uytkownicy komputerw MacBook Pro oraz iMac mog skorzysta z wbu-
dowanych, wewntrznych mikrofonw. Takie rozwizanie sprawdzi si w przy-
padku wydawania polece bezporednio przed laptopami z wymienionych
serii, ale bdzie coraz mniej skuteczne wraz z rosnc odlegoci od ekranu
(i mikrofonu). W tym przypadku zaley nam raczej na moliwoci prowa-
dzenia rozmowy z naszym domem w czasie chodzenia po pokojach, oglda-
nia telewizji, przygotowywania niadania w kuchni czy sprztania salonu.
Ten cel mona osign za pomoc mikrofonu bezprzewodowego.
Warunkiem niezawodnej wsppracy bezprzewodowego mikrofonu z mecha-
nizmem rozpoznawania mowy w systemie Mac OS jest zastosowanie urz-
dzenia odpowiedniej jakoci, ktre zagwarantuje czyst transmisj sygnau.
Mikrofon, ktrego sygna bdzie zakcany przez trzaski czy syki, nie spraw-
dzi si w tym systemie, poniewa mechanizm rozpoznawania mowy musi
prawidowo odrnia waciwy sygna od szumu. Jeli budowany system ma
mie praktyczn warto i ma skutecznie realizowa swoje zadania przez du-
szy czas, warto zainwestowa w mikrofon bezprzewodowy wysokiej jakoci
(podobny do mikrofonw uywanych przez profesjonalnych wokalistw).
Rozdzia 10. Dajmy przemwi naszemu domowi  239

Taki mikrofon moe co prawda kosztowa kilkaset zotych (zalenie od mo-


liwoci i zasigu), jednak jako sygnau i czysto dwiku z pewnoci s
warte dodatkowych nakadw. Czytelnikom, ktrzy przed podjciem decyzji
o zainwestowaniu tak powanych rodkw wol dobrze przetestowa ten
system, polecam nieco taszy produkt o nazwie Radio Shack Wireless Lapel
Microphone System.
Naley podczy interfejs Griffin iMic do jednego z wolnych portw USB
komputera Mac, po czym podczy wyjcie stacji bazowej mikrofonu bez-
przewodowego do wejcia interfejsu iMic. Warto jeszcze sprawdzi, czy
w interfejsie iMic wybrano wejcie mikrofonowe. Moemy nastpnie wczy
mikrofon bezprzewodowy i zasilanie stacji bazowej. W panelu Rozpoznawa-
nie mowy (Speech Recognition) w ramach preferencji systemowych naley
wybra system iMic USB i klikn przycisk Kalibruj (Calibrate). Wybr tej
opcji spowoduje wywietlenie okna kalibracji mikrofonu (patrz rysunek 10.7
zatytuowany Kalibracja mikrofonu). Podczas kalibracji naley mwi
w kierunku mikrofonu i tak ustawi pozycj suwaka, aby poziom gonoci
mieci si w zielonym polu.

Rysunek 10.7. Kalibracja mikrofonu

Warto te sprawdzi, czy podczas mwienia do mikrofonu w rnych miej-


scach pokoju wskanik sygnau nadal bdzie si mieci w zielonym polu.
Zanim bdziemy mogli przystpi do kodowania aplikacji, musimy wyko-
na jeszcze jedno zadanie. Trzeba podczy goniki potrzebne do odtwa-
rzania generowanych komunikatw.
240  10.5. Programowanie mwicego systemu

10.5. Programowanie mwicego


systemu
Napisanie dobrego syntezatora mowy i oprogramowania rozpoznajcego
mow jest trudne. Wanie dlatego wykorzystamy oprogramowanie, ktre
powstao w wyniku cikiej pracy inynierw firmy Apple i ktre zostao
wczone do systemu operacyjnego OS X. Dostp do tego silnika mona
uzyska na wiele sposobw, w tym za porednictwem odpowiednich metod
jzykw Objective-C, Perl, Python i Ruby oraz specjalnych konstrukcji
stworzonych z myl o pozostaych jzykach skryptowych. Z moich dowiad-
cze wynika jednak, e zdecydowanie najprostszym sposobem budowy,
modyfikowania i testowania odpowiednich rozwiza jest uycie jzyka
AppleScript.
Chciabym przy tym podkreli, e nie jestem wielkim zwolennikiem jzyka
AppleScript. Prby pisania skryptw w formie przypominajcej zdania jzyka
angielskiego okazuj si skuteczne tylko w przypadku najprostszych roz-
wiza. Wady i ograniczenia tego jzyka ju po kilku minutach s oczywiste
dla kadego programisty, ktry mia do czynienia z bardziej eleganckimi
jzykami programowania, jak Ruby czy Python. W jzyku AppleScript na-
wet implementacja prostych zada, na przykad operacji na acuchach, oka-
zuje si do trudna. Mimo tych wszystkich ogranicze warto podkreli, e
AppleScript bije na gow pozostae jzyki skryptowe w zakresie bezpro-
blemowej integracji z pozostaymi aplikacjami systemu OS X przystosowa-
nymi do wsppracy z tym jzykiem. Skrypty jzyka AppleScript mona
z powodzeniem integrowa z oprogramowaniem doczonym do systemu
Mac OS X, jak iTunes, Mail, Safari czy Finder, a take z wieloma innymi
programami dla tego systemu, w tym z komunikatorem Skype, pakietem biu-
rowym Microsoft Office itp. W przypadku tego projektu warto wykorzysta
due moliwoci wsppracy ze skryptami oferowane przez serwer rozpozna-
wania mowy firmy Apple wanie tego produktu uyjemy podczas re-
alizacji opisywanego projektu.
Skrypty jzyka AppleScript mona co prawda pisa w dowolnym edytorze
tekstu, jednak zdecydowanie wygodniejszym rozwizaniem jest uycie spe-
cjalnej aplikacji AppleScript Editor. Aplikacj mona znale w folderze
Applications/Utilities. Po pierwszym uruchomieniu edytora skryptw jzyka
AppleScript wywietlone zostanie puste okno podzielone na dwa panele.
Grna poowa okna suy do wpisywania kodu, natomiast dolna cz okna
obejmuje trzy zakadki odpowiedzialne odpowiednio za monitorowanie zda-
rze i odpowiedzi oraz wywietlanie wynikw wykonywanego skryptu. Edytor
Rozdzia 10. Dajmy przemwi naszemu domowi  241

co prawda uatwia pisanie skryptw poprzez wyrnianie poszczeglnych


elementw skadniowych odpowiednimi kolorami, ale nie oferuje mechani-
zmw znanych z bardziej rozbudowanych rodowisk IDE, na przykad wy-
kaczania kodu czy kompilacji w locie. Typowe skrypty s jednak na tyle
krtkie, e brak wymienionych funkcji nie stanowi wikszego problemu.
Jzyk AppleScript ma wasne sownictwo, sowa kluczowe i idiomy. Opano-
wanie tego jzyka nie jest trudne, ale bywa do irytujce, szczeglnie z uwagi
na konieczno precyzyjnego doboru skadni, tak aby tworzony skrypt prawi-
dowo oddawa nasze intencje. Na przykad analiza skadniowa acucha
w poszukiwaniu adresu poczty elektronicznej w wikszoci jzykw skrypto-
wych jest dziecinnie prosta. W jzyku AppleScript jest inaczej. Realizacja
tego zadania w jzyku AppleScript jest trudna z powodu koniecznoci
zapewnienia zgodnoci z historycznymi rozwizaniami i w zwizku z niety-
powym sposobem pisania skryptw. Czytelnicy, ktrzy nie maj dowiadcze-
nia w pracy w tym jzyku, musz mi zaufa i uwierzy, e skrypty opracowa-
ne na potrzeby tego projektu dziaaj zgodnie z tym, co o nich napisaem.
Czytelnikw, ktrym jzyk AppleScript przypadnie do gustu lub ktrzy
bd zainteresowani rozbudow kodu tego projektu, zachcam do lektury
dostpnej w internecie dokumentacji opublikowanej przez firm Apple5.
Zanim przystpimy do pisania tego skryptu, musimy zastanowi si, co do-
kadnie ten skrypt ma robi. Pierwszym zadaniem tego skryptu bdzie reago-
wanie na wybran grup wypowiadanych sw i wyrae oraz podejmowanie
odpowiednich dziaa. Ktre polecenia powinnimy wybra? Na pocztek
warto stworzy skrypt odwoujcy si do adresw URL udostpnianych
przez projekty, ktre zrealizowalimy z myl o dostpie za porednictwem
internetu, a wic przez internetowy wcznik wiata i drzwi otwierane przez
Androida. Skoro ju podejmujemy si zadania opracowania skryptu w jzyku
AppleScript, warto przy okazji wykorzysta cz wbudowanych aplikacji
systemu OS X, na przykad Mail i iTunes, do odbierania i czytania nieode-
branej poczty oraz odtwarzania wybranych plikw muzycznych. Zaimple-
mentujemy te mechanizm odpowiadania przez dom na pytanie o aktualn
godzin.
Musimy zainicjalizowa aplikacj SpeechRecognitionServer oraz zdefiniowa
zbir sw i wyrae, ktrych chcemy nasuchiwa. Aby waciwie reago-
wa na wydawane polecenia, wystarczy uy sekwencji wyrae if-then.

5
http://developer.apple.com/library/mac/#documentation/AppleScript/
Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html
242  10.5. Programowanie mwicego systemu

Jeli na przykad prosimy komputer o rozpoczcie odtwarzania muzyki, skrypt


powinien wywoa aplikacj iTunes, wymusi przeszukanie utworw mu-
zycznych zapisanych w jej bibliotece, posortowanie tych utworw wedug
artysty i albumu, umieszczenie tych nazw, nazwisk i tytuw w zbiorze
sw wymagajcych interpretacji oraz uycie mechanizmu syntezatora mowy
do zadania pytania o artyst i album interesujcy uytkownika. Podobnie
moemy wymusi odczytanie nowych wiadomoci poczty elektronicznej,
wydajc polecenie sprawd poczt. To polecenie powinno uruchomi apli-
kacj Mail, sprawdzi skonfigurowane wczeniej konto pocztowe pod k-
tem ewentualnych nowych wiadomoci, sprawdzi, czy skrzynka odbiorcza
nie zawiera nieprzeczytanych wiadomoci, oraz uy mechanizmu syntezy
mowy do przeczytania nazwisk nadawcw i tytuw tych wiadomoci.
Przejdmy teraz do szczegowej analizy przebiegu wykonywania tego skryptu.
Kompletny kod skryptu pokazano poniej. Wikszo zastosowanych kon-
strukcji skadniowych powinna by atwa w interpretacji nawet dla programi-
stw, ktrzy nigdy wczeniej nie mieli do czynienia z jzykiem AppleScript.
Plik GivingYourHomeAVoice/osx-voice-automation.scpt

with timeout of 2629743 seconds


set exitApp to "no"
repeat while exitApp is "no"
tell application "SpeechRecognitionServer"
activate
try
set voiceResponse to listen for {"zapal wiato", "zga wiato",
"otwrz drzwi", "wcz muzyk", "wstrzymaj muzyk",
"wznw muzyk", "zatrzymaj muzyk", "nastpny utwr",
"goniej", "ciszej",
"poprzedni utwr", "sprawd poczt", "godzina", "zadzwo",
"koniec rozmowy", "zamknij aplikacj"} giving up after 2629743
on error -- limit czasowy
return
end try
end tell

if voiceResponse is "zapal wiato" then


-- otwiera adres URL wczajcy internetowy wcznik wiata
open location "http://192.168.1.100:3344/command/on"
say "wiato jest wczone."

else if voiceResponse is "zga wiato" then


-- otwiera adres URL wyczajcy internetowy wcznik wiata
open location "http://192.168.1.100:3344/command/off"
say "wiato jest wyczone."

else if voiceResponse is "otwrz drzwi" then


-- otwiera adres URL powodujcy odblokowanie zamka sterowanego przez Androida
Rozdzia 10. Dajmy przemwi naszemu domowi  243

open location "http://192.168.1.230:8000"


say "Otwieranie drzwi."

else if voiceResponse is "wcz muzyk" then


tell application "iTunes"
set musicList to {"Anuluj"} as list
set myList to (get artist of every track
of playlist 1) as list
repeat with myItem in myList
if musicList does not contain myItem then
set musicList to musicList & myItem
end if
end repeat
end tell

say "Ktrego wykonawcy chcesz posucha?"


tell application "SpeechRecognitionServer"
set theArtistListing to
(listen for musicList with prompt musicList)
end tell

if theArtistListing is not "Anuluj" then


say "Ktrego albumu " & theArtistListing &
" chcesz posucha?"
tell application "iTunes"
tell source "Library"
tell library playlist 1
set uniqueAlbumList to {}
set albumList to album of tracks
where artist is equal to theArtistListing

repeat until albumList = {}


if uniqueAlbumList does not contain
(first item of albumList) then
copy (first item of albumList) to end of
uniqueAlbumList
end if
set albumList to rest of albumList
end repeat

set theUniqueAlbumList to {"Anuluj"} & uniqueAlbumList


tell application "SpeechRecognitionServer"
set theAlbum to (listen for the theUniqueAlbumList
with prompt theUniqueAlbumList)
end tell
end tell
if theAlbum is not "Anuluj" then
if not ((name of playlists) contains "Current Album") then
set theAlbumPlaylist to
make new playlist with properties {name:"Current Album"}
else
set theAlbumPlaylist to playlist "Current Album"
delete every track of theAlbumPlaylist
end if
244  10.5. Programowanie mwicego systemu

tell library playlist 1 to duplicate


(every track whose album is theAlbum) to theAlbumPlaylist
play theAlbumPlaylist
else
say "Anulowanie wyboru muzyki"
end if
end tell
end tell
else
say "Anulowanie wyboru muzyki"
end if

else if voiceResponse is "wstrzymaj muzyk" or


voiceResponse is "wznw muzyk" then
tell application "iTunes"
playpause
end tell

else if voiceResponse is "zatrzymaj muzyk" then


tell application "iTunes"
stop
end tell

else if voiceResponse is "nastpny utwr" then


tell application "iTunes"
next track
end tell

else if voiceResponse is "poprzedni utwr" then


tell application "iTunes"
previous track
end tell

-- Zwiksza i zmniejsza gono (kod zaczerpnity z wpisu HexMonkeya:


-- http://forums.macrumors.com/showthread.php?t=144749).
else if voiceResponse is "goniej" then
set currentVolume to output volume of (get volume settings)
set scaledVolume to round (currentVolume / (100 / 16))
set scaledVolume to scaledVolume + 1
if (scaledVolume > 16) then
set scaledVolume to 16
end if
set newVolume to round (scaledVolume / 16 * 100)
set volume output volume newVolume
else if voiceResponse is "ciszej" then
set currentVolume to output volume of (get volume settings)
set scaledVolume to round (currentVolume / (100 / 16))
set scaledVolume to scaledVolume - 1
if (scaledVolume < 0) then
set scaledVolume to 0
end if
set newVolume to round (scaledVolume / 16 * 100)
set volume output volume newVolume
Rozdzia 10. Dajmy przemwi naszemu domowi  245

else if voiceResponse is "sprawd poczt" then


tell application "Mail"
activate
check for new mail
set unreadEmailCount to unread count in inbox
if unreadEmailCount is equal to 0 then
say "W skrzynce odbiorczej nie ma nieprzeczytanych wiadomoci."
else if unreadEmailCount is equal to 1 then
say "W skrzynce odbiorczej jest jedna nieprzeczytana wiadomo."
else
say "Masz " & unreadEmailCount &
" nieprzeczytanych wiadomoci w skrzynce odbiorczej."
end if
if unreadEmailCount is greater than 0 then
say "Mam przeczyta nieprzeczytane wiadomoci?"
tell application "SpeechRecognitionServer"
activate
set voiceResponse to listen for {"tak", "nie"}
giving up after 1 * minutes
end tell
if voiceResponse is "tak" then
set allMessages to every message in inbox
repeat with aMessage in allMessages
if read status of aMessage is false then
set theSender to sender of aMessage
set {savedDelimiters, AppleScript's text item delimiters}
to {AppleScript's text item delimiters, "<"}
set senderName to first text item of theSender
set AppleScript's text item delimiters
to savedDelimiters
say "Nadawca: " & senderName
say "Temat: " & subject of aMessage
delay 1
end if
end repeat
end if
end if
end tell

else if voiceResponse is "godzina" then


set current_time to (time string of (current date))
set {savedDelimiters, AppleScript's text item delimiters} to
{AppleScript's text item delimiters, ":"}
set hours to first text item of current_time
set minutes to the second text item of current_time
set AMPM to third text item of current_time
set AMPM to text 3 thru 5 of AMPM
set AppleScript's text item delimiters to savedDelimiters
say "Jest godzina " & hours & " " & minutes & AMPM
--else if voiceResponse is "zadzwo" then
-- tell application "Skype"
-- -- Podczas pierwszej prby dostpu do aplikacji Skype za porednictwem
-- -- tego skryptu
-- -- zostanie wywietlone okno dialogowe zabezpiecze interfejsu API Skypea.
246  10.5. Programowanie mwicego systemu

-- -- Wybiera opcj "Pozwl tej aplikacji uywa Skypea", aby


-- -- od tej pory skrypt mia dostp do interfejsu API tej aplikacji.
-- activate
-- -- identyfikator testowej usugi echo123 naley zastpi
-- -- numerem telefonu lub identyfikatorem uytkownika komunikatora Skype
-- send command "CALL echo123" script name
-- "Place Skype Call"
-- end tell
-- else if voiceResponse is "koniec rozmowy" then
-- tell application "Skype"
-- quit
-- end tell

else if voiceResponse is "zamknij aplikacj" then


set exitApp to "tak"
say "Zakoczono nasuchiwanie. Zamykanie aplikacji."
delay 1
do shell script "killall SpeechRecognitionServer"
end if
end repeat
end timeout

Aby zapewni cigo dziaania programu, musimy najpierw otoczy


ten skrypt dwiema ptlami. Pierwsza ptla (with timeout... end with)
ma zapobiega przekraczaniu limitu czasowego przez ten skrypt. Od-
powiedni limit czasowy naley okreli w sekundach. W tym przypadku
skrypt ma dziaa przez miesic (a rednia liczba sekund w jednym mie-
sicu wynosi okoo 2,6 miliona).
Druga ptla (while) jest powtarzana do momentu ustawienia wartoci
"tak" w zmiennej exitApp (wspomniana warto jest ustawiana poprzez
wydanie polecania gosowego zamknij aplikacj patrz kocowy
fragment kodu).
Musimy nastpnie zainicjalizowa Speech Recognizer Server i przeka-
za na jego wejciu tablic sw i wyrae kluczowych za porednictwem
metody listen. Serwer rozpoznawania mowy bdzie dziaa przez mie-
sic, zatem obsuga otrzymywanych polece nie bdzie wymagaa wielo-
krotnego uruchamiania skryptu. Czas dziaania programu mona zmie-
ni, odpowiednio modyfikujc warto giving up.
Jeli wyraenie przychodzce jest interpretowane jako polecenie wcze-
nia wiata, skrypt otwiera domyln przegldark i kieruje j na adres
URL serwera systemu internetowego wcznika wiata. Wypowie-
dziane wyraenie zga wiato spowoduje otwarcie adresu URL tego
samego projektu z poleceniem off. Analogiczne rozwizanie naleaoby
zastosowa do otwierania adresu URL serwera projektu drzwi otwiera-
nych przez Androida.
Rozdzia 10. Dajmy przemwi naszemu domowi  247

Oprcz otwierania adresw URL w zalenoci od wydawanych po-


lece gosowych nasz program moe take wsppracowa z aplikacja-
mi systemu OS X przystosowanymi do integracji ze skryptami jzyka
AppleScript, jak iTunes czy Mail. W powyszym fragmencie kodu
zrealizowalimy nastpujce zadania:
1. Otwieramy aplikacj iTunes.
2. Tworzymy pust tablic.
3. Wypeniamy t tablic wszystkimi utworami w lokalnej bibliotece
iTunes, przy okazji usuwajc powtarzajce si tytuy.
4. Wyodrbniamy z tablicy utworw nazwiska wykonawcw.
5. Jeli tablica zawiera przynajmniej jednego wykonawc, nazwiska i
nazwy wykonawcw s przekazywane na serwer rozpoznawania
mowy za pomoc metody listen for.
6. Prosimy uytkownika o wybr wykonawcy, ktrego utworw chce
sucha. Jeli uytkownik odpowiada nazw lub nazwiskiem wyko-
nawcy wystpujcego w bibliotece, przekazujemy na wejciu ser-
wera rozpoznawania mowy co najmniej jeden album tego wyko-
nawcy. Na tym etapie uytkownicy mog te przerwa procedur
wyboru muzyki, wypowiadajc sowo anuluj.
7. Jeli dla jakiego wykonawcy istnieje w bibliotece wiele albumw,
ta sama procedura jest powtarzana, aby uytkownik mg wybra
jeden z albumw wybranego wczeniej wykonawcy. W przeciw-
nym razie skrypt od razu rozpoczyna odtwarzanie albumu.
Polecenia wstrzymania, wznowienia i zatrzymania odtwarzania muzyki
oraz przejcia do nastpnego i poprzedniego utworu powoduj wywo-
ania odpowiednich metod aplikacji iTunes.
Polecenia zwikszenia i zmniejszenia gonoci powoduj odczytanie bie-
cej gonoci ustawionej na komputerze Mac oraz zwikszenie lub zmniej-
szenie odpowiedniej wartoci w takim samym stopniu jak w przypadku
klawiszy zwikszania i zmniejszania gonoci na klawiaturze komputera
Mac. Te polecenia s szczeglnie przydatne w sytuacji, gdy musimy
zwikszy lub zmniejszy gono odtwarzanej muzyki bez uycia rk.
Ta cz skryptu wymaga uprzedniego skonfigurowania niezbdnych
kont poczty elektronicznej i wbudowanej aplikacji Mail systemu OS X.
Fragment odpowiedzialny za integracj z programem Mail realizuje
nastpujce zadania:
248  10.5. Programowanie mwicego systemu

1. Otwiera program Mail.


2. Sprawdza wszystkie skonfigurowane serwery poczty elektronicznej
pod ktem nowych, nieprzeczytanych wiadomoci.
3. Zlicza nieprzeczytane wiadomoci poczty elektronicznej we
wszystkich skrzynkach odbiorczych i na gos informuje uytkowni-
ka o tej liczbie.
4. Jeli istniej jakie nieprzeczytane wiadomoci, skrypt pyta uyt-
kownika, czy yczy sobie przeczytania tych wiadomoci.
5. Jeli uytkownik odpowie twierdzco, program tworzy tablic nie-
przeczytanych wiadomoci i dla kadej z nich odczytuje nazwisko
nadawcy i temat. W przeciwnym razie nastpuje koniec procedury
obsugi poczty elektronicznej.
Ta cz kodu wyodrbnia biec godzin z wartoci zwrconej przez
funkcj current date jzyka AppleScript. Po uzyskaniu godziny skrypt
wykonuje nastpujce kroki:
1. Przypisuje biec godzin do acucha current_time.
2. Uywa funkcji savedDelimiters jzyka AppleScript do podzielenia
acucha current_time wedug separatora :. Dzieli ten acuch na
wartoci skadowe reprezentujce godzin i minut. Dalsza cz
acucha zawiera informacj o tym, czy jest to godzina przed-, czy
popoudniowa.
3. Przypisuje uzyskane wartoci odpowiednim zmiennym (reprezen-
tujcym godziny, minuty oraz przedpoudnie lub popoudnie), po
czym gosowo przekazuje te informacje uytkownikowi.
Czytelnicy, ktrzy dysponuj zainstalowan aplikacj klienck Mac
Skype i chc prowadzi rozmowy telefoniczne bez pomocy rk, mog
usun symbole komentarzy poprzedzajce wiersze w tej czci kodu
(w jzyku AppleScript komentarze oznacza si podwjnymi mylnikami).
Naley te skonfigurowa nazw konta w miejsce usugi testowej Skypea
nazwanej echo123.
To polecenie koczy wykonywanie skryptu i gwarantuje prawidowe
zniszczenie procesu serwera rozpoznawania mowy za pomoc polecenia
powoki killall SpeechRecognitionServer.
Po wpisaniu tego skryptu w edytorze jzyka AppleScript naley zapisa
program i klikn przycisk Kompiluj (Compile) na pasku narzdzi tego
edytora. Jeli ten skrypt zawiera jakiekolwiek literwki czy inne bdy, nie
Rozdzia 10. Dajmy przemwi naszemu domowi  249

zostanie skompilowany. Ewentualne usterki naley usuwa tak dugo, a


skrypt zostanie prawidowo skompilowany. Warto te raz jeszcze sprawdzi,
czy skalibrowany mikrofon bezprzewodowy jest wczony i czy poziom go-
noci sygnau wejciowego zosta prawidowo ustawiony. Gono ze-
wntrznych gonikw naley ustawi na takim poziomie, aby odpowiedzi
systemu i odtwarzana muzyka byy dobrze syszalne. Wystarczy teraz klikn
przycisk Uruchom (Run) i przygotowa si na dusz konwersacj.

10.6. Rozmowa z wasnym domem


Moment naszej najwikszej chway zblia si wielkimi krokami. Wystarczy
teraz wypowiedzie polecenie godzina i sucha, jak nasz komputer wypo-
wiada biec godzin. Jeli powiemy wcz muzyk, nasz komputer
powinien zapyta ktrego wykonawcy chcesz posucha?. Moemy teraz
powiedzie nazw lub nazwisko wykonawcy, ktrego utwory znajduj si
w lokalnej bibliotece aplikacji iTunes, po czym wybra album tego artysty, aby
wreszcie rozpocz odtwarzanie. Kiedy znudzi nam si suchanie muzyki,
wystarczy, e powiemy zatrzymaj muzyk.
Aby uzyska informacje o nieprzeczytanej poczcie w skrzynce odbiorczej,
wystarczy wyda komputerowi polecenie sprawd poczt. Warto sprawdzi
na ekranie komputera, czy system prawidowo podaje liczb nieprzeczyta-
nych wiadomoci oraz czy odczytuje nadawcw i tematy waciwych wia-
domoci.
Jeli dysponujemy dziaajcym systemem drzwi sterowanych przez Androida
lub internetowego wcznika wiata, moemy dodatkowo wyda polecenie
otwrz drzwi lub zapal wiato i sprawdzi, czy nasz system odpowied-
nio odblokowa elektryczny rygiel drzwi wejciowych lub zapali wiato.
Wreszcie osignlimy swj cel, czyli stworzylimy dom sterowany gosem.
Super!
Warto przeprowadzi testy polegajce na wydawaniu polece z rnych
punktw pokoju. Po sprawdzeniu dziaania systemu w jednym pokoju naley
wykona testy w pozostaych pomieszczeniach. W ten sposb przekonamy
si, jak daleko siga zasig naszego bezprzewodowego mikrofonu w kt-
rych pomieszczeniach sygna jest zbyt saby, aby skutecznie wydawa pole-
cenia systemowi. Warto mie na uwadze te ograniczenia w przyszoci,
podczas waciwego korzystania z tego systemu.
250  10.7. Nastpne kroki

Aby zapewni odpowiedni trwao tego skryptu, warto go przekonwertowa


na plik wykonywalny. Po umieszczeniu ikony skryptu na pulpicie systemu
OS X naley j klikn, przytrzymujc klawisz Ctrl, po czym wybra opcj
Otwrz w czasie logowania (Open at Login) w sekcji opcji wywietlonego
menu kontekstowego. Dziki temu skrypt bdzie automatycznie urucha-
miany przy okazji kadego logowania si w systemie Mac zaraz po zalo-
gowaniu nasz system bdzie gotowy do obsugi zdefiniowanych wczeniej
polece gosowych.
Skrypt mona oczywicie udoskonala i rozbudowywa, dodajc obsug
nowych sw i wyrae, ktre najlepiej bd pasoway do danego rodowi-
ska. Moemy na przykad przystosowa projekt sterowania zasonami do
obsugi przez internet, aby jednym poleceniem odso okna podnie
wszystkie zasony i rolety. Innym ciekawym rozwizaniem byoby pobieranie
prognozy pogody z internetu (na przykad z serwisu weather.gov nalecego
do Amerykaskiej Narodowej Suby Oceanicznej i Meteorologicznej) i gone
informowanie domownikw o nadchodzcych zmianach. Zachcam te do
rozwaenia rozwiza opisanych w podrozdziale Nastpne kroki.

10.7. Nastpne kroki


Gratuluj udanej realizacji ostatniego projektu opisanego w tej ksice. Jak
wida, stworzenie systemu automatyzacji domu na podstawie polece goso-
wych nie jest niczym trudnym. Mimo e dostpne technologie nie s dosko-
nae, moliwo sterowania urzdzeniami domowymi w ten sposb jest spo-
rym osigniciem (jeszcze dwadziecia lat temu kojarzono podobne roz-
wizania raczej z wizjami autorw science fiction).
Zachcam do dalszego doskonalenia opisanych tutaj rozwiza na przykad
poprzez wprowadzenie nastpujcych elementw:
Warto rozszerzy mechanizm gosowej prezentacji nieprzeczytanych
wiadomoci o informowanie uytkownika o dacie wysania i zawartoci
poszczeglnych wiadomoci. Cennym rozwizaniem byoby take do-
danie moliwoci usuwania wiadomoci lub odpowiadania na wia-
domoci przy uyciu z gry zdefiniowanych szablonw (na przykad
w formie polecenia odpowiedz tak).
Mechanizm zarzdzania tablic wykonawcw i albumw z biblioteki
aplikacji iTunes mona skopiowa, tak aby uytkownik mg atwo (za
pomoc polece gosowych) zarzdza kontaktami w komunikatorze
Rozdzia 10. Dajmy przemwi naszemu domowi  251

Skype i wybiera z listy tych kontaktw osob, do ktrej chce zadzwoni.


Po wydaniu polecenia zadzwo skrypt powinien wypeni tablic
dalszych polece nazwami kontaktw aktywnego konta komunikatora
Skype. Tak jak w przypadku nazw i nazwisk wykonawcw, uytkow-
nik musiaby tylko odpowiedzie na pytanie, podajc nazw kon-
taktu, z ktrym chce si poczy.
Warto rozway rozszerzenie skryptw jzyka Python projektw
wierkajcego karmnika dla ptakw i systemu powiadamiania o do-
starczonych paczkach tak, aby przylot ptaka lub dostarczenie paczki
powodowao odpowiedni komunikat gosowy. Odpowiednie dziaanie
mona zaimplementowa za porednictwem polece powoki archi-
tektury OSA (od ang. Open Script Architecture)6.
Mechanizmy rozpoznawania mowy mona przenie na platformy
programowe inne ni system OS X wystarczy przekonwertowa
ten skrypt na aplikacj systemu Android (za pomoc intencji Recogni-
zerIntent systemu Android) lub aplikacj systemu Windows (przy
uyciu interfejsu Speech API firmy Microsoft)7.

6
http://developer.apple.com/library/mac/#documentation/Darwin/Reference/
ManPages/man1/osascript.1.html
7
Patrz odpowiednio http://developer.android.com/resources/articles/speech-input.html
lub http://msdn.microsoft.com/en-us/library/ee125663%28VS.85%29.aspx.
252  10.7. Nastpne kroki
Cz III
Przewidywana
przyszo
254  Programming Your Home
Rozdzia 11.
Przysze projekty

Z
decydowana wikszo tej ksiki bya powicona rzeczywistym
projektom automatyzacji domu, ktre ju teraz mona zrealizowa
stosunkowo niewielkim kosztem. W tym rozdziale przeanalizujemy
wyjtkowo ciekaw, byskawiczn ewolucj w dziedzinie mikrokontrolerw,
smartfonw i komputerw, aby na tej podstawie sprbowa przepowiedzie
przyszo tych technologii.
Zaczniemy od omwienia potencjalnych scenariuszy rozwoju technologii
Arduino, systemu Android i innych systemw operacyjnych w niedalekiej
przyszoci. W dalszej czci rozdziau podejmiemy prb rozszerzenia
naszych prognoz jeszcze o dekad, aby wyobrazi sobie technologie auto-
matyzacji domu, ktre bd nam towarzyszy w 2025 roku. Zwaywszy na
niesamowity postp technologii mobilnych w ostatnich dziesiciu latach,
nasze pomysy dotyczce przyszego rozwoju tych technologii szybko mog
si okaza zupenie pospolite. W rzeczywistoci wikszo proponowanych
scenariuszy mona by zrealizowa ju teraz (podczas implementacji tych
rozwiza bardzo pomocne byyby dowiadczenia zebrane w trakcie pro-
jektw opisanych w tej ksice). Zanim wybiegniemy dalej w przyszo,
warto przyjrze si rozwizaniom, ktre powinny zagoci na sklepowych
pkach ju w cigu roku.
256  11.1. Przyszo na wycignicie rki

11.1. Przyszo na wycignicie rki


Dziki otwartym rozwizaniom sprztowym przybiera na sile coraz wicej
firm rozszerza swoj ofert o odpowiednie produkty i usugi. Okazuje si
jednak, e take uznane technologie, jak Arduino czy Android, nie stoj
w miejscu. Obie te platformy doczekay si wanych aktualizacji w czasie, gdy
koczyem prac nad t ksik.
W tym podrozdziale omwimy zapowiedziane innowacje i usprawnienia,
ktre zostan wprowadzone w najbliszym czasie. Przeanalizujemy take
wpyw tych zmian na prac konstruktorw uywajcych tych technologii (na
przykad podczas realizacji projektw opisanych w tej ksice).

Arduino 1.0
Dokadnie w czasie, gdy pisaem ostatnie strony tej ksiki, zesp odpo-
wiedzialny za rozwj technologii Arduino zapowiedzia nadchodzce wyda-
nie wersji 1.0. W nowej wersji wprowadzono wiele daleko idcych zmian,
ktre z pewnoci wymusz odpowiednie dostosowanie istniejcego kodu.
Decyzja zespou rozwijajcego technologi Arduino bya o tyle ryzykow-
na, e istnieje mnstwo bibliotek, przykadw kodu, dokumentw, ksiek
i zapisw wideo przygotowanych przez samych uytkownikw dla wcze-
niejszych wersji tej technologii. Nie inaczej jest w przypadku tej ksiki.
Po spopularyzowaniu standardu Arduino 1.0 opisane projekty i ich za-
lenoci (w formie bibliotek) z pewnoci bd wymagay modyfikacji pod
ktem zmian wprowadzonych w tym standardzie. Najwaniejsze spord
wprowadzonych zmian opisano poniej:
Rozszerzenia plikw szkicw zmieniono z .pde na .ino. Zdecydo-
wano si na t zmian, aby unikn mylenia tych szkicw ze szkica-
mi jzyka Processing, ktre take s zapisywane w plikach z roz-
szerzeniem .pde.
Biblioteka Ethernet platformy Arduino bdzie oferowaa rdzenn
obsug systemu DNS i protokou DHCP. Takie rozwizanie
znacznie uatwi przypisywanie adresw IP.
Klasa String zostaa zoptymalizowana, dziki czemu wymaga
mniejszej iloci zasobw i moe realizowa wicej zada, gene-
rujc mniejsze obcienie.
Klasa Serial oferuje teraz wicej funkcji do analizy skadniowej,
dziki ktrym moemy atwiej przeszukiwa dane i adowa wiele
bajtw do bufora. Opisana zmiana moe powodowa pewne
Rozdzia 11. Przysze projekty  257

problemy podczas stosowania istniejcego kodu. Problemy mog


mie zwizek na przykad ze stosowaniem operacji asynchronicz-
nych (niedostpnych lub nieuywanych w szkicach sprzed wydania
Arduino 1.0).
Take pozostae biblioteki wbudowane, na przykad te obsugujce
czytnik kart SD, zostay zaktualizowane z myl o uatwieniu
budowy zoonych szkicw bez obaw o niezawodno i wydajno
wewntrznych rozwiza.
Zmiany w samym rodowisku IDE s raczej kosmetyczne. Ogra-
niczono si do wprowadzenia nowych ikon, schematw kolorw
i wskanikw (na przykad paska postpu kompilacji), aby uno-
woczeni wygld rodowiska IDE i uatwi uytkownikom ko-
rzystanie z elementw interfejsu.
W nowej wersji zmieniono nazwy, zwracane typy i implementacje
wielu wanych klas funkcji (w tym podstawowych elementw bi-
blioteki Wired). Autorzy bibliotek bd jeszcze przez wiele mie-
sicy dostosowywa swj kod pod ktem wsppracy ze zmodyfi-
kowanymi rozwizaniami niskopoziomowymi.
Szczegowy wykaz zmian mona znale w odpowiednim wpisie na ofi-
cjalnym blogu technologii Arduino1. rodowisko programowania Arduino
IDE na szczcie jest na tyle autonomiczne i przenone, e instalacja
wielu rnych wersji na jednym komputerze nie stanowi adnego proble-
mu. Oznacza to, e moemy nadal uywa wczeniejszych wyda rodo-
wiska IDE (przynajmniej dopki niezbdne zalenoci nie zostan zaktuali-
zowane w celu zapewnienia zgodnoci z najnowszymi zmianami). Z czasem,
wraz z popularyzacj nowej wersji (najpewniej w cigu roku), coraz wicej
popularnych bibliotek uytkownikw doczeka si odpowiednich konwersji.
W tej sytuacji celem przyszych wyda tej ksiki bdzie wanie prezentacja
rozwiza (w tym kodu rdowego) zgodnych zarwno z nowym, jak i ze
starymi wydaniami tego rodowiska IDE.

Android@Home
Na konferencji Google IO w 2011 roku oficjalnie ogoszono powstanie
interfejsu Android Open Accessory API i zestawu narzdzi Android
Development Kit (ADK). Celem obu projektw byo zapewnienie dostpu

1
http://arduino.cc/blog/2011/10/04/arduino-1-0/
258  11.1. Przyszo na wycignicie rki

do tanich mikrokontrolerw, czujnikw i urzdze wykonawczych na po-


ziomie interfejsu API systemu operacyjnego Android. Uczestnicy konfe-
rencji otrzymali niestandardowe wersje pytek Arduino Mega z zainstalo-
wanymi podstawowymi czujnikami wskazania tych czujnikw mogli
odczytywa za porednictwem urzdze z systemem Android, na przykad
telefonu Google Nexus2. Na wspomnianej konferencji zasugerowano wiele
scenariuszy konfiguracyjnych moliwych dziki tej technologii. Jednym z nich
byo rozwizanie nazwane Android@Home. Zademonstrowano przykady
sterowania bezprzewodowym owietleniem, systemami domowej rozrywki
oraz urzdzeniami do wicze. Naley przypuszcza, e na konferencji
Google IO 2012 poznamy wiele dodatkowych rozwiza przygotowanych
przez niezalenych producentw.
Projekt Google@Home jest moliwy dziki zestawowi narzdzi ADK,
a sercem tej technologii jest specyfikacja sprztowa, ktra ma na celu wy-
znaczenie standardw komunikacji pomidzy urzdzeniami. System ope-
racyjny Android moe prawidowo reagowa na te komunikaty. Naley
oczekiwa, e za jaki czas, kiedy odpowiednie technologie sprztowe doj-
rzej i zyskaj na popularnoci, system operacyjny Android bdzie sterowa
prac duo wikszej liczby rnych urzdze, nie tylko telefonw. Firma
Google ma nadziej, e proponowane rozwizania z czasem zrewolucjoni-
zuj rynek automatyzacji domu warunkiem takiej rewolucji jest akcep-
tacja tej specyfikacji przez producentw urzdze domowych i dopuszcze-
nie do wzajemnej komunikacji tych urzdze.
Jako dowiadczony obserwator wielu podobnych prb wprowadzenia stan-
dardw automatyzacji domu w przeszoci nie wr temu projektowi wik-
szych szans jestem sceptyczny przede wszystkim z powodu maego (przy-
najmniej na razie) zainteresowania projektem Google@Home ze strony
innych firm ni Google. Wielu producentw prawdopodobnie przyjo
postaw wyczekiwania i ledzenia sytuacji, aby przystpi do projektu we
waciwym momencie. Nawet jeli projekt Android@Home nie zawadnie
sercami milionw konsumentw, jego wpyw na sfer automatyzacji urzdze
domowych bez wtpienia skoni konkurentw firmy Google (w szczeglno-
ci takich gigantw jak Apple i Microsoft) do bliszej analizy potencjau
tego rynku. Jednym z prawdopodobnych pierwszym obszarw, w ktrych
mona z powodzeniem stosowa tego rodzaju technologie, jest telewizja.

2
http://www.adafruit.com/products/191
Rozdzia 11. Przysze projekty  259

Przycisk Home w urzdzeniach firmy Apple


Wraz z wprowadzeniem technologii Siri w telefonie iPhone 4S firma Apple
skonstruowaa pewien metainterfejs ponad standardowym mechanizmem
wyszukiwania informacji interfejs, ktry nie potrzebuje przegldarki
internetowej do przegldania wynikw zapytania. Dla wacicieli wyszukiwa-
rek internetowych, w tym firm Google i Microsoft, nowa technologia oznacza
zasadnicz zmian, poniewa modele biznesowe ich wyszukiwarek polegaj
przede wszystkim na przeplataniu wynikw wyszukiwania z powizanymi
reklamami. W pewnych scenariuszach technologia Siri filtruje uzyskane
wyniki tekstowe przed ich gosowym przekazaniem uytkownikowi (robi to
na podstawie konwersacji z uytkownikiem, nie operacji na bazie danych),
eliminujc przy tym niechciane reklamy. Chocia nie mona wykluczy, e
pewnego dnia firma Apple zdecyduje si doda reklamy do konwersacji
prowadzonej przez technologi Siri i uytkownika (takie rozwizanie tech-
nicznie jest moliwe), w najbliszym czasie opisana technologia prawdo-
podobnie bdzie wolna od reklam. Ktr technologi wybierze uytkownik,
ktry ma do dyspozycji albo wpisanie na klawiaturze zapytania i uzyskanie
mnstwa linkw wymieszanych z reklamami, albo gosowe poproszenie
telewizora o informacj i otrzymanie precyzyjnej, jasnej odpowiedzi?
Firma Apple, podobnie jak firmy Google i Microsoft, zaprojektowaa do-
datkowo komputer, ktry nawizuje poczenie z telewizorem w celu stru-
mieniowej transmisji muzyki lub zapisw wideo. Jeli wierzy plotkom, na-
stpna generacja urzdzenia Apple TV umoliwi gosowe sterowanie telewi-
zorem z wykorzystaniem technologii Siri (bez uycia tradycyjnego pilota).
atwo sobie wyobrazi moliwo proszenia telewizora o wywietlenie
lokalnej prognozy pogody, odtworzenie albumu ulubionego wykonawcy, wy-
suchania i wysania odpowiedzi na wiadomo poczty elektronicznej oraz
to moliwe! nawizanie poczenia z pozostaymi urzdzeniami w domu
(zapewne iPhoneami i iPadami) w celu ich synchronizacji (za pored-
nictwem usugi iCloud) i wczenie do opisanej konwersacji. Trudno
oczekiwa, by firmy Google i Microsoft bezczynnie czekay na ruchy Ap-
ple przeciwnie, naley oczekiwa, e technologie rozpoznawania mowy
i ogromne zbiory danych zgromadzone na serwerach pozwol tym poten-
tatom pokona firm Apple przynajmniej w dziedzinie polece gosowych.
Jak nietrudno odgadn, inynierowie firmy Apple stale poszukuj sposo-
bw bardziej cisego zwizania swojej platformy z urzdzeniami domo-
wymi. Firma Apple wci nie ujawnia swoich planw dotyczcych rynku
domowych urzdze konsumenckich, ktre w przyszoci bd konkuroway
260  11.2. Prognoza dugoterminowa

z technologi Android@Home firmy Google i pochodnymi urzdzenia


Kinect firmy Microsoft. Ewentualna propozycja firmy Apple z pewnoci
wzbudzi ogromne zainteresowanie i bdzie si cieszya sporym wsparciem
ze strony programistw.

11.2. Prognoza dugoterminowa


Mimo e wszystkie te rozwizania projektowane z myl o uatwieniu na-
szego codziennego ycia s naprawd wspaniae, podstawowym warunkiem
funkcjonowania tych technologii jest energia elektryczna. atwo sobie wy-
obrazi wzrost zapotrzebowania na zasoby naszej planety, gdyby kady mia
ochot i moliwo automatyzacji swojego domu. Miejmy nadziej, e na-
stpne pokolenie przedsibiorcw osignie w dziedzinie gromadzenia i dys-
trybucji energii rwnie wiele jak moje pokolenie osigno na polu kom-
puterw i globalnej komunikacji. Inteligentne sieci elektroenergetyczne,
odnawialne rda energii i coraz wiksze poszanowanie dla rodowiska
bd rwnie wane dla przyszych systemw automatyzacji jak niedrogie
czujniki, standardowe protokoy i wszechobecna, bezpieczna komunikacja
bezprzewodowa.
Zwaywszy na problemy z dostpem do energii elektrycznej, mona przy-
j, e coraz wiksz popularnoci bd si cieszyy czujniki i systemy
przekazywania komunikatw o niskim poborze energii. Ile wspczesnych
komputerw, monitorw, zegarw, radioodbiornikw, telefonw, tabletw
i konsol do gier stale podczamy do gniazdek elektrycznych w naszym domu?
Jeszcze czterdzieci lat temu lista takich urzdze bya nieporwnanie krt-
sza i obejmowaa gwnie lampy, lodwki, czasem telewizor i gramofon,
kilka radioodbiornikw i zegar. Po zaledwie czterdziestu latach w wielu do-
mach kade pomieszczenie zawiera przynajmniej kilka urzdze elektrycz-
nych, ktre w dodatku stale komunikuj si z innymi urzdzeniami. Scen-
tralizowane usugi monitoruj przekazywane komunikaty w celu wykrywania
wanych zdarze i waciwego reagowania na sytuacj. Jak podobne syste-
my bd dziaay w przyszoci?

Dom jako komputer


Wyobramy sobie sytuacj, w ktrej wybieramy jeden z projektw opisa-
nych w tej ksice i rozszerzamy odpowiedni system, tak aby obejmowa
wszystkie pomieszczenia w naszym domu. Automatyzacja jest dosownie
Rozdzia 11. Przysze projekty  261

wszdzie, a w powietrzu a roi si od komunikatw przesyanych do ser-


wera w celu dalszego przetworzenia. Sam serwer moe mie posta wirtual-
nego serwera prywatnego dziaajcego w chmurze lub magistrali komunika-
tw zarzdzanej przez zewntrznego usugodawc. Taki dom moe by-
skawicznie informowa domownikw o wanych zdarzeniach i jednoczenie
wykrywa obecno mieszkacw domu, aby na tej podstawie dostosowywa
swoje reakcje na spywajce komunikaty. Systemy rozpoznawania obrazw
i gosu bd potrafiy okrela tosamo osb przebywajcych w domu
i dostosowywa usugi automatyzacji do preferencji tych osb. ycie w ro-
dowisku wypenionym rozmaitymi czujnikami bdzie rwnie naturalne i bez-
problemowe jak dodawanie wpisw na Twitterze za pomoc telefonu. Gro-
madzone dane bd analizowane i dostosowywane do stylu ycia domow-
nikw. Dom bdzie w stanie przewidywa nasze czynnoci i zachowania
na podstawie takich czynnikw zewntrznych jak pora roku, pora dnia, pogo-
da, dostarczone przesyki, charakter goci przebywajcych w domu, du-
go wizyty, preferowane tryb i forma cyfrowej rozrywki oraz czstotliwo
i sposb filtrowania komunikatw ostrzegawczych.

System zainstalowany w materacu


Czci elektroniczne s coraz tasze. Jeli porwnamy cen pytki Arduino
(dostpnej za okoo 100 zotych) do kosztu komputera sprzed dziesiciu
lat, ktry oferowa identyczn moc obliczeniow, nietrudno sobie wyobra-
zi moliwoci sprztu dostpnego za jeszcze mniejsze pienidze w nieda-
lekiej przyszoci. Wystarczy poczy te mikrokontrolery z jeszcze taszymi
czujnikami, aby stworzy dom peen punktw gromadzenia i przetwarzania
informacji. Po naszym wyjciu dom przejdzie w stan upienia, w ktrym
bdzie zuywa tylko tyle energii elektrycznej, ile potrzebuje do utrzymania
gotowoci.
W czasie snu czujniki nacisku zainstalowane w naszym ku okrel, czy
mielimy spokojny sen, i na tej podstawie dostosuj dwik budzika, ktry
obudzi nas rano. Jeli we wszystkich drzwiach wewntrznych bd zainsta-
lowane czujniki, dom zarejestruje wzorce poruszania si pomidzy pokojami
i na tej podstawie bdzie mg z wyprzedzeniem wcza wiata i uywane
urzdzenia.
Dom bdzie pamita, e na przykad we wszystkie dni robocze wstajemy
do pracy o 6 rano, bierzemy prysznic, aby po 30 minutach uda si do kuch-
ni na filiank kawy. Zaraz po uruchomieniu budzika system moe odkr-
ci wod pod prysznicem, aby miaa odpowiedni temperatur w momencie,
262  11.3. Dom przyszoci

w ktrym wejdziemy do kabiny. W czasie, w ktrym bdziemy si ubiera,


ekspres bdzie dla nas parzy wie kaw, tak aby bya gotowa, kiedy wej-
dziemy do kuchni. Dom bdzie te wiedzia, e w soboty pimy do 8, zatem
nie bdzie powtarza opisanej procedury w weekend wszystkie urzdzenia
domowe zwizane z budzeniem domownikw bd dziaay w trybie stero-
wania rcznego. Opisany scenariusz mona zaprogramowa i zaimplemen-
towa ju dzisiaj przy uyciu narzdzi i technologii, ktrymi posugiwalimy
si podczas realizacji projektw opisanych w tej ksice. Spadek cen elek-
troniki, rozwj technologii przetwarzania sygnaw generowanych przez
czujniki w chmurze i postpujca standaryzacja interfejsw spowoduj, e
coraz wicej osb bdzie oczekiwao realizacji podobnych scenariuszy.

11.3. Dom przyszoci


Jak kady pasjonat nowych technologii lubi wyobraa sobie prawdopodob-
ne scenariusze rozwoju istniejcych rozwiza w przyszoci. Jako pragma-
tyczny programista wiem jednak, e tego rodzaju wizje nie mog si speni
w cigu jednej nocy. Warunkiem postpu s przyrostowe zmiany i uspraw-
nienia w wielu powizanych dziedzinach. Wszystkie te doskonalone usu-
gi, wynajdywane technologie i odkrycia w pewnym momencie osigaj punkt
krytyczny i jako takie wpywaj na bieg historii.
W swoim yciu miaem szczcie uczestniczy w trzech wielkich rewolucjach
technologicznych. Pierwsza z nich polegaa na wprowadzeniu i byskawicznej
ewolucji komputera osobistego w latach osiemdziesitych ubiegego wieku.
Drug rewolucj bya prawdziwa eksplozja popularnoci internetu w latach
dziewidziesitych ubiegego wieku, za trzecia rewolucja polegaa na
byskawicznym rozwoju urzdze mobilnych w pierwszej dekadzie XXI
wieku.
Rozmaite technologie z czasem spotykaj si w jednym punkcie. Przetwarza-
nie w chmurze, superkomputery wielkoci telefonu z dostpem do internetu,
niedrogie czujniki przystosowane do komunikacji sieciowej, autonomiczne
sterowniki, tanie noniki danych i krtsze cykle przetwarzania z czasem
doprowadz do nowej, rwnie niezwykej ery w historii przetwarzania infor-
macji. Po uwzgldnieniu wszystkich tych czynnikw decydujcych o rozwoju
technologii przygotowaem opis typowego popoudnia mionika technologii
w 2025 roku (patrz rysunek 11.1 zatytuowany Bardziej inteligentny dom
ok. roku 2025).
Rozdzia 11. Przysze projekty  263

Rysunek 11.1. Bardziej inteligentny dom ok. roku 2025

Po powrocie do domu po dugim dniu w pracy Magda aktywuje zamek


w drzwiach obsugiwanych bez uycia kluczy. Zdarzenie otwarcia drzwi jest
zapisywane (wraz z odpowiednim zapisem wideo) w bezpiecznym banku
danych w chmurze. Na podstawie wsprzdnych systemu GPS telefon
Magdy wczy w domu klimatyzacj na dwadziecia minut przed jej wej-
ciem do domu. W momencie przybycia do domu temperatura wewntrz
jest identyczna jak wtedy, gdy rano wychodzia do pracy.
Na schodach czeka paczka zawierajca rczniki papierowe, ktre zostay
automatycznie zamwione w momencie wykrycia koczcego si zapasu
w podajniku jednorazowych rcznikw. Komunikat potwierdzajcy dostar-
czenie przesyki automatycznie zeruje licznik tego podajnika, dziki czemu
dalsze zamwienia nie s wysyane.
Magda ma ze sob torb z zakupami, ktre zrobia na podstawie listy wy-
generowanej przez lodwk. Czujniki w lodwce wykryy, e jutro upywa
termin przydatnoci do spoycia pomidorw, zatem Magda postanowia
kupi dodatkowe skadniki potrzebne do przygotowania sosu spaghetti.
Podczas przygotowywania posiku i nalewania do garnka wody na maka-
ron spaghetti czujniki zainstalowane w kranie monitoruj czysto wody.
264  11.3. Dom przyszoci

W razie wykrycia jakiej anomalii system automatycznie wysya odpowiedni


komunikat do wydziau gospodarki wodnej urzdu miasta.
Po obiedzie Magda postanawia troch powiczy na swoim stacjonarnym
symulatorze roweru. Magda zwykle spotyka o tej porze znajomego pod-
czas przejadki po drodze prowadzcej przez preri. Zakada wic su-
chawki ledzce ruch w trzech wymiarach, wcza list ulubionych utworw
i zaczyna pedaowa. Zestaw suchawkowy zawiera wbudowane czujniki
pulsu, cinienia krwi i pocenia si monitorowane wartoci s wywie-
tlane ponad sielankow scen powoli mijanych pagrkw i koyszcego si
zboa. Po kilku minutach awatar znajomego Magdy pojawia si obok niej
i wysya sygna sprawdzajcy, czy Magda jest zainteresowana rozmow
w czasie rowerowej przejadki. Magda potwierdza zainteresowanie roz-
mow, zatem oboje wsplnie spdzaj nastpne p godziny na przejadce
i pogawdce. Na kocu przejadki kady rowerzysta otrzymuje 200 punk-
tw energii, ktre s doliczane do sieci elektroenergetycznej zasilanej midzy
innymi przez rowery treningowe.
Fotokomrki zainstalowane w oknach wykrywaj zmierzch, co powoduje
odpowiednie przygotowanie owietlenia domu, w tym zasunicie zason
i aktywacj czujnikw ruchu w poszczeglnych pokojach. Dawno miny
czasy, w ktrych trzeba byo cigle wcza i wycza wiato oraz mona
byo omykowo zostawi zapalone wiato w pustym pokoju. System oferuje
jeszcze specjalny tryb na czas wizyty goci, jednak przez wikszo czasu
czujniki ruchu w zupenoci wystarczaj do wczania i wyczania wiata
zalenie od obecnoci domownikw w poszczeglnych pomieszczeniach.
Opisana strategia zarzdzania owietleniem ma niemay wpyw na wysoko
rachunkw za energi elektryczn.
Magda siada przed telewizorem, aby odpocz. Prosi telewizor o list no-
wych zapisw wideo polecanych przez jej znajomych. Sterowanie gosem
jest teraz czym zupenie naturalnym w przypadku urzdze przekazujcych
treci. Udao si take udoskonali algorytmy filtrowania treci i identyfikacji
samych uytkownikw. Podczas odtwarzania sekwencji klipw wideo na
ekranie jest prezentowany take biecy status Magdy i jej znajomych, lista
komunikatw, prognoza pogody i lista najbliszych programw (zapisw
wideo). Magda w kadej chwili moe zada wywietlenia wybranych in-
formacji. Na podstawie prognozy pogody Magda decyduje, co ubierze na
siebie jutro. Poniewa zblia si ciepy front atmosferyczny, wieszaki w garde-
robie Magdy s ustawiane w taki sposb, aby odpowiednie ubrania byy do-
Rozdzia 11. Przysze projekty  265

stpne na wycignicie rki. System moe zarzdza ubraniami, poniewa


w kadym wieszaku zainstalowano czujnik RFID. Jutro ma by ciepo
i sonecznie.
Mam nadziej, e spodobaa Ci si moja wizja przyszoci. Czytelnicy,
ktrzy wol sami wyznacza kierunki rozwoju technologii zamiast czeka
na to, co przyniesie przyszo, mog ju teraz zbudowa podobny system
automatyzacji domu za pomoc dostpnych rozwiza. Odpowiednie
poczenie efektywnych kosztowo technologii, prostej implementacji, oka-
zyjnych zakupw, akcji marketingowych i wyboru waciwego momentu
spowoduje, e kto kiedy zrealizuje ten futurystyczny scenariusz, na zawsze
zmieniajc sposb interakcji ludzi z ich domami. Tym kim moesz by
wanie Ty!
266  11.3. Dom przyszoci
Rozdzia 12.
Wicej pomysw
na projekty

S
koro dysponujemy ju niezbdnymi podstawami, moemy wykorzysta
zebrane dowiadczenia w zakresie projektowania i konstruowania sys-
temw automatyzacji domu do tworzenia wasnych projektw. W tym
niedugim ostatnim rozdziale krtko przeanalizujemy pomysy na alterna-
tywne wykorzystanie elementw i urzdze, ktrych uywalimy w projektach
opisanych w tej ksice.
Czytelnicy, ktrzy zbudowali wszystkie projekty opisane w tej ksice, ju
teraz dysponuj wikszoci sprztu potrzebnego do realizacji pomysw
prezentowanych w tym rozdziale. Moemy take wykorzysta kod rdo-
wy tych projektw w wielu przypadkach wystarczy wprowadzenie kilku
drobnych zmian. Przeanalizujmy teraz kilka dodatkowych sposobw na
zaprogramowanie domu.

12.1. Wykrywacz baaganu


Masz maonka, dzieci lub partnera, ktrzy za adne skarby nie potrafi utrzy-
ma porzdku? Niezalenie od tego, jak czsto sprztasz, w domu stale
jest brudno? Kada wolna, posprztana przestrze natychmiast przyciga
stare gazety, ulotki reklamowe, puste opakowania, brudne ubrania, tekturo-
we kartony i rozmaite inne mieci? Wanie z myl o takich przypadkach
268  12.2. Monitor zuycia energii elektrycznej

powstaa koncepcja nowatorskiego systemu wykrywacza mieci przy uyciu


czujnika odlegoci (dalmierza) na podczerwie1.
Czujnik naley skierowa w stron pustej przestrzeni, aby zmierzy jego
wskazania dla posprztanego pomieszczenia. Pojawienie si mieci spowo-
duje, e odlego wskazywana przez dalmierz bdzie mniejsza. Wykrycie
mieci powinno powodowa wysanie wiadomoci poczty elektronicznej do
wsplokatorw podejrzewanych o miecenie z daniem usunicia mieci
z obszaru monitorowanego przez czujnik. To do projektanta naley okre-
lenie agresywnoci systemu rozumianej jako czstotliwo wysyania tych
powiadomie. Po usuniciu mieci system moe wysa (w imieniu domu)
wiadomo z podzikowaniami za przywrcenie porzdku.

12.2. Monitor zuycia


energii elektrycznej
Jeli wykorzystamy nieco zmodyfikowan koncepcj znan z urzdzenia
Tweet-A-Watt firmy Adafruit2 do budowy wykrywacza przepywu prdu
elektrycznego (nazwanego na przykad Kill-A-Watt), bdziemy mogli mie-
rzy zuycie energii elektrycznej przez takie urzdzenia jak lodwka czy
telewizja.
Niektrzy dostawcy energii elektrycznej ju teraz oferuj swoim klientom
moliwo ledzenia danych o zuyciu energii (zwykle w formie miesicz-
nych statystyk). Odpowiednie dane s przewanie dostpne na stronach
internetowych dostawcw na podstawie tych danych i wskaza naszego
urzdzenia mona obliczy procentowy udzia monitorowanych urzdze
w cznym zuyciu energii przez gospodarstwo domowe. Miesiczny rachu-
nek za energi elektryczn pozwoli nam dodatkowo obliczy koszt funk-
cjonowania wybranych urzdze w cigu miesica, doby i godziny. Wielu
uytkownikw bdzie zaskoczonych, kiedy odkryj, ile pienidzy wydaj
na ogldanie telewizji przez kilka godzin dziennie lub ile naprawd kosz-
tuje funkcjonowanie zamraarki, ktr kupili po okazyjnej cenie w jakiej
wyjtkowej promocji.

1
http://www.adafruit.com/products/164
2
http://www.adafruit.com/products/143
Rozdzia 12. Wicej pomysw na projekty  269

12.3. Elektryczny strach na wrble


Masz problem ze zwierztami, ktre regularnie nawiedzaj Twj ogrdek
warzywny? Nieproszonych goci mona si pozby, stosujc odpowiednie
technologie. Zapomnijmy o malowniczych, ale bezuytecznych, statycznych
strachach na wrble jeli maj skutecznie spenia swoj funkcj, musz
sprawia wraenie ywych (dziki czujnikowi ruchu i mocnym silnikom).
Kiedy ten nieznony krlik znowu wpadnie do naszego ogrdka, aby urz-
dzi sobie kolacj z naszych warzyw, czujnik ruchu wykryje nieproszonego
gocia i oywi stracha na wrble. Strach bdzie teraz porusza ramionami
i nogami na tyle sugestywnie, aby skutecznie przestraszy krlika. Po wykry-
ciu ruchu strach na wrble moe te robi zdjcia za pomoc telefonu z sys-
temem Android zainstalowanego w gowie stracha uzyskane w ten sposb
zdjcia zwierzt mona bez trudu wysya za porednictwem poczty elek-
tronicznej.

12.4. Pilot systemu domowej rozrywki


Warto rozway rozbudow serwera na bazie frameworku Rails, ktrego
uylimy w projekcie internetowego wcznika wiata, o mechanizm prze-
syania polece w formie sygnaw wiata podczerwonego za porednic-
twem portu szeregowego poczonego z pytk Arduino, do ktrej z kolei
podczono podczerwon diod LED3. Podczas budowy systemu przesya-
nia sygnaw za porednictwem wiata podczerwonego warto skorzysta
z zalece Maika Schmidta opublikowanych w ksice Arduino: A Quick
Start Guide [Sch11]. Podczerwone diody LED naley zainstalowa
w przedniej czci wszystkich sterowanych w ten sposb urzdze systemu
rozrywki, czyli na przykad telewizorw i wzmacniaczy audio. Naley te
opracowa przyjazny interfejs uytkownika aplikacji klienckiej systemu
iOS lub Android bd poczy interfejs uytkownika tego projektu z inter-
fejsem programu klienckiego ktrego z wczeniejszych projektw (na przy-
kad z interfejsem aplikacji otwierajcej drzwi z poziomu systemu Android).

3
http://www.adafruit.com/products/387
270  12.6. Sterowanie nawadnianiem za pomoc czujnika wilgotnoci

12.5. Wycznik urzdze domowych


na czas snu
Czy ktremu z czonkw rodziny zdarza si zasn podczas ogldania tele-
wizji? Zapominasz wyczy na noc prdoerny, czterordzeniowy komputer?
A moe kto zapomnia zgasi wiato w piwnicy? Jeli tak, warto napisa
skrypt, ktry wyczy wiata, urzdzenia i komputery w czasie, gdy wszy-
scy domownicy powinni spa. Jeli komputer obsuguje standard Wake-On-
LAN (WOL), wystarczy utworzy skrypt wysyajcy pakiet z daniem
zakoczenia pracy. wiata mona zgasi za pomoc odpowiednich polece
narzdzia heyu i przecznikw X10. Telewizory i systemy stereo mona
wyczy przy uyciu pilota do systemu domowej rozrywki. Do wyczania
wszystkich pozostaych urzdze mona uy przecznika przekanikowego
PowerSwitch Tail. System pozwoli zaoszczdzi troch pienidzy, ogra-
niczy emisj dwutlenku wgla i ochroni planet w czasie naszego snu.

12.6. Sterowanie nawadnianiem


za pomoc czujnika wilgotnoci
Warto podczy do pytki Arduino czujnik temperatury i wilgotnoci
DHT22 oraz silnik krokowy sterujcy kranem doprowadzajcym wod do
wa ogrodowego, ktry z kolei zasila zraszacze trawnika4. Po wykryciu wy-
sokiej temperatury i niskiej wilgotnoci utrzymujcej si przez okrelony czas
system powinien otworzy zawr kranu zasilajcego w ogrodowy i dalej
zraszacze. Po dziesiciu minutach system powinien ponownie odci do-
pyw wody do zraszaczy. Na podstawie czasu podlewania mona obliczy
objto zuytej wody. W tym celu naley najpierw obliczy liczb sekund
potrzebnych do napenienia litrowego zbiornika po otwarciu zaworu przez
silnik krokowy.
Jeli na przykad wypenienie zbiornika zajmuje trzydzieci sekund, mo-
emy przyj, e w kadym cyklu zraszacze pracujce przez dziesi minut
zuyj dwadziecia litrw (dwa litry na minut razy dziesi minut). Warto
rejestrowa dane o iloci zuytej wody za pomoc moduu komunikacji
bezprzewodowej XBee i komputera PC (na przykad w formie z rozdziau
5. zatytuowanego wierkajcy karmnik dla ptakw), aby po miesicu

4
https://www.adafruit.com/products/385
Rozdzia 12. Wicej pomysw na projekty  271

oceni, jaki procent wody zuywamy na podlewanie trawnika. Po skalibro-


waniu tych wartoci moemy oblicza koszty zraszania trawnika w czasie
rzeczywistym, aby na bieco obserwowa odpyw pienidzy przez otwarty
kurek.

12.7. Czujniki dymu przystosowane


do komunikacji sieciowej
Czujniki dymu nie tylko ratuj ycie, ale te pomagaj minimalizowa straty
materialne. Takie czujniki s jednak nieskuteczne, jeli nikt nie syszy alar-
mu (jeli na przykad nikogo nie ma w domu). Czytelnicy dysponujcy od-
powiedni wiedz mog podczy przewody bezporednio do elektroniki
czujnika, aby mierzy zmiany napicia w momencie uruchomienia alarmu.
Warto jednak pamita, e taka ingerencja w urzdzenie najprawdopodob-
niej naruszy warunki gwarancji czujnika. Co wicej, nieprawidowo prze-
prowadzone zmiany mog naraa na ryzyko ycie i zdrowie osb, ktrych
bezpieczestwo zaley od prawidowego dziaania tego czujnika. Zamiast
przylutowywa przewody bezporednio do pytki elektronicznej czujnika
dymu warto kupi ukad mikrofonowy Electret, po czym wykorzysta do-
wiadczenie w komunikacji systemu Arduino i moduw XBee do po-
czenia elementw projektu, kalibracji wartoci progowych i monitorowania
danych wejciowych mikrofonu pod ktem poziomu gonoci powodowa-
nego przez alarm5. W momencie wykrycia alarmu komputer PC, ktry
otrzyma odpowiedni komunikat za porednictwem moduu XBee, powinien
wygenerowa i wysa wiadomo poczty elektronicznej alarmujc waci-
ciela domu. Mona by nawet zmodyfikowa aplikacj serwera dla systemu
Android (patrz rozdzia 9. zatytuowany Zamek do drzwi sterowany
przez Androida), aby system robi zdjcie obszaru monitorowanego przez
czujnik dymu i docza fotografi do wysyanego komunikatu.
Komunikat alarmowy moe powodowa dodatkowe dziaania, na przykad
automatyczne dzwonienie do ssiadw i odtwarzanie przygotowanej wia-
domoci z prob o sprawdzenie, czy w naszym domu nie wybuch poar
(na wypadek, gdybymy nie otrzymali lub nie mogli przeczyta wiadomoci
poczty elektronicznej). Konstruktorzy absolutnie pewni niezawodnoci tego
systemu mog zaimplementowa system automatycznego wzywania stray
poarnej, jeli alarm nie zostanie zdezaktywowany w okrelonym czasie

5
http://www.sparkfun.com/products/9964
272  12.9. Inteligentny sterownik klimatyzacji i wentylacji

(musimy jednak mie na uwadze, e nieuzasadnione wzywanie sub ratow-


niczych moe si wiza z powanymi kosztami, poniewa faszywe alarmy
zwykle s surowo karane). Niezalenie od zastosowanych rozszerze naj-
waniejsz zalet tego projektu jest moliwo alarmowania praktycznie
caego wiata o wykrytym niebezpieczestwie dziki poczeniu zwykego
czujnika z urzdzeniami obsugujcymi komunikacj z internetem.

12.8. Zblieniowy mechanizm


otwierania bramy garaowej
Kiedy zbliamy si ze smartfonem wyposaonym w modu GPS do naszego
garau, telefon wysya danie otwarcia bramy garaowej. Odpowiedni
sygna trafia do pytki Arduino z moduem XBee podczonej do radiowe-
go pilota napdu bramy garaowej, ktry z kolei wysya sygna do waci-
wego urzdzenia podnoszcego bram.
Otwieranie drzwi garaowych za pomoc smartfonw z systemami An-
droid i iOS jest moliwe take bez odwoa do pozycji GPS rozwizania
tego typu nale do najpopularniejszych projektw zrb to sam (wiele
filmw prezentujcych realizacj tej koncepcji opublikowano w serwisie
YouTube). Poniewa gara jest statyczn konstrukcj, wartoci okrelajce
wysoko i szeroko geograficzn oraz pooenie wzgldem poziomu morza
pozostaj stae. Implementacja mechanizmu otwierania i zamykania bramy
garaowej na podstawie pooenia smartfonu nie powinna nam sprawi due-
go problemu wystarczy rozszerzenie serwera na bazie frameworku Rails
z rozdziau 7. zatytuowanego Internetowy wcznik wiata.

12.9. Inteligentny sterownik


klimatyzacji i wentylacji
Klimatyzacj i ogrzewaniem domu mona sterowa za pomoc nieporw-
nanie bardziej inteligentnego systemu ni tradycyjne sterowniki. Moemy
na przykad zwiksza i zmniejsza ustawienia termostatu na podstawie
biecej godziny lub wedug polece wysyanych za porednictwem zdalne-
go urzdzenia. Ben Heckendorn, prowadzcy program The Ben Heck
Show, nagra kiedy odcinek powicony takiemu projektowi6. Podoba mi

6
http://revision3.com/tbhs/homeauto
Rozdzia 12. Wicej pomysw na projekty  273

si sposb prezentacji projektu przez Bena, poniewa nie zanudza widzw


szczegami budowy samego termostatu. Co wicej, w projekcie zastosowa-
no czci, ktrych sami uywalimy w rozdziale 8. zatytuowanym Auto-
matyzacja dziaania zasony, zatem budowa i implementacja tego pro-
jektu nie powinny nam sprawi adnego problemu.

12.10. Inteligentna skrzynka na listy


Take budowa inteligentnej skrzynki na listy naley do najbardziej popular-
nych projektw zrb to sam, na temat ktrych napisano mnstwo artykuw
i opublikowano w internecie mnstwo zapisw wideo. Wystarczy ponownie
wykorzysta sprzt, ktrego uylimy w rozdziale 5. zatytuowanym wier-
kajcy karmnik dla ptakw, aby w momencie wykrycia przez fotokomrk
wiata docierajcego do wntrza skrzynki na listy opublikowa wpis na
Twitterze lub wysa wiadomo poczty elektronicznej. Warto te rozway
zastosowanie urzdzenia z systemem Android i syntezatorem mowy (patrz
rozdzia 10. zatytuowany Dajmy przemwi naszemu domowi), aby po
wykryciu listu system informowa nas na gos: masz now poczt.

12.11. Inteligentne owietlenie


Projekt opisany w rozdziale 7. zatytuowanym Internetowy wcznik wia-
ta warto rozbudowa do postaci systemu zarzdzajcego owietleniem
w caym domu. Do aktywowania i dezaktywowania wiata w piwnicy, a-
zience i sypialni mona z powodzeniem uywa czujnikw ruchu. Zdarze-
nia wczania i wyczania wiate warto rejestrowa, aby nastpnie zestawi
czas owietlania poszczeglnych pomieszcze z miesicznym rachunkiem
za energi elektryczn.

12.12. Monitorowanie rde energii


zasilanych promieniami
sonecznymi i wiatrem
12.12. Monitorowanie rde energii

Szczliwcy, ktrzy dysponuj solarnymi lub wiatrowymi kolektorami ener-


gii pokrywajcymi cz zapotrzebowania na energi elektryczn, mog wyko-
rzysta kombinacj pytki Arduino, moduu XBee i komputera PC do
274  12.12. Monitorowanie rde energii

mierzenia zarwno energii generowanej przez te urzdzenia, jak i stanu


naadowania akumulatorw gromadzcych energi ze rde odnawialnych.
Tak skonstruowany system moe na przykad wysya wiadomoci poczty
elektronicznej z powiadomieniami o niskim stanie naadowania akumulato-
rw. Rejestrowanie dostpnych danych w duszym okresie pozwoli lepiej
zrozumie rnice dzielce poszczeglne miesice i tym samym skuteczniej
przewidywa efektywno poszczeglnych rde energii.
Czytelnikw, ktrym uda si zrealizowa te i inne projekty automatyzacji
domu, zachcam do dzielenia si swoimi dowiadczeniami i osigniciami
z pozostaymi czytelnikami jednym z miejsc, w ktrych mona opisywa
swoje pomysy, odkrycia i stworzone konstrukcje, jest forum tej ksiki. Do
zobaczenia na forum!
Dodatki
Dodatek A
Instalacja bibliotek
platformy Arduino

J
edn z najwikszych zalet rodziny produktw Arduino jest zastosowa-
nie otwartej platformy sprztowej. Oznacza to, e kady moe uczestni-
czy w procesie tworzenia i rozwijania bibliotek sprztowych i pro-
gramowych dla tej platformy. Takie biblioteki mona nastpnie atwo do-
cza do szkicw platformy Arduino, aby albo rozszerzy oferowane przez
ni funkcje i mechanizmy, albo (tak jest w wikszoci przypadkw) uatwi
samemu sobie pisanie szkicw.
Rozwizania opracowane przez spoeczno uytkownikw tej platformy
zostay wykorzystane w wielu projektach opisanych w tej ksice. Okazuje
si jednak, e instalacja nowych bibliotek platformy Arduino nie jest auto-
matyczna i nie sprowadza si do uruchomienia skryptu instalacyjnego.
Pliki bibliotek, ktre czsto s udostpniane w formie skompresowanych
archiww .zip, naley rozpakowa i umieci w folderze libraries rodowiska
programowania Arduino IDE. Pooenie tego folderu zaley od systemu
operacyjnego, w ktrym uruchamiamy rodowisko Arduino IDE.

A.1.1. System Apple OS X


1. Naley znale ikon platformy Arduino (zwykle znajduje si
w gwnym folderze /Applications).
278  Inteligentny dom

2. Ikon tej platformy naley klikn, przytrzymujc wcinity klawisz


Ctrl. Na ekranie zostanie wywietlone menu kontekstowe.
3. Z wywietlonego menu naley wybra opcj Poka zawarto pa-
kietu (Show Package Contents). Opcja spowoduje otwarcie folderu
zawierajcego zasoby danej aplikacji platformy Arduino.
4. Naley teraz przej do folderu Contents/Resources/Java/libraries.
5. Wanie do folderu libraries naley skopiowa pliki nowej biblioteki.
Pliki biblioteki mona te umieci w folderze Documents/Arduino/libraries
w katalogu domowym uytkownika.

A.1.2. System Linux


1. Naley okreli miejsce przechowywania rozpakowanych plikw
aplikacji platformy Arduino.
2. Naley przej do folderu libraries.
3. Do folderu libraries naley skopiowa pliki nowej biblioteki.

A.1.3. System Windows


1. Naley okreli miejsce przechowywania rozpakowanych plikw
aplikacji platformy Arduino.
2. Naley przej do folderu libraries.
3. Do folderu libraries naley skopiowa pliki nowej biblioteki.
Po skopiowaniu plikw biblioteki do odpowiedniego katalogu naley po-
nownie uruchomi rodowisko Arduino IDE, tak aby mona byo odwoywa
si do nowej biblioteki w kodzie szkicw.
Aby zainstalowa na przykad bibliotek CapSense na potrzeby projektu wier-
kajcego karmnika dla ptakw na komputerze z systemem Mac OS X firmy
Apple, naley najpierw rozpakowa plik CapSense.zip. Wypakowany folder
CapSense naley nastpnie umieci w folderze /Applications/Arduino/Contents/
Resources/Java/libraries. Naley teraz ponownie uruchomi rodowisko Ar-
duino IDE, a nastpnie utworzy nowy szkic platformy Arduino. W oknie
rodowiska Arduino IDE naley wpisa nastpujcy kod tego szkicu:
Dodatek A Instalacja bibliotek platformy Arduino  279

#include <CapSense.h>;
void setup() {}
void loop() {}

Naley klikn przycisk Verify dostpny na pasku narzdzi rodowiska


Arduino IDE. Jeli biblioteka CapSense zostaa skopiowana we waciwe
miejsce, powyszy szkic powinien zosta skompilowany bez adnych bdw.
280  Inteligentny dom
Dodatek B
Bibliografia

[Bur10] Ed Burnette, Hello, Android: Introducing Googles Mobile


Development Platform, Third Edition, The Pragmatic
Bookshelf, Raleigh i Dallas, 2010.
[CADH09] David Chelimsky, Dave Astels, Zach Dennis, Aslak Hellesy,
Bryan Helmkamp i Dan North, The RSpec Book,
The Pragmatic Bookshelf, Raleigh i Dallas, 2009.
[Fal10] Robert Faludi, Building Wireless Sensor Networks,
OReilly & Associates Inc., Sebastopol, 2010.
[LA03] Mark Lutz, Python. Wprowadzenie. Wydanie III,
Helion, Gliwice 2009.
[RC11] Ben Rady i Rod Coffin, Continuous Testing: with Ruby,
Rails, and JavaScript, The Pragmatic Bookshelf,
Raleigh i Dallas, 2011.
[Sch11] Maik Schmidt, Arduino: A Quick Start Guide,
The Pragmatic Bookshelf, Raleigh i Dallas, 2011.
[TFH09] David Thomas, Chad Fowler i Andrew Hunt,
Programowanie w jzyku Ruby. Wydanie II,
Helion, Gliwice, 2006.
282  Inteligentny dom
Skorowidz

A aplikacja kliencka, 220


poczenia, 198
ADK, 41, 195, 257 serwer WWW, 207
IOIO, 41 sterowanie, 202
adres IP, Patrz IP Development Tools Eclipse, 164
aktywacja dwucewkowa, 180 Eclipse, 163
Android, 27, 40, 162 intencja, 208
ADK, 41, 257 interfejs API, 258
Google@Home, 258 IOIO, 41
Android@Home, 40, 257 kod serwera, 207
ADK, 195 konfiguracja urzdzenia, 210
aparat, 214 okno dialogowe nowego projektu,
konfiguracja, 214 164
podgld zdjcia, 214
Open Accessory Development Kit,
aplikacja kliencka, 220
Patrz ADK
kod, 221
SDK, 41, 163
konfiguracja, 222
serwer WWW, 211
testowanie, 224
testowanie, 219
uprawnienia dostpu, 224
tworzenie, 211
zabezpieczenia, 221
statyczny adres IP, 209
AVD, 163
testowanie, 211
bezprzewodowe otwieranie drzwi,
tryb diagnostyczny, 206
195
284  Inteligentny dom

Android Nano, 95, 97


uprawnienia dostpu, 218 silnik krokowy, 173
wiadomoci e-mail, 216 czenie, 188
doczanie grafiki, 216 szkic, 42
X10, 167 struktura, 42
AppleScript, 240 TDD, 33
Editor, 240 Uno Ethernet, 54
syntezator mowy, 242 wiadomoci e-mail, 64
testowanie, 249 hosting, 64
Arduino, 31, 33, 37, 42 serwer poczty SMTP, 64
1.0, 256 wirtualny emulator, 43
ATMega 168/328, 42 wysyanie komunikatu, 70
biblioteki, 277 XBee, 43, 106, 130
instalacja, 277 zabezpieczanie powiadomie, 66
czujnik nacisku, 130 zasilanie, 122
czujnik pojemnociowy, 99, 100 Audacity, 84
czujnik ugicia, 53 automatyzacja domu, 25, 260
czenie, 55 zrb to sam, 27
Ethernet, 54 analiza inwestycji, 28
fotokomrka, 103 Android, 27
Fritzing, 31 protok komunikacji, 26
IDE, 57, 69, 257 standaryzacja, 26
Adapter USB, 155 TCP/IP, 27
LED Blink, 57 wysyania impulsw, 26
Linux, 69 warsztat, 30
Serial Monitor, 62 automatyczna zasona, 173
Upload, 62 budowa rozwizania, 177
Verify, 62 czci systemu, 175
Inkscape, 31 czujnik temperatury, 181
Integrated Development warto progowa, 186
Environment, Patrz IDE czujniki, 176
konfiguracja, 57 doczanie, 181
mechanizm przesyania polece, 269 instalacji, 187
modu fotokomrka, 177
dwikowy, 82 warto progowa, 185
MP3, 81 instalacja sprztu, 187
sieciowy, 67 lista komponentw, 174
Skorowidz  285

schemat pocze, 182 serwer WWW, 207


silnik krokowy testowanie, 219
instalacja, 188 testowanie systemu, 225
kalibracja, 188 biblioteka
programowanie, 179 AF_Wave, 85
sposb czenia, 179 AFMotor, 177, 179
szkic, 180, 182 android.net.wifi.WifiManager, 223
testowanie, 186 android.widget.Button, 223
wygld systemu, 189 Arduino Ethernet, 67
CairoPlot, 124
B Capacitive Sensing, 100
datetime, 120
baza danych, 114 Ethernet, 70
Debian, 114 interfejsu SPI, 67
packagedelivery, 135 IOIOLib, 202
deliverystatus, 136 java.io.InputStream, 165, 223
tracking, 136 java.net.URL, 165, 223
SQLite, 114, 134 MediaPlayer, 85, 86
sqlite3, 114, 135 os, 142
tweetingbirdfeeder, 115 packagetrack, 137, 142
birdfeeding, 115 Pyserial, 114, 118
seedstatus, 115 Python-Twitter, 114, 118
tworzenie, 114 serial, 120, 142
bezprzewodowe otwieranie drzwi, 194 Servo, 86
Android, 195 ServoTimer2, 86
aplikacja kliencka, 220 smtplib, 142
poczenia, 198 sqlite, 120
serwer WWW, 207 sqlite3, 142
budowa rozwizania, 197 suds, 138
IOIO, 195 sys, 142
instalacja systemu, 226 time, 142
lista komponentw, 195 twitter, 120
PowerSwitch Tail II, 194 wavehc, 85
przecznik przekanikowy, 194 Bluetooth, 232, 234
rozbudowa, 226 nawizywanie poczenia, 233
Perfect Paper Passwords, 227
schemat pocze, 201
286  Inteligentny dom

C elektryczny pies strujcy, 77, 81


budowa rozwizania, 80
czujnik lista elementw, 79
dymu, 271 monta, 90
nacisku, 126 PIR, 82
Arduino, 130 prbki dwikw, 83
czenie, 130 rozbudowa, 91
odlegoci, 268 schemat pocze, 82
pojemnociowy, 99 szkic, 85
Arduino, 99 testowanie, 89
budowa, 99
sposb podczenia, 99 F
zastosowania, 123
ruchu, 269 fotokomrka, 102, 177
temperatury, 181 Adruino, 103
warto progowa, 186 schemat pocze, 103
ugicia, 53 silnik krokowy, 181
Arduino, 53 warto bazowa, 105
montowanie, 72 warto progowa, 185
prg generowania zdarzenia, 58 zastosowania, 123
rozbudowa, 74 fotowoltaniczny system zasilania, 122
szkic, 58 Freemind, 31
tolerancja, 58 Fritzing, 31
wiadomo e-mail, 64
wykorzystanie, 74 G
wilgotnoci, 270
Gmail, 135
Google@Home, 258
D
DIY, 40 H
Django, 65
Heyu, 150
kod rdowy, 156
E x10.conf, 156
Eclipse, 163 Hyperterminal, 107
Electric Sheep, 199
Elektor Electronic Toolbox, 32
Skorowidz  287

I czujnik pojemnociowy, 98
budowa, 99
iCircuit, 32 programowanie, 99
IDE, 42, 57, 69, 257 fotokomrka, 102
Inkscape, 31 konfiguracja bazy danych, 114
internetowy wcznik wiata, 149 lista komponentw, 95
Android, 162 nasuchiwanie komunikatw, 119
testowanie, 167 publikowanie wpisw, 113
biecy stan wiata, 162 schemat pocze, 108
budowa rozwizania, 153 szkic, 109
kod klienta, 158, 162 Twitter, 94
testowanie, 161, 167 XBee, 95
lista komponentw, 151 zabezpieczenie urzdze, 121
czenie, 154 zasilanie, 122
rozbudowa, 170 fotowoltaniczne, 122
Ruby on Rails, 158 klucz
X10, 150 API, 118
CM11A, 155 konsumenta standardu OAuth,
IOIO, 195, 199 118
ADK, 41 tajnego tokenu dostpu, 118
IOIOLib, 202 tajny konsumenta, 118
schemat pocze, 201 kompilator, 156
serwer WWW, 212 komunikacja bezprzewodowa, 106
IP, 68, 209 Bluetooth, 234
przypisanie staego adresu, 68 Wi-Fi, 106
iPad, 32 XBee, 43, 106
Elektor Electronic Toolbox, 32 krok, 178
iCircuit, 32
iThoughts HD, 32 M
miniDraw, 32
MAC, 68
K metodyka wytwarzania sterowanego
testami, Patrz TTD
karmnik dla ptakw, 93 Minicom, 107
Arduino Nano, 95, 97 miniDraw, 32
budowa rozwizania, 98
czci systemu, 96
288  Inteligentny dom

modu monitorowanie, 85
dwikowy, 78 zasada dziaania, 84
AF_Wave, 85 pytki mikrokontrolerw, 37
Arduino, 82 Arduino, 37
czenie, 82 pojemno elektryczna, 99
prbki dwikw, 83 PowerSwitch Tail II, 194
szkic demonstracyjny, 85 powiadamianie o zdarzeniach, 230
zarzdzanie odtwarzaniem, 86 konfiguracja gonikw, 231
parowanie, 44 Bluetooth, 232
sieciowy, 67, 70 nawizywanie poczenia, 233
Arduino, 67 lista komponentw, 231
kodowanie, 67 mechanizm rozpoznawania mowy,
przypisanie adresu, 68 234
stay adres IP, 68 konfiguracja, 234
multimetr, 34 wczanie mwionych
komunikatw, 235
O wybr gosu, 237
rozbudowa, 250
open source, 31 syntezator mowy, 237, 240
Freemind, 31 kod, 242
Fritzing, 31 testowanie, 249
Heyu, 150 TTS, 230
Inkscape, 31 wewntrzny mikrofon, 238
kalibracja, 239
P protok komunikacji, 26
parowanie moduw, 44 SOAP, 138
pasywny czujnik ruchu na standaryzacja, 26
podczerwie, Patrz PIR TCP/IP, 27
Perfect Paper Passwords, 227 wysyania impulsw, 26
PHP, 64, 65 przecznik przekanikowy, 194
hosting, 64 Python, 33, 45
mail, 66 easy_install, 118
wiadomoci e-mail, 65 identyfikacja XBee, 143
pin, Patrz wtyk implementacja dostarczania paczek,
PIR, 77 139
instalacja, 90 testowanie skryptu, 144
czenie, 82
Skorowidz  289

implementacja procesw karmnika, Android, 211


113, 119 IOIO, 212
nasuchiwanie komunikatw, 119 testowanie, 219
os, 142 serwomotor, 78
packagetrack, 137, 142 moment obrotowy, 91
przetwarzanie komunikatw, 134 sterowanie, 86
publikowanie wpisw, 113 silnik krokowy, 173
Pyserial, 114, 118 aktywacja dwucewkowa, 180
python-fedex, 138 Arduino, 173
Python-Twitter, 114, 118 czenie, 188
serial, 142 fotokomrka, 181
smtplib, 142 kalibracja, 188
SQLite, 114 koo pasowe, 176
sqlite3, 142 instalacja, 188
suds, 138 krok, 178
sys, 142 liczba obrotw, 189
testy jednostkowe, 33 modu silnika, 190
time, 142 programowanie, 179
sposb czenia, 179
R zasada dziaania, 178
zastosowania, 190
realizacja projektw, 37 Simple Object Access Protocol,
Android, 40 Patrz protok SOAP
Arduino, 42 Siri, 259
bezpieczestwo, 47 SQLite, 114
elementy elektroniczne, 39 Manager, 116
oprogramowanie, 38, 45 Browse and Search, 121
urzdzenia wykonawcze, 38 sqlite3, 114, 135
XBee, 43 standard uwierzytelniania OAuth,
Ruby on Rails, 33, 65, 158 117
konfiguracja, 161 system powiadamiania o poziomie
RSpec, 33 wody, 51
Arduino, 55
S konfiguracja, 57
screen, 107, 134 budowa rozwizania, 55
Serial Monitor, 62 czujnik ugicia, 53, 55
serwer WWW, 207 diagram pocze, 56
290  Inteligentny dom

system powiadamiania o poziomie wody testowanie, 63


lista komponentw, 53 tolerancja, 58
czenie, 55, 71 uruchamianie, 62
modu sieciowy, 67 wiadomoci e-mail, 64
kodowanie, 67 hosting, 64
czenie, 67 serwer poczty SMTP, 64
rozbudowa, 74
spawik, 56 T
szkic, 56
TDD, 33
testowanie, 63, 71
testy jednostkowe, 33
tworzenie, 58
py.test, 33
uruchamianie, 62
token dostpu, 118
wiadomoci e-mail, 64
TTS, 230
szkic, 42, 56 Twitter, 93
#include, 42 dane uwierzytelniajce, 117
automatyczna zasona, 182 klucze, 118
testowanie, 186 nowe konto, 117
czujnik nacisku, 131, 132 publikacja wpisu, 117
testowanie, 133 Python, 113
warto progowa, 134
czujnik pojemnociowy, 100 U
doczanie bibliotek, 68
fotokomrka, 103 urzdzenia wykonawcze, 38
IDE, 42
modu sieciowy, 67 V
testowanie, 71
VPS, 65
wysyanie komunikatu, 70
monitorowanie czujnika PIR, 85
gwna ptla, 87
W
testowanie, 89 warsztat, 30
silnik krokowy, 180 pomieszczenie, 30
struktura, 42 wyposaenie, 30
ugicie czujnika, 58 wiadomoci e-mail, 64
konfiguracja portu szeregowego, Arduino, 64
59 czujnik ugicia, 64
prg generowania zdarzenia, 58 PHP, 64, 65
serwer poczty SMTP, 64
Skorowidz  291

wirtualne serwery prywatne, monitorowanie komunikacji, 157


Patrz VPE podczanie, 154
wtyk, 42 Firecracker, 152
wykrywacz dostarczania paczek, 125, Heyu, 150
131 modu sterownika, 152
budowa rozwizania, 128 problemy, 158
czci systemu, 127 protok, 158
czujnik nacisku, 126 zasada dziaania, 153
instalacja systemu, 145 x10.conf, 156
lista komponentw, 127 XBee, 43
czenie sprztu, 129 Arduino, 43, 106, 130
rozbudowa, 146 komunikacja radiowa, 43
schemat pocze, 130 moliwoci, 106
testowanie skryptu, 144 nadajnik radiowy, 95
testowanie szkicu, 133 parowanie moduw, 44
schemat czenia, 106
X
X10, 150
AM486 Appliance, 157
Android, 167
CM11A, 152, 155
adapter USB, 154
Arduino, 154
interfejs, 154