Feinstaubalarm oder wie gut ist die Luft? geschrieben am 05.02.2017
Die Tage habe ich mich dem Feinstaubprojekt/luftdaten.info aus Stuttgart angeschlossen.
Dort möchten sie die öffentlichen Messstellen mit eigenen Sensoren unterstützen.
Was wird gemessen?
Der Sensor misst zwei Partikelgrößen parallel:
- PM10: inhalierbarer Feinstaub mit 10µm Durchmesser
- PM2.5: lungengängiger (alveolengängiger) Feinstaub mit im Mittel 2,5 µm Durchmesser
Weiteres kann man in der wikipedia lesen.
Hardware & Investition
Das Projekt basiert auf einem NodeMcu mit ESP8266 Chip und einem SDS011 Sensor.
Meine Einkaufsliste sieht wie folgt aus:
2x Rohrbogen DN75, 87° | 2,58€ |
NodeMcu V3 Lua WIFI ESP8266 | 2,94€ |
Nova PM sensor SDS011 | 21,69€ |
5m USB-micro | 7,99€ |
DHT22 | ca. 1-2€ |
Stück Schlauch durchsichtig 6mm | aus der Restekiste |
Für mich lagen die Kosten bei ca. 37 Euro. Den SDS011 und NodeMcu haben ich in China bestellt, die Rohrbogen aus dem Baumarkt geholt und den Rest in Deutschland bestellt.
Der Schlauch wird am Sensor angeschlossen und ist so lang, dass er etwas aus den Rohstücken hervor guckt. Damit ist gewährleistet das frische Luft angesaugt wird.
Siehe auch: http://luftdaten.info/feinstaubsensor-bauen/.
Firmware
Die Software kann mit dem Arduino auf die ESP8266 kompiliert werden. Das Projekt ist auf github.com/opendata-stuttgart/sensors-software... zu finden. Dort gibt es auch alle weiteren Erklärungen.
Anbringung des Sensors
Ich habe den Sensor hinter der Balkonabsperrung aufgehangen. Durch die offene Bauweise kommt dort genug Luft vorbei.
Funktion
Das Programm auf dem ESP8266 misst einmal in der Sekunde die Staubbelastung und sendet die Daten an das Projekt. Es gibt aber auch die Möglichkeit die Daten selber zu nutzen.
rp1 ist hier mein lokaler Server und die URL des Empfängerscript ist "io/feindata.php".
Software
Um die Daten selber zu nutzen habe ich auf meinem Raspi ein php-Script erstellt, welches die Daten empfängt und wegspeichert:
php<?php
$logURL="feinstaub.log";
$logToOrdner="feinstaublog/".date('Ymd').".log";
$itime= time();//timestamp Januar 1 1970 00:00:00 GMT
$datum= date('Y-m-d');
$zeit= date('G:i:s');
$ipAddress=$_SERVER['REMOTE_ADDR'];
$daten = file_get_contents('php://input');
if(isset($daten) && !empty($daten)){//wenn Daten leer, nicht speichern
//create oder add; aktuelles Messwert
$handle=fopen($logURL,'w');
fwrite ($handle, "{" );
fwrite ($handle, '"time":'.$itime.','.chr(10));
fwrite ($handle, '"datum":"'.$datum.'",'.chr(10));
fwrite ($handle, '"zeit":"'.$zeit.'",'.chr(10));
fwrite ($handle, '"ipAddress":"'.$ipAddress.'",'.chr(10));
fwrite ($handle, '"daten":'.$daten.chr(10) );
fwrite ($handle, "}".chr(10) );
fclose ($handle);
}
if(isset($daten) && !empty($daten)){//wenn Daten leer, nicht speichern
//als Datensätze in Ordner,
$add=file_exists($logToOrdner);
$handle=fopen($logToOrdner,'a');
if($add)fwrite ($handle, "," );
fwrite ($handle, "{" );
fwrite ($handle, '"time":'.$itime.',');
fwrite ($handle, '"datum":"'.$datum.'",');
fwrite ($handle, '"zeit":"'.$zeit.'",');
fwrite ($handle, '"daten":'.$daten );
fwrite ($handle, "}".chr(10) );
fclose ($handle);
}
?>
Der Knackpunkt an der Geschichte war, das ich die Daten nicht per $_POST empfangen konnte - es läuft hier über file_get_contents.
Ein Datensatz vom Sensor sieht so aus:
JavaScript{
"software_version": "NRZ-2016-062",
"sensordatavalues":[
{"value_type":"SDS_P1","value":"19.75"},
{"value_type":"SDS_P2","value":"6.52"},
{"value_type":"temperature","value":"5.20"},
{"value_type":"humidity","value":"81.90"},
{"value_type":"samples","value":"339826"},
{"value_type":"min_micro","value":"160"},
{"value_type":"max_micro","value":"26707"},
{"value_type":"signal","value":"-61 dBm"}
]
}
Ich habe neben dem Feinstaubsensor (Nova PM sensor SDS011) noch ein DHT22 Temperatur und Feuchtigkeitssensor angebaut.
Auswertung
Nun läuft der Sensor seit ca. einem Monat. Ich habe mir mit etwas Javascript die Daten angezeigt:
Die rote 50µg/m³ Linie markiert den Punkt über dem die Belastung nicht gehen sollte (siehe auch feinstaub-stuttgart.info/fragen-antworten).
Was zu beobachten ist, das wenn feuchtes Regenwetter ist (ab 20.2.2017) die Kurven (lila-PM2.5 & braun-PM10) fallen. Die Luft wurde durch den Regen schön gereinigt.
Zwischen dem 13.2.2017 und 17.2.2917 war es eher trocken und die Linien waren oberhalb der roten Markierung.
Interessanterweise stiegen die Messwerte am Wochenende an und fielen montags wieder ab, ich hätte gedacht das es durch den Berufsverkehr eher am Anfang der Woche schlimmer wird.
Meine Scripte sind unter github/polygontwist/feinstaub-log-view zu finden.
offizielle Auswertung
Vom Projekt gibt es auch eine Karte wo alle Sensoren mit aktuellen Werten angezeigt werden.
Hier ein Screenshot vom 26.2.2017:
Wie man sieht haben sich auch Leute außerhalb Deutschland gefunden, die das Projekt nutzen.
Meiner ist übrigens zur Zeit der nördlichste Punkt, ganz oben auf der Karte.
Fazit
Der Aufbau ist sehr einfach, die Hardware muss nur zusammen gesteckt werden. Die Lieferung aus China dauert wie gewohnt ein paar Tage (20-30). Die Software lässt sich einfach aufspielen.
Für das private Vergnügen lassen sich die Daten auch nutzen um Kurvendiagramme zu erstellen.
Weitere Möglichkeiten
Wer mag, kann einen Key auf opensensemap.org generieren und ihn in der Firmware eintragen. Damit ist der Sensor auch auf opensensemap zu sehen und die Daten stehen jedermann zur Verfügung.
Update 15.10.2017
Ich hatte ja noch eine DHT22 eingebaut, aber nach einiger Zeit lagen die Werte der Luftfeuchte nur noch bei 99.9%. Deshalb habe ich heute einen HTU21D Sensor angebaut. Mal sehen wie lange er stabile Werte liefert.
Im Bild ist die Testschaltung zu sehen. Der Sensor wurde später an D3 und D4 am Projektboard angeschlossen. Dazu habe ich die Kabel am Sensor noch angelötet.
aktuelle Werte
Verlauf über die Zeit
- Hellblau: Luftfeuchte (0..99.9%)
- Dunkelrot: PM2.5 (0..250µg/m³)
- Orange/Braun: PM10 (0..250µg/m³)
- Grün: Temperatur (-20..+40°C)
- NRZ: Zeitpunkt der neuen Firmware (per autoupdate)
#1 W Manns schrieb am 20.05.2017 um 18:56
Vielen Dank für die gute Beschreibung, die mir sehr geholfen hat: ich habe nämlich zwei Feinstaubsensoren, deren Werte ich vergleichen möchte - bevor ich die Sensoren zB an der Straße messen lasse und die Werte ins Internet gehen. Dafür war die Beschreibung des Datensatzes und das php-Script wirklich hilfreich. Ich kenne mich nun mit dem Ajax und Javascript Sachen gar nicht aus und wüßte gerne, wie die obige Grafik erstellt werden kann und wie man die JSON Daten mit "etwas Javascript" so schön darstellen kann. Wär das möglich? Danke jedenfalls nochmal!