Feinstaub-Sensor am Raspberry Pi
Eine lokale Aktion für saubere Luft war der Anfang. Interessant klang das Projekt der openSata Feinstaub Map, deutschlandweit weltweit den Feinstaub zu messen und jeder könne mitmachen. Herausforderung angenommen - aber ich mache es mit dem Raspberry Pi!
Das Bauteil der Wahl ist der Feinstaubsensor SDS011, welcher einfach per USB angeschlossen wird. Er kostet bei Amazon so zwischen 30 und 40 Euro, dafür wird er aus Deutschland geliefert und ist schnell da. Wer für dieses Projekt Geduld hat, bekommt den Sensor aber auch für unter 20 Euro aus China, zum Beispiel über AliExpress - nur, dass es dann auch mal drei Wochen dauern kann, bis das Paket ankommt

Jedoch ist das Ergebnis noch nicht für den Menschen interpretierbar und bedarf noch ein paar Umwandlungen des Bytecodes. Im Internet bin ich auf folgendes Script gestoßen, welches mir die gewünschsten Werte in zwei unterschiedliche Dateien schreibt:
#!/bin/bash
stty -F /dev/ttyUSB0 9600 raw
INPUT=$(od --endian=big -x -N10 < /dev/ttyUSB0|head -n 1|cut -f2-10 -d" ");
FIRST4BYTES=$(echo $INPUT|cut -b1-4);
if [ "$FIRST4BYTES" = "aac0" ]; then
echo "check for correct intro characters: ok"
else
echo "incorrect sequence, exiting"
exit;
fi
PPM25LOW=$(echo $INPUT|cut -f2 -d " "|cut -b1-2);
PPM25HIGH=$(echo $INPUT|cut -f2 -d " "|cut -b3-4);
PPM10LOW=$(echo $INPUT|cut -f3 -d " "|cut -b1-2);
PPM10HIGH=$(echo $INPUT|cut -f3 -d " "|cut -b3-4);
PPM25LOWDEC=$( echo $((0x$PPM25LOW)) );
PPM25HIGHDEC=$( echo $((0x$PPM25HIGH)) );
PPM10LOWDEC=$( echo $((0x$PPM10LOW)) );
PPM10HIGHDEC=$( echo $((0x$PPM10HIGH)) );
PPM25=$(echo "scale=1;( ( ( $PPM25HIGHDEC * 256 ) + $PPM25LOWDEC ) / 10 ) " | bc -l );
PPM10=$(echo "scale=1;( ( ( $PPM10HIGHDEC * 256 ) + $PPM10LOWDEC ) / 10 ) " | bc -l );
echo $PPM25 >> ./ppm25.dat
echo $PPM10 >> ./ppm10.dat
Btw: Hier steigt prism wohl aus, die vorletzten Zeilen sind dem JavaScript-Parser für Syntax-Highligthing wohl leider etwas zu komplex - schade!Jedenfalls befinden sich die Ergebnisse nun in zwei Dateien, die sich jedoch noch auf dem "falschen" Raspberry Pi befinden. Der Sensor ist im Garten angebracht und ist aus Sicherheitsgründen nicht mit dem Internet verbunden - diesen Zugang habe ich durch den Router blockiert. Stattdessen "holt" sich ein anderer Raspberry Pi in meinem Netzwerk diese beiden Dateien regelmäßig ab und stellt sie somit einerseits meiner Wetteransicht zur Verfügung, andererseits werden die Werte dann an luftdaten.info geschickt:
#!/bin/sh
ppm10=`cat ./ppm10.dat`
ppm25=`cat ./ppm25.dat`
curl -s -H "X-Pin: 1" -H "X-SENSOR: raspi-0000000012345678" -H "Content-Type: application/json" -X POST -d '{"software_version": "NRZ-2016-047", "sensordatavalues":[{"value_type":"P1","value":"'${ppm10}'"},{"value_type":"P2","value":"'${ppm25}'"}]}' http://api.luftdaten.info/v1/push-sensor-data/
[FOLGT: Anleitung zum Anschluss]
[FOLGT: Aufruf aus der Konsole]
[FOLGT: Erklärung zu luftdaten.info]
http://deutschland.maps.luftdaten.info/#13/51.0601/6.9533