Wettermessgerät für OpenSenseMap einrichten
Auf der OpenSenseMap (OSeM) soll ein flächendeckendes Sensornetzwerk für alle möglichen Messdaten entstehen. Die gesammelten Daten werden dort unter Open-Source Lizenzen veröffentlicht und können von Wissenschaftlern oder interessierten Bürgern frei heruntergeladen werden.
![Fritzing-Zeichnung: Arduino und SHT15-Sensor.](https://heise.cloudimg.io/width/610/q85.png-lossy-85.webp-lossy-85.foil1/_www-heise-de_/imgs/18/1/5/7/9/4/0/5/Arduino-SHT15-7dba445146d564a2.png)
- Jan Wirwahn
In dieser Anleitung wird beispielhaft die Anbindung eines SHT15-Sensors in das OpenSenseMap-Netzwerk beschrieben. Für die Datenverarbeitung bzw. -übertragung nutzen wir ein Arduino Uno mit Arduino Ethernet Shield. Die REST-Schnittstelle bietet aber auch jeder anderen programmierbaren und mit dem Internet verbundenen Messstation die Möglichkeit, Messungen auf der OSeM zu veröffentlichen und zu teilen.
Komponenten in der Übersicht
- Arduino Uno R3
- Arduino Ethernet Shield R3
- Sparkfun SHT15 Breakout
SHT15 anschließen
- VCC zu 5V
- DATA zu Pin 6
- SCK zu Pin 7
- GND zu Arduino GND
SHT1x-Bibliothek
Für Sensoren der SHT1x-Serie von Sensirion gibt es bereits eine einfache Arduino-Schnittstelle. Ladet die Bibliothek von Github herunter und entpackt sie in euren Arduino/libraries-Ordner. Importiert die Bibliothek wie gehabt in eurem Arduino-Sketch, und definiert zusätzlich den Daten- und Taktpin entsprechend der Verkabelung in Bild 1. Danach könnt ihr eine Verbindung zum Sensor herstellen:
#include<sht1x.h>
#define dataPin 6
#define clockPin 7
SHT1x sht1x(dataPin, clockPin);
Nun lassen sich über zwei Funktionen die Temperatur in Grad Celsius, sowie die relative Luftfeuchte in Prozent als Gleitkommazahl abspeichern:
float temp = sht1x.readTemperatureC();
float humi = sht1x.readHumidity();
Manuelle Registrierung
Um einen Sensor mit der OSeM zu verbinden, müsst ihr ihn zuerst dort registrieren. Falls ihr dabei keinen der SenseBox-Bausätze nutzt, müsst ihr in Schritt 4 der Registrierung die manuelle Konfiguration auswählen (Bild 2). Dort wird für jedes gemessene Phänomen ein neuer Sensor angelegt.
OpenSenseMap API
Eine REST-Schnittstelle regelt den Zugang zur Datenbank auf dem OSeM-Server. Intern ist jede Messstation mit ihren Sensoren (bzw. Phänomenen) verknüpft, die bei der Registrierung angegeben wurden. In unserem Falle haben wir eine SenseBox-ID für die Station, sowie jeweils eine Sensor-ID für Temperatur- und Luftfeuchtigkeitsmessungen bei der Registrierung generiert. Die IDs werden euch nach der Registrierung per Mail zugeschickt. Jede Messung wird dann über das HTT-Protokoll mit der POST-Operation an den Server gesendet. Dazu muss eine eindeutige URI angegeben werden, die wie folgt aufgebaut ist:
http://opensensemap.org:8000/SenseBoxID/SensorID
Jede Messung wird einzeln im Json-Format über das value-Attribut an den Server gesendet. Nehmen wir an, wir wollen von unserer Station (ID 1234) einen Messwert des Thermometers (ID abcd) von 22,5 an den OSeM-Server schicken. Die vollständige HTTP-POST-Operation dazu sieht folgendermaßen aus:
POST /boxes/1234/abcd HTTP/1.1
Host: www.opensensemap.org
Content-Type: application/json
Connection: close
Content-Length: 14
{"value":22.5}
Achtung: Der Zeilenumbruch (\n) in Zeile 6 trennt die HTTP-Header-Information von den Daten, die gesendet werden sollen. Er ist also ist notwendig, um die Operation korrekt auszuführen.
Arduino OSeM-Client
Nach der Registrierung wird ein Arduino-Sketch generiert, den ihr als Anhang in einer Bestätigungsmail zugeschickt bekommt. Ihr müsst diesen Sketch noch anpassen, indem ihr die SHT1x-Bibliothek einfügt, sowie die benötigen Variablen und eine Sensorinstanz:
#include <SPI.h>
#include <Ethernet.h>
#include<sht1x.h>
#define dataPin 6
#define clockPin 7
SHT1x sht1x(dataPin, clockPin);
//SenseBox ID
#define senseBoxID "1234"
//Sensor IDs
#define temperatureSensorID "abcd"
#define humiditySensorID "efgh"
Innerhalb der if
-Anweisung in der loop
-Funktion müsst ihr nacheinander die Sensoren auslesen und mit der Hilfsfunktion postFloatValue()
hochladen.
void loop()
{
//Upload der Daten mit konstanter Frequenz
if (millis() - oldTime >= postInterval)
{
oldTime = millis();
temperature = sht1x.readTemperatureC();
postFloatValue(temperature, 1, temperatureSensorID);
humidity = sht1x.readHumidity();
postFloatValue(humidity, 0, humiditySensorID);
}
}
Falls ihr ein Ethernet-Modul nutzt, das nicht mit der Ethernet-Bibliothek kompatibel ist, müsst ihr den Sketch entsprechend anpassen. Solltet ihr weitere Fragen dazu haben, könnt ihr euch direkt an unseren Support unter der Adresse support@sensebox.de wenden.
- Wie die Sensebox funktioniert und wie ein Exemplar auf den höchsten Gipfel Deutschlands gelangte, steht in unserer Reportage Arduinos erklimmen die Zugspitze in Make 4/2015 ab Seite 106.
(phs)