Kursy • Poradniki • Inspirujące DIY • Forum
IoT Kit - łączenie chmury Intela z Arduino IDE
Ponieważ programujemy wykorzystując środowisko Ardiono IDE, musimy najpierw pobrać i zainstalować bibliotekę do obsługi IoT Kit. Będziemy potrzebowali pliku IoTkit.zip, który można pobrać z repozytorium znajdującego się na githubie.
Po pobraniu niezbędnego pliku uruchamiamy Arduino IDE, wybieramy opcję menu: Szkic > Include Library > Add .ZIP Library i dodajemy bibliotekę z pliku IoTkit.zip.
Biblioteka będzie dostępna dla wszystkich projektów,
więc nie będziemy musieli jej ponownie dodawać.
Jako pierwszy przykład wykorzystamy czujnik HDC1008, który poznaliśmy wcześniej. Jak pamiętamy, pozwala on na pomiar temperatury oraz wilgotności powietrza. Podłączamy czujnik do płytki podobnie jak wcześniej:
Teraz możemy napisać program, który będzie wykonywał pomiary i wysyłał rezultaty do chmury. Najpierw musimy na początku dołączyć pliki nagłówkowe biblioteki:
1 2 |
#include <Ethernet.h> #include <IoTkit.h> |
Biblioteka Ethernet jest niezbędna dla działania IoTkit, ale pamiętajmy, że program wykorzystuje sieć WiFi. Deklarujemy globalny obiekt reprezentujący nasze połączenie z Cloud Analytics:
1 |
IoTkit iotkit; |
W funkcji setup() musimy, podobnie jak dla innych modułów wywołać metodę begin() obiektu iotkit:
1 |
iotkit.begin(); |
Teraz już możemy komunikować się z chmurą. Do wysyłania danych służy metoda send(). Przyjmuje ona dwa parametry:
- pierwszy to nazwa czujnika,
- drugi to zmierzona wartość.
Przykładowo:
1 |
iotkit.send("temp", 21.3); |
Oczywiście zamiast stałej wartości, lepiej byłoby wykorzystać prawdziwy wynik pomiaru. Ponieważ znamy już czujnik HDC1008, możemy napisać pierwszy program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <Wire.h> #include <Adafruit_HDC1000.h> #include <Ethernet.h> #include <IoTkit.h> Adafruit_HDC1000 hdc; IoTkit iotkit; void setup() { Serial.begin(9600); iotkit.begin(); if (!hdc.begin()) { Serial.println("Brak HDC1008"); while (1); } } void loop() { iotkit.send("temp", hdc.readTemperature()); iotkit.send("humidity", hdc.readHumidity()); sleep(10); } |
Odwołujemy się do dwóch czujników: temp oraz humidity. Nie utworzyliśmy ich jeszcze, więc poczekajmy chwilę z uruchamianiem programu, najpierw musimy zarejestrować odpowiednie czujniki. Wiemy jak taki proces wygląda, łączymy się więc z modułem Edison za pomocą portu szeregowego lub ssh i wydajemy polecenie: iotkit-admin catalog
Wyświetli ono listę dostępnych typów komponentów. Nas zainteresują dwa: temperature.v1.0 oraz humidity.v1.0. Idealnie pasują do naszego czujnika. Wystarczy więc zarejestrować dwa czujniki: temp do pomiaru temperatury i humidity dla wilgotności:
1 2 |
iotkit-admin register temp temperature.v1.0 iotkit-admin register humidity humidity.v1.0 |
Po rejestracji nowych czujników trzeba zrestartować usługę iotkit-agent. Czasem nie aktualizuje ona wpisów i można stracić sporo czasu szukając przyczyny błędu:
1 |
systemctl restart iotkit-agent |
Po rejestracji czujnika należy zrestartować usługę iotkit-agent.
Teraz możemy uruchomić nasz program w Arduino IDE. Aby zobaczyć rezultaty działania, musimy zalogować się do Cloud Analytics. Następnie wybieramy z menu opcję Charts oraz parametry urządzenia i wykresu (na wykresie umieszczamy zarówno temperaturę, jak i wilgotność).
Jak widzimy, raptem kilka linijek kodu wystarczyło do obsługi dwóch czujników. Chyba każdy się zgodzi, że to znacznie łatwiejsze rozwiązanie, niż pisanie własnego serwera od podstaw, które uskutecznialiśmy w poprzedniej części kursu. Dodatkowo system sam zajmuje się zbieraniem i przechowywaniem danych.
W menu Rules możemy zdefiniować automatyczne powiadamianie
np. o przekroczeniu dopuszczalnej temperatury.
Tworzenie własnego komponentu
Dotychczas wykorzystaliśmy czujniki oparte na dostarczonych komponentach. Teraz zobaczymy jak łatwo opracować własny. Do układu podłączymy dwa fotorezystory, zgodnie ze rysunkiem:
Następnie przechodzimy do Analytics Cloud i wybieramy opcję Account oraz zakładkę Catalog (jak pamiętamy są tam dostępne typy komponentów). Na dole zobaczymy duży przycisk Add a New Catalog Item. Przyciskamy go i definiujemy nowy komponent:
Warto w tym miejscu poświęcić chwilę na poznanie dostępnych opcji. W polu Type mamy do wyboru dwie wartości:
- Sensor - czyli czujnik,
- Actuator - element wykonawczy (omówimy w kolejnej części).
Dale mamy typ danych (Data type):
- Number - liczba,
- String - napis,
- Boolean - wartość logiczna,
- Byte array - tablica bajtów.
W zależności od wybranego typu danych, będziemy mogli wybrać odpowiedni dla danego typu format. Przykładowo dla typu Number mamy do wyboru:
- Float - czyli liczby zmiennopozycyjne,
- Integer - liczby całkowite,
- Percentage - procenty.
Musimy podać jednostkę, w której wykonujemy pomiary (Unit of measure). W zależności od wybranego typu można jeszcze wybrać sposób wyświetlania danych oraz zakres.
Po kliknięciu przycisku Save zostanie utworzony nowy komponent. Ponieważ jest to pierwsza wersja (1.0), jego nazwa zostanie zmieniona z Light na light.v1.0. Teraz możemy przejść do konsoli pracującej z Edisonem i upewnić się za pomocą polecenia iotkit-admin catalog, że nowy komponent został poprawnie dodany.
Czas dodać odpowiedni czujnik. Jak pamiętamy służy do tego opcja register. Zarejestrujemy dwa czujniki, ponieważ mamy dwa fotorezystory:
1 2 3 |
iotkit-admin register light1 light.v1.0 iotkit-admin register light2 light.v1.0 systemctl restart iotkit-agent |
Podgląd rejestracji w konsoli:
Możemy również sprawdzić zarejestrowane czujniki w chmurze, powinny wyglądać tak:
Czas napisać program. Od poprzedniego będzie się on różnił o raptem dwiema linijkami:
1 2 |
iotkit.send("light1", (int)analogRead(0)); iotkit.send("light2", (int)analogRead(1)); |
Na wszelki wypadek podamy jednak pełny kod programu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <Wire.h> #include <Adafruit_HDC1000.h> #include <Ethernet.h> #include <IoTkit.h> Adafruit_HDC1000 hdc; IoTkit iotkit; void setup() { Serial.begin(9600); iotkit.begin(); if (!hdc.begin()) { Serial.println("Brak HDC1008"); while (1); } } void loop() { iotkit.send("temp", hdc.readTemperature()); iotkit.send("humidity", hdc.readHumidity()); iotkit.send("light1", (int)analogRead(0)); iotkit.send("light2", (int)analogRead(1)); sleep(10); } |
Rezultat działania jest widoczny w zakładce z wykresami (Charts):
Dodajemy do Edisona więcej czujników
Wiemy już jak podłączać czujniki, dlaczego nie podłączyć ich więcej? W zestawie znajdziemy kilka kolejnych, które pozwolą na rozszerzenie możliwości naszej stacji pogodowej i zmienią ją w system monitorowania mieszkania.
Podłączmy 2 kolejne czujniki - czujnik zamknięcia drzwi oraz ruchu (PIR). Schemat podłączenia:
Są to czujniki cyfrowe, więc mają tylko 2 stany włączone/wyłączone. Możemy więc dodać komponenty, które będą wykorzystywały zmienne logiczne, jednak wtedy nie będziemy mieli możliwości umieszczenia danych na wykresie (ale np. alarmy o otwarciu drzwi nadal będą mogły być zgłaszane). Zostaniemy więc przy definiowaniu wartości jako liczb całkowitych:
- Rejestracja nowego komponentu 1.
- Rejestracja nowego komponentu 2.
Następnie rejestrujemy odpowiednie czujniki:
1 2 3 |
iotkit-admin register opendoor opendoor.v1.0 iotkit-admin register pirmove pirmove.v1.0 systemctl restart iotkit-agent |
Teraz modyfikujemy program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#include <Wire.h> #include <Adafruit_HDC1000.h> #include <Ethernet.h> #include <IoTkit.h> Adafruit_HDC1000 hdc; IoTkit iotkit; const int DOOR_PIN = 12; const int MOVE_PIN = 13; void setup() { Serial.begin(9600); iotkit.begin(); if (!hdc.begin()) { Serial.println("Brak HDC1008"); while (1); } pinMode(DOOR_PIN, INPUT_PULLUP); pinMode(MOVE_PIN, INPUT_PULLUP); } void loop() { iotkit.send("temp", hdc.readTemperature()); iotkit.send("humidity", hdc.readHumidity()); iotkit.send("light1", (int)analogRead(0)); iotkit.send("light2", (int)analogRead(1)); iotkit.send("opendoor", (int)!digitalRead(DOOR_PIN)); iotkit.send("pirmove", (int)digitalRead(MOVE_PIN)); sleep(10); } |
Efekt działania programu w praktyce naszego systemu monitorowania mieszkania:
Oczywiście nasz program jest bardzo uproszczony, więc jeśli ktoś szybko otworzy drzwi, nawet tego nie zauważymy. Podobnie jest z wykrywaniem ruchu - powinniśmy takie zdarzenia zgłaszać natychmiast.
Odpowiednia modyfikacja programu nie powinna stanowić problemu,
więc zostawimy ją jako pracę domową dla chętnych.
Zadanie 9.1
Zmodyfikuj program, tak aby zdarzenia otwarcia drzwi oraz wykrycia ruchu były zgłaszane natychmiast.
Zadanie 9.2
Dodaj powiadamianie o otwarciu drzwi, np. poprzez wysłanie maila.
Podsumowanie
W tej części zbudowaliśmy całkiem rozbudowany system wyposażony w wiele czujników oraz możliwość zdalnego monitorowania pracy. Zobaczyliśmy, że Cloud Analytics pozwala łatwo obsłużyć całkiem rozbudowany system.
Nawigacja kursu
W kolejnej części poznamy jak można zdalnie sterować naszym systemem. Dzięki temu możliwa będzie budowa kompletnego systemu zdolnego do opieki nad naszym mieszkaniem. Nie chcesz przeoczyć kolejnych części kursu? Skorzystaj z poniższego formularza i zapisz się na powiadomienia o nowych artykułach!
Autor kursu: Piotr (Elvis) Bugalski
Redakcja: Damian (Treker) Szymański
Powiązane wpisy
arduino, chmura, czujnik, Edison, Intel, IoT, komunikacja, kursEdison
Trwa ładowanie komentarzy...