Der Sketch für die WeatherStation füllt das ROM des Arduino fast vollständig. Es muss an jedem Byte gespart werden. Wird der Sketch vergrößert, funktioniert das Programm nicht mehr. Im Folgenden wird der Sketch Version 2.00 näher beschrieben. Das Programm läuft auf der WeatherStation-Hardware Version 1.00 (seit 2012 unverändert).
IDE 1.05
Zur Entwicklung wurde die die Entwicklungsumgebung IDE1.05 benutzt. Höhere Versionen können ebenfalls verwendet werden.
Verwendete Arduino-Bibliotheken
Folgende Bibliotheken kommen zum Einsatz:
Library | Quelle | Zweck |
SPI.h | Arduino-IDE | SPI-Schnittstelle für LAN |
Ethernet.h | Arduino-IDE | LAN-Verbindung |
SoftwareSerial.h | Arduino-IDE | Serielle Verbindung zu FS20WUE |
Wire.h | Arduino-IDE | I²C-Bus für Barometer |
Beschreibung der Sketch-Funktionen
Das Programm sammelt laufend die Messwerte aller Sensoren und speichert sie in Variablen. Jede Minute (einstellbar im Sketch) werden die Messwerte per HTTP an den OpenHAB Webserver übermittelt. Die WeatherStation wird über LAN/WLAN mit dem Hausnetzwerk verbunden. Die WeatherStation kann ihre IP_Adresse über eine statische Konfiguration oder DHCP erhalten. Die statische Konfiguration wird empfohlen, da der Sketch dann nach dem Kompilieren kleiner ist. Nach dem Einschalten der WeatherStation verbindet sich diese mit dem LAN und startet dann den Messablauf. Die Übermittlung der ersten Messwerte beginnt nach Ablauf der Intervallzeit (Default = 1 Minute). Ist die WeatherStation per USB an den PC angeschlossen, gibt sie auf der IDE-Konsole laufend Statusmeldungen aus, welche sinnvoll fürs Debugging verwendet werden können.
Datenübermittlung zum OpenHAB-Server
Der Arduino Sketch verwendet das HTTP-Protokoll zur Datenübermittlung. Dabei wird ein GET-Request an den OpenHAB-Webserver übermittelt:
http://10.0.0.10:8080/CMD?WS_01_LDruck=1022.13
In diesem Beispiel hat der OpenHAB-Server die feste Ip-Adresse 10.0.0.10 und verwendet den Port 8080 (Standard). CMD ist das Verarbeitungsskript für externe Daten. Hier wird das Item WS_01_LDruck mit einem Wert von 1022.13 hPa übermittelt - der Luftdruckwert des BMP085-Sensors. Achtung: Trennzeichen für den Nachkommanteil ist der "Punkt", nicht das "Komma".
OpenHAB erfordert, dass immer nur ein Messwert pro Aufruf übermittelt wird. Um alle WeatherStation-Werte zu übermitteln, wird eine Sequenz von HTTP-Aufrufen erzeugt.
Übermittelte Daten
Zu jedem Übermittlungszeitpunkt werden die Messdaten an OpenHAB übermittelt, welche vorliegen. Findet die WeatherStation keine Werte für die Sensoren S300TH, werden die Werte auch nicht übermittelt. Da der Wettermast KS300 nur alle drei Minuten seine Werte aktualisiert, kann es nach dem Einschalten ein paar Minuten dauern bis Messwerte übermittelt werden.
Diese Parameter sind verfügbar:
Sensor- Adresse |
Sensor- Typ |
Wert | Typ | OpenHAB- Parameter |
Wertebereich |
0 | S300TH | Temperatur Feuchtigkeit |
Float | WS_01_Temp0 WS_01_Hum0 |
-40.0 bis +80.0 °C 0.0 bis 99.0 %rH |
1 | S300TH | Temperatur Feuchtigkeit |
Float | WS_01_Temp1 WS_01_Hum1 |
-40.0 bis +80.0 °C 0.0 bis 99.0 %rH |
2 | S300TH | Temperatur Feuchtigkeit |
Float | WS_01_Temp2 WS_01_Hum2 |
-40.0 bis +80.0 °C 0.0 bis 99.0 %rH |
3 | S300TH | Temperatur Feuchtigkeit |
Float | WS_01_Temp3 WS_01_Hum3 |
-40.0 bis +80.0 °C 0.0 bis 99.0 %rH |
4 | S300TH | Temperatur Feuchtigkeit |
Float | WS_01_Temp4 WS_01_Hum4 |
-40.0 bis +80.0 °C 0.0 bis 99.0 %rH |
5 | S300TH | Temperatur Feuchtigkeit |
Float | WS_01_Temp5 WS_01_Hum5 |
-40.0 bis +80.0 °C 0.0 bis 99.0 %rH |
6 | S300TH | Temperatur Feuchtigkeit |
Float | WS_01_Temp6 WS_01_Hum6 |
-40.0 bis +80.0 °C 0.0 bis 99.0 %rH |
7 | S300TH | Temperatur Feuchtigkeit |
Float | WS_01_Temp7 WS_01_Hum7 |
-40.0 bis +80.0 °C 0.0 bis 99.0 %rH |
--- | KS300 |
Temperatur |
Float | WS_01_Temp WS_01_Hum WS_01_WSpeed WS_01_RAmount WS_01_RFlag |
-40.0 bis +80.0 °C 0.0 bis 99.0 %rH 0.0 bis 200.0 km/h 0.0 bis 200.0 l/m² 0.0 / 1.0: Kein Regen/Regen |
--- | BMP085 |
Temperatur BMP085 |
Float | WS_01_LDTemp WS_01_LDruck |
0.0 bis 80.0 C 0.0 bis 1200.0 hPa |
--- | LDR03 | Spannung am LDR | Float | WS_01_LumDigits | 0.0 bis 1023.0 |
--- | KTY81 | Spannung am KTY | Float | WS_01_KTY | 0.0 bis 1023.0 |
--- | Arduino | Heizung WeatherStation Heizung Regenmesser |
Float | WS_01_HtWS WS_01_HtRM |
0.0 bis 4.0W 0.0 bis 9.6 W |
Umrechnung von gelieferten Messwerten in OpenHAB
Einige Messwerte werden von der WeatherStation ein einem nicht direkt lesbarem Format geliefert. Sie werden nicht innerhalb des Arduino-Sketches umgerechnet, weil:
- Das Programm bereits sehr groß ist
- Die Verarbeitungsgeschwindigkeit des Arduino zu gering ist
- Die Fließkommagenauigkeit des Arduino zu gering ist (Exponentialfunktionen usw.)
Diese Umrechnung erfolgt innerhalb von OpenHAB.
Helligkeit
Der Messwert WS_01_LumDigits wird erst in OpenHAB zu Lux-Werten umgewandelt.
Formel hinterlegen!
Temperatur Regenmesser
Der Messwert WS_01_KTY werden erst in OpenHAB zu einem Temperaturwert umgewandelt.
Formel hinterlegen!
Luftdruck
Der von der WeatherStation ausgegebene Luftdruck entspricht der Höhe des Standortes der Weatherstation (in meinem Fall 492m). Er muß innerhalb von OpenHAB auf Meereshöhe umgerechnet werden, damit er mit den Wetterprognosen im Radio/Internet vergleichbar ist. Hierzu muß die Barometrische Höhenformel verwendet werden:
- p(H) = P0 * exp(-H/7990m)
- Corr = exp(-H/7990m)
- p(H) = P0 * Corr
H ist die Höhe der Weatherstation über Meeresspiegel in Meter (per Google einfach zu finden)
p(H) ist der Luftdruck auf der Höhe der WeatherStation in hPa
p ist der Luftdruck in Meereshöhe in hPa
Für "H" setzt bitte die Höhe Eures Wohnortes ein. Die Exponentialgleichung ergibt aufgelöst einen festen Faktor. Bei meiner Höhe von 492m errechnet sich der Faktor "Corr" zu 0,940280568. Jetzt stellt man die Gleichung um:
P0 = p(H) / Corr
Meldet die WeatherStation auf 492m Höhe einen Luftdruck von 963,4 hPa, dann ergibt dies nach Formel einen Wert von 1024,6 hPa auf Meereshöhe. Der Korrekturfaktor muß von Euch nur einmal berechnet und in OpenHAB eingegeben werden.
Regenmenge
Die WeatherStation sendet den aktuellen Regen zwischen zwei Messpunkten (1 min. Abstand). Natürlich interessiert darüber hinaus die Regenmenge pro Tag, Monat und Jahr. Diese Mengen werden mit einer OpenHAB-Rule aus dem aktuellen Niederschlag gebildet.