Rpi Pico Heizungssteuerung               

von Ralph Maas                                

Elektronik-Labor  Projekte  Mikrocontroller  Raspberry            



Wir haben eine Fußbodenheizung mit „thermischen Stellventilen“ (Typ TA-D12). Dabei wird ein Widerstand in Öl erhitzt, um das Ventil zu öffnen. Das benötigt pro Fußbodenheizungskreis ca. 6W. Auch verbraucht die Steuereinheit für 4 Ventile (Typ KR-D 12) 11 Watt Ruheleistung. Zudem gehen diese Stellventile mit der Zeit kaputt und sind seit Jahren nicht mehr lieferbar. Vor einigen Jahren konnte ich noch welche über EBAY-Kleinanzeigen bekommen, jetzt nicht mehr. Ein Ersatz muss also her. So energiehungrig die Ventile auch sind, die Regelung erfolgt linear, also deutlich besser als ein/aus. Die Vorgabe kommt von den verbauten Raumtemperaturreglern (Typ RF-D 12), diese geben ein 0..3,5V-Sollsignal ab und sind schon fest eingebaut und mit Kabel bis in die Fußbodenverteilung verlegt.Also ist ein linear arbeitendes Stellglied gefragt, das mit einem analogen Signal angesteuert werden kann.

Konzept:

Von elv gibt es die Stellmotoren HmIP-VDMOT, die mit 3,3V arbeiten und daher gut in Kombination mit dem PiPico verwendet werden können. Die Stellmotoren verbrauchen nur Strom beim Verstellen. Eine Herausforderung ist noch, dass die Stellmotoren keine Sensoren für den Endanschlag haben. Die Steuerung muss den Endanschlag über den erhöhten Stromverbrauch erkennen. Zudem sieht man dem Stellmotor (im Gegensatz zu seinem „thermischen“ Vorgänger) nicht an, ob er geöffnet oder geschlossen ist. Also sollte auch noch eine Statusanzeige dazu kommen. Als Motortreiber habe ich einen L9110 verwendet. Am Anfang des Projekts gab es diesen noch als DIP8, dieses Jahr habe ich keine weiteren mehr bekommen und deshalb aus einer Modulplatine die SMD-Bausteine ausgelötet und mit einem Adapter SO8 TSSOP8 auf DIP8 umgebaut. Eingebaut wurde das Ganze in ein Hutschienengehäuse. Den PiPico habe ich hochkant eingebaut, von der „oberen“ Leisten benötige ich nur 2 Pin. Die Stellmotoren werden über RJ10-Buchsen angeschlossen. Mit den 3 ADC des PiPico kann ich 2 Stellmotoren mit einem PiPico ansteuern. Je Raumtemperaturregler ein ADC und für die Messung des Motorstroms den dritten. Für die Anzeige des aktuellen Status habe ich je Kanal eine LED vorgesehen, die je nach Öffnung des Ventils 1-10x blinkt. Das Blinken habe ich über 3 PWM-Generatoren realisiert.

Nicht verfolgte Alternativen:

Nicht verwenden wollte ich „thermoelektrische“ Stellantriebe, weil diese dauerhaft Energie benötigen. Diese findet man in der Regel, wenn man nach „Stellantrieb Fußbodenheizung“ sucht. Auch nicht verwenden wollte ich die von elv angebotene Ansteuerung HmIP-FALMOT-C12, weil ich für diese ein Smart-Home-System benötigt hätte und meine schon verkabelten Raumtemperaturregler nicht mehr hätte verwenden können. Auf Github gab es auch noch eine veröffentlichte Variante https://github.com/Lenti84/VdMot_Controller, die mir zu kompliziert war.

Material:

Schaltplan:

Aufbau:

Der PiPico wird hochkant mit gewinkelten Stiftleisten eingebaut. Damit passt er in das Hutschienen-Gehäuse und auch die uUSB-Buchse bleibt bei abgenomenen Oberteil zugänglich.

Von vorne (mit Gehäuse im Hintergrund):

Von hinten (mit Gehäuse im Hintergrund):

(In weiteren Versionen habe ich nur noch GPIO 6 + 7 mit Buchsenleisten versehen).

Geschlossenes Gehäuse:


 

Erfahrungen:

Inzwischen habe ich das Hutschiene-Modul 4x aufgebaut und damit alle meine 8 Ventile umgerüstet.


Für die Stromversorgung reicht ein altes USB-Netzteil völlig aus. Ruhestrom für 4x PiPico und 8 Raumtemperaturfühler liegt unter 80mA (0,4W). Im Betrieb kommen maximal 300mA (1,5W) zusammen. (Kein Vergleich zu den 22 Watt Ruheleistung, die das alte System verbrauchte.) Die Einstellung der Grenzen für die Erkennung des Endanschlags erforderte einiges Probieren. Dadurch dass beim Schließen der Ventile gegen den Druck gearbeitet wird, ist der Endanschlag nicht nach Überschreiten einer bestimmten Stromstärke erreicht, sondern erst wenn die Stromstärke zusätzlich nicht mehr steigt.

Code: PicoErsatzStellmotorMitLED_object_2Kanal.zip

Hier nur Hauptprogramm. Wenn die Definition „zweikanal“ auskommentiert wird, wird nur ein Kanal verwendet. Die Logik für den Stellmotor und die PWM-Ansteuerung der LED ist in den .h bzw. .cpp Dateien in der ZIP. 

// 

// Stellmotor HmIP-VDMOT (von ELV) ansteuern auf Basis eines Analogsignal, mit Signalisierung des Zustands über LED
// verwendet als Ersatz für nicht mehr lieferbare Stellventile (TA-D12) von Veltamat
// Die "Grundeinheit" (KR-D 12) wird nicht mehr benötigt, was den Stromverbrauch stark reduziert.
// Der Raumtemperaturfühler (RF-D 12 ) wird weiter verwendet.
// Er wird mit 5V betrieben und liefert ein Signal 0...3,5V das den Sollzustand des Ventils (0V-zu .. 3,5V-auf) ausgibt
// (Eine Kauf-Alternative wären HmIP-FALMOT-C12 bzw. HmIPW-FALMOT-C12 als Steuerung für 12 Ventile.
// Damit könnten aber die Raumtemperaturfühler und die vorhandene Verkabelung nicht weiter verwendet werden und es wären weitere Komponenten notwendig)
//
// Die Signalisierung des aktuellen Zustands der Stellmotoren erfolgt mit blinkenden LED. Dazu werden drei PWM-Kanäle verwendet
//
// Dieses Programm verwendet die Pico-Arduino Boarderweiterung von Earle Philhower (Version 2.6.3)
// nach Anregung des Buches "RPi Pico Schaltungen und Projekte" von Burkhard Kainka, Seite 5
// Einbindung über die Boardverwalter-URL https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
// unter "Datei | Voreinstellungen" in der Arduino-IDE
//

#include <Arduino.h>
#include
"pico/stdlib.h"
#include
"PWM_Status.h"
#include
"Stellmotor.h"

#if defined(_BOARDS_PICO_H)
// V2 in Gehäuse für Hutschiene mit Ausbau für 2 Kanäle
#define
RT_Regler_A A1 // GPIO27 ist ADC1, GPIO28 ist ADC2
#define Feedback A0 // GPIO26 ist ADC0
#define
MotorAuf_A 21
#define
MotorZu_A 22
#define
RT_Regler_B A2 // GPIO27 ist ADC1, GPIO28 ist ADC2
#define
MotorAuf_B 19
#define
MotorZu_B 20
#define
LED_Anode 18 // Slice_Blink, Output A
#define
LED_Kathode_A 6 // Slice_Burst, Output A
#define
slice_burst_Input_A 7 // Slice_Burst, Input B, Muss physisch mit LED_Anode verbunden werden
#define
LED_Kathode_B 16 // Slice_Burst, Output A
#define
slice_burst_Input_B 17 // Slice_Burst, Input B, Muss physisch mit LED_Anode verbunden werden
#define
ZweiKanal

#else
#error "non supported board"
#endif



PWM_Status StatusLED_A( LED_Anode, LED_Kathode_A, slice_burst_Input_A, 10, 99);// slice_burst_Input (Input B) muss physisch mit LED-Anode verbunden werden
#if
defined(ZweiKanal)
PWM_Status StatusLED_B( LED_Anode, LED_Kathode_B, slice_burst_Input_B, 10, 99);// slice_burst_Input (Input B) muss physisch mit LED-Anode verbunden werden
#endif


Stellmotor Motor_A(MotorAuf_A, MotorZu_A, RT_Regler_A, Feedback, StatusLED_A );
#if defined(ZweiKanal)
Stellmotor Motor_B(MotorAuf_B, MotorZu_B, RT_Regler_B, Feedback, StatusLED_B );
#endif

void setup() {
set_sys_clock_48mhz(); // 125MHz ist Standard, dann aber Blinkfrequenz minimal 3,7Hz; mit 48MHz sind es 1,42 Hz
Serial
.begin(115200);
sleep_ms(5000); // Zeit bis Nutzer seriellen Monitor aufmacht
Serial
.println("Vor Aufruf PWM");
StatusLED_A.init();
#if defined(ZweiKanal)
StatusLED_B
.init();
#endif
StatusLED_A.start();
Serial.println("Nach Aufruf PWM");

Serial.println("Motor A:");
Motor_A.init(); // Evtl. hier ein Flag rein für Mess-Modus
#if
defined(ZweiKanal)
Serial
.println("Motor B:");
Motor_B.init();
#endif // Evtl. hier ein Flag rein für Mess-Modus
// Motor_A.init_mess(); // Für Messungen alternativ

}


void loop() {
Serial.print("Motor A:");
Motor_A.messen();
delay(5000); // das später auf 10sec=10000 oder gar eine Minute = 60000 erhöhen, damit nicht zu oft verstellt wird
#if
defined(ZweiKanal)
Serial
.print("Motor B:");
Motor_B.messen();
delay(5000); // das später auf 10sec=10000 oder gar eine Minute = 60000 erhöhen, damit nicht zu oft verstellt wird
#endif

}

Zum Vergleich: Die alte Anlage







Elektronik-Labor  Projekte  Mikrocontroller  Raspberry