Programowanie

Domofon z powiadomieniem e-mailowym

Uruchomiłem już “internetowy domofon”. Za każdym razem gdy ktoś przy furtce wciśnie przycisk domofonu, dostaję powiadomienie e-mailowe z linkiem do zdjęcia drogiego gościa. Ponieważ w telefonie używam K-9 mail z obsługą IMAP IDLE, jako programu pocztowego, więc mail dociera do mnie w ciągu kilku sekund. Dzięki temu wiem, kiedy ktoś mnie odwiedza a nie ma mnie w domu. Gdy przyjdzie ktoś znajomy, mogę zadzwonić i powiedzieć, żeby poczekał, bo właśnie wracam do domu. Wkrótce będę mógł też otworzyć z telefonu furtkę i wpuścić gościa na posesję. Podobnie w przypadku śmieciarzy, gdy przyjadą odebrać śmieci, a furtka będzie zamknięta. Gdyby natmiast ktoś chciał się włamać, to istnieje pewne prawdopodobieństwo, że zadzwoni wpierw domofonem, żeby upewnić się, że nikogo nie ma w domu - wtedy jego zdjęcia trafią bezpiecznie na serwer internetowy poza domem.

Programowanie Arduino, czyli nauka podlewania

Mamy już gotową część sprzętową systemu nawadniania i wiemy jak będzie się komunikować z systemem narzędnym działającym na bazie OpenWRT. Pora zabrać się za oprogramowanie. Przygotowując je należy pamiętać, że posłuży ono za podstawę budowy kolejnych elementów inteligentranego domu (lub jak kto woli, automatyki domowej). Poza tym system podlewania także ma dodatkowe funkcje, co trzeba przewidzieć.

Podsumujmy, co jest do zrobienia:

  1. Obsługa Ethernet Shield
  2. Klient www na potrzeby zgłaszania zdarzeń do systemu nadrzędnego (mastera)
  3. Obsługa serwera www - do przyjmowania komunikatów
  4. Sterowanie czterema przekaźnikami (dwa do podlewania, dwa na razie wolne)
  5. Pilnowanie zmian czterech wejść (dwa kontaktrony na drzwiach i dwa czujniki zalania)
  6. Realizacja różnych faz podlewania ogrodu

Komunikacja urządzeń inteligentnego domu - Arduino i OpenWRT

Zgodnie z koncepcją , przygotowałem część sprzętową mojego systemu odpowiedzielnego za podlewanie ogródka i parę innych rzeczy. Obiecałem, że wkrótce napiszę, jak to wszystko oprogramować. Wcześniej jednak należałoby zaprojektować komunikację różnych elementów systemu - nie tylko części odpowiedzialnej za podlewanie, ale urządzeń związanych z automatyką domową w szczególności.

Jak już wiecie z koncepcji systemu , “mózgiem” będą routery (jeden główny, drugi zapasowy) z oprogramowaniem w php. Oczywiście nie muszą to być routery - w szczególności mogą to być serwery, komputery, cienkie klienty lub inne urządzenia, na których można uruchomić Linuksa. Router (z zainstalowym OpenWRT ) jest o tyle dobrym wyborem, że jest energooszczędny a dodatkowo i tak działa cały czas pełniąc inne funkcje.

Wielozadaniowość w Arduino?

Programowanie Arduino jest bardzo proste. Do takiego wniosku można dojść obserwując najprostsze przykłady programów. Spójrzmy chociażby na, prezentowany już wcześniej, program mrugający diodą podłączoną do wyjścia numer 13. Dla łatwiejszych dalszych rozważań został on jeszcze trochę uproszczony:

#define LED1 13

void setup() {                
  pinMode(LED1, OUTPUT); // ustawiamy pin 13 jako wyjście
}

int led1_state=0; // na początku zmienna będzie 0 (nie świeci)

void loop() {
  digitalWrite(LED1, led1_state); // ustawiamy stan wyjścia diody zgodnie 
                                  // z wartością zmiennej led1_state: 
                                  // 1 - świeci, 0 - nie
  delay(1000);             // czekamy sekundę
  led1_state=1-led1_state; // zmieniamy stan z 0 na 1 lub z 1 na 0
}

Nie ma w nim oczywiście nic wyszukanego - co sekundę zmieniamy stan wyjścia, a co za tym idzie diody świecącej. Przypominam, że 13 została wybrana nieprzypadkowo, ponieważ do tego wyjścia podłączona jest na stałe dioda znajdująca się na płytce Arduino.

Arduino - środowisko programistyczne

O tym, co to jest Arduino i dlaczego mi się podoba, pisałem w poprzednim poście . Teraz przyszła kolej, żeby wspomnieć o sednie całej zabawy - środowisku programistycznym. Wszak to między innymi dzięki łatwości programowania Arduino jest tak interesujące dla “przeciętnego człowieka”.

Programy dla Arduino tworzy się w języku opartym na platformie Wiring i przypomina bardzo uproszczone narzecze C/C++. Jakkolwiek mało przyjaźnie by to mogło zabrzmieć, oznacza ni mniej, ni więcej, że każda osoba mająca jakieś, choćby minimalne doświadczenie w języku C (a tak naprawdę jakimkolwiek języku programowania), po przeczytaniu krótkiego poradnika, szybko zacznie pisać proste programy. Ich konstrukcja jest wszak bardzo prosta, a masa przykładów, które można znaleźć w sieci, pozwoli szybko rozwiać ewentualne wątpliwości, lub nawet pisać oprogramowanie metodą “kopiuj/wklej”. Już samo środowisko programistyczne zawiera mnóstwo przykładów o różnym stopniu złożoności, napisanych tak, żeby łatwo je było zrozumieć. Bardzo dobrym punktem startu do nauki programowania będzie tutoral ze strony projektu Arduino.

Zrzut ekranu telefonu z Androidem

Ostatnio stałem się szczęśliwym posiadaczem telefonu Samsung Galaxy ACE, poznaję więc tajniki Androida. Na marginesie muszę napisać, że telefon i sam Android bardzo pozytywnie mnie zaskoczyły. Telefon kosztował mnie mniej, niż warta jest moja używana Nokia E72 (której aktualnie się pozbywam, bo przejściach z nieuczciwym kupującym na Allegro), a potrafi dużo więcej. Do jakości wykonania także nie można się przyczepić, z zakupu więc jestem bardzo zadowolony.

Do rzeczy jednak. Ponieważ mam zacięcie programistyczne, rozgryzam różne narzędzie okołoprogramistyczne. Ponieważ zostałem ostatnio zainspirowany do zajęcia się problemem zrzutów ekranu, które jakoby wymagały “rootowania” urządzenia, postanowiłem przyjrzeć się, jakie możliwości daje Android SDK, który mam zainstalowany na swoim Ubuntu. Krótka lektura, pozwoliła odnaleźć w katalogu tools (podkatalogu Android SDK, rzecz jasna) program ddms (Dalvik Debug Monitor). Po uruchomieniu go i podpięciu telefonu przez USB (musi być włączony tryb debugowania), mogłem zaznaczyć nazwę mojego urządzenia, a następnie wybrać Device/Screen Capture. Ta czynność wystarcza, żeby na ekranie komputera pojawił się wykonany właśnie zrzut ekranu: