IoT Heizungssteuerung 1 (LCD Panel)

Für eine IoT Steuerung gibt es fertige Angebote zu Hauf. Viel mehr Spaß macht es, wenn man das alles selbst entwickelt und so auch volle Kontrolle über seine Daten behält.

Vor einiger Zeit ist meine Heizungssteuerung wegen Überspannung im Stromnetz über den Jordan gegangen - ein alter Analogrechner, einfach durchgeschmort. Eberhard, der genialische Heizungsmonteur, konnte die Heizung zwar wieder in Gang bringen aber nur mit einer Regelung über den Kesselthermostaten. Die Heizung läuft vor sich hin und produziert Wärme, egal, ob diese gebraucht wird oder nicht.

Da die Heizungsanlage sowieso jenseits des "End of Life" ist, habe ich zur Überbrückung, bis die neue Anlage kommt, eine Raspberry Pi Steuerung entwickelt, welche die Umlaufpumpe über einen Funkschalter nach Bedarf ein- und ausschaltet. Features sind Einstellung und Statusanzeige über ein LCD Panel, Nachtabsenkung und Fernsteuerung über Internet - neudeutsch IoT oder Internet of Things.

Diese Anleitung könnt ihr modifiziert für alle möglichen anderen Einsatzzwecke verwenden z.B. Klimaanlage, Lüftung, Rollosteuerung etc., das Prinzip ist meist dasselbe.

Voraussetzungen: Neben den üblichen Voraussetzungen in Bezug auf Programmier- und Linux Kenntnisse auf leicht fortgeschrittenem Niveau, etwas handwerklichem Geschick mit dem Lötkolben und Englischkenntnissen für die Adafruit Anleitungen braucht ihr:

  • einen Raspberry Pi - egal welches Modell, ein uralter Raspberry 1 Modell A reicht auch.
  • Ein aktuelles Raspbian Betriebssystem - ob Wheezy oder Jessie ist egal.
  • einen BMP 180 oder BMP 085 Temperatur- und Luftdrucksensor (z.B. bei Watterott.com), es geht aber auch ein beliebiger anderer Temperatursensor, wenn ihr wisst, wie der angesteuert wird. Die Luftdruckmessung wird hier nicht benötigt, man könnte die Funktion aber für eine kleine Wetterstation verwenden. Der BMP180 hat den Vorteil Temperaturen auf 0,1 °C genau messen zu können. Einfachere Sensoren, z.B. der DHT11 können nur auf ein Grad genau messen.
  • einen 433MHz Sender (gibt es bei Watterott) sowie eine Schaltsteckdose (möglichst von Elro) aus dem Baumarkt , von Amazon oder einem Elektronik Versender.
  • Ein Adafruit RGB 16x2 LCD+Keypad Kit for Raspberry Pi. RGB muss nicht unbedingt sein, ob die Darstellung positiv oder negativ ist, ist auch egal. Ich empfehle euch, das Teil bei Watterott zu kaufen. Da kommt die Ware schnell und günstig aus Deutschland und nicht aus Fernost. Achtung: Etwas Lötarbeit ist erforderlich.
  • optional ein Gehäuse
  • Und... nein, ich habe keinerlei Verbindung zu der Firma Watterott. Reichelt.de oder conrad.de sind z.B. sehr gute Alternativen.

Dieses Instructable baut auf den oben erwähnten Komponenten auf; es spricht aber nichts dagegen, es mit anderen Bauteilen zu versuchen. Dann müsst ihr halt etwas herumprobieren. Der Pi arbeitet "headless" im Terminal Modus via Putty oder einem anderen Terminalprogramm und muss nicht an einen Bildschirm angeschlossen sein.

Adafruit 16x4 LCD Panel
Adafruit 16x4 LCD Panel

Messung, Steuerung und Bedienung

Damit das alles nicht zu schwierig wird gehen wir Schritt für Schritt vor. Als erstes kümmern wir uns um die.

Anzeige im LCD Panel

Für das Panel gibt es eine sehr gut gemachte englische Anleitung bei Adafruit. Nachdem ihr das Panel gemäß Anleitung zusammengelötet habt, solltet ihr zuerst einmal das I2C Interface aktivieren. I2C braucht ihr nachher auch, um das BMP180 Modul anzusprechen.

I2C ist eine Möglichkeit, angeschlossene Peripherie mit nur drei Leitungen anzusteuern, und wird gebraucht um das Adafruit Panel sowie den BMP180 Sensor anzusteuern. Das geschieht über sudo raspi-config . Dort dann die "Advanced Options" auswählen und im nächsten Screen I2C auswählen und im folgenden Bildschirm die Frage "Would you like the ARM I2C interface to be enabled?" mit "JA" beantworten.

Im nächsten Screen mit OK bestätigen und dann auf die Frage "Would you like the I2C kernel module to be loaded by default?" ebenfalls mit "JA" beantworten. Nochmal bestätigen und dann mit "Finish" alles speichern und anschließend neu booten.

Anschließend haltet ihr euch an folgende englischsprachige Anleitung bei Adafruit: https://learn.adafruit.com/adafruit-16x2-character-lcd-plus-keypad-for-raspberry-pi/usage

Zum Testen verwendet ihr am besten das im Zuge der Installation heruntergeladene Testprogramm char_lcd_plate.py das ihr wie üblich mit chmod +x char_lcd_plate.pylauffähig machen müsst.

Nochwas: Ich habe das Teil mit Raspbian Wheezy entwickelt. Das heißt, alle Programme, die den I2C Anschluss oder sonstige GPIO Funktionen des Pi benutzen, müssen mit einem sudo vornedran aufgerufen werden. Mit dem neueren Raspbian Jessie ist das nicht mehr erforderlich.

Anschließend wird der

BMP180 Temperatur- und Lufdrucksensor

angeschlossen. Für den Anfang empfehle ich, das erst einmal auf einem Steckbrett (Breadboad) auszuprobieren. Auch hierfür gibt es eine sehr gut gemachte Anleitung bei Adafruit. Achtet beim Installieren der Software und Treiber darauf, die neueste Library aus dem Abschnitt Using the Adafruit BMP Python Library (Updated) zu verwenden.

Die Pinbelegung ist gerade für Einsteiger etwas verwirrend, weil sie keinem erkennbaren Schema folgt. Eine gute Übersicht findet ihr bei Elinux.org. Hier sind die Pins bei allen verschiedenen Varianten A/B oder A+/B+ und 2B beschrieben.

Die i2C Pinbelegung ist vorgegeben und ist wie folgt:

BMP180 Luftdruck und Temperatursensor
BMP180 Luftdruck und Temperatursensor
  • SDA wird mit Pin 3 verbunden,
  • SCL mit Pin 5,
  • GND mit Pin 6 für Masse,
  • VIN mit Pin 1 - 3,3 V. Auch wenn der Sensor 5 V verträgt solltet ihr bei 3,3 V Betriebsspannnung bleiben

Wir brauchen für später ein kleines Pyhton Skript namens get_temperature.py, das den Temperatursensor anspricht und die Temperatur ausgibt. Den Luftdruck brauchen wir hier nicht.

Wenn alles wie gewünscht funktioniert, könnt ihr den Sensor direkt mit dem LCD Panel verlöten oder per Drahtschlinge drekt auf die GPIO Steckkontakte aufschieben und anschließend das Panel aufstecken.

433 MHz Sender

Die Heizungspumpe wird mit einer handelsüblichen 433 MHz Schaltsteckdose ein- und ausgeschaltet.

433MHz_Sender Der dafür erforderliche Sender hängt am Pi und wird entweder mit den passenden Kontakten auf dem LCD Panel verlötet. Bei mir ist das

  • Pin 17 für 3,3V,
  • Pin 25 für Masse und
  • Pin 26 für GPO 7 - hier könnt ihr auch einen anderen freien Kontakt verwenden und die Anleitung entsprechend verändern
GPIO Kontakte für BMP180 und 433MHz Sender
GPIO Kontakte für BMP180 und 433MHz Sender

Die Ansteuerung des Senders habe ich bereits im Beitrag 433 MHZ Schaltsteckdosen fernsteuern beschrieben. Wenn ihr diese Anleitung befolgt, kann eigentlich nichts schiefgehen.

Nachdem wir die Hardware entsprechend vorbereit haben, geht es jetzt an die Software:

Python Steuer- und Bedienlogik

Das Programm besteht im Wesentlichen aus einer Endlosschleife, in der laufend gecheckt wird, ob eine der Tasten des LCD Panels gedrückt wurde, innerhalb dieser Schleife wird in regelmäßigen Abständen (timeout) die Temperatur gemessen und bei Bedarf die Schaltsteckdose (de-)aktiviert. Nebenbei wird natürlich die Anzeige im LCD Panel aktualisiert. Obwohl das eigentlich keine besonderen Anforderungen an den Prozessor stellt, liegt die Systemauslastung aufgrund der Endlosschleife bei 40%. Interruptgesteuert wäre das wesentlich eleganter, aber ich wüsste nicht, wie man das mit Python und dem Adafruit Panel hinbekommen sollte.

Das Menü ist 6-stufig und fängt nach Erreichen des letzten Punkts wieder von vorne an:

  • Standardanzeige (Datum/Zeit/Isttemperatur/Solltemperatur)
  • Einstellen Solltemperatur Tag
  • Einstellen Solltemperatur Nacht
  • Einstellen Nachtabsenkung von
  • Einstellen Nachtabsenkung bis
  • Shutdown (zum sauberen Herunterfahren des Pi)

Der Programmablauf ist wie folgt strukturiert:

Hier das ganze Programm namens lcd_menu_integrated.py. Nicht vergessen, das Ganze mit
chmod +x lcd_menu_integrated.py ausführbar zu machen:

Die Datei settings.dat wird in /var/www gespeichert, da dort das Webinterface liegt, mit dem wir unsere Heizung auch von unterwegs steuern können. Aus Sicherheitsgründen darf der vom Webserver verwendete User - bei mir ist das www-data - nicht in Dateien außerhalb seines Verzeichnisses hinein schreiben.

Die Datei status.dat wird in das Verzeichnis /tmp geschrieben, da sie nur zur Laufzeit benötigt wird. im Beitrag SD-Karten Verschleiß vermeiden erkläre ich noch, wie man sich häufig ändernde Dateien und Logs ins RAM anstatt auf unsere "Festplatte", die SD-Karte schreibt.

Bei Fragen zum Programm einfach die Kommentarfunktion verwenden.

Das Webinterface steht aus Performancegründen und der Übersichtlichkeit wegen in einem eigenen Beitrag.

Schreibe einen Kommentar

Ich freue mich über Lob und Kritik.
Falls du Probleme mit der hier vorgestellten Anleitung hast und nicht weiter kommst:
Bitte das Problem oder die Fehlermeldung(en) möglichst genau beschreiben, auch an welcher Stelle (z.B. in welchem Node oder Befehl) und unter welchen Umständen der Fehler auftritt.
Gerne kannst du mir auch ein Mail schreiben. Die Adresse findest du im Impressum.
Ich gebe mir viel Mühe, meinen Lesern weiterzuhelfen. Je konkreter du bist, desto einfacher und schneller kann ich versuchen zu helfen.
Deine E-Mail-Adresse wird nicht veröffentlicht.
Erforderliche Felder sind mit * markiert