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