[google-translator]
Update 14.11.2014: In der Beschreibung fehlte die Angabe der weiteren Systemvariablen homeduino_fehler als Logikwert
Zur Einstimmung auf das Thema:
Da Komponenten mit I2C-Bus sehr vielfältig im Markt verfügbar sind, eröffnet diese Vorgehensweise auch für ganz andere Meßaufgaben einen interessanten Lösungsweg.
-ein Ethernet W5100-Shield ( ebenfalls preiswert für etwa 6€)
– ein Barometersensor BMP180_Modul ( <2€ )
– ein 4×20 LCD-Display mit I2C ( ca. 3,50€ „Serial Interface2004 20X4 Character LCD Modul“ )
– optional: ein IO-Shield (kann zukünftig von mir bezogen werden, bitte PN)
– die Homeduino-Software
2.) Das Display und den Sensor schließt man über den I2C-Bus an und verbindet die verwendeten Module zusätzlich mit der 5V-Spannungsversorgung. Die folgenden Bilder zeigen die Verschaltung:
3.) Systemvariablen in der Homematic anlegen:
– barometer_druckNN als Zahl mit Dimension mb
– barometer_temp als Zahl mit Dimension °C
– barometer_tendenz als Werte: bleibend; fallend; steigend;
– barometer_druckNN_alt als Zahl mit Dimension mb
– homeduino_fehler als Logikwert
Das erste HM-Skript fragt den Barometersensor ab. In diesem Skript ist in der url noch die Höhe des eigenen Standortes einzutragen, Bei mir sind das 229m.
[codesyntax lang=“text“ title=“HM-Skript“]
var url = "192.168.178.58/?barometer:229:"; !Stand 23.08.14### !Messung mit dem Barometersensor BMP180############## !zuerst die Barometer-Abfrage mit system.Exec string stdout; string stderr; system.Exec("wget -q -O - '"#url#"'", &stdout, &stderr); string arduino_xml = stdout; integer laenge = arduino_xml.Length(); boolean status = 0; if (laenge == 0) {dom.GetObject("homeduino_fehler").State(true);quit;} !beenden , wenn laenge =0 dom.GetObject("homeduino_fehler").State(false); !Luftdruck in Systemvariable speichern integer wort_position = arduino_xml.Find("bei NN"); string daten = arduino_xml.Substr(wort_position+10,8); real druck = daten.ToFloat(); dom.GetObject("barometer_druckNN").State(druck); !Temperatur in Systemvariable speichern integer wort_position = arduino_xml.Find("tur : "); daten = arduino_xml.Substr(wort_position+9,5); real temp = daten.ToFloat(); dom.GetObject("barometer_temp").State(temp); !Tendenz berechnen und in Systemvariable speichern real druck_alt = dom.GetObject("barometer_druckNN_alt").State(); dom.GetObject("barometer_druckNN_alt").State(druck); !umspeichern neu >> alt real druck_diff= druck - druck_alt; integer tendenz = 0; string ten_denz = "gleichbleibend"; if (druck_diff > 0.1) {tendenz =2 ;ten_denz = "steigend";} if (druck_diff < -0.1) {tendenz =1 ;ten_denz ="fallend";} dom.GetObject("barometer_tendenz").State(tendenz);
[/codesyntax]
Das zweite HM-Skript stellt die Messwerte auf dem LCD-Display dar:
[codesyntax lang=“text“]
!LCD-Display , Stand 24.08.14 var url = "192.168.178.58/?display:"; !################################## real druck = dom.GetObject("barometer_druckNN").State(); string Druck =druck.ToString(); Druck = Druck.Substr(0,7); !zwei Nachkommastellen real temp = dom.GetObject("barometer_temp").State(); string Temp =temp.ToString(); Temp = Temp.Substr(0,4); !nur eine Nachkommastelle integer tendenz = dom.GetObject("barometer_tendenz").State(); string zeichen = "="; if (tendenz == 1) {zeichen = "(";} if (tendenz == 2) {zeichen = ")";} integer druck_position = (druck - 981.0)/2.0; if (druck_position < 0) {druck_position = 0; } if (druck_position >19) {druck_position = 19;} string zeile_1 = "Druck N.N. " + Druck +"mb "; zeile_1 = zeile_1.Substr(0,20); string zeile_2 = "____________________"; string zeile_20 = zeile_2.Substr(0,druck_position); string zeile_21 = zeile_2.Substr(druck_position+1,19 - druck_position); zeile_2 = zeile_20 + zeichen + zeile_21; string gesamt = url + "0:0:" + "Homeduino Barometer" + zeile_1 + zeile_2; string stdout; string stderr; system.Exec("wget -q -O - '"#gesamt#"'", &stdout, &stderr); string zeile_3 = "Temperatur " + Temp +" grdC "; zeile_3 = zeile_3.Substr(0,20); string gesamt = url + "0:3:" + zeile_3; string stdout; string stderr; system.Exec("wget -q -O - '"#gesamt#"'", &stdout, &stderr);
[/codesyntax]
Als Ergebnis hat man eine regelmässig aktualisierte Systemvariable bzw. den Messwert des Luftdruckes zurückgerechnet auf Normal-Null (N.N.), also Meereshöhe. Der Homeduino liefert zwar auch den absoluten Luftdruck, allerdings hat der nichts mit den Wetterdienst-Daten zu tun und wird deshalb hier nicht verwendet. In der dritten Zeile wird der Luftdruck quasi als Bargraph dargestellt . Je nach Tendenz des Luftdrucks wird ein „>“ oder „<“ oder „=“Zeichen in einer dem Luftdruckwert entsprechenden Zeilenposition angezeigt.
Unabhängig von dieser Darstellung kann man auch mit einem Browser das Daten-Telegramm vom Homeduino ansehen:
Anmerkungen zum Barometersensor BMP180: Der verwendete Sensor BMP180 ist der Nachfolgesensor des BMP085. Der Sensor selbst hat normalerweise eine Versorgungsspannung von 3,3V . Aber auf dem hier verwendeten Modul ist ein Spannungsregler integriert, so dass ein Betrieb mit 5V möglich ist. Also unbedingt auf den folgenden Bildern den Modultyp vergleichen. Ansonsten kauft man die 3V-Version und beschädigt so das Modul sofort bei Inbetriebnahme!
Mehr zu diesem tollen Sensor hier : http://www.bosch-presse.de/presseforum/details.htm?txtID=5192
Diese Bauanleitung wird noch erweitert zu einer kompletten Wetterstation. Bald mehr dazu!
Haftungs- und Sicherheitshinweise
Beim Nachbau müssen natürlich alle wichtigen einschlägigen Sicherheitsvorschriften für den Umgang mit gefährlichen Spannungen eingehalten werden. Fundierte theoretische und praktische Fachkenntnisse der Elektrotechnik und für den Umgang mit gefährlichen Spannungen sind unverzichtbar!!
Durch eine unsachgemäße Installation gefährden Sie ihr Leben und das Leben ihrer Mitmenschen! Darüberhinaus riskieren Sie erhebliche Sachschäden , welche durch Brand etc. hervorgerufen werden können ! Für alle Personen- und Sachschäden durch falsche Installation etc. ist nicht der Hersteller sondern nur der Betreiber verantwortlich.
Ich verweise hier unbedingt auf die „Sicherheitshinweise und Haftungsausschluss„-Seite dieses Blogs.