Oprogramowanie i problemy z IoT - czujnik smogu
Urządzenia IoT łączące się z siecią Wi-Fi, a niewyposażone w interfejs użytkownika (klawiatura i wyświetlacz), mają dość poważny problem – jak skonfigurować na nich właściwą sieć? Producenci takich urządzeń próbują w większości przypadków rozwiązać ten problem za pomocą aplikacji na smartfona, na której wybieramy właściwą sieć i podajemy hasło, a następnie przesyłamy te dane do urządzenia IoT.
Metody przesyłania są różne. Np. Amazon w swoim Dash Button korzysta z wbudowanego mikrofonu. Smartfon odtwarza specjalnie modulowane dźwięki, a przycisk Amazonu ich słucha. Trochę jak najstarszy modem telefoniczny. Inne urządzenia korzystają z czujników optycznych. Urządzenie przykładamy do ekranu smartfona, który za pomocą sekwencji błysków transmituje dane.
Czujniki IoT czy inne urządzenia, które łączą się z zewnętrznym serwerem, mają problem wyłącznie z uzyskaniem danych sieci Wi-Fi, a potem już sobie radzą, łącząc się z serwerem, którego adres uzyskują np. za pomocą DNS albo mają go zapisany na stałe. Gorzej jest w przypadku urządzeń, które same zawierają serwer – tak jak jest to w SMOG TX. Tutaj użytkownik musi poznać adres IP w sieci lokalnej, z którym ma się połączyć za pomocą swojej przeglądarki internetowej.
W domowych sieciach WiFi adres IP przydziela dynamicznie router. Oczywiście można w jego konfiguracji sprawdzić, jaki adres nadał nowemu urządzeniu, ale to mało eleganckie, a gdy mamy w sieci domowej wiele urządzeń, może być ciężko się zorientować, które jest właściwe. SMOG TX nie ma wyświetlacza, na którym może pokazać otrzymany adres. Ma port UART, na który wysyła wiele informacji, w tym adres IP. Ale podłączanie urządzenia do przejściówki USB UART, aby sprawdzić adres również jest mało eleganckim rozwiązaniem.
Oba problemy rozwiązuje biblioteka WiFiManager. Za jej pomocą na urządzeniu utworzymy Access Point, z którym połączymy się naszym smartfonem. Na wyświetlonej stronie internetowej z listy dostępnych sieci wybierzemy właściwą i wpiszemy hasło. Gdy SMOG TX połączy się z naszą siecią domową, odczytamy nadany mu adres IP. Więcej szczegółów w śródtytule „Montaż i uruchomienie”.
Biblioteka pokazuje bardzo interesujący tryb pracy układu ESP8266, w którym jest on jednocześnie punktem dostępowym oraz klientem sieci Wi-Fi.
Aby programować w Arduino IDE na ESP8266, należy doinstalować odpowiednie oprogramowanie. Jest to bardzo proste. Najpierw w menu Plik wybieramy Preferencje. I tam w polu „Dodatkowe adresy URL do menadżera płytek” wpisujemy: http://arduino.esp8266.com/stable/package_esp8266com_index.json
Następnie w menu Narzędzia→Płytka wybieramy Menadżera płytek. Tam w pole wyszukiwania wpisujemy „esp8266” i instalujemy paczkę esp8266 by ESP8266 Community. Kolejny krok to dodanie wykorzystywanych bibliotek, tzn. WiFiManager by tzapu, ArduinoJson, Adafruit_Sensor oraz Adafruit_BME280. Biblioteki dodajemy, korzystając z menu Narzędzia→ Zarządzaj bibliotekami… Biblioteka WiFiManager występuje w dwóch wersjach – oryginalnej stworzonej przez tzapu i zmodyfikowanej, autorstwa kentaylor.
Niestety w projekcie musiałem wykorzystać obie. Ta od tzapu lepiej sprawdza się w RX, natomiast od kentaylor w TX. Ponieważ w pierwszej lepiej działają dodatkowe parametry, a druga wyświetla adres IP, jaki otrzymało urządzenie. Wersja kentaylor nie jest dostępna przez menedżera bibliotek. Po wgraniu oprogramowania dla RX należy ją ściągnąć ręcznie i podmienić w folderze z bibliotekami.
SMOG TX - oprogramowanie
Funkcja setup() ma dwa tryby, zależne od stanu przycisku. Gdy przycisk jest wciśnięty w trakcie uruchamiania urządzenia, wywoływany jest WiFiManager, w przeciwnym wypadku to typowa konfiguracja urządzenia. W pętli loop() oprogramowanie cyklicznie odczytuje parametry powietrza z czujnika PM7003 przez port szeregowy oraz ciśnienie, temperaturę powietrza i wilgotność z czujnika BME280 przez magistralę I2C.
Adres czujnika na magistrali można konfigurować za pomocą pinu wejściowego. Na moim module miał on adres 0x76. W pliku Adafruit_BME280.h z biblioteki adres był inny i dlatego komunikacja z czujnikiem nie działała. Aby naprawić problem, należy adres poprawić w tym pliku i ponownie skompilować cały projekt.
Na urządzeniu uruchomione są dwa serwery. Jeden na porcie 80, czyli standardowym HTTP, serwuje stronę WWW urządzenia. Drugi na porcie 50000 służy do wysyłania danych z czujnika do SMOG RX. Serwer HTTP udostępnia bardzo prostą stronę WWW widoczną na rysunkach 1–3. Składa się ona ze statycznego nagłówka oraz danych z czujników, ma też warunkowe formatowanie – zmiana koloru tła tekstu i teksty wyświetlane warunkowo – ocenę jakości powietrza. Strona odświeża się automatycznie w przeglądarce internetowej co 5 sekund, dzięki parametrowi zawartemu w jej nagłówku.
<meta http-equiv=”refresh” content=”5”>
SMOG RX - oprogramowanie
Ponieważ podczas konfiguracji konieczne jest zapisanie dodatkowego parametru – adresu IP SMOG TX, funkcja setup() jest tu trochę bardziej skompilowana. Zawiera obsługę systemu plików, gdzie ten parametr jest zapisywany. Sposób definicji tego parametru na stronie konfiguracyjnej i w systemie plików bazuje w pełni na przykładzie dostarczonym razem z WiFiManagerem. Poza tym funkcja setup() ma jeszcze tryb ustawiania wskaźników wychyłowych wywoływany przyciskiem.
Funkcja loop() cyklicznie łączy się z serwerem SMOG TX na porcie 50000, odczytuje parametry powietrza, zamienia wartości tekstowe na Int i przelicza na wartości z zakresu 0 do 1023, czyli dopuszczalne dla 10-bitowego PWM. Dla PM2,5 jako maksymalne wychylenie, czyli wartość 1023 przyjęte zostało 120μg/m3, natomiast dla PM10 – 200μg/m3.
Montaż i uruchomienie czujnika smogu IoT
Płytki drukowane urządzeń TX i RX są pokazane na rysunkch 6 i 7. Montaż jest typowy i prosty pomimo zastosowania wielu elementów SMD. Nietypowym elementem są moduły lutowane powierzchniowo, ale tu też jest to bardzo prosto. Najlepiej pocynować jeden skrajny pad, przyłożyć moduł i podgrzewając ten pad, dobrze wyrównać. Potem przylutować drugi pad po przekątnej. Po upewnieniu się, że moduł jest dobrze wyrównany, pozostałe pady można lutować bez problemu grotem. Ewentualne zwarcia usunąć plecionką.
ESP8266 nie wymaga żadnego specjalnego programatora do wgrania oprogramowania – wystarczy przejściówka USB–UART o poziomie napięć 3,3V. Złączem programującym zarówno na SMOG TX, jak i RX jest K1. Pin numer 1 tego złącza to TX ESP8266, czyli tu należy podłączyć RX przejściówki i analogicznie TX przejściówki do pinu 2. ESP ma bootloader, który odbiera oprogramowanie przesyłane przez łącze szeregowe i zapisuje w zewnętrznej pamięci programu.
ESP nie ma wewnętrznej pamięci kodu, dlatego na modułach zawsze towarzyszy mu 8-pinowy układ scalony – pamięć FLASH z interfejsem SPI. Aby ESP uruchomił swój bootloader zamiast kodu zapisanego w tej właśnie pamięci, należy go włączyć z wyprowadzeniem GPIO0 zwartym do masy. Dla SMOG TX oznacza to przytrzymanie przycisku SW2 w trakcie dołączania zasilania do układu, a dla RX będzie to SW3.
W Arduino IDE jako typ płytki należy wybrać Generic ESP8266 Module, rozmiar pamięci na 2MB (1MB SPIFFS) dla TX oraz 4MB (1MB SPIFFS) dla RX oraz właściwy port COM – naszą przejściówkę USB–UART. Pozostałe parametry można pozostawić z wartościami domyślnymi. I już można wgrać oprogramowanie tak jak to robimy dla zwykłego Arduino.
SMOG TX - montaż i uruchomienie
Urządzenie najlepiej zasilić z 9V. Napięcie może być wyższe (12V), ale wtedy większe straty w stabilizatorach bardziej zaburzają pomiar temperatury. Pobór prądu to maksymalnie 140mA i jest dość zmienny.
W urządzeniu trzeba skonfigurować parametry naszej domowej sieci Wi-Fi. Aby to zrobić, włączamy SMOG TX z wciśniętym przyciskiem SW1. Na naszym smartfonie (można też korzystać z komputera, ale na telefonie będzie łatwiej) wchodzimy w menu wyboru sieci Wi-Fi i łączymy się z niezabezpieczoną siecią SMOG_TX_SETUP. Po połączeniu telefon automatycznie przekieruje nas na stronę konfiguracyjną SMOG TX.
Na komputerze należy uruchomić przeglądarkę internetową i połączyć się z adresem 192.168.4.1. Uwaga, to jest tylko tymczasowy adres używany do konfiguracji Wi-Fi, a nie adres, na którym potem będziemy sprawdzać odczyt z czujników. Na wyświetlonej stronie klikamy przycisk Configuration i przechodzimy do strony z wyświetlonymi okolicznymi sieciami WiFi. Należy wybrać naszą sieć i w odpowiednie pole wpisać hasło.
Po zaakceptowaniu SMOG TX połączy się z siecią, ale nadal będzie udostępniać swoją sieć SMOG_TX_SETUP. Należy się z nią ponownie połączyć w menu sieci telefonu i tym razem na głównej stronie wyświetli się adres IP, jaki SMOG TX otrzymał. Należy go zapisać i kliknąć „Exit Portal”, a potem wyłączyć i włączyć ponownie zasilanie urządzenia.
Ponieważ z adresu IP będziemy korzystać my – wchodząc na stronę czujnika oraz SMOG RX, należy zadbać, aby ten adres nie zmieniał się z czasem. Należy to zrobić w ustawieniach domowego routera, tak aby przyznany adres IP był na stałe skojarzony z adresem MAC SMOG TX. Teraz już możemy sprawdzać jakość powietrza, wchodząc na stronę WWW pod zapisanym lokalnym adresem IP za pomocą dowolnej przeglądarki internetowej.
SMOG RX - montaż i uruchomienie
Zasilanie dostarczane jest przez port microUSB. Można wykorzystać starą ładowarkę od telefonu, powerbank czy nawet podłączyć urządzenie do portu USB komputera – linie danych są niepodłączone na płytce. Aby wybrać tryb kalibracji wskaźników wychyłowych, urządzenie należy włączyć z wciśniętym przyciskiem SW1. Oprogramowanie wysteruje maksymalną wartość i należy ją ustawić na wskaźnikach za pomocą potencjometrów montażowych RV1 oraz RV2.
Następne należy odłączyć zasilanie i podłączyć je ponownie, tym razem z wciśniętym przyciskiem SW2, aby uruchomić tryb konfiguracji sieci Wi-Fi. Jest ona analogiczny jak dla SMOG TX, ale tu mamy jedno dodatkowe pole, gdzie należy wpisać adres IP czujnika. Po ponownym uruchomieniu urządzenia będą komunikować się ze sobą i wymieniać dane.
W normalnym trybie pracy po włączeniu SMOG RX wskaźniki wychyłowe wykonują test, poruszając się od minimalnej do maksymalnej wartości, następnie w trakcie łączenia się z siecią Wi-Fi oscylują w pobliżu połowy wartości maksymalnej. Po pomyślnym połączeniu z siecią opadają do wartości minimalnej. Po wymianie danych z SMOG TX wskazują poziom PM2,5 (lewy) oraz PM10 (prawy). Każda wymiana danych z czujnikiem jest sygnalizowana krótkim błyskiem diody LED.
Możliwości zmian - czujnik smogu IoT
Oczywiście wykorzystane w moim projekcie wojskowe wskaźniki wychyłowe są unikatowe i Czytelnicy raczej nie użyją identycznych, ale można skorzystać z innych, np. z demontażu z uszkodzonych mierników lub magnetofonów. Można też skorzystać z zupełnie innych rodzajów wyświetlaczy, np. linijek diodowych, diod WS2812B – prezentować poziom zanieczyszczenia powietrza za pomocą różnych kolorów.
Można również zastosować wyświetlacz graficzny, np. z matrycą OLED. Ponieważ oprogramowanie, które udostępniam, powstało w Arduino, zmiana będzie prosta, bo dla każdego urządzenia opisanego powyżej są dostępne gotowe biblioteki. Dla części nadawczej można dodać więcej czujników środowiskowych i stworzyć np. rozbudowaną stację pogodową. Wykorzystanie różnych czujników było opisane w EdW w cyklu dotyczącym Arduino.
Mój czujnik działa bezawaryjnie już ponad półtora roku, chociaż latem był używany sporadycznie. Jedynie na przyciskach widać lekkie ślady korozji. Popularna platforma pokazująca poziom smogu w Polsce powstała mniej więcej w tym samym czasie albo nawet trochę później. A urządzenie będące jej podstawą bazuje na bardzo zbliżonych komponentach, choć nie identycznych. Setki sztuk działające w Polsce potwierdzają dobry wybór komponentów. A platforma odniosła dość duży sukces.
W tytule artykułu jest skrót IoT – Internet of Things. To ostatnio bardzo popularny termin i często nadużywany. Trend łączenia wszystkiego z Internetem prowadzi czasem do dość absurdalnych urządzeń. Naprawdę nie wszystko w naszym życiu musi być „podłączone”. Ale właśnie sieci czujników to moim zdaniem bardzo sensowna ścieżka rozwoju IoT. Możliwość zbierania danych pomiarowych w wielu rozsianych po świecie punktach, gromadzenia, analizowania i udostępniania ich w Internecie jest bardzo przydatna.
W opisanym urządzeniu wymiana informacji zachodzi wyłącznie w sieci lokalnej. Ale protokół jest „internetowy”, więc żeby informacje były dostępne w Internecie na całym świecie, to tylko kwestia konfiguracji domowego routera, żeby przekierował zewnętrzne zapytania na adres SMOG TX w sieci lokalnej.
Prosty protokół do komunikacji ze SMOG RX może być wykorzystany w inny sposób, np. przez serwer, który cyklicznie odpytuje TX o zmierzone wartości i loguje je bądź udostępnia dalej. Oczywiście oprogramowanie SMOG TX można zmodyfikować tak, żeby udostępniało dane jednej z licznych platform do obsługi czujników IoT – np. ThingSpeak. Biblioteki dla Arduino i ESP8266 są gotowe dla tej platformy. Mówiąc o rozwoju własnego oprogramowania na ESP8266, chciałbym na koniec polecić bardzo dobrą płytkę deweloperską – NodeMcu (fotografia 7 po lewej).
Powstała ona do programowania ESP w LUA, ale nie ma żadnych przeszkód, żeby używać jej w Arduino IDE. A ma ona wiele zalet. Na małej płytce mamy moduł ESP- 12, przejściówkę USB–UART, która również automatycznie steruje pinem GPIO0 oraz RESET, aby wejść w tryb programowania. Dzięki temu nie musimy tego robić ręcznie, dzieje się to samo po wybraniu komendy wgrania softu w Arduino.
Poza tym NodeMcu ma wyprowadzone wszystkie GPIO mikrokontrolera w rastrze pasującym do płytki prototypowej. Ma też stabilizator 3,3V. Do rozpoczęci a programowania ESP8266 na NodeMcu potrzebny jest jedynie kabel microUSB. Moim zdaniem ta płytka to taki sam niezbędnik, jak Arduino UNO.
Kolejna rzecz, którą polecam Czytelnikom zainteresowanym IoT i tworzeniem swoich urządzeń tego typu, to ESP32. To relatywnie nowy układ produkcji Espressif o znacznie większych możliwościach. Jest dwurdzeniowy: jeden rdzeń przeznaczony jest dla stosu radiowego, a drugi w pełni dla aplikacji użytkownika. Zawiera Bluetooth, w tym także SMART. Ma możliwość podłączenia Ethernetu oraz wiele innych nowych układów peryferyjnych. Fotografia 7 przedstawia wersję NodeMcu już z ESP32. Nie są one drogie, a wsparcie w Arduino jest coraz lepsze. Polecam!