SMOG = Raspberry Pi B z SDS011

[Aktualizacja 08-02-2018] Czujnik pyłu zawieszonego – mierzymy SMOG 2,5 oraz 10 mikrometrów

[Ostatnie zmiany]:
07-11-2017: Przykłady pobierania danych z zaawansowanych stacji, Integracja ze Open-Smog, promocja na czujnik
20-12-2017: Kontrola zasilania USB na Raspberry Pi 3, dzięki czytelnikowi
03-02-2018: Nowe API od GIOŚ Poland
08-02-2018: Odnajdywanie ID

SMOG stał się nieodłączną częścią życia w dużych miastach. Postarajmy się więc zbudować wiarygodny, własny czujnik SMOGu – na początek cząsteczek o wielkości 2,5 oraz 10 μm. Pewnym problemem staje się wybór czujnika, ponieważ niełatwo znaleźć taki, który łączy w sobie długą żywotność i precyzję pomiaru z przystępną ceną. W końcu – po zasięgnięciu opinii – zdecydowałem się na czujnik cząsteczek – Nova Fitness SDS011:

  • zadowalająca precyzja pomiaru
  • wentylator
  • możliwość zamontowania wężyka
  • duża trwałość
  • wbudowany interfejs UART, wraz z konwerterem USB
  • Niska cena całego rozwiązania: od około $40 przy użyciu Orange Pi Zero – do $60 jeśli używamy Raspberry Pi

Czego będziemy potrzebować?

Hardware:

  • Raspberry Pi lub klon (Orange Pi) z wolnym portem USB
  • czujnik Nova Fitness SDS011 w wersji z konwerterem USB-UART, który obecnie z kodem DIY_SMOG_15 jest 15% tańszy w Nettigo. Cóż, szybka dostawa to plus – bo sezon na SMOG na szczęście  jest wtedy gdy mamy dużą niską emisję.

Software:

  • ulubiona dystrybucja Raspbian lub Armbian dla klonów
  • podstawowe programy występujące jako opcje w dystrybucji Linuksa

Budowa, konfiguracja oraz wykresy

Urządzenie podłączamy możliwie krótkim (kilka cm) wężykiem, tak aby wlot pobierał z zewnątrz powietrze. Długi wężyk – 100cm jak na pierwszym zdjęciu – znacznie obniża rezultaty – zaniża pomiar.

Nova Fitness SDS011 z RPi B+ (wężyk za długi)
Nova Fitness SDS011 z RPi B+ (wężyk za długi)

Pamiętajmy także, że czujnik pracuje cały czas, więc być może warto spróbować załączać go tylko na czas pomiaru. W wersji pracującej u mnie – wybrałem dość proste rozwiązanie – wyłączam zasilanie po pomiarze, a przed pomiarem – załączam i czekam 60 sekund.

Czujnik pod dachem
Czujnik pod dachem

Kolejna ważna kwestia – czujnik staje się niewiarygodny, gdy wilgotność przekracza 70%, pamiętajmy o tym!
Najpierw zainstalujmy bc – potrzebny do obliczeń:

Nie zapominajmy, że to pierwsza wersja naszego czujnika – i jak się domyślacie – będziemy modyfikować go pod kątem pomiarów wilgotności.
Komunikacja z urządzeniem jest bardzo prosta – po umieszczeniu w porcie USB  otrzymujemy /dev/ttyUSB0 – z którego czytamy tak samo jak z innego interfejsu szeregowego:

Po odczytaniu – sprawdzamy czy linia zaczyna się od „aac0”. Dane podawane szesnastkowo, little endian – a więc finalną wartość należy wyliczyć. Cały kod, łącznie z aktualizowaniem bazy Influx do rysowania w Grafanie przedstawia się następująco, mam nadzieję, że jest niezwykle przejrzysty:

Wersja dla dowolnego komputera, testowana na Orange Pi:

Wersja dla Raspberry Pi 3

Dzięki czytelnikowi bloga – Piotrek Pilek, pozdrowienia, mamy sposób na identyczną kontrolę zasilania USB! (przy okazji – Piotr pracuje w Lantech w Szczecinie – popatrzcie na to niedocenione miasto – https://lantech.com.pl/internet_szczecin_oferta/transmisje-live/)

Kontrolę zasilania USB możemy uzyskać dzięki programowi Vadim Mikhailov, który stworzył oprogramowanie dla kilkunastu róznych hubów USB wraz z obsługą Raspberry Pi. Program instalujemy:

Następnie modyfikujemy linie w powyższym przykładzie:

na

A następnie analogicznie na końcu pliku:

na

Uwaga – wyłącza to wszystkie porty USB, ale nie wyłącza portu eth0 ani też wlan0

Rysujemy!

Teraz – podobnie jak wcześniej – rysujemy dane w Grafanie, definicje wyglądają następująco:

Nova Fitness SDS011 - dane w Grafanie
Nova Fitness SDS011 – dane w Grafanie

To wszystko!

Dzielenie się danymi, wysyłanie do innych systemów. Czy masz własny projekt?

Nasze dane od smogu są dostępne i bardzo łatwo możemy się nim podzielić. Jeśli prowadzisz własny projekt agregujacy dane – napisz proszę komenatarz lub emaila – dopiszę sposób w jaki można wysłać do konkretnych projektów dane.

Integracja z OpenSmog

Open-Smog to projekt zapoczątkowany jako realizacja pomysłu Artura Kurasińskiego. Po szczegóły zapraszam na Slacka: https://open-smog.slack.com/
Integracja sprowadza się do dodania do skryptu na końcu:

Obiecywałem, że będzie prosto, prawda ?

Pomiary, aktualizowane co 60 minut, możecie śledzić pod adresem http://pogoda.jokielowie.com/

Pobieranie danych i weryfikacja ze stacjami WIOŚ

Z pewnością każdego interesuje jak dokładny jest taki czujnik. Możemy bardzo szybko dodać do naszego skryptu dane z oficjalnych stacji WIOŚ: mapa znajduje się pod adresem: http://powietrze.gios.gov.pl/pjp/current. Wybieramy interesującą nas stację – w przykładzie będzie to stacja na ul. Koszyka w Opolu, która ma adres: http://powietrze.gios.gov.pl/pjp/current/station_details/chart/10374. Jak zauważył Krzysztof Styc na grupie Domoticz – WIOŚie podają aktualne dane (ostatni pomiar) w formacie JSON.
Pod koniec 2017 uległo to jednak zmianie i udostępniono nowe API pod nowym adresem, także w formacie JSON: http://powietrze.gios.gov.pl/pjp/content/api
To pozwala nam szybko wyciągnąć nową zmienną i wpisać ją do bazy InfluxDB – dodając kilka linijek do naszego skryptu. Najpierw musimy jednak znaleźć ID naszej stacji:

Szukamy np: Opola i znajdujemy StationID:

GIOS - StationID
GIOS – StationID

Mając StationID – wpisujemy je w URL, który pokaże konkretne pomiary:

GIOS - pomiar - ID
GIOS – pomiar – ID

Mamy nasze ID do pomiarów – oto i one:

GIOŚ - dane PM10 z Opola
GIOŚ – dane PM10 z Opola

Modyfikujemy skrypt:

Oczywiście dla stacji podających więcej danych – należy zmodyfikować nieco kod. Najpierw trzeba znaleźć ID jak powyżej.
Po modyfikacji (przykłady bez optymizacji) możemy pobrać więcej zmiennych, co wymaga jak zwykle małej zabawy z parametrami.
Na wykresie pojawi się więc dodatkowa zmienna – lub zmienne, dzięki której zweryfikujemy nasze wskazania. Dla gazów warto zrobić osobny wykres.

Wskaźniki – zegary – aktualne wartości na stronie WWW

Informację o aktualnych wartościach ilości cząsteczek w metrze sześciennym możemy także prezentować w formie wskaźników lub zegarów. Z pomocą przychodzi gotowa bilblioteka w JavaScript, która współpracuje bezproblemowo z większością przeglądarek: http://justgage.com/:

Zegary smogowe i pogodowe
Zegary smogowe i pogodowe

Pobieramy ZIP „justgauge”, rozpakowujemy i przygotowujemy naszą surową stronę, w przykładzie będziemy jeszcze pobierać dane z bazy InfluxDB – temperaturę i wilgotność, tak abyśmy wiedzieli czy nasz pomiar jest wiarygodny. Surowa wersja strony:

Zapiszmy plik jako raw-index.html
W głównym skrypcie mamy już zmienną która odpowiada na 2,5 i 10. Pobierzmy więc – dodają te line do skryptu – wilgotność i temperaturę. W InfluxDB są to w moim przykładzie zmienne „temperatura_out” oraz „wilgotnosc_out” – zmieniamy je na własne, podobnie jak adres IP i nazwę bazy danych – oczywiście dołączamy do głównego skryptu:

Gotowe – zatem wymieńmy odpowiednie wartości w naszym pliku i stwórzmy nowy:

Plik index.html wysyłamy do naszego hostingu na przykład tak, oczywiście wcześniej wykonując „ssh keygen” oraz „ssh-copy-id”

Każde uruchomienie skryptu zaktualizuje nam plik!