Sensor BBair wyposażony jest w dokładny, laserowy czujnik PMS7003. Umożliwia wykonywanie zdalnych pomiarów zawartości pyłów zawieszonych w powietrzu. Mierzy też jego temperaturę i wilgotność względną, korzystając z precyzyjnego układu SHT20.
Prezentację wyników pomiaru powierzono aplikacji BBair, która na ekranie smartfonu z systemem Android pokazuje, jaki jest aktualny stan badanego powietrza.
Po odpowiednim skonfigurowaniu sensor BBair może wykonywać pomiary jakości powietrza w dwóch równoległych trybach:
- 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.
- 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 przy pomocy smartfona 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.
Konfiguracja sensora 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.
Nie wykonując żadnego połączenia pól, programujemy sensor do pracy w trybie pomiarów na żądanie, bez wykonywania pomiarów automatycznych.
Konfiguracja Raspberry Pi
Mikrokomputer Raspberry Pi Zero W z zainstalowanym systemem operacyjnym Raspbian Lite jest idealnym narzędziem do celów zbierania i przetwarzania danych z sensora.
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.
Żół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, informują o trwającej komunikacji radiowej, odpowiednio – odbieraniu i wysyłaniu danych.
Oprogramowanie Raspberry Pi
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 przechodzimy do nowo powstałego katalogu
cd BBair_SMOG_logger_1.0
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 plik instrukcji sterujących procesem kompilacji,
- bbair_smog_logger.c to plik z kodem źródłowym naszego programu
Projekt zawiera też gotowy, skompilowany już plik bbair_smog_logger. Jeśli chcielibyśmy natychmiast go uruchomić, to uprzednio dla pewności modyfikujemy prawa dostępu poleceniem:
chmod 755 bbair_smog_logger
I po tym zabiegu uruchamiamy komendą:
sudo ./bbair_smog_logger
Przeanalizujmy ten kod
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. 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 starcie 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 poniżej.
Nazwa flagi | Włącza wyświetlanie |
---|---|
LIB_SHOW_CONFIG | Komunikaty raportujące start biblioteki |
LIB_SHOW_SENSORS | Dane odebrane od sensorów BBMagic |
LIB_SHOW_ACTORS | Dane odebrane od aktorów BBMagic |
LIB_SHOW_BBAIR | Dane odebrane od sensora BBair |
W kolejnych liniach kodu 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.
Pozycja w buforze bbm_buf | Symbol w bbmagic_lib.h | Opis |
---|---|---|
0 | BBM_BBAIR_STATUS | Status przesłanych danych: 0 – dane aktualne, 1 – dane nieaktualne. |
1 | BBM_BBAIR_MEAS_TIME | Czas w minutach jaki upłynął od ostatniego pomiaru. |
2 | BBM_BBAIR_PERIOD | Okres w minutach wykonywania pomiarów automatycznych. |
3 | BBM_BBAIR_V_BAT | Napięcie zasilania sensora BBair. Należy podzielić przez 71 aby otrzymać wartość w woltach. |
4 | BBMAGIC_DEVICE_TYPE | ID modułu, który nadesłał dane. Wszystkie dostępne są zdefiniowane w pliku 'bbmagic_lib.h’ |
5 | BBM_BBAIR_TEMP_MSB | Temperatura powietrza – starszy bajt. |
6 | BBM_BBAIR_TEMP_LSB | Temperatura powietrza – młodszy bajt. |
7 | BBM_BBAIR_RH | Wilgotność względna. |
8 | BBM_BBAIR_PM10_MSB | Zawartość pyłów frakcji PM10 starszy bajt. |
9 | BBM_BBAIR_PM10_LSB | Zawartość pyłów frakcji PM10 młodszy bajt. |
10 | BBM_BBAIR_PM2_5_MSB | Zawartość pyłów frakcji PM2.5 starszy bajt. |
11 | BBM_BBAIR_PM2_5_LSB | Zawartość pyłów frakcji PM2.5 młodszy bajt. |
12 | BBM_BBAIR_PM1_MSB | Zawartość pyłów frakcji PM1 starszy bajt. |
13 | BBM_BBAIR_PM1_LSB | Zawartość pyłów frakcji PM1 młodszy bajt. |
14 | BBM_BBAIR_FIRM_1 | Wersja oprogramowania sensora. |
15 | BBM_BBAIR_FIRM_0 | Wersja oprogramowania sensora. |
16 do 21 | BBMAGIC_DEVICE_ADDR_5-BBMAGIC_DEVICE_ADDR_0 | Adres sensora BBair. |
22 | BBMAGIC_DEVICE_RSSI | Moc odbieranego sygnału radiowego RSSI w dBm. |
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 sekundę, 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 już wiemy z powyższej tabeli, 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 odpalenie aplikacji
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ł tak:
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. Przy prawidłowej konfiguracji na ekranie pojawiać się będą wyniki kolejnych pomiarów:
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 poniżej.
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
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ć: Screen i możesz się wylogować