Bezprzewodowa stacja monitorowania jakości powietrza

Ostatnio na fali popularności walki ze smogiem, szczególnie w moim rejonie (okolice Rybnika), postanowiłem zrobić swoja własną stację pomiaru zanieczyszczenia powietrza. Nie z pro-ekologicznych motywów, interesowało mnie po prostu zrobienie takiego urządzenia. Poza tym byłem ciekaw, jak w moim małym mieście prezentują się statystyki – bo w zimowy wieczór naprawdę bezpieczniej jest nie wychodzić z domu.

Niestety trochę spóźniłem się z pomysłem i przegapiłem najbardziej smogowy okres. Na dodatek przez chiński Nowy Rok paczka dotarła dopiero w lutym – rekordów zanieczyszczeń w tym roku już nie zmierzę.

Z informacji jakie znalazłem w sieci (szczególnie pod wpływem strony http://krakow-zdroj.pl ) ułożyłem sobie następujący zestaw:

  1. Czujnik laserowy Plantower PMS1003 – dokładny i niedrogi (19$). Jest też dostępny model PMS3003, który różni się rozmiarem, ale elektronika i sposób wykorzystania są praktycznie takie same. Alternatywa to m.in. czujnik SDS011, który powinienem kupić dla kontroli.
  2. Espduino – to dla mnie oczywisty wybór, wygoda Arduino i WiFi w jednym. Cena – 9$
  3. Czujnik wilgotności powietrza i temperatury DHT22 (20PLN?) – tu popełniłem błąd, mogłem od razu kupić coś lepszego.

Czujniki laserowe mają jedną wadę. Ich precyzja jest dobra jedynie w warunkach niskiej wilgotności powietrza. Mierzą ilość cząstek (podane frakcje PM1.0, PM2.5, PM10)  – ale przy wilgotności powyżej 70% zawyżają wynik. Według różnych oszacowań przy wilgotności 70% zawyża około 50%, przy 95% już prawie dwukrotnie. Autor wyżej podanej strony stworzył na podstawie porównań do dwóch państwowych stacji funkcję nieliniową, którą koryguje wyniki pomiaru. Profesjonalne czujniki podobno podgrzewają powietrze, widziałem też amatorskie czujniki z grzałkami, ale nie wiadomo, jaki wpływ ma podgrzewanie grzałką na wynik zawartości pyłu.

Plantower PMS1003 (lub PMS3003)

PMS1003 mierzy zawartość w powietrzu cząstek o rozmiarach:

  • do 1µm (PM1.0) – z niezbyt dużą dokładnością (deklarowane 50%)
  • do 2.5µm (PM2.5) – to najbardziej niebezpieczny pył, przenikający z płuc do krwi
  • do 10µm (PM10) – pył osadzający się głęboko w płucach.

Pomiar odbywa się przez przetłoczenie powietrza wentylatorem przez odpowiedni „tunel”. Na powietrze pada światło lasera, które odbija się od cząstek pyłu i pada na czujnik umieszczony pod kątem prostym. Jest to metoda stosowana przez kilku producentów, na pewno dużo bardziej przecyzyjna niż czujniki oparte na diodzie, choć oczywiście nie tak dobra, jak BAM (Beta attenuation monitoring) w sprzęcie za kilkadziesiąt tysięcy złotych.

Wadą, oprócz wpływu wilgotności powietrza, jest też możliwe zabrudzenie czujnika po dłuższym czasie, choć tunel powietrzny jest tak skonstruowany, żeby duże cząstki kurzu osadzały się w komorze przed czujnikiem.

Transmisja odbywa się poprzez port szeregowy. PMS1003 / 3003 domyślnie pracuje w trybie aktywnym: Co około 2,4 sekundy wysyła wyniki pomiarów, chyba, że dane zmieniają się szybko, wtedy częstotliwość wynosi 0,9 sekundy. Do takiej transmisji wystarczy podłączyć zasilanie (5V), GND, a także RX i TX do transmisji danych (3,3V).

Jest jeszcze tryb pasywny – żeby go wprowadzić, trzeba wprowadzić PMS1003 w ten tryb odpowiednią, komendą, następnie można ręcznie wywoływać pomiar. Komendami można też czujnik uśpić i wybudzić. Jest jeszcze wejście SET (do zmiany trybu pracy) i RST – ale jak się okazało, nie były mi potrzebne.

Po kilku próbach i przemyśleniu tematu ustaliłem, że najwygodniej będzie zrobić tak:

  1. Czujnik jest uśpiony (minimalny pobór prądu) przez kilka minut
  2. Wybudzam czujnik komendą, ten wchodzi w tryb aktywny i zaczyna pomiar
  3. Po 30 sekundach potrzebnych na napływ powietrza i stabilizację odczytów odczytuję 10 pomiarów, co kilka sekund. Obliczam średnią po odrzuceniu skrajnych wyników.
  4. Usypiam czujnik.

Parametry transmisji opiszę w osobnym poście, rozgryzałem je ręcznie na podstawie instrukcji. Opiszę też dlaczego czujnik wysyła dwa rodzaje danych i z których nalezy korzystać.

Espduino – ESP8266

To mój ulubiony zamiennik Arduino. W tym wypadku zaletą jest także praca na napięciu 3V3, a jednocześnie Espduino może zasilać czujnik zapylenia napięciem 5V. Jest to bardzo wygodne, bo nie potrzebuję konwertera sygnałów logicznych, a zasilanie wystarczy podłączyć tylko do Espduino. Na dodatek esp8266 można także wprowadzić w stan uśpienia, przez co pobór prądu przez całą stację będzie rzędu kilkudziesięciu µA!

Myślę, że mógłbym wyciągnąć z szafki ogniwo fotowoltaiczne (18V, 500mA w dobrych warunkach, z wyjściem 5V USB), dopasować jakiś akumulatorek i zrobić stację z własnym zasilaniem!

DHT22 (AM2303)

Czujnik wilgotności jest niezbędny do korekty wyników, niestety nie przewidziałem, że akurat ten model nie jest szczególnie dokładny przy dużej wilgotności, a taką właśnie trzeba mierzyć. Na dodatek osoba, która wyliczyła parametry korekty, posiadała inny czujnik. Korekta nie będzie więc idealna (choć nawet przy tych samych modelach nie byłaby), ale uznałem, że lepsza taka, niż żadna. I tak nie przywiduję dużej dokładności.

Zamówiłem jeszcze dobrze wypadający w testach czujnik BME280 i porównam wyniki.

Zmontowałem całość, napisałem program na esp8266 wykonujący wyżej ustaloną pętlę pomiarów. Dane wysyłam przez HTTP POST na serwer, zapisuję do MySQL za pomocą programu w PHP. Dodatkowo dorzuciłem funkcję automatycznej aktualizacji oprogramowania (podczas wysyłania danych sprawdzana jest wersja).

Pierwsze testy wypadły dobrze, zaskoczyło mnie tylko dość wysokie stężenie pyłów w domu (PM2.5 od 50 do 80µg/m³, PM10 nawet do 150µg/m³). Na zewnątrz było jeszcze gorzej.

Norma (średnia z 24 godzin) ustalona przez Światową Organizację Zdrowia wynosi dla pyłu PM2.5 – 25µg/m³, natomiast PM10 – 50µg/m³.

Po umieszczeniu czujnika na zewnątrz aż zacząłem wątpić w poprawność odczytów, bo po kilku godzinach nastąpił skok do ponad 400-500µg/m³ dla obu frakcji (norma przekroczona o kilkaset procent). Wystarczyło jednak wyjść z domu, by przekonać się, że naprawdę nie ma czym oddychać (w kolejnym dniu ogłoszono alarm).

Dokładność pomiaru

Wracając do korekty pomiaru. W odległości 4800m ode mnie znajduje się państwowa stacja pomiarów m.in. pyłu PM10 (niestety nie ma PM2.5). Wyniki są bardzo zbliżone do moich, różnice zwykle nie przekraczają 10-20µg/m³ w stabilnym i „zdrowym” okresie (norma przekroczona o 100%), natomiast przy dużych skokach często różnią się tylko czasem wystąpienia. Wyniki są też dość stabilne bez względu na wilgotność powietrza (mierzyłem przy gwałtownych skokach 40-95%, a także w wietrzonych pomieszczeniach o niskiej wilgotności) i pokrywają się z w/w stacją Wojewódzkiej Inspekcji Ochrony Środowiska. Wyniki są więc nawet lepsze, niż zakładałem.

Na wykresie pojawiają się czasem kilkunastominutowe skoki nawet do 300-400µg/m³ – dokładnie wtedy, gdy któryś z sąsiadów rozpala w kotle.

Poniżej zdjęcie wersji prototypowej i cały kod na ESP8266 w C (IDE Arduino).

Cały frontend oparłem na PHP + JavaScript z wykresami Google Chart, zawarłem też informacje o indeksie AQI stosowanym do oznaczania jakości powietrza.

Strona z wynikami wzbudziła dość dużą ciekawość jak na małe miasteczko. Pomimo tylko wzmianki dla znajomych na FaceBooku miałem 650 odsłon w pierwsze dwa dni.

 

 

 

11 komentarzy to “Bezprzewodowa stacja monitorowania jakości powietrza”

You can Dodaj komentarz or Trackback this post.

  1. spairo1741 - 28 lutego 2017 o 20:54

    badzo ładny projekt, myślę nad czyms podobnym.
    zastosuję pms3003 (pms5003) i raczej BlueTooth.
    pms5003 trudno obudowac, bo nie ma wysającego wentylatora.

  2. atomic77 - 2 marca 2017 o 21:16

    Dzięki. Ja wybrałem wifi – i i tak mam sieć domową. Do tego mój ulubiony Espduino, który działa na 3,3V a do tego ma wyjście 5V, dzięki czemu nie musiałem stosować żadnych dodatkowych elementów (kiedyś bawiłem z arduino + esp8266 + konwerter sygnału 5V-3V3). Co do obudowy to zacząłem sobie rysować w CAD taką pasującą idealnie, wydrukuję sobie 🙂 Na razie to prowizorka, ale świetnie pokazuje jakie powietrze jest u mnie. Obecnie norma przekroczona o 30-50% ale było już 500-600%. Trzeba też wziąć pod uwagę, że przy dużej wilgotności pomiar jest zawyżony.

  3. spairo1741 - 5 marca 2017 o 14:34

    dzięki za projekt, chyba zostanę przy bluetooth.
    w swoim projekcie zastosuję pms5003 oraz dogrzewanie wlotu powietrza.
    5003 nie ma wystającego wentylatora ale to nie jest potrzebne ponieważ wejście powietrza jest od strony tych 4 otworow obok wentylatora.
    wentylator 5V wyciaga powietrze a nie nadmuchuje.
    do projektu obudowy do 5003 przydałaby się drukarka 3D a tak trzeba będzie klejem na gorąco coś kleić.
    bardziej mnie martwi brak możliwości zakupu wkretów M2 samogwintujących do przykręcenia 5003.
    mój projekt bedzie miał 5003, dht22 jako czujnik zewnętrzny oraz BME280 jako czujnik temperatury i cisnienia „termostatu”, kontroluje grzałkę i grzanie do tych 40 stC.

  4. atomic77 - 5 marca 2017 o 15:48

    Świetnie, ja przymierzałem się do tego grzania, ale to dla mnie za dużo zabawy. Myślałem, że może kiedyś… ale tym czasem okazuje się, że wzór na korektę odczytów od kolegi z Krakowa jest zaskakująco dokładny. Na wykres nakładam sobie dane ze stacji państwowej (kilka km ode mnie) i jest bardzo duża zbieżność, zarówno przy dużych odczytach jak i teraz, przy kilkunastu ug/m3. Dla mnie wystarczy. Tylko DHT22 rzeczywiście nie najlepiej się spisuje jako ten „główny” do pomiaru wilgotności – przy 95% zatrzymuje się i nie spada jak powinien. W lecie będę pracował nad zmianami, na razie chciałem zdążyć na ostatnie tygodnie sezonu grzewczego z testami więc to prowizorka zapakowana do pudełka po płytach CD 🙂
    PS. poprawiłem nick autora, mam nadzieję że teraz dobrze (email był ten sam).

  5. atomic77 - 5 marca 2017 o 15:50

    Aha dodam jeszcze, że wyniki są tu: pszow.cc8.pl

  6. Tadeusz Qteki - 2 kwietnia 2017 o 20:36

    na razie mam kłopoty z obróbką obudowy i rury grzewczej.
    zakupiłem „maszyne ” cnc (mf 70 zabaweczka) do tej obróbki , ale myślałem, że ona sama coś zrobi a tu nic, trzeba samemu projektować i frezować (CAD/CAM).
    najgorzej idzie frezowanie plastiku, frezy oblepiają się tym plastikiem.
    z powodu powolnych prac, zakupiłem dodatkowo Look O2.
    wynik zanieczyszczenia w mojej okolicy można obserwowac z tego linku, adres mego loko2 to wroclaw_wislanska
    link: http://looko2.com/heatmap.php

  7. spairo - 10 kwietnia 2017 o 17:39

    do budowy grzałki użyłem rury od wody ciepłej fi32 oraz ceramicznej grzałki od lutownicy 80W.
    nie był to dobry wybór, za dużą moc grzałki, przez błąd programu grzałka stopiła rure nośną, o mało co nie powodując pożaru.
    zmieniłem grzalki, zastosowałem trzy grzałki od drukarki 3D połaczone szeegowo.
    przy 12 V pobierają prąd 1.1 A, raczej nie stopią rury z plastiku.
    grzałki te są obudowane metalem, dodatkowo daje to pewną bezwładność grzania.
    do sterowania zastosowałem program sterujący z regulacją PID.
    osiągnięta dokładność regulacji temperatury to tak +0.5 / – 1 st C.
    w tym przypadku na dokładności nam nie zależy i tak regulacja temperatury jest włączana wtedy, jak temperatura i wilgotność zbliża się o te +2 st C do punktu rosy.

  8. atomic77 - 11 kwietnia 2017 o 20:07

    Widzę, że to dużo bardziej profesjonalne urządzenie niż moje 🙂 Ja opieram się na matematycznej korekcji i porównaniu danych z sąsiedniej stacji pomiarowej. A co dopiero maszyny CNC, nawet na żywo takiej nie widziałem. Ja wszelkie obudowy i potrzebne urządzenia projektuję w CAD i drukuję. Zastanawiam się, czy podgrzewanie powietrza w celu obniżenia wilgotności nie wpływa też na zawartość pyłu? Zresztą już samo wykorzystanie grzałek komplikuje sprawę bezpieczeństwa, nawet takich grzałek z drukarki 3D. Na pewno trzeba wszystko mieć lepiej przemyślane, niż moja konstrukcja – tymczasowo opakowana w pudełko po płytach CD z wyciętymi dziurami. Ale działa już kilka miesięcy 🙂

  9. byrrt - 17 lipca 2017 o 15:13

    atomic77 pytanko o ten algorytm kompensacji w zależności od wilgotności – możesz coś szerzej?

  10. atomic77 - 17 lipca 2017 o 15:28

    Wzorowałem się na obliczeniach kolegi z Krakowa http://www.krakow-zdroj.pl który opisał mi jak to obliczył. Mieszka w zasięgu 3 państwowych stacji i obliczał zależność wilgotności od wyników pomiaru porównując je do tych stacji.
    Nazbierał bardzo dużo „próbek”.
    Ja z kolei zweryfikowałem to ze stacją która jest w pobliżu mnie (niestety tylko PM10) i wszystko się zgadzało.
    Niemniej jednak, nawet nie korzystając z tych korekt, można chyba (orientacyjnie) korzystać z bezpośrednich wyników pomiaru.
    Na stronie z Krakowa są też dostępne wersje z korektą i bez, można porównać. Myślę, że orientacyjnie można też korzystać z wersji bez korekty.

  11. byrrt - 30 lipca 2017 o 01:25

    Dzięki za odpowiedź. Napisałem do autora projektu z Krakowa. Sam uruchomiłem już czujnik, muszę tylko jeszcze ogarnąć sprawę tej korekty, parę pierdół i na balkon to 😉

Napisz odpowiedź

Twój adres e-mail nie zostanie opublikowany.