Mit diesem kleinen Bastelprojekt verhindere ich, dass im Winter im Gartenhaus die Temperatur unter null Grad fällt. Da sich die Thermostate diverser Heizlüfter als recht unpräzise heraus gestellt haben und die Variante Zeitschaltuhr nicht auf Änderungen der Außentemperatur reagieren kann, habe ich eine digitale Heizungssteuerung mittels Arduino entwickelt.
Kernkomponenten sind ein Arduino Uno oder Nano, ein digitaler Termperatursensor (DS1820), ein 433MHz Funksender und eine Funksteckdose.
Grundüberlegungen
Da ich keine Ambitionen habe, in Bastelprojekten mit direkt Hochspannung zu arbeiten, habe ich mich entschieden, eine Elro Funksteckdose einzusetzen und diese mittels Arduino zu schalten. In anderen Projekten habe ich bereits die hervorragende RemoteSwitch library von Randy Simons verwendet, welche das Schalten von Funksteckdosen denkbar einfach gestaltet – so auch hier.
Als Temperatursensor kommt ein DS1820, DS18S20 oder ein anderer aus der DS18x20 Reihe zum Einsatz. Dieser kostet zwar 1-2€, ist aber ohne großen Aufwand sofort einsatzbereit. Die DS1820 library aus dem Netz habe ich soweit aufgebohrt, dass sie mit allen Sensoren dieser Reihe funktionieren sollte.
Um die Zieltemperatur einzustellen wird ein Potentiometer an einem der analogen Eingänge verwendet. Dessen einstellbare Analog-Werte von 0…1023 werden in Zieltemperaturen von 4-30°C umgerechnet (der Wertebereich ist jederzeit änderbar).
Damit die Zieltemperatur auch gut erkennbar ist, soll das ganze Projekt mit einem Display abgerundet werden. Da mir die Verdrahtung eines parallel angeschlossenen Displays mit 4 Datenleitungen, 2 Steuerleitungen, Kontrasteinstellung etc. (mind. 10 zu verdrahtende Pins) und der damit verbundene Aufwand noch gut im Gedächtnis ist, habe ich mich für ein seriell angeschlossenes Display entschieden (im Prinzip das Gleiche Display mit einem Extra Controller dran). Dieses kostet unwesentlich mehr und ist mit 2 Datenleitungen, GND und +5V recht einfach zu verkabeln.
Das letzte Element ist eine Kontrolleuchte (LED), die anzeigt, wann geheizt wird. Hier könnte ich auch die LED vom Arduino direkt nehmen aber da das Ganze am Ende in ein Gehäuse soll, ist eine extra LED praktischer.
In der Vergangenheit habe ich ATMega328-Controller mit Spannungswandlern direkt verbaut, um nicht in jedem Projekt einen Arduino zu verbraten. Inzwischen verwende ich für solche Projekte Arduino-Nano-Clones aus China. Diese bringen nicht nur einen größeren Funktionsumfang (z.B. USB-Interface) bei deutlich reduziertem Aufwand, sondern sind mit 2-3€ bei Aliexpress auch deutlich günstiger als selbst aufgebaute Minimal-Arduinos. Deshalb setze ich auch hier einen Nano-Clone ein.
Teile-Liste
- Basis
- Arduino Nano, Ali Express, ca. 2,30€
- Breadboard, Kabel, Ali Express, ca. 1-2€
- ggf. Raster-Platine für den finalen Aufbau
- Temperatursensor
- DS18S20, Ebay im 10er Pack, pro Stück ca. 1,50€
- Widerstand 4.7 kOhm (2-5kOhm tut’s)
- 433 MHz-Sender
- Optional:
- 433 MHz-Sender, Ali Express, ca. 0,80€
- Potentiometer 10 kOhm (oder mehr, max 1000 kOhm)
- LCD Display LCM 1602 I2C 16×2, Ali Express, ca. 2,70€
Anstelle des Potentiometers kann die Zieltemperatur auch fest einprogrammiert werden, beispielsweise auf 4 Grad Celsius. Dann kann auch das Display entfallen, wenn man auf die Anzeige der aktuellen Temperatur verzichten möchte. Man kann die Temperatur auch am Rechner einstellen und via serieller Konsole kontrollieren.
Aufbau und Programmierung
Zieltemperatur
Das Potentiometer wird mit den äußeren Pins mit GND und +5V verbunden. Der Schleifkontakt wird am analogen Eingang A0 angeschlossen. Damit lassen sich nun Werte von 0…1023 einstellen. Mit einer einfachen Formel werden diese auf 4…30 abgebildet, was die einstellbare Minimaltemperatur darstellt.
Temperatursensor
Der Temperatursensor wird an GND und +5V angeschlossen. Der Datenpin wird an D9 angeschlossen und zusätzlich mit einem 4,7 kOhm Widerstand gegen +5V geschaltet (siehe Datenblatt). Mit meiner Version der DS18X20 Bibliothek kommt die Klasse OneWireListener zum Einsatz, welche das Initialisieren und Auslesen eines oder mehrerer DS18x20 Sensoren an einem Datenpin übernimmt und die Temperaturen an eine Callback-Funktion übergibt. Der Einfachheit halber verwende ich hier nur einen Sensor am Pin D9, so dass eindeutig ist, dass dessen Temperatur ausschlaggebend ist.
Alle 5 Sekunden wird die Methode readValues() des OneWireListener aufgerufen, welche die Sensoren ausließt. Dies geschieht hier im Loop, kann jedoch auch über eine Timer-Bibliothek zyklisch erfolgen.
Zieltemperatur und Hysterese
Das Potentiometer wird mit den äußeren Pins mit GND und +5V verbunden. Der Schleifkontakt wird am analogen Eingang A0 angeschlossen. Damit lassen sich nun Werte von 0…1023 einstellen. Mit einer einfachen Formel werden diese auf 4…30 abgebildet, was die einstellbare Zieltemperatur darstellt.
Sinkt die Temperatur unter die Zieltemperatur, soll die Heizung eingeschaltet werden, steigt sie darüber wieder aus. Um ein „flattern“ des Zustandes um die Zieltemperatur herum zu vermeiden, kommt eine Hysterese-Funktion zum Einsatz: Ist der Zustand „aus“ und die Temperatur fällt unter die Zieltemperatur, wechselt der Zustand auf „an“. Er wechselt jedoch erst wieder auf „aus“, wenn er „an“ ist und die Temperatur die Zieltemperatur um mind. 1 °C übersteigt.
Steckdose schalten
Um die Funksteckdose zu schalten, wird ein 433 MHz Transmitter an Pin D8, GND und +5V angeschlossen. Als System-Code habe ich mal „30“, als Kanal „A“ festgelegt. Geschaltet werden kann damit eine Elro Funksteckdose, welche es für ein paar Euro im Baumarkt oder beim Amazon gibt. Wichtig ist, dass es eine Steckdose mit per DIP-Schalter einstellbarem Systemcode ist. Es gibt 5 DIP-Schalter für den Systemcode, von denen jeder einen Bitwert 1,2,4,8 und 16 repräsentiert. Sind die DIP-Schalter 2-5 an, ergibt dies 2+4+8+16= Systemcode 30.
Da auf dem 433 MHz Band recht viel los ist, kann ein Schaltsignal auch mal verschluckt werden. Daher sende ich den aktuellen Schaltzustand alle 30 nochmal. Das überredet auch Nachbarn, die ggf. den selben Kanal verwenden, sich einen anderen zu suchen 😀
Display ansteuern
Das serielle Display wird an GND, +5V und den Analog-Pins A4 (SDA) und A5 (SCL) angeschlossen. Warum analog ist mir nicht ganz klar – ist halt so… Mit der passenden Bibliothek vom Anbieter klappt die Anzeige auf Anhieb. Ich stelle auf dem Display die IST-Temperatur, die Zieltemperatur und den Zustand AN/AUS dar.
Status-LED
Diese wird mit einem 150-500 Ohm Vorwiederstand direkt am Pin D13 angeschlossen.
Watchdog
Aufgrund von Programmierfehlern (oder wegen des Billig-Arduino-Clones) kann es gelegentlich mal zu Abstürzen des Systems kommen. Da das ein-/ausschalten der Heizung wichtig ist, kommt hier der eingebaute Arduino Watchdog zum Einsatz. Diesem teilt man mit, nach wie vielen Sekunden sich der Arduino selbst neu starten soll. Im loop ruft man die Reset-Funktion des Watchdog an relevanten Codestellen auf. Diese setzt den reset-Timer wieder auf Null zurück und die Zeit bis zum Reset läuft von vorn.
Finaler Zusammenbau
Im Titelbild ist der Prototyp auf dem Breadboard zu sehen, welcher schon voll funktionsfähig ist. Nun geht es daran, ein Gehäuse zu finden und alles zusammen zu löten (oder stecken). Wenn ich damit fertig bin, füge ich hier noch ein Foto hinzu…
Der gesamte Quellcode des Projektes ist in meinem Github-Repository zu finden.