Moduły Wi-Fi Atmel WINC1500 dedykowane dla aplikacji IoT cz. III.
W poprzednim odcinku WINC1500 Cz. II udało się przesłać dane z wykorzystaniem modułu WiFi WINC1500 do smartfona za pośrednictwem AP. W tej części wyślemy dane przez internet a następnie za pośrednictwem przeglądarki internetowej będziemy obserwować przesłane informacje.
Atmel wraz z PubNub przygotował demo obserwacji temperatury w czasie rzeczywistym: WINC1500 połączony z pubnub. Kod przykładu dla zestawu Atmel Xplained Pro można pobrać tutaj: http://pubnub.com/blog/wp-content/uploads/2015/05/code-1.zip
Przygotowany przykład poza płytką mikrokontrolera ATSAMD21-XPRO, modułem WiFi ATWINC1500, czujnikiem temperatury I/O1 Xplained Pro, wykorzystuje także moduł OLED 1 Xplained Pro. Ponieważ moduł OLED nie jest dostępny w testowanym zestawie, wyłączymy funkcje obsługi wyświetlacza.
Po skompilowaniu projektu w Atmel Studio 6.2 będziemy przesyłać dane poprzez WiFi do serwerów PubNub, przy pomocy przykładowego projektu https://github.com/pubnub/atmel-temperature-demo wyświetlimy przesłane dane z wykorzystaniem przeglądarki internetowej (zalecana przeglądarka Google Chrome, jednak inne przeglądarki również działają poprawnie).
Po ściągnięciu przykładu (WINC1500+PubNub), jeżeli w zestawie nie mamy wyświetlacza oled, możemy zrezygnować z linijek w main.c:
// ssd1306_init();
// ssd1306_clear();
oraz kodu który wyświetla poziom oświetlenia i temperaturę:
//display_temperature( (uint8_t)temperature );
//display_light( light );
a także wyświetlanie komunikatów przesłanych z PubNub.
//display_received_data( (char*)msg );
Projekt wykorzystuje skalę Fahrenheita, zakomentujmy przeliczenie:
//double tempf = (temperature*(9/5))+32;
oraz dodajmy bezpośrednie przekazywanie temperatury w stopniach Celsiusza:
double tempf = temperature;
Po założeniu konta na PubNub, odczytujemy wartości Publish Key, Subscribe Key dla utworzonego kanału Atmel_Pubnub, dane dostępne są na https://admin.pubnub.com po zalogowaniu. Wraz z plikami projektu dostępne jest oprogramowanie do aktualizacji firmware modułu Atmela, jeżeli firmware nie jest aktualny możemy podnieść jego wersję.
Do złącza EXT1 podłączamy moduł WINC1500, do EXT2 czujnik temperatury i oświetlenia, do EXT3 moduł OLED (jeżeli posiadamy).
W pliku main.h wpisujemy dane umożliwiające połączenie z punktem dostępowym będącym w zasięgu modułu WINC1500:
#define TEST_MODE_SSID "nazwa_SSID"
#define TEST_MODE_PASSWORD "hasło_dostępwe"
W pliku main.c dodajemy dane autoryzacyjne odczytane https://admin.pubnub.com po zalogowaniu, oraz utworzeniu kanału Atmel_Pubnub
static const char pubkey[] = "tutaj wpisujemy Publish Key";
static const char subkey[] = "tutaj wpisujemy Subscribe Key";
static const char channel[] = "Atmel_Pubnub";
Po skompilowaniu, oraz uruchomieniu projektu warto uruchomić konsolę emulowanego portu szeregowego aby zobaczyć komunikaty wysyłane przez program. Na stronie https://admin.pubnub.com klikamy po prawej stronie Debug Console zobaczymy tam komunikaty docierające przez internet z modułu WINC1500 do serwerów PubNub. Jeżeli wszystko działa poprawnie na stronie http://www.pubnub.com/console/ powinniśmy zobaczyć w oknie komunikatów wpisy w formie:
{“columns”:[["temperature","23.00"]]}
Korzystając z projektu https://github.com/pubnub/atmel-temperature-demo możemy obserwować dane docierające do serwerów PubNub z naszej platformy testowej. W plikach .js zmieniamy wartości:
subscribe_key:
publish_key:
na odczytane z https://admin.pubnub.com
Po uruchomieniu index.html na komputerze posiadającym dostęp do internetu, zobaczmy dane z czujnika temperatury docierające do pubnub w czasie rzeczywistym. W plikach js możemy przeliczyć wartości ze skali Fahrenheita na skalę Celsiusza aby aplikacja zachowywała się zgodnie z założeniami autorki.
Serwis pubnub.com dostarcza wiele innych płatnych opcji takich jak możliwość zapisywania odbieranych danych, szyfrowania transmisji, oraz obsługi większej ilości urządzeń i komunikatów.
Sprawdźmy czy możemy łatwo przystosować dostarczony kod aby wykorzystać projekt do połączenia z serwisem https://thingspeak.com , również dedykowanym m.in dla rozwiązań IoT. Po założeniu konta na thingspeak.com tworzymy nowy kanał oraz ustawiamy dwa pola dla temperatury i poziomu oświetlenia:
Przy okazji zaglądamy do API Keys i zapisujemy swój klucz.
W pliku pubnub.h zmieniamy:
#define PUBNUB_ORIGIN "pubsub.pubnub.com"
na
#define PUBNUB_ORIGIN "api.thingspeak.com"
aby połączyć się z serwisem thingspeak.com.
oraz dodajemy:
bool thingspeak_publish(pubnub_t *pb, const char *message);
będzie to nowa funkcja wysyłająca dane o temperaturze oraz poziomie oświetlenia.
W pliku pubnub.c tworzymy nową funkcję thingspeak_publish na bazie pubnub_publish:
Kod: text
Aby dane trafiały do thingspeak należy otwierać url z wartością klucza oraz parametrami dot. temperatury oraz oświetlenia, przykładowo:
http://api.thingspeak.com/update?key=tutaj_twój_klucz_thingspeak&field1=25.0&field2=15
25.0 to przykładowa wartość temperatury, natomiast 15 przykładowa wartość oświetlenia. Testowo możemy otworzyć url w przeglądarce aby sprawdzić czy widzimy aktualizacje na thingspeak.com.
W pliku main.c wpisujemy swój API Key z thingspeak.com:
static const char pubkey[] = "tutaj_twój_klucz_thingspeak";
rezygnujemy z linijki:
//sprintf(buf, "{\"columns\":[[\"temperature\", \"%d.%d\"]]}", (int)tempf, (int)((int)(tempf * 100) % 100));
zastępując ją:
sprintf(buf, "&field1=%d.%d&field2=%d", (int)tempf, (int)((int)(tempf * 100) % 100), light );
w ten sposób utworzymy odpowiedni url (query string) przekazujący dane do serwisu thingspeak.com.
Rezygnujemy z linijki:
//pubnub_publish(m_pb, channel, buf);
zastępując ją:
thingspeak_publish(m_pb, buf);
wywołującą nową funkcję wysyłającą dane.
Rezygnujemy także z:
//printf("pubnubDemo: subscribe event.\r\n");
//pubnub_subscribe(m_pb, r21_channel);
gdyż w tej prostej próbie będziemy tylko wysyłali dane.
Zmieńmy warunek sterujący maszyną stanów:
Kod: text
na:
if(m_pb->trans == PBTT_NONE || m_pb->trans == PBTT_PUBLISH) {
będziemy wykonywać kolejne cykle publikacji danych.
Zobaczmy, czy w tak prymitywny sposób udało się przystosować kod wysyłający dane na serwery pubnub.com do komunikacji z https://thingspeak.com.
Obserwując komunikaty wysyłane portem szeregowym debugera wszystko wygląda dobrze, aby podejrzeć wysyłane komunikaty można zdjąć komentarz z linii:
printf("buf = %s", buf);
w pliku pubnub.c w funkcji static void handle_transaction(pubnub_t *pb).
Już po chwili możemy obserwować dane napływające do serwisu thingspeak.com, po dłuższym zbieraniu komunikatów możemy zaobserwować długotrwałe zmiany temperatury i oświetlenia:
Warto zajrzeć do ustawień wykresów, możemy zmienić zarówno sposób prezentacji danych, jak również dodać funkcje matematyczne (średnia z określonej liczby próbek, sumowanie wartości itp.).
Materiał przygotowany we współpracy z firmą JM elektronik.
Fajne? Ranking DIY
