wersja mobilna | kontakt z nami

Laserowy, bezprzewodowy sensor smogu dla Raspberry Pi

Numer: Maj/2019

W jednym z poprzednich numerów zaprezentowany został projekt sensora smogu z bezprzewodową technologią Bluetooth Low Energy. Wyposażony w dokładny, laserowy czujnik PMS7003 umożliwia on wykonywanie zdalnych pomiarów zawartości pyłów zawieszonych w powietrzu. Mierzy też temperaturę i wilgotność względną, korzystając z precyzyjnego układu SHT20. Prezentację wyniku pomiaru powierzono aplikacji BBair, która na ekranie smartfonu z systemem Android pokazuje, jaki jest aktualny stan badanego powietrza. Okazuje się, że z zaprezentowanego sensora można wycisnąć znacznie więcej funkcjonalności. I właśnie tym zajmiemy się dzisiaj.

Pobierz PDF

Rysunek 1. Połączenie pól konfiguracyjnych: czas 15 minut

Rysunek 2. Połączenie pól konfiguracyjnych: czas 60 minut

Rysunek 3. Połączenie pól konfiguracyjnych: czas 180 minut

Rysunek 4. Schemat połączenia diod LED

Rysunek 5. Pierwsze kroki podczas konfigurowania systemu

Po odpowiednim skonfigurowaniu sensor BBair może wykonywać pomiary jakości powietrza w dwóch równoległych trybach:

  1. Pomiar na żądanie: w dowolnej chwili, po nawiązaniu połączenia Bluetooth Smart, sensor rozpoczyna wykonywanie pomiarów, przesyłając wyniki do  urządzenia mobilnego.
  2. Pomiary automatyczne: wykonywane cyklicznie z przesyłaniem wyników do komputera kolekcjonującego i przetwarzającego dane.

Takie dualne działanie sensora umożliwia sprawdzenie stanu powietrza w konkretnej, interesującej nas chwili, na przykład za pomocą smartfonu i jednocześnie zbieranie długookresowych danych analitycznych. Wykorzystując mały, popularny mikrokomputer Raspberry Pi, dostajemy nieograniczone wręcz możliwości rejestracji, analizy, prezentacji i publikacji zebranych danych pomiarowych. Odpowiednie do naszych zastosowań będą Raspberry Pi 3 lub Raspberry Pi Zero W fabrycznie wyposażone w interfejs Bluetooth Low Energy. Dzięki bibliotece bbmagic_lib jest możliwe bardzo łatwe i szybkie napisanie programu zbierającego dane z sensorów jakości powietrza.

Jak to zrobić? Sensor BBair

Na początek zajmiemy się skonfigurowaniem samego sensora BBair. Mamy do wyboru trzy okresy wykonywania pomiarów automatycznych: 15 minut, 1 godzina lub 3 godziny. Ustawienia żądanego okresu pomiarowego dokonujemy po uprzednim wyłączeniu zasilania za pomocą odpowiedniego połączenia pól konfiguracyjnych. Szczegóły pokazano na rysunkach 1…3. Nie wykonując żadnego połączenia pól, programujemy sensor do pracy w trybie pomiarów na żądanie, bez wykonywania pomiarów automatycznych.

Jak to zrobić? Raspberry Pi

Mikrokomputer Raspberry Pi Zero W z zainstalowanym systemem operacyjnym Raspbian Lite jest idealnym narzędziem do naszych celów. Ponieważ biblioteka zapewniająca komunikację z sensorami BBair ma również możliwość sterowania trzema diodami LED, wykonamy kilka połączeń, aby skorzystać z tego udogodnienia. Kolorowe diody będą informowały o stanie pracy programu. Przyłączmy zatem do Raspberry Pi diody z szeregowymi rezystorami, jak pokazano na schemacie z rysunku 4. Żółta dioda dołączona do pinu 13 zaświeci się, gdy uruchomimy aplikację, i zgaśnie, jeśli program zostanie zamknięty. Mrugające, zielona i czerwona, diody LED poinformują o trwającej komunikacji radiowej, odpowiednio - odbieraniu i wysyłaniu danych.

Jak to zrobić? Software

Aby móc zbudować aplikację, potrzebujemy narzędzi (kompilator, linker). Logujemy się zatem do elektronicznej maliny i instalujemy cały pakiet poleceniem

sudo apt-get install gcc

Będzie też potrzebny edytor plików tekstowych. Możemy użyć małego nano, instalując go komendą

sudo apt-get install nano

Do odbierania danych pomiarowych udostępnianych przez sensor jakości powietrza użyjemy biblioteki bbmagic_lib w wersji 2.0. Pobierzmy ją wraz z całym projektem BBair SMOG logger poleceniem

wget http://bbmagic.net/download/src/BBair_SMOG_logger_1.0.tar.gz

Następnie rozpakujmy pobrane archiwum komendą

tar -zxvf BBair_SMOG_logger_1.0.tar.gz

i przejdźmy do nowo powstałego katalogu

cd BBair_SMOG_logger_1.0

Powyższe kroki pokazano na rysunku 5. Projekt BBair SMOG logger zawiera następujące zasoby:

  • w katalogu libs znajdują się niezbędne biblioteki,
  • plik bbmagic_lib.h zawiera deklaracje stałych oraz funkcji zaimplementowanych w bibliotece bbmagic_lib.

Makefile to z kolei plik instrukcji sterujących procesem kompilacji, a bbair_smog_logger.c to plik z kodem źródłowym naszego programu. Projekt zawiera też skompilowany plik bbair_smog_logger. Jeśli chcielibyśmy natychmiast go uruchomić, to uprzednio modyfikujemy prawa dostępu poleceniem

chmod 755 bbair_smog_logger

I po tym zabiegu uruchamiamy komendą

sudo ./bbair_smog_logger

Jeśli natomiast mamy ochotę coś zmodyfikować w kodzie programu lub po prostu samodzielnie go skompilować, to możemy teraz spokojnie przystąpić do analizy.

Analizowanie kodu programu

Nasz program będzie odbierał dane o stanie jakości powietrza, jego temperaturze i wilgotności, wyświetlał je w formie tekstowej na ekranie monitora oraz zapisywał do pliku tekstowego. Uruchamiamy zatem edytor, aby zobaczyć na ekranie zawartość pliku źródłowego

nano bbair_smog_logger.c

Na początku załączone zostały niezbędne pliki nagłówkowe, a następnie zdefiniowane stałe konfigurujące nasz program (listing 1). RX_LED_PIN to numer pinu, do którego podłączyliśmy zieloną diodę LED sygnalizującą odbieranie danych, TX_LED_PIN to pin z diodą sygnalizującą nadawanie (czerwona), a RUN_LED_PIN to ten z diodą informującą o uruchomionym programie (żółta). TIME_BUF_SIZE definiuje rozmiar bufora potrzebnego m.in. do wyświetlenia aktualnego czasu.

Na początku głównej funkcji loggera sprawdzamy wersję użytej biblioteki bbmagic_lib i jeśli nie jest to wersja 2.0, kończymy działanie, informując o niekompatybilności. Jeśli dysponujemy biblioteką w odpowiedniej wersji, możemy skorzystać z zaimplementowanych tam funkcji, które będą nam potrzebne.

W kolejnym kroku uruchamiamy zatem komunikację bbmagic over BLE, wywołując funkcję

i = bbm_bt_open(RX_LED_PIN, TX_LED_PIN, RUN_LED_PIN, LIB_SHOW_CONFIG) ;

Przyjmuje ona 4 argumenty. Pierwsze 3 to zdefiniowane uprzednio numery pinów z diodami LED. Jeśli numer pinu przyjmie wartość zero, to jego funkcja sygnalizacyjna nie zostanie włączona. Czwarty argument to flagi bitowe określające, jakie rodzaje komunikatów biblioteka powinna wysyłać na ekran podczas działania. Flagi można oczywiście ustawiać niezależnie: LIB_SHOW_CONFIG | LIB_SHOW_BBAIR spowoduje wyświetlanie komunikatów startowych i danych odebranych od sensora BBair. Ponieważ my chcemy samodzielnie formatować i wyświetlać dane otrzymane od sensora jakości powietrza, użyjemy wyłącznie flagi LIB_SHOW_CONFIG. Szczegółowy opis dostępnych flag i ich nazw symbolicznych zawiera tabela 1.

Następnie dokonujemy próby otwarcia pliku, który posłuży do przechowywania, danych pomiarowych. Funkcję fopen wywołamy w ten sposób, aby dopisywać dane na końcu istniejącego pliku. Wskazuje na to parametr „a”. Jeśli plik jeszcze nie istnieje, funkcja utworzy nowy

logFile = fopen(„bbair_smog_log.txt”, „a”) ;

Teraz zajmiemy się samym jądrem naszej aplikacji. Odbieranie danych pomiarowych opiera się na cyklicznym wywoływaniu zaimplementowanej w bibliotece bbmagic_lib funkcji

bbm_id = bbm_bt_read(bbm_buf) ;

Jeśli zwróci ona „0”, to oznacza, że nie nadeszły nowe dane. Wartość „-1” informuje, że użytkownik nacisnął Ctrl+C i zażądał zakończenia działania programu. Wtedy przerywamy główną pętlę do{...}while(bbm_id != -1), zamykamy komunikację BBMagic over BLE (bbm_bt_close()) i plik logowania, jeśli wcześniej został poprawnie otwarty (fclose(logFile)) i kończymy działanie (exit(0)). Jeśli natomiast funkcja zwróci liczbę większą od 0, to jest ona numerem ID urządzenia, które nadesłało wiadomość. W takim wypadku tablica bbm_buf[BBLIB_FRAME_SIZE] zawiera odebrane i zdekodowane dane. Sensor BBair ma numer ID=40 ukryty w stałej BBMAGIC_M_BBAIR i zdefiniowanej w pliku bbmagic_lib.h. Zawartość tablicy wypełnionej informacjami od sensora jakości powietrza szczegółowo przedstawia tabela 2.

Dalsza część pętli głównej sprawdza, czy odebrane dane pochodzą od sensora BBair

if(bbm_id == BBMAGIC_M_BBAIR)

Jeśli tak, to przelicza i wyświetla zawarte w tablicy ‘bbm_buf’ dane, ale robi to tylko w przypadku, gdy flaga aktualności informacji jest równa zero.

if(bbm_buf[BBM_BBAIR_STATUS] ==0)

Wyzerowana flaga oznacza, że sensor wykonał już pomiar i udostępnia poprawne wyniki. W przeciwnym wypadku, gdy flaga ma wartość inną niż zero, wyświetlany jest tylko adres sensora wraz z odpowiednim komunikatem o oczekiwaniu na aktualne dane.

Pozostaje jeszcze pytanie, w jaki sposób zapisywać kolejne porcje danych pomiarowych do pliku? Sensor BBair dostarcza bowiem kolejnych informacji co około 1 sekundy, ale pomiary są wykonywane co 15, 60 lub 180 minut, w zależności od wybranej konfiguracji. Byłoby przecież bezcelowym zapisywanie do pliku każdej odebranej ramki danych. Mamy na szczęście prosty sposób na zorientowanie się, czy otrzymane właśnie dane są świeże, czy może dotyczą historycznego pomiaru sprzed powiedzmy kilkudziesięciu minut. Jak pokazuje tab. 2, pole bbm_buf[BBM_BBAIR_MEAS_TIME] każdej nadesłanej ramki danych zawiera czas w minutach, który upłynął od ostatniego pomiaru. Widzimy więc, że wartość ta będzie systematycznie rosła, aż do momentu, w którym zostanie zakończony kolejny pomiar i nowe wyniki zostaną dostarczone do aplikacji. Wtedy nastąpi jej wyzerowanie, ponieważ od wykonanego właśnie pomiaru upłynęło 0 minut. Wystarczy więc zapamiętywać wartość tego pola w zmiennej m_time i jeśli spełniony zostanie warunek

if( bbm_buf[BBM_BBAIR_MEAS_TIME] < m_time)

zapisać do pliku kolejny wiersz zawierający aktualne dane pomiarowe.

Kompilacja i uruchomienie programu

Rysunek 6. Ekran po uruchomieniu programu

Rysunek 7. Wyniki pomiarów jakości powietrza, temperatury i wilgotności

Rysunek 8. Plik logowania wyników pomiarów

Rysunek 9. Przykładowa analiza wyników pomiarów - wilgotność i temperatura

Rysunek 10. Przykładowa analiza wyników pomiarów - pyły zawieszone

Rysunek 11. Wyniki pomiarów prezentowane na wyświetlaczu

Skompilujmy teraz nasz projekt, wpisując polecenie make. Następnie możemy już uruchomić program naszego loggera sudo ./bbair_smog_logger. Włączamy zasilanie uprzednio skonfigurowanego sensora BBair, a ekran monitora będzie wyglądał jak ten przedstawiony na rysunku 6. Jeśli po dwóch minutach nie pojawią się pierwsze wyniki, oznacza to, że sensor nie pracuje w trybie automatycznych pomiarów i należy sprawdzić połączenia pól konfiguracyjnych (rysunki 1…3). Przy prawidłowej konfiguracji na ekranie pojawiać się będą wyniki kolejnych pomiarów jak na zrzucie ekranu z rysunku 7. Znajdziemy tam: godzinę pomiaru, temperaturę i wilgotność oraz kolejno zawartość zawieszonych w powietrzu pyłów frakcji PM10, PM2.5 oraz PM1. Dalej aktualne napięcie zasilania sensora (może zostać wykorzystane do kontroli stanu baterii zasilających) i moc odbieranego sygnału radiowego RSSI podany w dBm. Liczby w ostatnim nawiasie kwadratowym to kolejno: czas, jaki upłynął od ostatniego pomiaru oraz czas, jaki pozostał do kolejnego pomiaru. W pliku bbair_smog_log.txt zapisywane są w kolejnych wierszach rezultaty pomiarowe, jak pokazano na rysunku 8. Kolejne dane rozdzielone są przecinkami, co bardzo ułatwia ich import do arkusza kalkulacyjnego. Pewnym kłopotem jest to, że temperatura i napięcie zanotowane są z kropką dziesiętną, czego nie przyjmuje program arkusza, oczekując w tych miejscach przecinka. Zamiana kropek na przecinki jest jednak dziecinnie prosta: wystarczy skorzystać z funkcji 'znajdź/zamień' (często pod skrótem klawiszowym Ctrl+f) i wszystkie kropki w mgnieniu oka stają się przecinkami.

Już po kilku dniach zbierania danych pomiarowych można przeprowadzić ciekawe analizy parametrów powietrza (rysunek 9 i rysunek 10).

Pozostaje jeszcze kwestia drobnego usprawnienia, aby nasz logger działał w tle, umożliwiając normalny dostęp do konsoli. Użyteczne w tym przypadku będzie narzędzie ‘screen’. Szczegółowy opis, jak go zainstalować i użyć, można zaleźć pod adresem http://bit.ly/2PelGHN.

W kolejnym artykule o badaniu jakości powietrza zbudujemy w kilka chwil stację monitorującą, która będzie zasilana energią słoneczną. Wyniki pomiarów w atrakcyjnej formie zaprezentuje kolorowy czterocalowy, graficzny wyświetlacz LCD sterowany przez Raspberry Pi zero W (rysunek 11).

Mariusz Żądło

Pozostałe artykuły

Rower elektryczny (1)

Numer: Maj/2019

Już od jakiegoś czasu stały się dosyć mocno popularne różne pojazdy z napędem elektrycznym. Na ulicach często możemy zobaczyć hulajnogę lub deskorolkę elektryczną. Tego typu pojazdy są bardzo tanie w eksploatacji oraz umożliwiają łatwe przemieszczanie się po utwardzonych nawierzchniach w większych aglomeracjach. Niestety większość małych pojazdów elektrycznych może poruszać się tylko po utwardzonych drogach, a dodatkowo ...

Strumieniowy odtwarzacz audio na i.MX6ULL

Numer: Kwiecień/2019

W systemach mikroprocesorowych często zachodzi potrzeba porozumienia się z użytkownikiem nie tylko za pomocą obrazu i dotyku, ale również za pomocą dźwięku. Nie zawsze musi to być dźwięk o najwyższej jakości, szerokiej dynamice i pozbawiony zniekształceń. Do zwrócenia uwagi użytkownika na wyświetlany na ekranie komunikat, udźwiękowienia zapisanego w pamięci urządzenia filmiku instruktażowego, odtworzenia mowy lub muzyki z niewielkich, ...

Analizator stanów logicznych z modułu STM32F4DISCOVERY

Numer: Styczeń/2019

W artykule przedstawiono kolejny przykład użycia zestawu uruchomieniowego mikrokontrolera w roli analizatora stanów logicznych. Tym razem projekt analizatora powstał na bazie zestawu STM32F4DISCOVERY. Dzięki niestandardowemu użyciu układu DCMI w mikrokontrolerze STM32F407 uzyskano analizator stanów logicznych o godnych uwagi parametrach, przewyższający swymi osiągami popularny wśród hobbystów i studentów analizator Saleae.

Moduł ESP01 pracujący jako sterownik z 2 wyjściami i 1 wejściem

Numer: Grudzień/2018

ESP01 to miniaturowy moduł Wi-Fi zbudowany w oparciu o układ ESP8266. W tej najprostszej wersji do dyspozycji użytkownika są 2 wyprowadzenia I/O oraz port komunikacyjny UART. Nawet jednak z tak ograniczonymi zasobami sprzętowymi, można wykorzystać moduł do zbudowania mikro-serwera z 2 wyjściami i 1 wejściem, ze sterowaniem za pośrednictwem przeglądarki internetowej. Taki serwer może generować dynamiczne strony HTML wysyłane do wyświetlenia ...

Czytnik linii papilarnych

Numer: Listopad/2018

Moduł GT-511 jest czytnikiem optycznym linii papilarnych. Może skanować odciski palca i porównywać je ze zgromadzoną wcześniej bazą danych linii papilarnych. Płytka sterownika z dołączonym skanerem pozwala na przykład, na sterowanie przekaźnikiem danymi biometrycznymi. Przekaźnik zadziała tylko wtedy, jeśli skan odcisku palca będzie właściwy.

Mobilna
Elektronika
Praktyczna

Ze świata  Kobiety w elektronice    ...

Elektronika Praktyczna

Maj 2019

PrenumerataePrenumerataKup w kiosku wysyłkowym

Elektronika Praktyczna Plus

lipiec - grudzień 2012

Kup w kiosku wysyłkowym