Nova PM2.5/PM10 Feinstaub Sensor (SDS011) am Pi anschließen

  • Tach'chen,


    als regelmäßiger Leser des Make Magazins bin ich kürzlich auf einen Artikel in der IoT Sonderausgabe gestoßen, den ich recht interessant fand.


    Dort wurde über den Nova PM2.5/PM10 Feinstaub-Sensor berichtet, der für die Messung von Partikeln mit 2.5 µm bzw. 10 µm Größe geeignet ist.


    Die Idee wurde inzwischen von vielen Makern aufgegriffen und sogar D-Radio Wissen hat in "Netzbasteln" darüber berichtet.


    Der Sensor saugt mit Hilfe eines Lüfters Luft in eine Kammer. Die angesaugte Luft wird mit einem Laser beschossen.


    Anhand der Streuung des zurückgeworfenen Laserlichts wird die Partikelgröße und -menge ermittelt. Die Daten werden über eine Serielle Schnittstelle


    und als PWM Signal bereitgestellt.


    250x250


    Interessant an dem Sensor ist, dass er mit einem USB-Adapter ausgeliefert wird (wenn man möchte, kann man den Sensor auch an die GPIO-Pins,


    anschließen, aber das ist eigentlich nur zu empfehlen, wenn man z.B. mit dem Arduino oder ESP8266 eine Messtation bauen will).


    Den Sensor kann man für ca. 20 bis 25 Euro bei Aliexpress bestellen (Lieferzeit ca. 3 bis 5 Wochen).


    Das Adapter ist nach dem Anschließen über /dev/ttyUSB0 erreichbar. Die Schnittstelle ist laut Datenblatt auf 9600 8N1 konfiguriert (9600 Bit/s,


    acht Datenbits, keine Parität und ein Stoppbit). Die Daten werden in hexadezimaler Schreibweise in wiederkehrender Reihenfolge ausgegeben


    (1x pro Sekunde). Details dazu findet man im Make-Magazin Artikel.


    Das Sensor-Datagramm kann man im Datenblatt nachschauen. Das Make Magazin hat ein Shell-Skipt gebastelt, mit dem man den Sensor auslesen


    kann und das natürlich auch auf dem Pi funktioniert.


    Im Datenblatt kann man nachlesen, dass die verbaute Laserdiode eine Lebensdauer von ca. 8000 Stunden hat. Wenn man den Sensor also 24/7


    betreiben will und jede Sekunde eine Messung durchführt, muss man wohl damit rechnen, dass nach einem Jahr Messungen dann Schluss ist.


    Zwar verursacht der Lüfter kaum hörbaren Lärm, dennoch müsste es eigentlich ausreichen nur alle 5 min zu messen, zumal sich die Werte sicherlich


    nicht sprunghaft ändern. Im Datenblatt steht zwar geschrieben, dass man auch diskontinuierliche Messungen durchführen kann, aber leider ist dort


    nicht dokumentiert wie das geht. Weil dazu auch nichts im Make Magazin Artikel steht, habe ich beschlossen ein - wenn auch kurzes - Tutorial zu


    schreiben, um dieses "Geheimnis" für andere Interessierte zu lüften (die Infos dazu musste ich mir mühselig aus verschiedenen Quellen


    zusammensuchen und gebe hier aus Gründen der Übersichtlichkeit nur die wichtigsten Links an). Zudem habe ich Python verwendet, weil sich IMHO


    der Code leichter erweitern lässt, um die Daten z.B. in eine MySQ(Lite) Datenbank zu schieben.


    Mit den sensor_sleep() und sensor_wake() Funktionen lässt sich der Sensor in den Schlafmodus schicken bzw. auffwecken.


    Mit einem ChargeDoctor habe ich ca. 80 bis 100 mA bei aktivem Sensor und ca. 30 mA im Schlafmodus gemessen (bei dem


    dann auch der Lüfter stillsteht). Es spricht also nix dagegen, sich ein portables Gerät zusammenzubauen, mit dem man


    Outdoor-Messungen an viel befahrenen Straßen durchführen kann.


    Wichtig ist die kurze Pause nach dem Aufwecken, damit sich die Kammer vor der Messung mit frischer Luft füllen kann. Laut Datenblatt dauert


    das ca. 10 Sekunden. Wenn man einen Schlauch angeschlossen hat (der darf bis zu 1 m lang sein), muss man die Pause entsprechend verlängern.


    Das Skript kann man in die crontab eintragen und nach Belieben Intervall-Messungen durchführen. Zumindest sollte es die Lebensdauer des Sensors


    verlängern.


    Viel Spaß damit,


    /luetzel


  • Bei mir läuft das (mein) Python Skript durch und "ruft in sich selbst die Messung auf". Der USB-Serial Adapter hat dann nach etwa 30h unterbrochen, deswegen muss ich immer wieder die serielle Schnittstelle aufmachen.
    Den Sensor mit RPI hab ich heute in zwei Rohrhälften rein und kommt demnächst wieder nach draußen (dann auch wetterfest und mit BMP180 und Kamera)

  • Hallo,


    Bei mir hat das Python-Skript auch auf Anhieb funktioniert.

    Nun wollte ich eine Funktion schreiben, die bestimmte Parameter beinhaltet und dann den Hexstring für den Sensor erstellt. Leider nimmt der Sensor die Werte, wenn Sie nicht von einer unbearbeiteten Hexstring-liste kommt nicht an. Jeder Zusammenbau der Hexstring-Liste aus separaten Hexstring wirft Fehler oder wird ignoriert. Wie kann man sich einen passenden Hexstring bauen?