„Internet Rzeczy” to termin, którego praktycznego znaczenia nie chciałem rozumieć. Tak po prostu, zwyczajnie, z niechęci do dzisiejszej „orwellowskiej rzeczywistości”, gdzie wszystko i wszyscy muszą być on-line, aby być elementem wielkiej, globalnej maszyny informacyjnej. Byłem niechętny IoT do czasu, aż natknąłem się na niezwykle już dzisiaj popularny moduł z układem ESP8266 firmy Espressif Systems będący kolejnym przykładem kreatywności chińskiej myśli technicznej. Umożliwia on za przysłowiowe kilka dolarów dołączenie dowolnego systemu mikroprocesorowego do Internetu i to bezprzewodowo! Taka możliwość istniała również wcześniej, jednak wymagało to zaangażowania znacznie większych środków finansowych, sprzętowych oraz niemało pracy. Chińczycy pokazali, że tak nie musi być, że można zaoferować bardzo dobry produkt w przystępnej, żeby nie powiedzieć „śmiesznie niskiej” cenie i spowodować, że komunikacja bezprzewodowa Wi-Fi stanie się szeroko dostępna również dla amatorów.
Moduł, o którym mowa, jest przejściówką UART/Wi-Fi. Domyślnie komunikacja z nim przebiega przez interfejs UART (CMOS 3,3 V) z użyciem komend AT, jednak sam układ ESP8266 stanowiący serce urządzenia (i będący 32-bitowym mikrokontrolerem RISC) jest programowalny, co daje możliwość wyeliminowania dodatkowego mikrokontrolera w wielu nieskomplikowanych systemach mikroprocesorowych. W tym celu producent modułu dostarcza odpowiedni pakiet SDK (w tym API), jednak w sieci znaleźć możemy kilka autorskich projektów IoT bazujących na oryginalnym oprogramowaniu (np. projekt NodeMCU i język LUA), a wyposażonych w rozszerzoną funkcjonalność lub pozwalających na bezpośrednie programowanie urządzenia w języku C, C++ (oficjalne rozszerzenie dla projektu Arduino) czy nawet Basic. Co więcej, moduł jest sprzedawany w kilku wersjach, różniących się przede wszystkim liczbą wyprowadzeń GPIO, a co za tym idzie, wyglądem i wymiarami obwodu drukowanego. Im większa liczba wyprowadzeń, tym większe są możliwości zastosowania układu jako urządzenia autonomicznego, bo może to oznaczać więcej wbudowanych modułów peryferyjnych.
Tyle na temat samego modułu, gdyż dziesiątki informacji i praktycznych przykładów wykorzystania bez problemu znajdziemy w Internecie oraz w „Elektronice Praktycznej”. Zatem pora przejść do sedna!
Kilka lat temu w EP 6/2011 opublikowałem projekt stacji pogodowej wyposażonej w mechanizm prognozowania pogody. Korzystała ona z lokalnych, wbudowanych czujników temperatury i ciśnienia atmosferycznego oraz programowego mechanizmu prognozowania pogody opartego na śledzeniu zmian wartości ciśnienia atmosferycznego. Pomyślałem sobie, że skoro dzisiaj tak łatwo możemy włączyć system mikroprocesorowy do sieci, fajnym pomysłem byłoby zbudowanie stacji pogodowej, która szczegółowe dane pogodowe (wraz z prognozą) „ściąga” z sieci Internet, posiłkując się dostępem do odpowiedniego serwera pogodowego.
Medium transmisji i połączenia z siecią już mamy. Za realizację tej funkcjonalności będzie odpowiadał moduł ESP8266-01 sterowany za pomocą komend AT wysyłanych z mikrokontrolera nadrzędnego, który „przy okazji” obsłuży interfejs użytkownika. Pozostaje znalezienie odpowiedniego serwera pogodowego. Wybór padł na serwis Wunderground.com, który skupia stacje pogodowe przyłączone do sieci Internet i dostarcza darmową usługę (oprócz kont płatnych o rozszerzonej funkcjonalności) oraz API pozwalające na integrację dowolnego systemu mikroprocesorowego ze środowiskiem po stronie serwera. Wspomniany serwis wymaga rejestracji, dzięki której dostaniemy dostęp do zgromadzonych tam danych, jak i własny, unikalny klucz, bez którego wspomniana usługa nie może być realizowana. Warto wspomnieć, że Wunderground.com jest jednym z najbardziej popularnych serwisów tego typu udostępniających najwięcej danych pogodowych. Aby zdobyć wspomniany wcześniej klucz, wchodzimy na stronę https://goo.gl/Jr8gfR i zakładamy darmowe konto. Następnie wybieramy z menu górnego More/Weather API for Developers i w zakładce Key Settings odczytujemy wartość naszego klucza (Key ID). Możemy jeszcze sprecyzować nazwę naszego projektu, dla którego zakładamy konto oraz jego stronę www. Wspomniany klucz zapisujemy w celu dalszego wykorzystania.
GET /api/YOURKEY/conditions/q/COUNTRY/CITY.json
gdzie:
- YOURKEY – unikalny klucz Key ID, który otrzymaliśmy od serwisu Wunderground.com.
- COUNTRY – nazwa państwa w języku angielskim, dla którego oczekujemy prognozy pogody.
- CITY – nazwa miasta w języku angielskim, dla którego oczekujemy prognozy pogody.
W celach testowych zapytanie takie możemy również wysłać z poziomu dowolnej przeglądarki WWW, przy czym w takim wypadku zapytanie to musi ulec drobnej korekcie. Oto przykład dla Warszawy: https://goo.gl/Wcf6fK. Podany przykład zapytania dotyczy informacji o bieżącym stanie pogody. W celu wysłania zapytania o stan bieżący i prognozę modyfikujemy je w następujący sposób https://goo.gl/p8DmcA. Co szczególnie istotne, warto wziąć też pod uwagę ograniczenia darmowego konta w serwisie Wunderground.com, które determinują maksymalną liczbę zapytań serwera w jednostce czasu. Korzystając z konta jak wyżej, możemy wysłać maksymalnie 10 zapytań w ciągu minuty i 500 zapytań na dobę, co wydaje się wystarczające w większości zastosowań.
Jak wspomniano, jest to tylko fragment odpowiedzi serwera, gdyż pełna jego treść potrafi składać się – w wypadku pytania o prognozę pogody – z kilku tysięcy znaków, ponieważ zawiera drobiazgowe dane dotyczące pogody, jej prognozy, miejsca i czasu pomiaru, linki do elementów graficznych reprezentujących stan pogody oraz wiele innych informacji. Mimo, taki format odpowiedzi sprawia, że jest ona czytelna dla człowieka, ponieważ łatwo jest analizować zwracane parametry, biorąc pod uwagę fakt, że po nazwie każdego pola występuje łańcuch znaków reprezentujący wartość tego pola, zaś same nazwy specyfikują oczekiwane elementy zapytania. Listę wszystkich zwracanych pól, możliwe ich wartości oraz obsługę błędów jak zawsze znajdziemy w dokumentacji API.
Na tym etapie mamy już wszystkie niezbędne informacje dotyczące naszego medium transmisyjnego i samego serwisu pogodowego, więc pora na przedstawienie schematu ideowego urządzenia wiStation, który pokazano na rysunku 1. Jest to system mikroprocesorowy, którego sercem jest mikrokontroler ATmega1284 odpowiedzialny za realizację całej założonej funkcjonalności. Mikrokontroler steruje pracą modułu ESP8266 za pomocą interfejsu USART0 (piny RXD0, TXD0) pracującego z wykorzystaniem przerwania RX Complete Interrupt, realizuje obsługę graficznego interfejsu użytkownika z użyciem kolorowego wyświetlacza TFT o rozdzielczości 320×240 pikseli, klawiatury złożonej z 4 mikroprzycisków oraz bariery podczerwieni zbudowanej z nadajnika IRED w postaci diody LED i odbiornika (układ TSOP34838) pracującego z częstotliwością nośną 38 kHz oraz odpowiada za obsługę scalonego higrometru/termometru DTH-22 (odpowiednik AM2302), dzięki któremu jest możliwy pomiar temperatury i wilgotności wewnętrznej pomieszczenia, w którym znajduje się urządzenie. Wybór tego konkretnego typu mikrokontrolera był podyktowany wyłącznie koniecznością posiadania układu o możliwie największej dostępnej pojemności pamięci Flash, gdyż piktogramy symbolizujące stan pogody i wzorce czcionek ekranowych zajmują ponad 80% wielkości programu obsługi aplikacji (głównie z uwagi na liczbę tych kolorowych piktogramów i to pomimo ich kompresji).
Wyświetlacz RVT28AETNWN00 idealnie wpasowuje się w wymagania odnośnie do urządzenia, a dodatkowo obsługę wyświetlacza ułatwia zastosowany w nim sterownik ILI9341. Dokładny opis sposobu obsługi wyświetlacza zamieściłem w artykułach „Komputer samochodowy Mee mkII” opublikowanych w EP 7…9/2016. Zainteresowanych czytelników odsyłam do wspomnianych publikacji.
Przejdźmy do sposobu obsługi modułu ESP8266. Jak wspominano, moduł jest sterowany przez mikrokontroler z użyciem interfejsu USART0. Na listingu 1 pokazano funkcję inicjalizacyjną, której zadaniem jest uruchomienie nadajnika i odbiornika interfejsu USART mikrokontrolera, ustawienie prędkości transmisji (115200 lub 9600 bps) oraz uruchomienie przerwania odbiorczego interfejsu, którego zadaniem będzie odbieranie i analiza danych wysyłanych przez moduł ESP8266. Funkcję, o której mowa, pokazano na listingu 2. Kolejne funkcje realizują wysłanie znaku, łańcucha z pamięci RAM i łańcucha z pamięci Flash mikrokontrolera – przedstawiono je na listingu 3.
Na listingu 4 pokazano funkcję obsługi przerwania odbiornika interfejsu USART (USART0_RX_vect), której zadaniem jest obsługa odpowiedzi modemu ESP8266 oraz analiza i dekodowanie danych pogodowych wysyłanych przez serwer Wunderground.com, które funkcja ta umieszcza w specjalnej strukturze danych zdefiniowanej na potrzeby projektu. Jak widać, funkcja korzysta z innej funkcji narzędziowej o nazwie determineWeather, której zadaniem jest ustalenie rodzaju pogody na podstawie wyrazów znajdujących się w linii reprezentującej stan pogody. Funkcję determineWeather prezentuje listing 5.
Po przesłaniu ostatniego z bitów danych układ Slave ściąga magistralę SDA do logicznego zera na czas 50 ms, po czym zwalnia ją, sygnalizując koniec transmisji całego pakietu danych. Układ DTH-22 każdorazowo transmituje 5 bajtów (40 bitów) danych, z których dwa pierwsze bajty reprezentują 16-bitową liczbę bez znaku, która przechowuje wilgotność względną w jednostce równej 0,1% (czyli, dla przykładu, liczba 455 oznacza wilgotność względną 45,5%). Dwa kolejne bajty reprezentują 16-bitową liczbę ze znakiem (znak jest kodowany przez najstarszy bit), która przechowuje temperaturę w jednostce równej 0,1°C (czyli, dla przykładu, liczba 324 oznacza temperaturę 32,4°C), zaś ostatni bajt stanowi sumę kontrolną obliczaną jako suma algebraiczna poprzednich czterech bajtów danych i pozwala na sprawdzenie poprawności transmisji. Warto zauważyć, że ujemne temperatury kodowane są w inny sposób, niż to zwyczajowo przyjęto. Nie jest to zapis w tzw. kodzie dopełnienia do dwóch U2, tylko zwyczajny zapis binarny, dla którego ustawiony najstarszy bit (bit 15) oznacza temperaturę ujemną i tak, dla przykładu, zapis 1000000001100101 oznacza temperaturę –10,1°C. Kolejną istotną informacją jeśli maksymalna częstotliwość odczytu danych pomiarowych, która nie może przekraczać 0,5 Hz, co oznacza, że nie należy odpytywać czujnika o dane pomiarowe częściej niż raz na 2 sekundy. Na koniec pozostaje przedstawić prostą implementację funkcji odpowiedzialnej za odczyt bieżących wartości wilgotności względnej i temperatury zmierzonych przez układ DTH-22 – pokazano ją na listingu 6.
Schemat montażowy układu wiStation pokazano na rysunku 4. Z uwagi na fakt, iż moduł wyświetlacza TFT podłączony jest do płytki naszego urządzenia z użyciem gniazda ZIF o bardzo gęstym rastrze (50 wyprowadzeń co 0,5 mm) montaż urządzenia rozpoczynamy właśnie od przylutowania tego gniazda. Najprostszym sposobem montażu elementów o tak dużym zagęszczeniu wyprowadzeń, niewymagającym jednocześnie posiadania specjalistycznego sprzętu, jest użycie typowej stacji lutowniczej, cyny z odpowiednią ilością topnika oraz dość cienkiej plecionki rozlutowniczej, która umożliwi usunięcie nadmiaru cyny spomiędzy wyprowadzeń złącza. Należy przy tym uważać, by nie uszkodzić termicznie złącza. Jakość tak wykonanego połączenia sprawdzamy pod lupą, korzystając z miernika ciągłości połączeń. Wspomniana kontrola będzie znacznie łatwiejsza, jeśli zmontowaną płytkę sterownika przemyjemy alkoholem izopropylowym w celu wypłukania nadmiaru kalafonii lutowniczej.
Następnie montujemy elementy na warstwie górnej, czyli mikrokontroler, elementy półprzewodnikowe SMD, elementy bierne a na samym końcu wszystkie elementy przeznaczone do montażu przewlekanego. Przechodzimy na warstwę spodnią, gdzie lutujemy w pierwszej kolejności elementy SMD, a na samym końcu duże podzespoły do montażu przewlekanego, jak czujnik DTH-22
(przykręcony na śrubkę), modem ESP-8266-01, rezonator kwarcowy i stabilizator LM1117-3.3V. Na samym końcu dołączamy taśmę wyświetlacza TFT do złącza ZIF, dbając o odpowiednie zablokowanie zatrzasków, zaś sam wyświetlacz przyklejamy do płytki sterownika, korzystając z pasków dwustronnej taśmy samoprzylepnej. Aby to było możliwe, należy przykleić wąskie paski (o szerokości około 2 mm) twardego materiału do płytki naszego sterownika w miejscach oznaczonych specjalnym nadrukiem, które będą stanowić dystans między płytką sterownika a modułem TFT niezbędny z powodu montażu na nim elementów SMD. Po przyklejeniu tychże dystansów, wspomniany moduł wyświetlacza mocujemy we wcześniej omówiony sposób. Na fotografii 5 pokazano wygląd obwodu drukowanego zmontowanego urządzenia wiStation od strony elementów (bez wyświetlacza TFT). Warto zauważyć, że w jego dolnej części przewidziano podłużne, odseparowane od masy pole miedzi, do którego możemy przylutować pod kątem 50–60° kawałek laminatu stanowiący niejako stopkę umożliwiającą wygodne postawienie całego urządzenia. Na fotografii 6 pokazano wygląd obwodu drukowanego zmontowanego urządzenia wiStation od strony wyprowadzeń. Warto zauważyć, że po zaprogramowaniu mikrokontrolera należy zewrzeć przy użyciu kropli cyny zworkę oznaczoną PGM, co umożliwi obsługę czujnika DTH-22.
Konstruując stację pogodową, chciałem, aby formą prezentacji danych i możliwościami dorównywała rozwiązaniom znanym choćby z telefonii komórkowej. Podstawowym zadaniem było w takim razie zaprojektowanie czytelnego i ładnego w swojej formie interfejsu użytkownika z wykorzystaniem efektownych, kolorowych elementów graficznych. Nie powiem, że było to zadanie łatwe, bo w istocie konstrukcja interfejsu graficznego zajęła mi najwięcej czasu, wliczając w to wykonanie wielu drobnych grafik (od nowa lub przetworzenie istniejących i znalezionych w Internecie elementów). Interfejs graficzny użytkownika pokazano na rysunku 7, który, mam nadzieję, czytelnie prezentuje wszystkie interesujące informacje.
Do obsługi urządzenia przewidziano 4 mikroprzyciski umownie oznaczone UP, DOWN, NEXT, PREV, których funkcjonalność zależy od aktualnie obsługiwanej funkcji. Dodatkowo przewidziano specjalny tryb konfiguracyjny, który pozwala na edycję podstawowych danych niezbędnych z punktu widzenia połączenia z siecią Wi-Fi i współpracy z serwisem Wunderground.com. Wspomniane dane to:
- Nazwa sieci Wi-Fi (SSID).
- Hasło WEP/WPA/WPA2 sieci Wi-Fi.
- Nazwa kraju i miejscowości, której dotyczy prognoza pogody (w języku angielskim).
- Unikalny klucz Key ID pozyskany od serwisu pogodowego.
Funkcjonalność przycisków przeznaczonych do obsługi stacji pogodowej zależy od aktualnie realizowanej funkcji. Rysunek obrazujący system Menu oraz sposób obsługi urządzenia (symbole przycisków wypełnione kolorem czarnym oznaczają długie naciśnięcie wybranego przycisku) pokazano na rysunku 10.
Podczas pierwszego uruchomienia urządzenia należy przytrzymać wciśnięty przycisk DOWN, co spowoduje przestawienie (i jednoczesne zapamiętanie) domyślnej prędkości interfejsu UART modułu ESP8266 z 115 200 bps na 9600 bps. Jest to niezbędne dla poprawnej pracy urządzenia. Uruchomieniu urządzenia towarzyszy wywołanie ekranu połączenia z siecią Wi-Fi, a następnie pokazanie ekranu głównego, na którym, po krótkiej chwili niezbędnej na pobranie danych pogodowych z serwisu Wunderground.com, powinniśmy zobaczyć wszystkie interesujące nas informacje. Manualna inicjacja pobrania danych pogodowych możliwa jest każdorazowo poprzez długie wciśnięcie przycisku DOWN, jednak należy mieć tutaj na uwadze ograniczenie liczby możliwych zapytań wysyłanych do serwera, o którym pisałem wcześniej oraz fakt, że ten proces jest powtarzany automatycznie z interwałem 5 minut. Dodatkową funkcjonalnością urządzenia jest funkcja alarmu/budzika, której obsługę umożliwia menu główne aplikacji i która nie wymaga dodatkowego komentarza.
Robert Wołgajew, EP