Czujnik czystości powietrza na platformie Arduino

29 Cze

W Zimie głośno było o smogu: pyłach i ogólnie o jakości powietrza, którym oddychamy na co dzień. W większych miastach są stacje, które mierzą stopień zanieczyszczenia powietrza ale jest ich niewiele więc o ile nie mieszkamy blisko takiej stacji to te informacje mogą jedynie pomóc zorientować się w jakim stopniu powietrze jest zanieczyszczone w danym regionie. Bieżące dane z całej Polski można znaleźć tutaj. Ponieważ chciałem mieć dokładne dane jaki jest stan powietrza w mieszkaniu postanowiłem samemu sklecić układ, który mierzyłby jego jakość.

Dla dociekliwych i wybrednych zadających sobie pytanie co to ma wspólnego z chmurą obliczeniową podaję hasło po którym wszystko powinno stać się jasne Internet Of Things 🙂

Wykorzystane moduły

Wybór padł na Arduino. Nie potrzebuję układu z systemem operacyjnym do wykonywania bardziej złożonych zadań (np. Raspberry Pi). To na czym mi zależy to jedynie pomiar jakości powietrza wraz z jego temperaturą i wilgotnością. No i fajnie by było odkładać te dane gdzieś online tak żeby można było je sprawdzać jak nie ma mnie w domu. Do tego wszystkiego Arduino spokojnie wystarczy.

Poniżej podaję nazwy układów wraz z krótkim opisem ich funkcji:

  1. Arduino Uno WiFi – główny mikrokontroler. To do niego wszystko trzeba podłączyć i to on zapewnia komunikację zarówno modułów jak i z siecią Internet za pomocą wbudowanego WiFi
  2. Base Shield v2 Grove – nakładka na główny mikrokontroler. Zapewnia łatwy sposób na podłączanie modułów do mikrokontrolera
  3. MP503 v1.3 – mierzy ogólny poziom zanieczyszczenia powietrza czyli stężenie szkodliwych gazów. UWAGA: nie dostarcza danych na temat stężenia konkretnego gazu, raczej informuje o ogólnym poziomie jakości powietrza
  4. Shinyei PPD42NS – mierzy zawartość pyłu PM2,5 oraz PM10 w powietrzu. To właśnie te cząsteczki tworzą smog. Te o średnicy mniejszej niż 2,5 µm są bardziej szkodliwe ponieważ są mniejsze i mogą dostawać się do krwioobiegu i ogólnie są gorsze dla organizmu
  5. TH02 – mierzy temperaturę i wilgotność powietrza. Niestety z tym modułem jest trochę kłopotów ale o tym za chwilę

Teraz to wszystko trzeba jeszcze ze sobą połączyć. Dzięki nakładce Grove jest to proste – wystarczy wpiąć odpowiedni kabelek do wyjścia. Poniżej zamieszczam zdjęcia jak to połączyłem.

IMG_1152 oznaczenia

IMG_1155 IMG_1154 IMG_1150 IMG_1147

Jedna ważna uwaga – to że czujnik cząstek stałych wisi sobie pionowo a reszta luźno lata to nie przypadek. Tylko pionowo umieszczony czujnik zapewnia prawidłowe pomiary. W dodatku warto zakleić/zakryć otwór na wierzchniej stronie czujnika – dzięki temu pomiary będą bardziej wiarygodne. Czujnik mierzy cząstki przez niego przefruwające laserem więc jakiekolwiek dodatkowe źródło światła może zakłamać pomiary.

Pewnie zauważyliście że czujnik Shinyei do płytki Grove jest podłączony przez „przejściówkę” 😉 Sposób połączenia jest następujący (skrajny lewy kabelek czujnika cząstek stałych zostaje nie podłączony):

IMG_1156

Jeśli chcemy podłączyć się do sieci należy jeszcze wykonać czynności opisane w tym miejscu. A jak już podłączymy się do sieci to możemy pokusić się o przesyłanie danych pomiarowych do jakiegoś serwisu, który ładnie je wyświetli i pokaże w przeglądarce 🙂

Zbieranie danych i ich dalsza obróbka

Wybrałem Thingspeak, ponieważ zapewnia darmowy interfejs i wizualizację przesłanych danych na wykresie. Nic więcej mi do szczęścia nie potrzeba. Brałem pod uwagę jeszcze Xively ale coś się pozmieniało w ich polityce i zrobili się bardziej komercyjni więc ostatecznie padło na Thingspeak. Po założeniu konta należy utworzyć kanał do którego będziemy pisać (nie ma znaczenia czy kanał jest publiczny lub prywatny) i skopiować jego klucz API (write API key). Ten klucz będzie nam potrzebny przy programowaniu układu do zdefiniowania połączenia czujnik – Thingspeak.

Programowanie układu

Czas ubrudzić sobie ręce 🙂 Do programowania Arduino wykorzystujemy Arduino IDE oraz język C/C++. IDE należy pobrać oraz zainstalować z oficjalnej strony Arduino. Mikrokontroler można połączyćz IDE na dwa sposoby: WiFi lub USB. Wystarczy podpiąć kabel lub sieć i z poziomu aplikacji wybrać rodzaj mikrokontrolera, który będziemy programować (menu Tools). Następnie w tym samym menu rozwijamy Port i tam wybieramy odpowiednio port COM po którym będziemy się łączyć (jeśli przez USB) lub adres IP urządzenia (jeśli przez sieć). Teraz do mikrokontrolera można wgrywać programy i dać mu coś do roboty.

Przykładowe mniej lub bardziej skomplikowane programy znajdują się w menu File – Examples. Możemy z nich skorzystać żeby zorientować się jak to działa i zdiagnozować czy układ programuje się poprawnie (np. czy diody świecą poprawnie). Program ładuje się do układu przyciskiem ze strzałeczką skierowaną w prawo zaraz pod menu (File, Edit, itd.) aplikacji lub skrótem klawiaturowym Ctrl + U. Najpierw następuje kompilacja a następnie próba załadowania programu do pamięci mikrokontrolera. W razie jakichś problemów zostaniecie o tym poinformowani przez IDE. Po załadowaniu programu do pamięci, natychmiast rozpoczyna on swoją pracę.

Po tym wprowadzeniu omówię kod składający się na program wykonywujący się w moim układzie:

Na samym początku definiuję stałe z namiarem na moje konto do Thingspeak – najważniejszy jest klucz API – można go znaleźć w ustawieniu swojego kanału w Thingspeak. Sam skrypt jest podzielony na 3 główne funkcje: setup, loop i measure:

  • Setup: inicjuje moduły i piny z których będą odczytywane dane
  • Loop: funkcja która w pętli wykonuje swoje zadania. W moim przypadku w pętli wykonuje się funkcja measure, o której poniżej
  • Measure: to tutaj są wykonywane pomiary i obliczenia

Jak się przyjrzycie to zauważycie że moduł pomiaru temperatury i wilgotności jest nieużywany. Testowałem tą konfigurację długo i wyszło na to że ten czujnik który jest podłączany za pomocą interfejsu I2C gryzie się z biblioteką Ciao, którą wykorzystuję do łączenia się z WiFi i wyświetlania informacji diagnostycznych w konsoli WiFi (na stronce urządzenia). Pytałem na różnych forach ale nigdzie nie uzyskałem żadnej odpowiedzi jak ten konflikt rozwiązać, więc póki co zbieram dane tylko na temat cząstek PM2,5 i PM10 w powietrzu jak i o ogólnej jego jakości. Odstępy czasu co ile zbieram dane ustalam w zmiennej sampletime_ms. Jest to wartość w milisekundach więc 3600000 oznacza że dane będą szły do Thingspeak co godzinę.

Ogólna jakość powietrza jest wyliczana z wartości napięcia czujnika i w efekcie będzie on zwracał wartości liczbowe oznaczające poziom zanieczyszczenia powietrza. Dokładny sposób działania jest wyjaśniony tutaj.

Poniżej wykresy które generuje dla mnie Thingspeak na podstawie danych mierzonych i wysyłanych przez Arduino:



I to w zasadzie wszystko. Jeśli uda się wam pogodzić bibliotekę Ciao z czujnikiem TH02 to dajcie proszę znać 🙂 A ja w tym czasie pomyślę jak te dane wykorzystać w chmurze.

Poniżej jeszcze pomocne linki:

Dodaj komentarz