SMOG = Raspberry Pi B z SDS011

[Aktualizacja 05-04-2017] Czujnik pyłu zawieszonego – mierzymy SMOG 2,5 oraz 10 mikrometrów

[Ostatnie zmiany: Przykłady pobierania danych z zaawansowanych stacji, Integracja ze Open-Smog]
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

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:

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 adresem: http://powietrze.gios.gov.pl/pjp/current/getAQIDetails?id=10347&param=AQI:

To pozwala nam szybko wyciągnąć nową zmienną i wpisać ją do bazy InfluxDB – dodając dwie linijki do naszego skryptu:

Oczywiście dla stacji podających więcej danych – należy zmodyfikować nieco kod. Przykładowo stacja z Warszawy, która pokazuje więcej danych:

Po modyfikacji (przykłady bez optymizacji) możemy pobrać więcej zmiennych:

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!




  • Niedawno pisałem o polskim projekcie Smogly http://rozie.blox.pl/2017/02/Smogly-miernik-poziomu-smogu.html który ma parę zalet: nie wymaga RPi, działa przy wysokiej wilgotności i integruje wiele czujników. Chociaż w sprawie integracji to widzę, że nie będzie problemów.

    Przy okazji – nie widzę wspomnianego zdjęcia z długim wężykiem?

    Tak czy inaczej, wysyłam twórców Smogly tu, a Ciebie zachęcam na rzut oka na Smogly.

    • Łukasz C. Jokiel

      Hej, dzięki! Celem jest uruchomienie w prosty sposób, urządzenia, które może wysyłać dane do wielu różnych baz/projektów – podobna filozowia jak przy dzieleniu się danymi z ADS-B. Dodatkowo – wyświetlanie lokalne, baza Grafany, możłiwość łatwego dołożenia czujników i modyfikacji pomiarów (przy > 70% zawilgocenia).
      Chętnie spojrzę na każdy projekt – jak widać ten wymaga jeszcze rozbudowy, dodam też zdjęcia przed/po.

  • Dariusz Leszczyszyn

    Jak bardzo różnią się pomiary przy wilgotności pow. 70% i jak można je korygować znając wilgotność?

    • Łukasz C. Jokiel

      Według doświadczeń innych – są zawyżane. Jeszcze innych, że całkowicie niewiarygodne – co ogólnie jest cechą czujników laserowych. Testuję (od 08.03.2017) kilka sposobów – wkrótce aktualizacja

      • Dariusz Leszczyszyn

        Ok, to daj znać bo też planuje u siebie pomiar smogu i nie wiem jak korygować te pomiary gdy wilgotność wieksza od 70%

        • Łukasz C. Jokiel

          Pingnę Cię w komentarzu

      • Krzysztof Ignatowicz

        Witam
        2 dni walcze z SDS018 czujnik działa fajnie ale faktycznie powyżej 70% RH zawyża pomiary jak u siebie rozwiazałeś ten problem spoglądam na twoje dane live i są całkiem wiarygodne.

        Pozdrawiam

        • Łukasz C. Jokiel

          Nie podgrzewam, ale sam czujnik jest w 20 st C. Rurka jest bardzo krótka (kilka cm).

          • Krzysztof Ignatowicz

            No ja mam SDS018 bez wlotu na rurke i cały za oknem leży a teraz 86% RH chyba jakis podgrzewacz nakleje na niego

          • Łukasz C. Jokiel

            Cóś mi tak ‚intucja’ podpowiadała, że z rurką mam większe szanse 🙂 Pamiętam, że podgrzewacze były z rezystorów dużych (5W), nawet nie brało to dużo prądu. A wlot był z kolanka rury od rynny (ale fi 50)…

  • Mirek Moczyróg

    SDS011 można uśpić i wybudzić komendą – wtedy możliwe jest też podłączenie bezpośrednio przez port szeregowy na GPIO.
    Zastanawiałem się też nad podgrzaniem próbki powietrza przed pomiarem, aby uzyskać lepszą dokładność przy dużej wilgotności.

    • Łukasz C. Jokiel

      Tak, ma tryb sleep, ale dopókie nie rozbiorę i nie zobaczę, że laser również się wygasza – nie uwierzę :). Bardziej zaawansowani użytkownicy mogą czerpać z dobrze opisanego pythona stąd: https://gitlab.com/frankrich/sds011_particle_sensor/blob/master/Code/sds011.py, zapewne to dodam w przyszłości

      Tak, podgrzewanie to jest to – może też nawet jakiś filtr na stałe cząstki wody. Jest nad czym pracować w lecie, trzeba kupić drugi SDS011 do testów…

  • Bart Juszczak

    Jak to się ma z popularnymi tu i ówdzie czujnikami plantower 5003/7003?

    • Łukasz C. Jokiel

      Mają podobną dokładność, także – co ważne – wentylator, ale są trudniejsze w podłączeniu dla początkujących i raczej wymagają montazu w obudowie na zewnątrz. Gdybym dostał go w prezencie – to raczej mierzyłbym zapylenie w pomieszczeniu.

  • adam

    super stacja pogody i strona – gratulacje!

    Mam pytanie dla Ciebie, ponieważ chciałbym zrobić lokalnie w swojej miejscowości identyczną stacje, ale czujniki wszystkie będą podłączone do arduino z gsm – który będzie wysyłał to Raspberry Pi gdzie będzie baza influxDB oraz grafan i chciałbym tam postawić taką stronę jak Ty masz. Czy możesz mi pomóc jak zmienić to
    #Update the local InfluxDB
    /usr/bin/curl -i -XPOST ‚http://127.0.0.1:8086/write?db=smogdb’ –data-binary „ppm25sds011 value=${PPM25}”
    /usr/bin/curl -i -XPOST ‚http://127.0.0.1:8086/write?db=smogdb’ –data-binary „ppm10sds011 value=${PPM10}”
    żeby było to wysyłane przez Arduino lub esp? czy lepiej zrobić to tak, że najpierw wysłać do domoticza i z domoticza do bazy InfluxDB?

    • Hej! Nie używam arduino (wolę SBC z interfejsem sieciowym na pokładzie – Orange Pi czy ESP8266 są w podobnych cenach), ale jeśli chcesz zmienić ten konkretny kod – to poszukaj przykładu z biblioteki http – po prostu tworzysz URL JSON. Jeśli z kolei masz gotowy kod do wysyłania do domoticza – to oczywiście w prosty sposób możesz (wcześniej opisany: https://goo.gl/BTzggm). Powodzenia!

  • lauba

    Cześć możesz dokładniej opisać co się dzieje, w pliku raw-index.html.
    Ponieważ piszesz tam, że mamy już zmienne odpowieadające za pobranie wartości 2,5 oraz 10. Dodatkowo totalnie nie rozumiem
    jak działa pobieranie wartości temperatury i wilgotności i gdzie to wpisać. I później już jak dodać do strony poniżej wykresy z Grafan. Proszę o opis dokładniejszy dolnej cześci bo wygląda to super i bardzo by się przydało:)

    wesołych świąt!:)

    • Plik raw-index.html to gotowa strona www, w której używając unix-tools – czyli standardowych narzędzi uniksowych obenych w dystrybucji – wykonujemy „Znajdź i Zamień” jak w edytorze tekstu. Tam gdzie jest __PPM25__ zamieniamy to na naszą odczytaną wartość smogu 2,5. Zmieniamy pozostałe i taki plik – mający „czas przydatności do spożycia” do następnego pomiaru – wrzucamy do folderu gdzie trzymamy stronę. Dzięki takiej prostej metodzie – unikasz wchodzenia w zaawansowane rejony dynamicznego generowania stron.

    • Wykresy z Grafany – po prostu eksportuję obrazek statyczyny do PNG – funckja Grafany.

  • lauba

    Dzięki za odp. Dalej skomplikowane – nie rozumiem do końca gdzie jest pobieranie danych z bazy influxDB do zmiennej i czy wpisujemy to do zmiennej : „zegar3”, czy do __temperature__ ? Druga sprawa czyli gotowa strona do której doklejamy kawałk kodu z skryptem, który umieściłeś na stronie tak?

  • Tomasz Czubachowski

    Pojawiło się api http://powietrze.gios.gov.pl/pjp/content/api . Czy mógłbym prosić o pomoc. Czy ktoś podał by przykład jak przetworzyć te dane np w pythonie.

    • Łukasz C. Jokiel

      Zapraszam do akapitu: Pobieranie danych i weryfikacja ze stacjami WIOŚ