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.
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:
- czujnik PPD42NS firmy Shinyei
- 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).
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:
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ń:
Wartość count określa liczbę cząstek powietrza o rozmiarze 1um, którą pozostaje już tylko skonwertować na ug/m3 wg wzoru:
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.
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.
Obecnie analizujemy zbierane dane oraz przygotowujemy się do zamknięcia rozwiązania w szczelnej obudowie.