Pomiar pyłu zawieszonego czujnikiem PPD42
03.03.2016 19:45
Aerozole atmosferyczne, czy jak ktoś woli – głównie pył zawieszony, to małe coś, które unosi się w powietrzu. Może być ciekłe, może być stałe, ale na ogół nie jest to dobroczynna zawiesina soli morskiej, a raczej pył zawieszony oznaczony jako PM10/PM2,5. PM rozwija się jako Particulate Matter, i oznacza odpowiednio wszystko wiszące w powietrzu rozmiaru <10 um i <2,5 um. Może powodować choroby takie jak astma, rak płuc, choroby układu krążenia, różne choroby układu oddechowego, przedwczesne porody, uszkodzenia płodu i w końcu śmierć (przedwczesną oczywiście, bo śmierć jako taką to powoduje życie). Są oczywiście dostępne pomiary ze stacji pogodowych rozmieszczonych w rożnych miejscach miast (albo i nie), dzięki którym wiemy czy warto zabrać maskę przeciwpyłową, albo nawet lepiej – wcale nie ruszać się z domu. Ale nawet takie stacje mają niską geograficzną rozdzielczość wyników, choć są dokładne. Bo jak ma się sytuacja kogoś kto mieszka przy ruchliwej drodze, do pomiaru stacji umieszczonej w samym środku spokojnego osiedla? To może by sobie wystawić takie urządzenie za okno... Czujniki mierzące dokładną liczbę zawieszonych w powietrzu cząsteczek pyłu są dokładne acz drogie.
Wspomniany w tytule PPD42 mierzy, właściwie nie tyle ich liczbę, co raczej przepływ masy w czasie. Idealny nie jest, szumi jak cholera, ma dziwne wyjście PWM, ale z grubsza działa, przynajmniej wystarczająco do typowo pozaokiennych zastosowań. Do tego jego koszt to całe 60zł z przesyłką od chińczyków, a jak się postarać to nawet mniej. Tak że kolejny element do nadchodzącej nowej wersji mojej zabawki. A że, z racji na zastosowane zasilanie i rodzaj wyjścia, nijak nie daje się podłączyć do elektroniki bezpośrednio, potrzebny będzie konwerter.
Na początek prostsza sprawa, bo zasilanie. PPD42 wymaga 5V napięcia, cała elektronika pracuje na 3v3. Problem, wbrew ewentualnym pozorom, prosty do rozwiązania dzięki sprytnym konwerterom napięcia sprzedawanym przez Chińczyków, a używanych do podbicia napięcia z pojedynczego ogniwa akumulatora do wartości potrzebnych dla urządzeń USB. Koszt takiej zabawki to cale 0,5 USD wraz z przesyłką. Pozostaje tylko zdemontować złącze USB (polecam hot‑air) i mamy gotowe kompaktowe urządzenie, które spełni swoje zadanie. Pozostaje tylko przylutować trzy przewody (masa, in, 5V) i obciągnąć koszulką termokurczliwą, co by się nie dotknęło do jakiejś innej okolicznej rzeczy.
PPD42 działa na zasadzie optycznego detektora rzeczy w powietrzu, które odbijają światło podczerwone. Z jednej strony mamy diodę LED, robiącą wiadomo co, z drugiej detektor wraz z układem skupiającym światło. Na dole jest 1W rezystor robiący za grzałkę, która powoduje mały przepływ tegoż powietrza przed sensorem. Na tej podstawie określamy ile pyłu jest w przemieszczającym się przed soczewką powietrzu podgrzanym przez rezystor. Ten sygnał wędruje na wzmacniacz, a potem na wyjście. Rezystor niby można wyciąć zastępując go małym wentylatorem w okolicy modułu, ale zostawimy rezystor, sumarycznie i tak daje mniejsze zużycie energii niż wentylator.
Wyjście, a właściwie dwa wyjścia w "standardzie" PWM. I wszystko byłoby ok, gdyby to był jakiś typowy PWM z okresem powiedzmy 1kHz, mierzalne prosto i fajnie. Ale nie, mamy do czynienia z sygnałem, który może wystąpić jakąś liczbę razy w okresie 30 s, trzeba zmierzyć ten okres i na jego podstawie wysnuć wniosek, ile czasu w procentach zajmuje on w stosunku do czasu pomiaru (30 s). Do tego szumi to jak cholera.
Jako konwerter interfejsów posłuży ATmega328p. Tak, jest to stanowczo za duży MCU jak na to zadanie, ale że jest popularny to jest szeroko dostępny, tani i ma kilka przewag nad takim ATtinyX5. Dedykowaną sekcję bootloadera, w której rezyduje kod pozwalający na programowanie głównego kodu za pomocą I2C. A że bootloader stacji meteo posiada kod, który może programować urządzenia na I2C i to jeszcze na podstawie danych odbieranych z eth... Same zalety. Firmware we wszystkich programowalnych układach stacji (poza bootloaderami), daje się wymieniać przez Ethernet, dzięki czemu aktualizację można spokojnie zrobić nie ruszając się na balkon, tam w końcu może być -10 stopni, a obudowę trzeba rozkręcić, na co trzeba czasu. Poza tym w przeciwieństwie do takiej mega8, ma 400kHz I2C.
Płytka poza samym układem zawiera konwerter poziomów logicznych 3v3 <-> 5 V i kondensatory dla stabilności wszystkiego. Podejrzewam, że gdyby się uprzeć, to konwerter napięcia zasilania też by na niej, od spodniej strony, spokojnie się zmieścił. Ale jeśli są gotowe, i to jeszcze w takich cenach, wygodniej mi użyć zewnętrznego konwertera.
Software bazuje na kodzie, który napisali ludzie z DustDuino. Ten kod był napisany na Arduino, którego rzecz jasna tutaj nie ma (fuj), dlatego wymagał adaptacji kilku rzeczy (jak zastąpienie digitalRead()) i implementacja funkcji millis() i micros(), podających odpowiednio liczbę milisekund i mikrosekund od startu systemu. Pomiar dokonywany jest na podstawie długości impulsów z ostatnich 30s (bo tak mówi datasheet), mnożony finalnie razy 10k (bo zmienne przecinki są fe), po czym następuje uśrednienie z ostatnich dwudziestu czterech pomiarów, czyli na końcu mamy średnią z dwunastu minut. Dzięki czemu soft stacji nie musi się bawić w uśrednianie. Jeżeliby to kogoś fascynowało, to cały kod interfejsu sensora dostępny jest na GitHubie. Jak zawsze, cudowny nie jest, ale działa. ;)
Pozostaje jeszcze kwestia obudowy i finalnej wersji elektroniki. Bo oczywiście wymyśliłem sobie, aby 8bit ATmegę64/128 zastąpić przez 32bit STM32F103 i nieco przebudować konstrukcję płytek.
Ale że komponenty do nich jeszcze nie przyszły (chwilowo brak programatora i samych MCU), to trzeba dopracować peryferia, jak oto ten czujnik. ;)