Heizkreissteuerung

Hallo,

Ich möchte hier einmal mein kleines Projekt vorstellen und hoffe auf Verbesserungsvorschläge und Kritik.

Ausgangslage ist/war das unsere Heizungssteuerung vor 2 Jahren den Geist aufgegeben hat und wir seid dem das ganze von Hand steuern. Das soll nun alles etwas automatischer laufen und etwas schöner geregelt...

So was hab ich vor:

  • "Heizkreis ein" ab einer gewissen Mindesttemperatur im Puffer und auf Anforderung (noch nicht im Skript, die Anforderung)
  • es soll entschieden werden obs im Puffer warm genug ist um damit zu heizen
  • ansonsten soll der Kessel eingeschaltet werden.
  • Regelung der Vorlauftemperatur in Abhängigkeit der Aussen Temperatur (lineare Anhebung der Vorlauftemp)

soweit das bisher realisierte

Was noch kommen soll:
-Pufferladetemperatur in abhängigkeit der Aussentemperatur und der Einschaltzeit.
-Nachlauf der Ladepumpe

  • ggf eine "direkt Heizfunktion"
    -Ein gewisser Einfluß eines Referenzraumes zur Vorlauftemp
    -Datenlog der wichtigestens Temperaturen/Laufzeiten und senden dieser an einen Webserver
    -ggf eine gewisse Einflußnahmen von Aussen auf die Vorlauftemp (Partytaste, oder heizen auf Fernaufforderung)
    -Zeitabhängige Schaltungen (kurzes aufheizen morgens, dann erst wenn wir abends heim kommen o.ä.)

mal schauen was ich umsetzten kann...
So nun der Skript bzw das was ich bisher geschafft hab.
Bitte nicht an den nicht Heizungstauglichen Temperaturen im Skript stören, auf dem Küchentisch lassen sich 28 Grad einfach besser simulieren wie 65, auch das die Loop nur alle 10 sekunden läuft ist diesem geschuldet...

#include <OneWire.h>
#include <DallasTemperature.h>    
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);    //Sensoren an Pin2 

// #define Heizunganforderung 4
#define Kessel_ein 5
#define Ladepumpe_ein 6
#define Heizkreis_ein 7
#define Mischer_AUF 8
#define Mischer_ZU 9

//-------------------------------------------------------------------------------------
int tempsoll = 20;
int Aussentemp;
int Vorlauftemp;
int Vorlauftemp_soll;
int Puffer;
int Puffertemp=20;        //mindest Puffertemperatur oben - Temp drunter --> Kessel an
// int Ladepumpe=30000;   //warte Zeit nach "Kessel an" bis zum einschalten der Ladepumpe
int Ladetemp=30;          //Temperatur bis wieviel Grad der Puffer vom Kessel geladen werden soll
int hyst = 2;             //Hysterse Mischerkreis
unsigned long MischenA;    
unsigned long WartenA,WartenB;
//-------------------------------------------------------------------------------------
void setup() {                
  pinMode(A0, INPUT);
  pinMode(Mischer_AUF, OUTPUT); 
  pinMode(Mischer_ZU, OUTPUT); 
  pinMode(Kessel_ein, OUTPUT);
  pinMode(Ladepumpe_ein, OUTPUT);
  pinMode(Heizkreis_ein, OUTPUT);
  digitalWrite(Kessel_ein, LOW);
  digitalWrite(Ladepumpe_ein, LOW);
  digitalWrite(Heizkreis_ein, LOW);
  digitalWrite(Mischer_AUF, LOW);
  digitalWrite(Mischer_ZU, LOW);


  Serial.begin(9600);
  sensors.begin();  
}
//-----------------------------------------------------------------------
void loop() {

  WartenA = millis();    // Alle 10 Sekunden den "Regelkreis" starten
  if (WartenA - WartenB > 10000)

  {
    // Abfrage aller Temperaturen für den "Regelkreis"
    sensors.requestTemperatures();
    Vorlauftemp = sensors.getTempCByIndex(0);
    Puffer = sensors.getTempCByIndex(1);
    Aussentemp = sensors.getTempCByIndex(2);
    Serial.print("Puffer:");
    Serial.println(Puffer);
    Serial.print("Vorlauftemp:");
    Serial.println(Vorlauftemp);
    Serial.print("Aussentemp:");
    Serial.println(Aussentemp);
    
    
    //----------------------------------------------------------------------------------
    // Umwandeln der Aussenfühlertemperatur in Vorlauftemperaturen
    
    Vorlauftemp_soll = (Aussentemp + 273);  //Umwandlung der gemessenen Temperatur in Kelvin um positive Werte zu erhalten
    Vorlauftemp_soll = map (Vorlauftemp_soll , 303, 263, 10, 45);
    Serial.print("Vorlauftemp_soll:");
    Serial.println(Vorlauftemp_soll);

    //----------------------------------------------------------------------------------
    // Entscheiden ob der Kessel gestartet wird oder erstmal der Pufferinhalt "genutzt" wird, Heizkreis bei Mindesttemp einschalten.

    if (Puffer <= Ladetemp)
    { 
      digitalWrite(Kessel_ein, HIGH);
      digitalWrite(Ladepumpe_ein, HIGH);
      (Ladetemp = 29);    // Wenn der Kessel anspringen muß, die Puffertemp hoch setzten, damit der Kessel eine gewisse Laufzeit bekommt
      Serial.println ("Puffertemp niedrig, Kessel eingeschaltet");
    }
    else 
    {
      digitalWrite(Kessel_ein, LOW);
      digitalWrite(Ladepumpe_ein, LOW);
      (Ladetemp = 22);    // Muß der Kessel nicht anspringen, kann der Puffer bis zur Mindesttemp leer gefahren werden
      Serial.println ("Puffertemp ausreichend, Kessel aus");  
    }

    if (Puffer >= 25)      // Heizkreis erst einschalten wenn eine gewisse Mindesttemperatur vorhanden ist
    {
      digitalWrite (Heizkreis_ein, HIGH);      
      Serial.println ("Heizkreis Ein");
    }


  //------> MISCHEN Anfang

    if (Vorlauftemp > (Vorlauftemp_soll + hyst)) // Mischer zu - Temperatur runter
    {    
      MischenA = millis();    
      while (millis() - MischenA < ((Vorlauftemp - Vorlauftemp_soll) * 500)) //Differenztemp *500ms = Ansteuerzeit des Mischers
      {  
        digitalWrite(Mischer_ZU, HIGH);
      }
      digitalWrite(Mischer_ZU, LOW);
      Serial.print("Mischzeit ist ");
      Serial.println(((Vorlauftemp - Vorlauftemp_soll) * 500));
      Serial.println("Mischer faehrt ZU");
    }
    if (Vorlauftemp < (Vorlauftemp_soll - hyst)) // Mischer auf - Temperatur erhoehen 
    {    
      MischenA = millis();    
      while (millis() - MischenA < ((Vorlauftemp_soll - Vorlauftemp) * 500)) 
      {    
        digitalWrite(Mischer_AUF, HIGH);
      }
      digitalWrite(Mischer_AUF, LOW);
      Serial.print("Mischzeit ist ");
      Serial.println(((Vorlauftemp_soll - Vorlauftemp) * 500));
      Serial.println("Mischer faehrt AUF");
    }
    WartenB = millis();  
  } //--------MISCHEN Ende-----------------

}      //Loop Ende

Mfg
Dominik

Es gibt Möglichkeiten, dass das einlesen des Dallas nicht die loop verzögert. Zwischen Anfrage und Rückgabe des Wertes sollten ca 750ms vergehen. Schau mal, ob du im Forum hier was passendes findest. Gab die Anfrage schon einige Male.

Hallo Dominik,
ich habe auch meine Heizung selbst programmiert.
Was mir so auffällt. Lese ich das richtig, das du den Kessel und die Ladepumpe immer zur gleichen Zeit einschaltest?
Das mache ich z.B. nicht, die Ladepumpe soll doch nur fördern, wenn auch genügend Temperatur vom Kessel bereit gestellt wird ?
Dann zur Vorlauftemperatur, das macht bei mir noch die eigentliche Heizungssteuerung, werde ich aber auch ändern, da ich zwei Heizkreise regeln möchte, Fußbodenheizung und Heizkörper.
Ist die Anhebung der Vorlauftemperatur wirklich linear?? Wenn ich mir meine Heizung anschaue ist das anders, vielleicht kennt ja hier einer die genau Kurve.
Aber das Thema ist immer wieder interessant, kann man sich ja mal austauschen.
gruß

@Maverick, dass kommt immer auf den Verwendungszweck an. Bei weniger kritischen "Transportflüssigkeiten" wie zB. Wasser ist das direkte Einschalten in einem bestimmten Temperaturbereich nicht weiter tragisch. Es gibt aber einige andere Verfahren, bei denen nicht mit Wasser sonder Kältemitteln gearbeitet wird, die sich sehr schnell bei einem geringen deltaT ausdehnen. Hierbei sollte aufjedenfall die Pumpe schon vor dem Brennerstart mitlaufen.

maverick1509:
Ist die Anhebung der Vorlauftemperatur wirklich linear?? Wenn ich mir meine Heizung anschaue ist das anders, vielleicht kennt ja hier einer die genau Kurve.

Die genaue Kurve hängt glaube ich von der Heizung ab. Ich bin auch am Überlegen ob ich das mache und habe mal folgende Formel im Internet gefunden (habe aber auch nicht lange gesucht).

double t1 = ext_temperatur / (320 - ext_temperatur * 4);
double t2 = Math.Pow(_kruemmung, t1);

double vorlaufTemperatur = Math.Min(Math.Max(((0.55 * _steilheit * t2 * ((-ext_temperatur + 20) * 2) + 
                _parallelverschiebung) + (_regelabweichung * _verstaerkung)), _min_vorlauf), _max_vorlauf);

 vorlaufTemperatur -= _nachtAbsenkung;

100%ig zufriedenstellend ist es nicht (die Art wie sich die Kurve ändert ist manchmal etwas komisch), aber es entspricht in etwa der die auf der Heizung aufgemalt ist. Wirklich ausprobiert ob praktisch es brauchbar ist habe ich es aber nicht

Ich habe dazu ein kleines C# Programm geschrieben in dem man die Kurve plotten kann:

HI,

UI dann hab ich gleich ne Frage, @Schultewolter...Welchen Vorteil/Nachteil hätte ich durch die von dir beschriebene Variante, der Sensor abfrage?? Da das ganze nicht wirklich zeitkritisch ist, hab ich mir darum bisher noch keine Gedanken gemacht.
Wäre es nicht auch möglich die Sensor abfrage mit deiner kurzen Schleifen zuversehen?? Weil Zeit hab ich ohne Ende für einen Durchgang...

@Maverick, Ja zur Zeit springen sie noch gemeinsam an, die Ladepumpe pumpt ja nur in den Pufferspeicher, die Heizkreispumpe springt auch erst bei einer Mindesttemperatur an.
Ist ne Ölheizung, das ist ja quasi warm, wenn der Brenner brennt :slight_smile:
Meine Heizungssteuerung konnte leider nie einen Heizkreisregeln...auch die Heizkurve war da alles andere als "fein" einzustellen...
Ob die Kurve wirklich linear ist, weiß ich leider auch nicht. Aber zum laufen lernen empfand ich das als ganz gute Lösung, weil ich die "Steilheit" bzw die Parrallelverschiebung einfach realisieren kann und es übersichtlich ist...
Komplizierter geht dann immer noch.
Ansonsten denk ich auch das das sehr von der Heizung/Haus ect abhängt...könnt mir vorstellen das eine FBH da doch anders temperiert werden mag wie Uralt Radiatoren.
Was machst/hast du gebaut..??

Mfg
Dominik

@Dominik
also ich steuere mit einem Arduino Mega meine Gasheizung, einen wasserführenden Kachelofen, der im Winterhalbjahr betrieben wird und dann das komplette Haus incl. Warmwasserbereitung versorgt sowie 10qm Röhrenkollektoren auf dem Dach.
Im Moment habe ich mir einen neuen größeren Pufferspeicher besorgt und dann will ich auch die zwei Heizkreise (FBH und Heizkörper)
steuern. Und da suche ich im Moment nach Informationen, wie solche Heizkurven (abhängig von der Außentemperatur) aussehen.
Gruß
Bernward

@Bernward
das würde ich gene auch bei mir steuern.
hast du schon ein sketch für mich zum verstehen?

Hallo Karl ?
das ist ziemlich umfangreich, aber ich kann dir alles zur Verfügung stellen, was ich habe.
Das Programm ist relativ gut auskommentiert, um es zu verstehen.
Angefangen hab ich mal mit einem kleinen Display und vielen Tastern zum Steuern, aber jetzt ist die gesamte Steuerung
so aufgebaut, das ich sie über einen 7 Zoll Touchscreen bedienen kann.
Melde dich einfach mal ich kann dir sicherlich mit Tipps helfen.
Gruß
Bernward

würde ich gerne nehmen

Hallo ich weiß ich bin neu hier aber ich bin gerade dabei meine Heizung umzubauen und habe auch schon ein relativ brauchbares Konzept aber darf ich trotzdem so frech sein und dich um deinen Ansatz zu bitten?

Hi

Da

  • der Thread >4,5 Jahre ist
  • der TO nicht mehr hier angemeldet ist
    könnte Es schwierig werden, an den Sketch zu kommen.
    Vll. hast Du Glück und karl77 (Der auch noch aktiv ist, zumindest letzte Post 31.05.18) hat den Sketch bekommen und die letzten 4,5 Jahre gut aufgehoben - würde jetzt aber eher Lotto spielen - da sind die Chancen wohl höher.

Vll. schreibst Du karl77 einfach Mal an - daß Er hier noch ein Abo drauf hat, ist noch unwahrscheinlicher, als der gut behütete Sketch.

MfG

Danke für die Information :slight_smile:

MfG Michael