Czujnik stężenia pyłów w powietrzu HM3301

Każdego roku w okolicach października w mediach powraca temat jakości powietrza w naszym kraju. Jesteśmy na pierwszym miejscu w rankingu największych stężeń zanieczyszczeń wśród krajów UE i na jednym z czołowych miejsc na świecie. W świadomości społecznej zanieczyszczone powietrze było zawsze kojarzone z wielkim przemysłem ciężkim, głównie na Śląsku, a także z centrami dużych miast z duża liczbą przejeżdżających samochodów. Dobre samopoczucie mieszkańców małych miejscowości w tym względzie popsuły dopiero powszechne pomiary zanieczyszczeń wykonywane w ich okolicy. Szybko okazało się, że bardzo dobre powietrze jest tylko tam, gdzie jego jakość nie jest mierzona.

Zanieczyszczenia w małych miastach i na wsiach potrafią w sezonie zimowym być większe niż w centrum dużego miasta. Ich głównym źródłem są prymitywne domowe piece grzewcze i spalane w nich tanie paliwo kiepskiej jakości. Paradoksalnie, do dużego poziomu zanieczyszczeń przyczyniają się lekkie zimy i dobra izolacja ścian domów. Prymitywne piece pracują wtedy krótko, z przerwami i niedostatecznie rozgrzane palenisko nie jest w stanie dokładnie spalić paliwa. Generują wtedy do atmosfery duże ilości pyłów i innych szkodliwych związków.

Oddychanie czymś takim powoduje bardzo wiele chorób od nowotworowych, poprzez kardiologiczne, aż do chorób płuc. Jest to szkodliwe dla każdego, ale szczególnie dla małych dzieci i osób starszych. Przy bardzo dużych stężeniach pyłów smog można nawet zobaczyć, bo przybiera postać szarej lub żółtawej mgły. Niższe, ale ciągle zbyt wysokie, długotrwałe stężenia pyłów nie są tak dobrze widoczne, ale są równie szkodliwe.

Dzisiaj bez większego problemu można stosunkowo precyzyjnie mierzyć poziom zanieczyszczeń w miejscu naszego przebywania, nawet niezbyt drogimi czujnikami. Jednym z takich czujników jest moduł czujnika laserowego HM3301 PM2.5 z rodziny Grove firmy Seeed Studio.

Laserowy czujnik zanieczyszczeń HM3301

Rodzina detektorów HM3300/HM3600 do której należy HM3301 to nowa generacja laserowych czujników przeznaczonych do ciągłego wykrywania stężenia pyłu w powietrzu w czasie rzeczywistym. Działanie detektorów jest oparte o rozpraszanie światła według rozwiązań Mie równań Maxwella. Technikę stosuje się między innymi do pomiarów wielkości małych cząstek metodami optycznymi. Kiedy światło przechodzi przez cząstki zawieszone w powietrzu, powodują one rozproszenie światła. Rozproszone światło jest skoncentrowane na bardzo czułej fotodiodzie. Sygnał z tej fotodiody jest wzmacniany i analizowany przez układy detektora. Za pomocą określonego modelu matematycznego i algorytmu uzyskuje się informację o stężeniu masowym cząstek pyłu.

Zanieczyszczone powietrze jest dostarczane do układu czujnika przez mały wentylator. Przepływa przez specjalną komorę, gdzie zanieczyszczenia są oświetlane przez światło lasera pracującego w podczerwieni. Światło jak już wiemy ulega rozszczepieniu na cząstkach pyłu i trafia na powierzchnie fotodetektora. Sygnał z fotodetektora jest następnie filtrowany, wzmacniany i przetwarzany cyfrowo – rysunek 1.

Rysunek 1. Zasada działania sensora HM3301

Rysunek 2. Moduł czujnika

Układ elektryczny czujnika można zasilać napięciem w zakresie +3,3….+5 V. Temperatura pracy wynosi od -10°C do +60°C, a wilgotność otoczenia nie może być niższa niż 10%, ani wyższa od 90% RH, przy czym nie dopuszcza się pracy w warunkach kondensacji pary wodnej. Tor pomiarowy rozróżnia 3 zakresy wielkości pyłów: 2,5 µm, 5 µm i 10 µm. Rozdzielczość pomiarowa wynosi 1 µg/m3, a efektywny zakres pomiarowy 1….500 µg/m3. Maksymalny zakres pomiarowy dla kanału 2,5 µm wynosi 1000 µg/m3. Pomiary stają się miarodajne 30 sekund po włączeniu napięcia zasilania. Układ HM3301 ma 2 interfejsy komunikacyjne: UART i I2C, przy czym domyślnym interfejsem jest UART. Można za jego pomocą nie tylko odczytywać pomiary, ale też programować tryby pracy. Natomiast I2C umożliwia tylko odczytywanie danych pomiarowych. Producent modułu wyprowadził jedynie sygnały interfejsu I2C i nie dostarczył sprzętowych możliwości korzystania z UART.

Połączenie z Arduino

Moduł czujnika umieszczono na płytce drukowanej, do której przymocowano obudowę detektora z wentylatorem tak, jak to pokazano na rysunku 2. W komplecie z czujnikiem znajduje się kabel z wtyczkami pasującymi gniazd płytki Grove Base Shield przeznaczonej do łączenia modułów Grove z płytką Arduino. Przygotowano też gotowy projekt na tą platformę. Wystarczy złącze modułu połączyć z portem I2C płytki Base Shield, jak to pokazano na rysunku 3, uruchomić gotowy projekt w Arduino i wszystko powinno działać.

Rysunek 3. Moduł podłączony do Arduino przez płytkę Base Shield

Praca z platformą ARIS EDGE

Ja w swoich testach nie używałem jednak klasycznego systemu Arduino. Wykorzystałem za to zestaw ARIS EDGE firmy RELOC składający się z modułu mikrokontrolera ARIS EDGE S3 IoT Board i modułu wyświetlacza LCD ARIS EDGE LCD, sprzętowo zgodnych ze standardem Arduino. Ponieważ nie miałem płytki Base Shield, to połączenie z czujnikiem wykonałem za pomocą kabli zakończonych wtykami (rysunek 11).

Wyprowadzenia zasilania i magistrali I2C modułu z HM3301 pokazano na rysunku 4.

Rysunek 4. Wyprowadzenia modułu HM3301

Program testowy został napisany w języku C dla 32-bitowego mikrokontrolera Renesas Synergy S3 (model R7FSA37A3) z rdzeniem Cortex-M4. Użyto środowiska projektowego e2-studio firmy Renesas, a także firmowych bibliotek SSP. Aplikacja odczytująca dane z czujnika i wyświetlająca je na ekranie jest rozszerzeniem wcześniej napisanej aplikacji obsługującej czujnik środowiskowy mierzący temperaturę, wilgotność i ciśnienie atmosferyczne za pomocą sensora BME280 umieszczonego na płytce ARIS EDGE S3 IoT Board. Na ekranie LCD wyświetlają się: temperatura otoczenia, wilgotność, ciśnienie atmosferyczne, koncentracja zanieczyszczeń pyłów PM2.5 i koncentracja zanieczyszczeń PM10.

Konfiguracja programu w Synergy Configuration

Komunikację z czujnikami realizuje sprzętowy interfejs IIC1 skonfigurowany przez Synergy Configuration wbudowany w pakiet e2-studio. W pierwszym kroku konfiguracji wybieramy zakładkę Threads. Driver zostanie skonfigurowany w domyślnym „wątku” HAL/Common. Wybierany w oknie HAL/Common Stacks ikonę New Stack i w rozwijanym menu wybieramy: New Stack-> Driver->Connectivity-> I2C Master Driver on r_iicrysunek 5.

Rysunek 5. Wybór drivera interfejsu I2C

Dodany driver pojawia się w oknie HAL/Common Stacks i można go skonfigurować w oknie Properties. W opcji Name nadajemy swoją nazwę. W naszym przypadku jest to zastana nazwa BME280. Występuje ona potem w funkcjach drivera. Opcja Channel wybiera numer kanału interfejsu I2C. Prędkość transmisji wybiera się w Rate. HM3301 obsługuje jedynie opcję Standard. Adres układu slave wpisuje się w opcji Slave Address, a format adresu w Address Mode (adres 7-bitowy). Dla układu BME280 wpisujemy adres 0x77, który potem zmieniamy zależnie od potrzeb. Priorytety przerwań zgłaszanych przez moduł I2C ustawiamy w 4 ostatnich opcjach.

Funkcja Callback

Trochę szerszego opisu wymaga opcja Callback. W interfejsach szeregowych, które nie maja bufora FIFO, wysłanie kolejnego bajtu na magistralę jest możliwe po zakończeniu wysyłania poprzedniego bajtu. W I2C nie ma znaczenia, czy bajt jest adresem slave, danymi wysyłanymi czy danymi do odbioru. Funkcje wysyłania pojedynczych bajtów w warstwach niższych są oparte na przerwaniach i nie musimy się martwić o kolizję na magistrali. Ale wysłanie sekwencji składającej się z wysłania i odczytania określonej ilości danych wymaga sprawdzenia warunku zakończenia transmisji. Dlatego funkcje drivera wysyłające i dobierające dane muszą albo czekać na zakończenie transmisji (funkcje blokujące), albo też kończyć swoje działanie po zainicjowaniu transmisji wielobajtowej i wprowadzać mechanizmy sygnalizacji zakończenia transmisji.

Funkcje blokujące nigdy nie są dostatecznie dobrym rozwiązaniem. Jeżeli coś pójdzie nie tak, to możemy całkowicie stracić kontrolę nad programem. Jeżeli w opcji Callback umieścimy wpis NULL, to funkcje transmisji będą się wykonywać jako blokujące. Wpisanie do Callback swojej nazwy spowoduje, że funkcje nie będą czekać na zakończenie transmisji. Użytkownik musi sam sobie napisać funkcję o nazwie z okna właściwości drivera i zadbać o wykrywanie zakończenia transmisji. Opiszę ten mechanizm przy okazji opisywania działania funkcji obsługi I2C.

Zastosowaną konfigurację drivera pokazano na rysunku 6.

Rysunek 6. Konfiguracja drivera I2C

W kolejnym kroku trzeba wybrać zakładkę Pins konfiguratora Synergy Configurator i skonfigurować wyprowadzenia interfejsu I2C tak, by był sprzętowo zgodny z płytką Arduino. I2C musi używać portów P206 i P207. Zaprezentowano to na rysunku 7.

Rysunek 7. Konfiguracja wyprowadzeń I2C

Po konfiguracji i wygenerowaniu odpowiednich plików, po kliknięciu na Generate Project Content można używać funkcji drivera magistrali I2C.

O autorze