Nierówna walka o czyste powietrze cz. 3 – cierpienia młodego Arduino

Autor: Dariusz Borowski.

Poniżej prezentujemy postępy w pracach nad miernikiem pyłów zawieszonych PM10 i PM2,5. W poprzednim odcinku informowaliśmy o planach i elementach, które wezmą udział w tworzeniu rozwiązania.

uklad-pomiarowy

Dzięki uprzejmości i zaangażowaniu pana Mirosława Kortusa z firmy MKS Elektronika (ul. Kościuszki), który wszechstronnie wspomógł nas w przygotowaniu sprzętu elektronicznego do testów, możemy się już pochwalić działającym układem, który dokonuje pomiaru a przetworzone wartości zapisywane są w bazie danych.

Nieodzowna była również pomoc Piotra Mierzejewskiego, który cierpliwie wysłuchiwał tyrad o trudnościach napotkanych w procesie komunikacji peryferiów oraz doradzał w kwestiach kalibracji i konfiguracji czujnika pyłu. Wspólnymi siłami, podpierając się podobnymi projektami w internecie, udało nam się osiągnąć stabilne rezultaty odczytu i zapisu z użyciem prostych skryptów uruchamianych natywnie w konsoli Linuxa.

Całość nie została jeszcze umieszczona w obudowie. Układ spięty jest za pomocą płytki uniwersalnej. Trwają testy komunikacji bezprzewodowej i zapisu odczytanych wartości do bazy danych. Jednocześnie cały czas ulepszamy oprogramowanie sterujące pomiarem i konwersją.

Jest to pewien początek, aczkolwiek wiele jeszcze przed nami. Największym osiągnięciem jest zapoznanie się ze słabymi punktami obranego rozwiązania, świadomość problemów, na które natkniemy się w następnych krokach a przede wszystkim przygotowanie listy możliwych rozwiązań.

Obecnie układ pomiarowy składa się z następujących elementów:

  1. czujnik PPD42NS firmy Shinyei
  2. czujnik temperatury i wilgotności DHT11 (docelowo DHT22 ze względu na większy zakres obsługiwanych temperatur)

Aby dokonać pomiaru interesujących nas parametrów należy zmierzyć czas występowania stanu niskiego na pinie czujnika w czasie 30 sekund (czas zalecany przez producenta). Odczytany czas jest proporcjonalny do stężenia pyłu zawieszonego PM10 i PM2,5 (odczyt z osobnego pinu).

PPD42NS-diagram

 

 

 

 

 

 

Po zasileniu czujnika należy odczekać 2-3 minuty aby jego temperatura i pomiar cząstek powietrza ustabilizował się. Dla zapewnienia właściwego przepływu powietrza, czujnik musi znajdować się w określonej pionowej pozycji. Wewnątrz znajduje się rezystor, który poprzez nagrzewanie się wymusza ruch powietrza w określonym kierunku. Dodatkowo, dla zapewnienia poprawności odczytu,  czujnik musi być umieszczony w całkowitej ciemności, stąd wymóg szczelnej obudowy. Elementem pomiarowym jest fotodioda, stąd powyższe warunki, które należy spełnić.

Na postawie charakterystyk dostarczonych przez producenta mądrzy ludzie z internetu opracowali wzór na wielomian 3 stopnia, który je odzwierciedla w postaci funkcji:

wzor-1  PPD42NS-charactaristicPPD42NS-graph

Zliczony czas trwania stanu niskiego (tPM10) na pinie czujnika należy podzielić przez czas pomiaru (T=30 sec), w ten sposób uzyskujemy proporcję do dalszych obliczeń:

wzor-2Wartość count określa liczbę cząstek powietrza o rozmiarze 1um, którą pozostaje już tylko skonwertować na ug/m3 wg wzoru:wzor-3

Tak przygotowaną wartość możemy wysłać do kolejnego stopnia pomiaru.

3. Arduino Nano

Komunikacja z czujnikiem pyłu i czujnikiem temperatury/wilgotności odbywa się poprzez układ Arduino Nano z wykorzystaniem protokołu 1-Wire. Odczytana i skonwertowana wartość jest właściwie gotowa do wysłania do następnego stopnia pomiaru.

Źródła programu pracującego na Arduino Nano dostępny jest w repozytorium GIT.

Parę szczegółów technicznych dotyczących układu mikrokontrolera:

  • odczyt stanu czujnika DHT11 odbywa się w interwałach 1s,
  • odczyt stanu czujnika PPD42NS jest ciągły,
  • odczytane wartości temperatury i wilgotności wysyłane są do routera TP-LINK WR-740N co 1 sekundę,
  • odczytane wartości zapylenia wysyłane są do routera co 30 sekund,
  • mikrokontroler komunikuje się z routerem za pośrednictwem protokołu RS232 (57600 boud, 1 bit stop, non parity),
  • prędkość transmisji została dobrana eksperymentalnie i była dosyć czasochłonnym procesem, jak się okazuje przy różnych prędkościach i ustawieniach portu mieliśmy do czynienia z różnym stopniem błędu transmisji (%), należy wziąć pod uwagę, że w wykorzystanej komunikacji nie możemy skorzystać z kontroli przepływu i synchronizacji danych, bo tychże nasz router nie obsługuje (sprzętowo),
  • aby dodatkowo poprawić jakość transmisji RS232 często opróżniany jest bufor do wysyłki danych a opóźnienia między kolejnymi danymi pozwalają na odczyt krokowy po stronie routera,
  • po zasileniu całego układu Arduino Nano startuje z 45 sekundowym opóźnieniem, jest to czas niezbędny na uruchomienie się routera i inicjalizację portów,
  • układ watchdoga Arduino resetuje mikrokontroler  (w przypadku zatrzymania jego pracy lub innego problemu) w maksymalnym czasie 2 sekund,

4. Router TP-LINK WR-740N

Wymieniony router wyposażony jest w system operacyjny OpenWRT, który znakomicie sprawdza się w szybkiej, zdalnej konfiguracji sieci bezprzewodowej. Jego główną rolą jest zapewnienie dostępu do internetu, odczyt danych pomiarowych z układu Arduino Nano oraz wysłanie ich do API, które umieści je bazie danych.

openwrt-interface

Kilka refleksji dotyczących tego stopnia pomiaru:

  • port równoległy routera musi pracować w trybie RAW, wyłączona kontrola przepływu, timeout oczekiwania na dane to 1 minuta, minimalna liczba znaków do odczytu portu ustawiona na 1,
  • przy starcie routera uruchamiany jest skrypt startup.sh (dostępny również w repozytorium), zadaniem skryptu jest konfiguracja ustawień portu RS232 oraz uruchomienie zapisu zawartości portu szeregowego (/dev/ttyATH0) do pamięci RAM (fizyczny plik /tmp/pomiar.txt),
  • wysłanie zawartości pliku (/tmp/pomiar.txt) z zapisanym pomiarem odbywa się co 5 minut, wykorzystany został do tego unixowy terminarz cron, skrypt wysyłający dane ma nazwę send.sh (również dostępny z poziomu repozytorium),
  • aplikacja wykonująca request do API serwera to proste wywołanie wget, po wykonaniu zapytania opróżniamy zawartość pliku pomiarowego,

5. API po stronie serwera – zapis do bazy danych

Na serwerze umieszczony jest skrypt (update.php) napisany w technologii PHP,  stworzony całkiem na szybko i z pewnością nie jest docelowym rozwiązaniem. Odczyt danych oparty jest o prosty parser wykorzystujący funkcję preg_match_all.

Do bazy danych zapisujemy wartości takie jak temperatury, wilgotność, wartości PM10 i PM2,5 oraz znaczniki czasu (pomiaru) zarówno z bazy danych jak i z układu arduino. Przychodzące dane sprawdzane są pod kątem poprawności wg. sumy kontrolnej, w którą doposażony jest każdy pomiar. Ma to na celu wyeliminowanie ewentualnych błędów w transmisji między peryferiami, tak aby nawet pozornie poprawnie wyglądające dane nie zakłócały przyjętego algorytmu.

pomiary-mysql

Obecnie analizujemy zbierane dane oraz przygotowujemy się do zamknięcia rozwiązania w szczelnej obudowie.

Komentarze do wpisu prosimy zamieszczać na Niezależnym Forum Nowego Tomyśla lub na Facebooku.