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.

In Pocket speichern vorlesen Druckansicht 2 Kommentare lesen
Fritzing-Zeichnung: Arduino und SHT15-Sensor.
Lesezeit: 4 Min.
Von
  • Jan Wirwahn
Inhaltsverzeichnis

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

  1. VCC zu 5V
  2. DATA zu Pin 6
  3. SCK zu Pin 7
  4. GND zu Arduino GND

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();

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.

Manuelle Konfiguration eines Sensors auf der OpenSenseMap. In unserem Beispiel messen wir Temperatur in °C und Luftfeuchtigkeit in %, beides mit dem SHT15.

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.

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)