piątek, 16 września 2016

Arduino i ESP8266 w projekcie Home IoT (inteligentnego domu)

Wnioski z działania

Dotychczasowe funkcjonowanie "centrum zarządzania" inteligentnym domem jest więcej niż bardzo dobre.


Praktycznie nie obserwuję jakichkolwiek resetów systemu a wszystkie funkcje (sterowanie cyrkulacją ciepłej wody, sterowanie gniazdami ELRO 433 MHz,sterowanie bramą garażową) działają bezproblemowo. Dodatkowo, po zamontowaniu całości w obudowie czujki PIR całość prezentuje się  naprawdę dobrze. Obudowę pozostawię nie zamkniętą gdyż istotne elementy systemu (NANO, ESP-01, nadajnik i odbiornik 433 MHz) zamontowane są w przejściówkach z goldpinami (jest to układ bądź co bądź testowy) przez co cała konstrukcja jest wyższa niż głębokość obudowy.
Równie ważne jest to że układ praktycznie nie nagrzewa się pomimo zasilania z zasilacza 12 V i konieczności zejścia z napięciem do poziomu 5 i 3,3 V. A to dzięki wysokosprawnej miniaturowej przetwornicy DC DC 12/5 V zamontowanej pod spodem płytki drukowanej. Więcej ciepła wydziela stabilizator 5/3,3V mimo że spadek napięcia na nim to tylko 1,7V i zasila jedynie układ ESP-01. Te chińskie mini przetwornice to naprawdę świetne rozwiązanie do zasilań elektroniki.

O aplikacji BLYNK pisałem już wielokrotnie - bez niej cała ta zabawa w Inteligentny dom nie miałaby większego sensu. Sam nigdy nie napisałbym programu wizualizacyjnego podobnej klasy nie mówiąc już o stworzeniu skutecznego i bezbłędnie działającego łącza internetowego pomiędzy procesorem a aplikacją w telefonie. Chłopaki z BLYNKa wciąż rozbudowują system dodając nowe widgety i funkcjonalności ale nawet to co już jest stanowi rewolucję dla rynku DIY. Trzymam kciuki by ich projekt się powiódł i by zarobili tyle by nie musieć sprzedać się wielkim tego świata. Zobaczymy......

Największa rewolucja od początku tworzenia projektu IoT nastąpiła w oprogramowaniu procesora. Kod programu jest najszybciej zmieniającym elementem w całej zabawie. To zrozumiała bo właśnie w tym zakresie mam najwięcej do nadrobienia. I jakkolwiek kopiowanie fragmentów kodu z innych obcych programów jest podstawowym sposobem jego powstawania  to udaje się mi już z sukcesem tworzyć własne fragmenty działające mniej więcej tak jak tego oczekuję. Najważniejsze jest to, iż program w połączeniu z procesorami (NANO i ESP-01) tworzy w miarę niezawodny system bez zawieszania się czy dziwnych nie planowanych zachowań. To jest nawet ważniejsze niż różnorodność czy elegancja tworzonych funkcji. System na którym w 100% nie można polegać gdy chodzi o ciągłość pracy nie nadaje się praktycznie do stosowania. Świadomie nie wyprowadzam więc na zewnątrz przycisku RESET do przywracania poprawności pracy modułu kiedy dochodzi do jego zaburzenia  np. z powodu zewnętrznych zakłóceń, zaniku napięcia zasilania czy innych zdarzeń "wysypujących" kod programu. Program sam musi sobie poradzić w takich sytuacjach. W programie sporo więc miejsca zajmują elementy samokontroli i autostartu umożliwiające przywracanie prawidłowej jego pracy. Do rozwiązania wciąż pozostaje jednak  problem złej obsługi watchdoga w module NANO. To ostatni element jaki muszę dopracować by uznać tą część programu za w miarę skończoną.

Całość programu na obecną chwile wygląda tak



Linia 17 i 18 to nowy sposób obsługi biblioteki BLYNK (ver 0.3.18) dla połączenia NANO <> ESP-01 poprzez sprzętowy port szeregowy. Niestety działa nieco inaczej niż wersja 0.3.14 choć chyba bardziej stabilnie. Inaczej więc musiałem rozwiązać sprawę kontroli połączenia z serwerem BLYNK . Procedura sprawdzBLYNK() wywoływana co ok 1 sek robi test połączenia i jeśli go nie ma ustawia flagę noconnection, która uaktywni funkcję restartArduino() wywoływaną co 30 sek programowym timerem uruchomionym w linii 258. Timery z biblioteki Timers.h są trzy - 1,5 sek wywołania różnych procedur obsługi, 30 sek resetu i 30 sek do odliczania czasu grzania. 
Wszystko co robi procesor ma swój początek w procedurze timer1sek(). 
  sprawdzBLYNK(); - test połączenia z BLYNK
  miganieLED_ok(); - Miganie LEDem zielonym na płytce potwierdzającym prawidłowe działanie calego systemu
  statusLED_error(); - ustawianie stanu LED ERROR w zależności od analizy poprawności pracy programu
  miganievLED(); - miganie wirtualnym LEDem w telefonie dla kontroli połączenia i poprawności pracy całego systemu
  sensorT(); - odczyt temperatury z czujnika DS18B20
  transmitBLYNK(); - wysyłane danych do aplikacji w telefonie (za pośrednictwem serwera BLYNK)
  swOnOff(); - początek procedury obsługi przełącznika na płycie procesora. W przyszłości będzie on służył do aktywowania pracy systemu kiedy brak jest dostępu do sieci Internet.

LEDy na płytce mają swoje odpowiedniki w aplikacji telefonu (V1 i V2)

Temperatura jest odczytywana z czujnika DS formatowana i zapamiętana do wysłania w zmiennej temperature. Jest ona wysyłana do BLYNKa  procedurą wyslij_V12() w linii 167.

Obsługa gniazd bezprzewodowych ELRO  (ich zdalne radiowe załączanie i wyłączanie) następuje w dwuch miejscach. Linie 176 - 190 to odczyt danych z aplikacji telefonu - wybranego nr gniazda (vPin20) i stanu przycisku on/off (ppilot). W liniach 286 - 338 następuje przyporządkowanie właściwego kodu  pilota do nr wybranego gniazda i wysłanie tego kodu poprzez transmiter 433 MHz.
Odpowiedzialna za to jest biblioteka  <RemoteTransmitter.h> , która po przyporządkowaniu portu do którego przyłączony jest transmiter CYT1 komendą ElroTransmitter elroTransmitter(3);  przejmuje na siebie całą procedurę transmisji.

Funkcjonalności sterowania bramą nie widać w kodzie programu bo realizowane jest to bezpośrednio z poziomu BLYNK. Wirtualny przycisk otwierania i zamykania bramy w telefonie jest bezpośrednio sprzężony z portem procesora, na którym "wisi' transoptor. Naciśnięcie Vprzycisku w telefonie zmienia stan portu i tym samym wysterowuje pilota bramy.  I już - szybko i bezproblemowo

Bardziej rozbudowana jest część związana ze sterowaniem pompą cyrkulacyjną ciepłej wody. Ten fragment programu może działać i działa autonomicznie - niezależnie od połączenia z BLYNK. Za pomocą biblioteki <RCSwitch.h> , która działa na przerwaniu zewnętrznym nr 0 (port nr 2) odbierane są kody z nadajnika, którym jest bezprzewodowa czujka PIR. Sygnał radiowy dekodowany w odbiorniku superheterodynowym CY-15 podawany na port nr 2 jest zamieniany na kod cyfrowy. Procedura sprawdzania tego co odebrało się odbiornikiem 433 MHz startuje w linii 340. Jeśli odebrany jest właściwy kod czujki PIR ( u mnie to 14013756) ustawiany jest licznik czasu grzania (zmienna grzanie) i wysyłany jest nadajnikiem kod załączający gniazdo z przyłączoną pompą cyrkulacyjną. Procedura licznikgrzania() w linii 193 wywoływana Timerem co 30 sek zmniejsza każdorazowo licznik grzania. Po osiągnięciu 0 wysyłany jest kod wyłączający gniazdo pompy. Każdorazowe pojawienie się sygnału z czujki PIR ustawia wartość początkową czasu grzania = 4 tzn 2 min. Czujka PIR też jest ustawiona na wysyłanie sygnałów o ruchu nie częściej niż co 2 min. W moim przypadku te dwie minuty wystarczają by w łazienkowym kranie na piętrze  pojawiła się ciepła woda w obiegu cyrkulacyjnym.
Jako gadżet jest możliwość załączenia pompy na czas cyrkulacji z aplikacji 2 telefonie. Dokonuje się to przyciskiem wirtualnym obsługiwanym w linii 213-223.

Fragment SETUP programu rozpoczyna się od restartu modułu ESP-01 portem nr 4 (245). Potem następuje inicjalizacja Timerów  (257) i inicjalizacja odczytu temperatury (268). Ustawienie portu szeregowego, inicjalizacja BLYNK połączenia z siecią WiFi i wydruk danych o programie to linie 264-269.

Ważnym elementem jest synchronizacja zmiennych programu ze stanem Vpinów aplikacji w telefonie po restarcie procesora. Robi to procedura BLYNK_CONNECTED() (227)

I to na razie tyle w temacie domowej inteligencji

 cdn ............ jak mniemam

3 komentarze:

  1. Kurcze widzę że naprawdę dużo pracy włożyłeś w ten projekt za co dozgonnie dziękuję. Ja niestety nie umiem programować w Arduino, ale zawsze są gotowe rozwiązania. Dlatego zrobiłem kilka zakupów z https://interblue.pl/inteligentny-dom,c,31 i w sumie moje mieszkanie zaczyna przypominać inteligentny dom :)

    OdpowiedzUsuń
  2. Nie wyrzucę ci tego wpisu tylko dlatego, że ten sklep zasługuje na reklamę. Ma wiele ciekawych elementów do IoT w tym sporo fajnych modułów z ZAMELa.
    https://interblue.pl

    OdpowiedzUsuń
  3. Ten komentarz został usunięty przez administratora bloga.

    OdpowiedzUsuń