SMOG = Raspberry Pi B z SDS011

[UPDATED 07-11-2017] SMOG sensor – 2,5 and 10 micro meter particles

[Last changes: Additional data from richer stations, Open-Smog Integration]
SMOG is common nowadays in big cities. Let’s put together a working, precise own SMOG sensor, first for the 2,5 and 10 μm size particles. There is one issue – the choices are many, but only few are reliable, precise and have affordable price. Finally – after a log searching, I’ve chosen Nova Fitness SDS011:

  • precision is OK
  • fan included
  • ability to mount a small tube to access external air
  • very realiable
  • UART with USB converter included
  • Low Total cost: around $40 (with Orange Pi Zero) up to $60 (with Raspberry Pi)

What will you need?

Hardware:

  • Raspberry Pi or clone (Orange Pi) with one USB port free
  • Nova Fitness SDS011 sensor with USB-UART included in package, it’s currently 15% off at Nettigo if you use the DIY_SMOG_15 code.  Luckily the SMOG is mainly attributed to low emissions, so fast delivery is the key.

Software:

  • favourite distibution – Raspbian or Armbian for clones
  • basic software included or optional in those distributions

Setup, configuration and graphs


The SDS011 should be connected to outside air via the duct and possibly very short tube (few cm). The picture above with the tube length of 100cm – is not advised the results are much lower than in real life.

Nova Fitness SDS011 on RPi B+ (tube too long)
Nova Fitness SDS011 on RPi B+ (tube too long)

Don’t forget that the sensor works constantly, so we will try to turn it on – only for the time of actual measurement. This version has a very simple solution – using Orange Pi with A20 CPU, I can selectively power the USB port pairs.

Sensor right under the roof
Sensor right under the roof

Another important caveat – sensor works only up to 70% of humidity, don’t forget that!
First – let’s install bc – needed for caluclations:

This is of first version of the sensor – meaning we will modify it for the extra humidity.
The communication with SDS011 is very simple – after inserting the delivered dongle in USB port we get the /dev/ttyUSB0 serial port – that we can use to read the data:

The data needs to be parsed to find “aac0” (SDS011 talks in hex, big endian), and the final value needs to be calculated. The whole code with updating the IndluxDB so Grafana can present nice graphs is here. Added comments to explain, used bash for simplicity:

Now, lets draw the results just like last time in Grafana, the definitions are as follows:

Nova Fitness SDS011 - Grafana graph
Nova Fitness SDS011 Grafana graph

And that is it!

Sharing the data, external systems. Do you run your own project?

Our SMOG data are available and easy to share. If you run a system that gathers such data – write in comments – I’ll setup connection to your project and update this entry.
Current measurements, updated every 15 minutes are available at http://pogoda.jokielowie.com/

OpenSmog integration

Open-Smog is a new project, based on Artur’s Kurasiński idea. For details – check out Slacka: https://open-smog.slack.com/
Integration is simple – just add at the end of script:

I promised easy, right ?

Getting the data from regional smog sensors – Polish voivodeship – WIOŚ

OF course you’re curios how precise is our sensor. To verify – we can add official data from WIOŚ sensor: the map is here: http://powietrze.gios.gov.pl/pjp/current. Choose the sensor near you – here it’s the one at Koszyka Streen in Opol, that has this particular address (mind the ID): http://powietrze.gios.gov.pl/pjp/current/station_details/chart/10374. As pointed by Krzysztof Styc on Domoticz group – the WIOŚ share the current measurment in JSON format at the address: http://powietrze.gios.gov.pl/pjp/current/getAQIDetails?id=10347&param=AQI:

This allows us to quickly get this data and put it to InfluxDB too – adding just two lines to our script:

Of course the script will vary from sensor – some give out much more data – the line needs to be modified (it’s usually about another print $7, print $8 etc.), i.e. for this Warsaw station, we can get more data:

After modification, we’re getting new variables:

Our Grafana graph should now get new data (you can choose which to add in similar manner) – that we can put up against our own sensor data.

The actual visualized data, updated every 60 minutes, are available under http://weather.jokielowie.com/

Gauges – current SMOG data via WWW

The up-to-date information about particles in cubic meter can be also presented as gauges. Popular library with easy examples JavaScript that work in most browsers is present at: http://justgage.com/:

Zegary smogowe i pogodowe
SMOG Gagues

Downdload the ZIP called “justgauge”, unpack. Now lets prepare RAW version of our webpage. We will update it via InfluxDB – using stored temperature and humidity to find out if our measurements are correct.
Here’s the RAW version:

Stacja pogodowa SMOG w … /SMOG Weather Station in …

 

 

 

 



Save it as raw-index.html

The main script already has the values for 2,5 and 10 (ppm). Let’s incorporate them by adding lines to the script dodają te line also with temperature and humidity. In my InfluxDB example – they are named as “temperatura_out” and “wilgotnosc_out” – change them to your measured values as well as IP and database – and then – add those lines at the end of the script:

Ready! Let’s process our RAW index file and swap the values for real ones:

The index.html file could be now sent to external hosting after using “ssh keygen” and “ssh-copy-id”

If you got those line in order – in the main script – each launch will update the file on the remote server!




  • 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.

      • Enc-X

        To jeszcze dodam moją wariację na temat miernika zanieczyszczenia. Od ponad roku działam z SDSem w obudowie na zewnątrz. Na podstawie doświadczeń kolegi z Krakowa wynik poddawany jest korekcji względem wilgotności i wszystko w sumie ok…. Jednak po roku: wszystkie sensory wilgotności mają już błędne pomiary. Roczny SI7021 zawyża pomiary. Podaje 100% gdy nowe SI7021 i BME280 wskazują 75%. Nie wspomnę o DHT który po pół roku działa już binarnie 🙂 0% lub 100%. Dlatego zdecydowałem się na drogę Smogly – podgrzewacz powietrza w czerpni i Plantower PMS. Mój sensor wysyła dane do bokera MQTT. Dla zainteresowanych link do githuba: https://github.com/enc-X/air-monitor

        • Łukasz C. Jokiel

          Bardzo fajne, dzięki za doświadczenia – muszę dodać świeży BME280 do weryfikacji pomiarów

  • 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Ś

  • Wojciech Banaszewski

    Czyli jeśli dobrze zrozumiałem, mamy 2 wyjścia, w celu zmierzenia stężenia pyłów na zewnątrz – albo montujemy czujnik na zewnątrz, albo w domu i wystawiamy wężyk na zewnątrz. Ty zdecydowałeś się na opcje 2. A co sądzisz o pomyśle zainstalowania całego urządzenia na zewnątrz? Bo jakoś nie uśmiecha mi się przewiercanie ścian czy okien w celu przepchania rurki. A nawet jeśli, to ściana z ociepleniem ma z 30 cm, więc wężyk miałby pewnie efektywnie z 50cm, czyli dość długi.

    • Łukasz C. Jokiel

      Jeśli nie możesz przy oknie (gdzie masz niedużo do wiercenia) – trzeba zamontować dodatkowo grzałkę do urządzenia i powietrza i zabezpieczyć elektronikę – sam czujnik działa i podaje poprawne wyniki w temperaturach dodatnich). Do zrobienia, ale trzeba zmodyfikować

      • Wojciech Banaszewski

        No fakt, mogę się przewiercić przez futrynę… Trochę żal, ale może się da.
        Co do zabezpieczenia, to kusiło mnie, żeby zamontować to na ogrodzeniu, w skrzynce od sterowania siłownikami bramy – jest tam prąd, jest zabezpieczenie elektroniki. Tylko ta grzałka mnie przeraża troche, bo nie wiem jak się za to zabrać – natomiast według specyfikacji z aliexpress, to czujnik ma operating temp: od -20 do +50… Czyli mimo wszystko sugerowałbyś wiercić przez okno?

        • Łukasz C. Jokiel

          Powiem, że po roku pracy daje bardzo zbliżone wyniki do oficjalnych – a więc z doświadczenia. W ujemnych pewnie będzie gorzej, ale z drugiej strony można przecież inaczej – porównany wyniki za rok!

  • Wojciech Banaszewski

    Co się powinno wydarzyć po wykonaniu /usr/bin/sunxi-pio -m PH26” ?? Bo mi pojawia się “PH26” a wentylatorek jak szumiał tak szumi….

    • Łukasz C. Jokiel

      Jeśli masz Orange Pi (CPU A20, SATA) to powinien przestać się kręcić. Jednak na RPi to nie zadziała – inny sprzęt i kontroler. Pracuję na aktualizacją – używając pomysłu na który zwrócił mi uwagę Piotr Pilek: https://github.com/mvp/uhubctl (już niedługo postaram się zaktualizować wpis – jeszcze w tym roku!)

      • Wojciech Banaszewski

        No właśnie Orange Pi Zero H2+, więc teoretycznie powinno zadziałać. Chyba, że nie mam czegoś poinstalowane. A na jakiej dystrybucji to robiłeś? Ja mam debian jessie.

        • Łukasz C. Jokiel

          Dystrybucja musi to obsługiwać (używam tylko armbiana), ale H2+ ma z pewnością inny kontroler zasilania – PH26 było tylko w Orange Pi – musisz znaleźć odpowiedni “PH”