Homeduino mit I2C-Barometer-Sensor und LCD-Display für die Homematic

,
Homeduino mit I2C-Barometer-Sensor und LCD-Display für die Homematic
Print Friendly, PDF & Email

[google-translator]Update 14.11.2014: In der Beschreibung fehlte die Angabe der weiteren Systemvariablen homeduino_fehler  als Logikwert

Zur Einstimmung auf das Thema:

Die Welt des Arduinos bietet viele Möglichkeiten, mit preiswerten Sensoren und Modulen sehr hochwertige Steuer- und Messgeräte darzustellen. Ein besonders für die Hausautomation mit der Homematic geeigneter Ansatz ist der Homeduino. Details hierzu findet man hier:
Auf Basis eines Arduino MEGA mit einem Ethernet Shield W5100 ist ein sehr preisgünstiges Gerät darstellbar, das über Ethernet (Wired) oder auch drahtlos über WLAN direkt von der Homematic-CCU ansteuerbar ist. Die Gestaltung der Homeduino-Software ist so universell, daß eine Verwendung des Gerätes auch mit Raspberry und anderen Computern mittels einfacher Skripte leicht möglich ist!
So kann man I2C-Module mit der Homematic über den Homeduino steuern:
Hier wird beschrieben, wie man relativ einfach ein 4-zeiliges LCD-Display und einen Barometersensor über einen sog I2C-Bus ansteuert. Damit wird in diesem Beispiel ein hochwertiges elektronisches Barometer dargestellt.
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.
Was sind die „Zutaten“:
– ein Arduino-MEGA 2650 ( bei ebay in China schon für 12€ zu haben)
-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
Das Kochrezept:
1.)  Man steckt den MEGA und das Ethernet-Shield zusammen, spielt per USB die Homeduino 1.0 oder 2.0 -Software auf und schließt das Ganze am Router an oder stellt die Verbindung über WLAN her. Wie das im Einzelnen geht ist unter dem o.a. Link beschrieben.

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:

Folie14
Folie15
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

 

4.)  WebUI-Programm mit Skripten für die Datenabfrage und für die Darstellung auf dem Display erstellen. Abtastintervall bei mir : alle 30min
barometer10
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.
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);

Das zweite HM-Skript stellt die Messwerte auf dem LCD-Display dar:

HM-Skript   
!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);

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.

barometer9

 

Unabhängig von dieser Darstellung kann man auch mit einem Browser das Daten-Telegramm vom Homeduino ansehen:
barometer6
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

barometer1
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.