Feinstaub messen – NodeMCU und SDS011

Ein Artikel aus der Make: IoT Special 1/2017 erregte mein Interesse. Es ging um die Feinstaubmessung mittels Raspberry Pi und einem entsprechenden Sensor. Der dort genutzte Sensor ist ein Nova PM SDS011 den man für ~23 € in China bekommt. Recht teuer im Vergleich zu den sonstigen Artikel aus China. Der Sensor saugt mit der Hilfe eines Lüfters Luft in eine Kammer welche dann mittels Laser “beschossen” wird. Durch die Streuung des zurückgeworfenen Laserlichtes werden die Luftpartikel (Größe und Menge) gemessen.

Der Sensor kann zwei Partikelgrößen parallel messen:
– PM10, inhalierbarer Feinstaub mit 10µm Durchmesser
– PM2,5, lungengängiger (alveolengängiger) Feinstaub mit im Mittel 2,5 µm Durchmesser

Mehr zu diesem Thema gibt’s im Wikipedia-Artikel.

Also, Sensor bestellt und drei Wochen später ohne Zollprobleme frei Haus geliefert bekommen.

Der Sensor kommt mit USB-Adapter für den einfachen Anschluss am Odroid (oder auch am Raspberry Pi wie im Artikel beschrieben). Im Make-Artikel wird ein Shellscript vorgestellt, mit dem die Sensordaten gelesen und verarbeitet werden. Ich habe am Ende des Scriptes nur noch eine Zeile zum Speichern der Daten in meine MySQL-Datenbank eingefügt. D.h. nach 10 Minuten Bastelei lief schon alles…das war fast zu einfach. Das Script wurde dann alle 10 Minuten per Cron aufgerufen um die gemessenen Daten in meine MySQL-Tabelle zu schreiben. Der Lüfter des Sensors läuft bei dieser Lösung durchgehend (dazu unten mehr).

Jetzt konnte ich die Feinstaubbelastung im Heizungsraum bestimmen. Irgendwie musste der Sensor nun noch nach draußen. Da ich kein Loch in den Fensterrahmen bohren wollte, stellte sich das als Problem heraus.

Auf der Suche nach einer kabellosen Lösung und mit einem NodeMcu in der Schublade, bin ich nach kurzer Internet-Recherche auf die Webseite http://luftdaten.info aus Stuttgart gestoßen. Dort wird eine sehr einfache Selbstbaulösung zur Feinstaubmessung auf Basis des NodeMcu vorgestellt. Es werden verschiedenen Sensoren zur Feinstaubmessung und Temperatur- und Luftfeuchtemessung unterstützt. Unter anderem ist dort auch der im Make-Artikel verwendete SDS011-Feinstaubsensor integriert. Die Firmware gibt es als Bin auf der Webseite zum Download und die Quellen bei Github. Die Lösung mit den HT-Rohren als Gehäuse fand ich auch sehr gelungen und günstig. Das Aufspielen der Firmware, die Verkabelung und Verstauung der wenigen Teile im HT-Rohr sind in wenigen Minuten erledigt.

SDS011-Sensor mit NodeMCU
SDS011-Sensor mit NodeMCU
luftdaten.info Map
luftdaten.info Map

Nach Anschluss des NodeMcu an ein herkömmliches USB-Netzteil ist der NodeMcu als Access Point (AP) unter der Standardadresse http://192.168.4.1/ eines ESP8266 erreichbar. Dort können dann unter anderem die Zugangsdaten für das eigene Wifi-Netzwerk eingerichtet werden. Zudem können die angeschlossenen Sensoren ausgewählt werden sowie die Übertragung der ermittelten Daten an verschiedene Datenbanken z.B. zur Aufnahme in die Karte de/aktiviert werden. Hier gibt es auch die Möglichkeit eine API zur eigenen Verarbeitung der Daten anzusprechen. Das funktionierte bei mir leider nicht, so das ich im ersten Anlauf die vom NodeMCU generierte Webseite parsen musste um die Daten in meine MySQL-Tabelle zu speichern. Schon ein paar Tage später konnte man aber mittels der neuen Firmware (die OTA ausgeliefert wird, wenn aktiviert) die Sensordaten per JSON abfragen. Das ist komfortabler und zukunftssicherer als das Parsen der HTML-Seite.

Hier ein PHP-Beispiel zum parsen der JSON-Daten welches z.B. auch per Cron aufgerufen werden kann:

/data.json');
$json_ergebnis=json_decode($json);

$PM10=$json_ergebnis->sensordatavalues[0]->value;
$PM25=$json_ergebnis->sensordatavalues[1]->value;
?>

Die Lösung aus Stuttgart unterstützt den Sleep-Mode des Sensors der in der Lösung der Make nicht genutzt wurde. D.h. die Messung und der Lüfter werden nur alle ~30 Sekunden gestartet anstatt dauerhaft zu laufen. Das erhöht die Lebenserwartung des Sensors die mit 8000 Betriebsstunden angesetzt ist. Nach dem Sommer werde ich mal die Luftkammer des Sensors öffnen und schauen was sich dort so angesammelt hat.

Die mittels JSON in einer Datenbank gesammelten Daten werte ich auf meiner Webseite aus. Das schaut dann wie folgt aus (zweimal war der Sensor nicht aktiv):

Die Weltgesundheitsorganisation (WHO) hat folgende Richtwerte für Feinstaubgrenzwerte heraus gegeben:

Jahresmittel PM1020 µg/m³
Jahresmittel PM2,510 µg/m³
Tagesmittel PM1050 µg/m³ ohne zulässige Tage, an denen eine Überschreitung möglich ist
Tagesmittel PM2,525 µg/m³ ohne zulässige Tage, an denen eine Überschreitung möglich ist

Somit sind wir hier trotz plattem Land schon recht nah (bzw. darüber -> Tagesmittel PM2,5) an den Werten der WHO dran.

Die Initiative aus Stuttgart zur einfachen Feinstaubmessung finde ich eine super Sache! Vielleicht findet sich ja noch der ein oder andere Nachbauer um die Karte zu füllen.

Gruß Chris

8 Gedanken zu „Feinstaub messen – NodeMCU und SDS011

  • 26. Februar 2017 um 17:14 Uhr
    Permalink

    Wieder ein tolles Projekt von dir! Thumbs up!

    Antwort
  • 22. April 2017 um 21:15 Uhr
    Permalink

    Hi, kannst du zu deiner Auswertung auf der Webseite mehr Infos oder Code Beispiel liefern? Ich hätte das auch gerne für meine Feinstaubsensoren?
    Danke!

    Antwort
    • 23. April 2017 um 18:45 Uhr
      Permalink

      Hallo Paul,

      ich schreib mal die SQL-Statements zusammen und den Code für den Graph. Kommt dann die Tage…

      Gruß
      Chris

      Antwort
      • 23. April 2017 um 18:46 Uhr
        Permalink

        Cool danke! Eilt nicht 🙂 ich freue mich, kann dich bei Bedarf gerne unterstützen!

        Antwort
          • 30. April 2017 um 19:49 Uhr
            Permalink

            Danke sieht gut aus! Für das Speichern der Werte in der DB würde ich mir dann einen kleinen service erstellen und im Feinstaubsensor eintragen oder gibt es da etwas generisches?

          • 2. Mai 2017 um 17:05 Uhr
            Permalink

            Hallo Paul,
            z.B. Sensordaten per JSON abfragen (siehe PHP-Beispiel) und die Werte dann in mySQL-DB eintragen. Das Ganze per Cron aufrufen.

            Gruß
            Chris

  • 26. Dezember 2017 um 22:18 Uhr
    Permalink

    Gibt es die Möglichkeit das ganze in Grafana anzuzeigen. Hab dazu leider nichts brauchbares gefunden. Der Volkszähler wird leider schnell unübersichtlich wenn man viele Sensoren bzw. viele Werte zum anzeigen hat

    Antwort

Schreibe einen Kommentar zu diefenbecker Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert