SMOG = Raspberry Pi B z SDS011

[UPDATED 05-04-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

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:

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.

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