środa, 31 października 2018

Stacja pogody na Arduino cz. 3. Pomiar zanieczyszczenia powietrza - czujnik SDS011

W kolejnym etapie rozbudowy stacji, dodaję czujnik zanieczyszczeń powietrza SDS011 do pomiarów zawartości pyłów zawieszonych PM2.5 i PM10. Wyniki pomiarów prezentowane będą na wyświetlaczu LCD i dodatkowo zapisywane do pliku logów (csv) na karcie pamięci.

Układ prototypowy
Elementy stacji
Na tym etapie rozbudowy dochodzi jedynie czujnik SDS011, pozostałe elementy były wprowadzone w części pierwszej i drugiej stacji pogody.

Funkcjonalność
  • Pomiar następujących parametrów powietrza:
    • Temperatury (co 5s)
    • Wilgotności względnej (co 5s)
    • Ciśnienia atmosferycznego (co 5s)
    • Pyłów zawieszonych PM2.5 i PM10 (co 3 minuty)
  • Prezentacja aktualnego czasu i wyniku pomiarów na wyświetlaczu LCD
  • Rejestrowanie czasu i wyniku pomiarów na karcie pamięci SDHC w pliku tekstowym o formacie csv co 5 minut

Dane wyświetlane są naprzemiennie z racji na ograniczoną ilość informacji jakie można zaprezentować na użytym wyświetlaczu (4 linie x 16 kolumn). Przez 4s pokazywane są dane z BME280, przez kolejne 2s - dane z SDS011. Dodatkowo, po włączeniu stacji, dane o zanieczyszczeniu nie są prezentowane do momentu wykonania pomiarów.

Uruchomienie
Kod wraz z logami na terminal zamieszczam tradycyjnie w repie na bitbuket-cie w branchu part3_serial.

Schemat blokowy
W zasadzie nie różni się specjalnie od tego z części drugiej, poza zamianami wymuszonymi dodaniem obsługi czujnika SDS011 (rozbudowane funkcje od prezentacji danych na LCD i w terminalu). Oczywiście jest i nowa funkcja (updateSdsData()) obsługująca SDS011, wzorowana na bardziej zaawansowanym przykładzie (SDS011_Extended_SoftwareSerial) z biblioteki (1) której użyłem do komunikacji z czujnikiem SDS011. W moim przypadku interwał pomiarów to 3 minuty. Na  5 sekund przed pomiarem czujnik jest aktywowany, co oznacza uruchomienie wiatraczka, tak aby osiągnął stabilny stan na czas samych pomiarów. Następnie wykonywanych jest 10 pomiarów, z których dwie skrajne wartości są odrzucane, a z pozostałych 8 wyznaczana jest wartość średnia. Po wykonaniu pomiarów czujnik jest usypiany i wiatrak się zatrzymuje. Czujnik jest zasilany z odrębnego źródła zasilania 5V, aby nie obciążać zbytnio prądowo Arduino i nie dorzucać mu zakłóceń od silnika wiatraczka w SDS011.

Poniżej zdjęcia wyświetlacza LCD (jeszcze z folią stąd te odblaski i niechlujny wygląd ekranu) z wynikami pomiarów z BME280 (temperatura T, wilgotność H i ciśnienie P) oraz z SDS011 (PM2.5 i PM10). Dodatkowo pojawia się napis /BASE/ który mówi, że aktualnie prezentowane są dane ze stacji bazowej. Trochę tu wyprzedzam przyszłość, bo plany są takie aby dane tu prezentowane pochodziły z różnych źródeł (np. bezprzewodowych czujek, czy z API pogodowego z danymi o pogodzie z mojego miasta).

Wyniki pomiaru z BME280

Wyniki pomiaru z SDS011

W porównaniu do poprzedniej wersji stacji, zmniejszyłem częstotliwość pobierania danych z czujnika BME280 z 1 do 5 sekund oraz dla wysyłkę danych na terminal z 1s do 1min. Obecnie, dodatkowo wysyłane są informacje o aktywacji i deaktywacji czujnika SDS011 i wyznaczone średnie wartości pomiarów. W funkcji updateSdsData() można znaleźć jeszcze inne zakomentowane dane możliwe do wysłania na terminal, ale moim zdaniem nie aż tak istotne. Przeniosłem je z przykładu ze źródła (1).

Dane przesyłane na terminal
Jak widać, po uruchomieniu stacji, zostały wysłane domyślne (zerowe) dane o PM'ach na terminal, ponieważ czujnik SDS011 nie zdążył dokonać pomiarów. W momencie pierwszego zapisu na kartę, dane te były już jednak dostępne.

Zarejestrowane dane w pliku csv na karcie pamięci

Udoskonalenia
Po napisaniu kodu, doszedłem do wniosku, że warto byłoby zgrać pomiary czujnika SDS011 z zapisem danych do pliku.Tym samym pomiary byłyby wykonywane co 5min i byłby zysk na dłuższym życiu lasera z czujnika. Poza tym, jeśli po włączeniu stacji stacji, nie będzie "leciał" zapis na kartę pamięci to mogą się zapisać domyślne wartości PM'ów czyli zera.

W przyszłości dodałbym także buzzer ostrzegający o przekroczeniu norm zanieczyszczeń. W moim przypadku oznacza to ręczne uruchomienie oczyszczacza powietrza. Póki co, oczyszczacz jest jeszcze na gwarancji, więc nie kombinuję z ingerencją w jego elektronikę i automatyczne uruchamianie.


Źródła:
1) Przykład SDS011_Extended_SoftwareSerial z biblioteki hafu/SDS011
2) Specyfikacja czujnika BME280
3) Strona SDS011 producenta

Brak komentarzy:

Prześlij komentarz