Jak sterować przez WiFi urządzeniem elektrycznym?

Inteligenty budynek jest to termin określający wysoce zaawansowane budynki, wyposażone w dużą ilość czujników i zintegrowany system zarządzania instalacjami. Jak łatwo się doyślić, koszt takiego systemu jest dość znaczny. Ponadto wymaga sporej liczby zmian na etapie projektu instalacji.

Arduino jest świetnym narzędziem, dzięki któremu możemy wprowadzić w swoim domu elementy inteligentnego budynku, nie rujnując naszej kieszeni i nie wymagając gruntownego remontu.

Cel - pompa CWU

Jedną z najczęstszych potrzeb, zwłaszcza w domach jednorodzinnych jest konieczność włączania i wyłączania urządzeń elektrycznych - różnego rodzaju pompy to konieczność we wszystkich instalacjach centralnego ogrzewania.

Jedną z takich pomp jest np pompa cyrkulacyjna CWU (ciepłej wody użytkowej) - instalacje ciepłej wody w domach jednorodzinnych mają nieraz kilka, kilkanaście metrów długości. Woda w rurach szybko stygnie, więc zazwyczaj na etapie budowy domu dodaje się dodatkową rurę zwrotną i pompę CWU, która wymusza obieg ciepłej wody między zasobnikiem a kranami.

Dzięki temu po odkręceniu wody w kranie nie musimy czekać długo aż zacznie płynąć ciepła woda. Wygoda ta ma jednak swoją cenę. Skoro woda w rurach szybko stygnie, to zimna wraca do zasobnika i tam spada temperatura wody. Piec musi znacznie częściej grzać wodę w zasobniku a to przekłada się od razu na koszty.

Pompę można oczywiście włączać tylko w czasie gdy jest duża szansa skorzystania z ciepłej wody - rano czy popołudniu. Sęk w tym że pompa znajduje się zazwyczaj przy piecu (w kotłowni, piwnicy) i biegać rano by ją włączyć - zazwyczaj się nikomu nie chce, więc albo pompa jest włączona cały czas i godzimy się na wyższe rachunki albo jest wyłączona cały czas i marnujemy czas i wodę czekając aż wystudzona woda spłynie z rur.

Można co prawda skorzystać z rozwiązania takiego jak zdalnie sterowane gniazdka ale znając życie, będzie problem w postaci pytania "Gdzie jest pilot do gniazdek?".

Rozwiązanie

I tutaj przychodzi nam na ratunek Arduino YUN. Zbudujemy kontroler urządzeń podłączonych do takich bezprzewodowych gniazdek, z interfejsem w postaci strony WWW. Podłączony do lokalnej sieci bezprzewodowej pozwoli sterować naszą pompą używając smartfona, którego mamy zazwyczaj zawsze pod ręką.

Po zalogowaniu się na stronę

Pompa włączona

Przygotowanie Arduino YUN

Arduino YUN jest połączeniem w jednym urządzeniu Arduino z niewielkim komputerem działającym pod kontrolą Linuxa. Arduino będzie odpowiedzialne za sterowanie urządzeniami elektrycznymi, część Linuksowa będzie serwerem WWW. Korzystając z gotowych bibliotek wchodzących w skład Arduino IDE, przygotowaliśmy pozostałe elementy, dzięki czemu uruchomienie projektu nie wymaga dużej ilości pracy.

Na Arduino YUN działa dystrybucja Linuxa o nazwie Linino, jest to odmiana popularnego OpenWRT. Domyślnie uruchamia się ona ze wbudowanej w urządzenie pamięci flash. Jest jej wystarczająco dla domyślnych konfiguracji, jednak by cały projekt był łatwo modyfikowalny i podatny na modyfikacje zdecydowaliśmy się użyć aplikacji WWW zbudowanej na podstawie Node.JS. Platforma ta jest gotowa do zainstalowania jako pakiet na Arduino YUN, jednak wymaga więcej miejsca, niż oferuje nam wbudowany flash.

Rozszerzenie pamięci Arduino YUN

Pierwszym krokiem będzie więc przeniesienie systemu operacyjnego na kartę microSD. Karty microSD oferują znacznie więcej miejsca na oprogramowanie i dzięki temu będziemy mieli dość przestrzeni na nasze eksperymenty.

Reset i uaktualnienie Arduino YUN

Jeżeli Arduino YUN było już przez Was używane lub jesteście w jego posiadaniu już dłuższy czas to przy tej okazji warto sprawdzić, czy można zrobić uaktualnienie.

Po zalogowaniu się do interfejsu WWW Arduino YUN, na dole znajduje się informacja, która może wyglądać następująco This Yún runs a version of OpenWrt-Yun built on Nov 14, 2014. Datę trzeba porównać z informacjami w https://github.com/arduino/openwrt-yun/blob/master/ChangeLog i na tej podstawie stwierdzić czy nasze oprogramowanie jest najbardziej aktualne.

Jeżeli jest potrzeba uaktualnienia, zróbcie to korzystając ze wskazówek w tym artykule na Akademii Nettigo.

Jeżeli nie ma potrzeby uaktualnienia, to wystarczy wyczyszczenie ustawień Arduino YUN. Po włączeniu się Arduino YUN przycisk WLAN RST przytrzymać 30 sek. Dioda WLAN powinna zacząć migać przez kilka, kilkanaście sekund. Po tym Arduino dokona restartu i będzie miało domyślną konfigurację, czyli będzie działać jako access-point i nie będzie podłączone do Internetu.

Powyższe kroki nie są konieczne, jeżeli używasz nowego Arduino YUN.

Podłączenie do Internetu

By przenieść system operacyjny na kartę microSD Arduino YUN musi mieć łączność z Internetem. W skrócie trzeba podłączyć się do sieci WiFi o nazwie ArduinoYUN-XXXXXXXXXX, gdzie znaki X są zastąpione przez cyfry i litery różne dla różnych Arduino YUN. Po podłączeniu się do sieci w przeglądarkę wpisujemy adres arduino.local, logujemy się podając hasło arduino. Na następnym ekranie konfigurujemy sieć WiFi, do której ma się podłączyć Arduino. Po restarcie Arduino jest gotowe do dalszych działań.

Przenosiny systemu operacyjnego

Podłączamy kabel micro USB do Arduino YUN, wkładamy kartę microSD do złącza. Uruchamiamy Arduino IDE (YUN jest wspierany w IDE wersja 1.5 i wyższe) i ze strony https://raw.githubusercontent.com/Fede85/YunSketches/master/YunDiskSpaceExpander/YunDiskSpaceExpander.ino ściągamy kod, który wklejamy w w IDE i wgrywamy na Arduino.

UWAGA Szkic ten jest inny niż szkic w oficjalnym przewodniku przenosin systemu YUN. Różnica polega na tym, że w tej wersji dodana jest partycja na potrzeby pliku wymiany (SWAP). Arduino YUN bez włączonego SWAPa może działać niestabilnie gdy korzystamy z Node.JS.

Aby wgrać szkic na Arduino w menu Tools/Board wybieramy Arduino YUN a w menu Tools/Port właściwy port szeregowy, następnie klikamy ikonkę strzałki (druga od lewej). Po udanym wgraniu (Done uploading) klikamy na ikonę monitora portu szeregowego (ikona lupy w prawym górnym rogu).

Po otwarciu się monitora musimy wybrać w prawym dolnym rogu prędkość 115200 baud oraz tryb Newline jeżeli są jakieś inne wartości.

Na pytania szkicu odpowiadamy wpisując w górnym oknie i naciskając przycisk Send.

Sugerowane odpowiedzi to:

  1. yes
  2. yes
  3. yes
  4. 900
  5. 256

Szkic na Arduino YUN zainstaluje dodatkowe oprogramowanie, sformatuje kartę dzieląc ją na trzy części. 900 MB będzie przeznaczone na część, która będzie dostępna zarówno w YUN, jak i wtedy gdy wsadzisz kartę do czytnika podłączonego do komputera z Windows. 256 MB przeznaczone jest na plik wymiany (SWAP), reszta karty - na system operacyjny OpenWRT.

Przenosiny systemu na kartę microSD

Sprawdzamy poprawność operacji - naciskamy przycisk YUN RST i obserwujemy co się dzieje w oknie monitora portu szeregowego. Po restarcie Arduino potrzebuje około 60 sekund do pełnego uruchomienia.

System zakończył ładownie na Arduino

Gdy skończą pojawiać się nowe linie w oknie, wciskamy raz przycisk Send (uruchomiana zostanie konsola) i wpisujemy polecenie df -m i przycisk Send.

Rezultat działania komendy df

Interesuje nas linia rozpoczynająca się od rootfs. W kolumnie Available powinna być liczba, dużo większa niż 7 :) Jeżeli Arduino YUN wystartuje z pamięci wbudowanej, właśnie liczba 7 to ilość wolnych MB. W zależności od rozmiaru karty i tego ile MB przeznaczyliśmy na dwie dodatkowe partycje, wolna przestrzeń na rootfs może być inna.

Nadajnik radiowy

Gniazdka zdalnie sterowane są z kontrolowane z wykorzystaniem radia. Do wysyłania komend niezbędny jest nadajnik na 433 MHz, który podłączamy do Arduino w następujący sposób.

Podłączony nadajnik

Podłączenie to jest jeden krok, następnie musimy wiedzieć jakie komendy wysyłać. W tej chwili przygotowany kod pozwala bez problemu sterować tylko jednym gniazdkiem. W przyszłości będzie można sterować większą ilością gniazdek.

Wybierzmy gniazdko, którego będziemy używać. Od strony frontowej, nad lampką sygnalizującą stan, znajduje się numer gniazdka. Od 1 do 4, natomiast po odwróceniu zobaczymy nad naklejką z danymi technicznymi serię w postaci czterocyfrowego numeru (np. 1416). W tabelce udostępnionej na Google Docs odnajdujemy wiersz pasujący do serii. Znajdź kolumny odpowiadające włączeniu i wyłączeniu gniazdka o wybranym numerze. Kody te będą potrzebne w następnym kroku.

Instalacja programów

Gotowy zestaw programów znajduje się do ściągnięcia z http://static.nettigo.pl/yhs.zip, jest to bieżąca wersja, jeżeli chcesz, to całość jest dostępna na serwisie GitHub: https://github.com/nettigo/YUNHomeServer

Ściągnięty plik rozpakowujemy w katalogu ze szkicami. Na Linuxie zwykle jest to ~/sketchbook. Pozostaje przenieść to, co trzeba na YUN.

Metoda na SCP

Korzystając z narzędzi UNIXowych, możemy skopiować wszystko, co potrzeba na Arduino. Mając włączone i działające Arduino, przechodzimy do katalogu ze szkicami i kopiujemy:

cd ~
scp -r YUNHomeServer root@arduino.local:/mnt/sda1/arduino/

Narzędzia scp dostępne też są na Windows, więc po ich zainstalowaniu możemy tak skopiować całość.

Metoda na kartę

Wystarczy wsadzić kartę microSD do czytnika podłączonego do naszego komputera, skopiować katalog YUNHomeServer do katalogu arduino na karcie i po przełożeniu karty do Arduino i jego uruchomieniu pliki są przeniesione.

Metoda na wget

Zalogować się przez SSH na Arduino YUN i wykonać następujące kroki:

opkg update
opkg install unzip
cd /mnt/sda1/arduino
wget http://static.nettigo.pl/yhs.zip
unzip yhs.zip
rm yhs.zip

Instalacja Node

Node.js nie jest domyślnie instalowane na YUN, dlatego logujemy się przez SSH i je instalujemy wydając polecenia:

opkg update
opkg install node

Kompilacja szkicu

W Arduino IDE otwieramy szkic YUNHomeServer. Jeżeli ściągnęliśmy kod bezpośrednio na YUN, to musimy go mieć też na lokalnym komputerze, gdyż musimy skompilować szkic.

W zakładce radio wpisujemy kody włączenia i wyłączenia gniazdka, które odczytaliśmy w poprzednim kroku. Poprawić trzeba polecenie if, wstawiając właściwe kody – pierwszy do włączenie gniazdka, drugi do wyłączenia. Teraz zostaje tylko wgranie szkicu na Arduino.

if (PUMP_ON == pumpStatus) {
  mySwitch.send("010100000100010101010011");
} else {
  mySwitch.send("010100000100010101011100");
}

Końcowe działania

W przeglądarce wpisujemy adres https://arduino.local:1234 i powinniśmy się połączyć z naszą aplikacją. Taka forma zadziała na komputerach, na smartfonach niezbędne może być użycie adresu IP. Jeżeli nie wiesz jak na routerze sprawdzić adres, które dostało Arduino, możesz to zrobić logując się przez SSH z komputera:

root@Arduino:~# ifconfig wlan0 | grep inet
       inet addr:192.168.1.221  Bcast:192.168.1.255  Mask:255.255.255.0

Liczby po inet addr: to adres IP - w powyższym przykładzie powinniśmy się łączyć z https://192.168.1.221:1234

Po udanym połączeniu zapewne otrzymamy komunikat o błędnym certyfikacie SSL, ale nie powinniśmy się tym przejąć.

Przyczyną ostrzeżeń bezpieczeństwa może być:

  1. Certyfikat jest tzw. 'self-signed' nie został wygenerowany przez autoryzowane centrum, które rozpoznają przeglądarki.
  2. Nawet jeżeli zaakceptujecie taki wyjątek, certyfikat został wygenerowany dla domyślnej nazwy, pod jaką Arduino jest widoczne w sieci (arduino.local). Jeżeli ją zmieniłeś lub łączysz się przez adres IP (np smartfony nie wszystkie obsługują protokół, dzięki któremu nazwa arduino.local jest dystrybuowana po sieci LAN) to certyfikat też będzie niepoprawny.

Domyślny użytkownik to root a hasło ntg arduino. Można je zmienić, edytując plik /mnt/sda1/arduino/YUNHomeServer/YHS.js w linii 93.

Interfejs WWW

Prawidłowy restart

Pozostaje jeszcze jeden bardzo ważny krok. Część linuksowa startuje o wiele dłużej niż część, na której działa szkic. Tymczasem to szkic, na początku startuje aplikację w Node. Dlatego by po resecie czy po włączeniu się Arduino nasza strona była dostępna automatycznie, trzeba poprawić plik /etc/rc.local i usunąć znak # sprzed polecenia reset-mcu. Posłużyć się można edytorem nano (nano /etc/rc.local po zalogowaniu się przez SSH).

Po usunięciu tego znaczku, gdy skończy się proces startowania Linuxa, zresetowana zostanie część wykonująca szkic i dzięki temu wszystko uruchomi się jak należy.

Co jeżeli nie działa jak się spodziewasz?

Brak połączenia z https://arduino.local:1234

Czy w ogóle łączysz się z Arduino?

Pierwszy krok - czy możesz się połączyć z http://arduino.local ? Czy sprawdzasz to na smartfonie? Jeżeli tak to sprawdź z komputera. Gdy z komputera się też nie łączysz, sprawdź na routerze jaki adres IP otrzymało Arduino. Możesz się połączyć na http://ADRES_IP ? Czy na https://ADRES_IP:1234 ? Zwróć uwagę, że czasem używamy HTTP a czasem HTTPS...

Jeżeli zmieniłeś nazwę Arduino, to może być to inny nazwa niż arduino.local.

Smartfony w większości przypadków nie potrafią odczytać nazwy arduino.local, w takim wypadku używać musisz adresu IP.

Działa HTTP ale nie HTTPS

Gdy możesz się połączyć na adres z http (interfejs do konfigurowania Arduino YUN), ale na adres z https już nie, najprawdopodobniej nie działa aplikacja node.

Czy odkomentowałeś reset-mcu w rc.local ? Bez tego nie uruchomi się aplikacja po restarcie Arduino.

Po zalogowaniu się na Arduino sprawdź, czy działa aplikacja:

root@Arduino:~# ps w| grep node
 1686 root      1488 S    {node} /bin/sh /usr/bin/node /mnt/sda1/arduino/YUNHomeServer/YHS.js
 1690 root     68268 S    /usr/bin/nodejs /mnt/sda1/arduino/YUNHomeServer/YHS.js
21659 root      1484 S    grep node

Wynik istotnie różny niż powyższy sugeruje, że aplikacja nie wystartowała.

Czy wciśnięcie przycisku 32U4 RST i sprawdzenie ponowne po kilkunastu sekundach da inny rezultat? Jeżeli tak, to sprawdź reset-mcu.

Czy jeżeli uruchomisz aplikację z linii poleceń (czyli SSH) przez node /mnt/sda1/arduino/YUNHomeServer/YHS.js to będziesz mógł się połączyć? Wystąpiły jakieś błędy podczas uruchamiania? Może nie zainstalowane jest node?

Gniazdka działają dziwnie...

Zasięg nadajnika nie jest zbyt duży, zależy bardzo od tego, jakie przeszkody są po drodze. Spróbuj przysunąć Arduino bliżej gniazdek i sprawdź ponownie.

Pamiętaj, że w obecnej wersji polecenie zmiany stanu jest nadawane ciągle, więc nie jesteś w stanie przyciskiem na gniazdku włączyć czy wyłączyć. Arduino co chwilę wysyła polecenie, więc zostanie z powrotem ustawione w taki stan, jakiego żąda aplikacja.