Anfängerfrage zur Programmierung einer Heizungsschaltung

Guten Abend und Hallo an's Forum :slight_smile:

Ich beschäftige mich gerade anfänglich mit dem Arduino und versuche mich gerade an den Beispielen diese zu verstehen und für meine Zwecke "umzubauen"...

Ich versuche gerade volgendes, weiß aber nicht so recht wie ich es umsetzen muss:

Ich möchte eine kleine Heizung bei Programmbeginn mittels eines Relais einschalten und diese bis ca 180°C heizen lassen.

WENN 180°C erreicht sind, soll das Relais die Heizung abstellen, erreicht die Temperatur 170°C, soll die Heizung wieder bis 180°C heizen und das alles wiederholen bis ich das Gerät wieder ausschalte.

gefunden habe ich das Beispielen "AnalogReadSerial" wo ich mittels eines NTC Sensors und einer Leuchtdiode sowas ähnliches hinbekommen könnte, nur geht es da nur Wenn kleiner als X - mache AN / Wenn größer als X - mache AUS.

hier mal der Beispielcode:

int led = D4;



void setup() {

  Serial.begin(9600);
  pinMode(led, OUTPUT); 
}


void loop() {
  
  int sensorValue = analogRead(A0);
   
  Serial.println(sensorValue);
  delay(100);        


if (sensorValue < 500)  {
   digitalWrite(led, HIGH);
  }

else  {
   digitalWrite(led, LOW);
  }

  delay(50);

}

Kann man diesen Code so ähnlich benutzen, so das einmalig zu Anfang der eingestellte Wert erreicht wird und DANACH dann immer zwischen den Schwellwerten hin und her schalten lässt?

Würde mich sehr über "Starthilfe" freuen :wink:

Gruß, Micha3582

Du musst mehr Informationen liefern. Unter anderem was für eine Heizung (Kessel?) und ob dieser ein Modul für eine externe Steuerung vorgesehen hat. Zweites ist gerade in kleineren Gebäuden (Nicht Industrieheizhäusern) meistens nicht der Fall. Das Abschalten der Vorsorgungsspannung des Kessels kannst du nicht machen. Dann darfst du dich kurzfristig nach einem neuen Kessel umschauen. Denn auch wenn der Kessel abgeschaltet wird, heizt sich dieser noch eine gewisse Zeit lang unerlaubt hoch auf, da der Kessel dann keine Pumpen zur Wärmeabfuhr mehr ansteuert.

Des weiteren verstehe ich nicht, warum du auf 180°C willst. Ist das überhaupt eine Heizung für deine Heizkreise im Haus?

Letztlich folgt der Programmcode oft einer Verbalen Beschreibung.
Es ist also immer sinnvoll, sich als erstes mal Schritt für Schritt aufzuschreiben / zeichnen, was eigentlich genau passieren soll.
z.B.:
"Messe Temperatur;
wenn kleiner 170°C: Heizung EIN
wenn größer 180°C: Heizung Aus"

wenn man dann dann in Code übersetzt kommt sowas dabei raus:

int led = D4;

void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
}


void loop() { 
  int sensorValue = analogRead(A0);   
  Serial.println(sensorValue);
  delay(100);       

if (sensorValue < 400)  {  // wenn kleiner 170°C: Heizung EIN
   digitalWrite(led, HIGH);
  }
if (sensorValue > 500)  {  //wenn größer 180°C: Heizung Aus
   digitalWrite(led, LOW);
  }
}// End loop()

Die Werte 400 und 500 sind völlig willkürlich. Hier musst du halt mal rausfinden, welchen Wert dein Sensor bei welcher Temperatur bringt.

Hallo Gunther, danke für Deine Antwort.

Ich hab es wohl sehr allgemein geschrieben... Die Heizung ist in dem Fall KEINE Heizung eines Hauses, sondern die meines umgebauten Laminiergerätes zur Tonertransfair-Methode.

Das Script sollte also nix spezielles können nur halt :

Beim Gerätstart soll die "Heizung" auf 180°C heizen, und nach erreichen des Wertes zwischen 170/180 pendeln zwischen An/Aus bis ich das Gerät abschalte.

Sorry für die schlechte Erklärung im ersten Post!

Grüße, Micha3582

Ich sehe Probleme zum Temperatursensor. Ist es wirklich ein NTC?
Grüße Uwe

Hallo Uwe,
mein Versuchsaufbau auf dem Steckbrett war ein NTC. Für mein Laminiergerät babe ich einen PT100 Sensor bestellt, weil er bis 450°C aushält.

Mir ging es im großen und ganzen ums Verstehen, wie ich einen Zustand (Wiederstandswert) erst "erreichen" muss bevor die "Dauerschleife" anfängt und zwischen den beiden Werten bleibt.

Momentan überwache ich das Gerat mittels Multimeter und angeschlossenem Temperatursensor und schaltet die Heizung manuell Ein/Aus. Das ist mir aber zu lästig und wollte es deswegen den Arduino machen lassen.

Grüße, Micha3582

Da det PT100 eine seht viel kleinere Widerstandsänderung in Funktin der Temperatur (gegenüber NTC) hat, kann man ihn nicht einfach in einen Spannungsteiler schalten, sondern braucht eine Auswertungselektronik um die Wiederstandsänderung zu messen.
Grüße Uwe

Ich möchte ja deine Bemühungen mit dem Arduino was zu programmieren nicht in Frage stellen, aber warum nimmst du nicht einfach einen Temperaturschalter mit 180°C?

Ich habe für das Tonertransferverfahren in meinem Laminiergerät einfach den vorhandenen Temperaturschalter mit einem höherer Schalttemperatur getauscht. Funktioniert prima.

Hallo Gunther, genau so ein Ding hatte ich besorgt. In meinem Gerät waren zwei solcher Sensoren verbaut. Ein 120er und ein 145er... Den 120 hab ich momentan kurzgeschlossen und den 145er durch den 180er ausgetauscht... Laut meinem Multimeter steigt die Temperatur aber über 180°C und ich weiß nicht wie viel ich den Heizelementen zumuten kann um zu testen WANN der Schalter schaltet...

Halte mal einen Lötkolben, am besten elektronisch geregelt mit einstellbarer Temperatur, an den Temp-Fühler, dann hast du die Antwort.

Laut meinem Multimeter steigt die Temperatur aber über 180°C und ....

2 Punkt Regler in/für Heizungen neigen zum Überschwingen.
Das liegt in der Natur der Sache.

Vielleicht möchtest du ja gar keine 2 Punkt Regelung einsetzen, sondern stattdessen eine PID Regelung.

Mir ging es im großen und ganzen ums Verstehen, wie ich einen Zustand (Wiederstandswert) erst "erreichen" muss bevor die "Dauerschleife" anfängt und zwischen den beiden Werten bleibt.

Hoffentlich hast du gemerkt, dass dies nicht dein Problem ist. :slight_smile: Ein Arduino als Temperatur Schalter, jedenfalls nach deiner Funktionsbeschreibung, macht nur "Dauerschleife": (ein/--/aus)

Die Frage die noch offen für mich ist, mal ganz abgesehen von meiner praktischen Idee, ob so eine Schaltung vom Schema her überhaupt "schreibbar" ist für den Arduino. Also:

Schritt 1 abarbeiten (bis true quasi)

Und wenn true...

Schritt 2 starten und bei
Schritt 3 weitermachen und danach wieder
Schritt 2 wiederholen und dann wieder
Schritt 3 bis zur Unendlichkeit :smiley:

Ich hoffe ihr versteht was ich meine und falls der ein oder andere sich schon die Haare rauft oder ins Keyboard beißt, bitte ich im Voraus um Entschuldigung ::slight_smile:

Wenn du Schritte brauchst, dann implementiere eine Schrittkette.
:o :o

Du musst ganz einfach mit Variablen arbeiten.

Pseudominimalcode nur für den übergeordneten Ablauf:

bool Aufheizen true

If Aufheizen == true
Heizung an
if Temperatur >= 180
Aufheizen == false
else
Regelung Temperatur

Beim Start wird also permanent geheizt bis die Zieltemperatur erreicht ist (thermische Trägheit ggfls. berücksichtigen und Tempwert anpassen).
Sobald das der Fall ist wird die Variable "Aufheizen" umgeschaltet und dann geregelt.

Prinzip ist klar?

Ich hoffe ihr versteht was ich meine

Ich denke schon, nur machst du es dir selbst zu kompliziert, denke ich.

Deine Aufgabenstellung:
Unter 170° : Heizung an
Über 180° : Heizung aus
Dazwischen Heizung so lassen wie es ist und nichts ändern.
(Wird schonmal "Zweipunkt-Regler mit Hysterese" genannt).

Das sollte dein gewünschtes Start-Verhalten (Erstmal Heizen) mit abhandeln.
Oder meinst du, beim Start soll auf jeden Fall x Sekunden geheizt werden, egal was die Temperaturmessung sagt. (Vermutlich nicht ?)

Ein anderes Start-Verhalten ( z.B. erstmal bis 70° langsam vorheizen, auf einen Start-Befehl warten, usw.) kann leicht programmiert werden. Da kommen dann die Möglichkeiten eines µControllers, im Vergleich zu einem Temperaturschalter, zum Tragen. Da wird einfach der aktuelle Zustand definiert und in einer (oder mehreren) Variablen gemerkt. ( Wie z.B. von klaus_ww angedeutet )


Dass die Heizung aus ist, wenn der Arduino nicht läuft, kann übrigens keine Aufgabe für den Arduino sein, sollte aber sichergestellt sein :wink:

Hallo nochmal zusammen!

Micha hat fertig :smiley: 8) !

Nach den Denkanstößen von Klaus und Michael und noch etlichen Tutorials auf YouTube bezüglich Arduino und Co. war ich nun in der Lage genau den Code zu schreiben, den ich haben wollte!

Da ich momentan noch keinen Sensor geliefert bekommen habe, wurden die Werte einfach mit einem Poti "zusammengedreht".
Das "Trennrelais" war zu Demozwecken eine gelbe LED, die Status-LED eine RGB-LED.
Benutzt habe ich zudem noch ein Display für die verschiedenen Meldungen und Anzeigen der Werte.

Ich habe verschiedene Betriebsmodis deklariert welche wie von mir gewünscht
im ersten Modi: aufheizen bis auf "Wert 800", LED Grün, LCD-Anzeige "Heizung AN", Trennrelais aus (Wert 800 soll später z.B. 180°C sein)

im zweiten Modi: Heizung aus und bis auf "Wert 600" abfallen lassen (z.B. 170°C), LED Orange, LCD-Anzeige "Heizung AUS", Trennrelais an

und im dritten Modi (welcher eigentlich nicht eintreten kann, nur für mich als Übung): LED ROT, LCD-Anzeige "Notabschaltung" Trennrelais an

hier mal mein fertiges Script:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);  // LCD Adresse = 0x3F (16 Zeichen / 2 Zeilen)


const int Solltemperatur = 800;
const int Mintemperatur = 600;
const int Alarmtemperatur = 850;
const int rotled = 7;
const int gruenled = 8;
const int blauled = 9;
const int trennrelais = 10;

int betriebsmodus = 1;


void setup() {

lcd.init();
lcd.backlight();

pinMode(rotled, OUTPUT);
pinMode(gruenled, OUTPUT);
pinMode(blauled, OUTPUT);
pinMode(trennrelais, OUTPUT);

}

void loop() {

int Sensor = analogRead(A0);
delay(1);

 
 if(betriebsmodus == 1){
    digitalWrite(gruenled, HIGH);
    digitalWrite(rotled, LOW);
    digitalWrite(blauled, LOW);
    digitalWrite(trennrelais, HIGH);
    lcd.setCursor(0,0);
    lcd.print(Sensor);
    lcd.setCursor(0,1);
    lcd.print("   Heizung AN   ");

    if(Sensor > Solltemperatur){
      digitalWrite(gruenled, HIGH);
      digitalWrite(rotled, HIGH);
      digitalWrite(blauled, LOW);
      digitalWrite(trennrelais, LOW);
      lcd.setCursor(0,1);
      lcd.print("   Heizung AUS  ");
      betriebsmodus = 2;
      } 
    
    }

else if(betriebsmodus == 2){
  if(Sensor < Solltemperatur and Sensor > Mintemperatur){
    digitalWrite(gruenled, HIGH);
    digitalWrite(rotled, HIGH);
    digitalWrite(blauled, LOW);
    digitalWrite(trennrelais, LOW);
    lcd.setCursor(0,0);
    lcd.print(Sensor);
    lcd.setCursor(0,1);
    lcd.print("   Heizung AUS  ");
    }
  
  if(Sensor < Mintemperatur){
    betriebsmodus = 1;
    }
  
  if(Sensor > Alarmtemperatur){
    betriebsmodus = 3;
    }
  }

else if(betriebsmodus == 3){
   digitalWrite(gruenled, LOW);
   digitalWrite(rotled, HIGH);
   digitalWrite(blauled, LOW);
   digitalWrite(trennrelais, LOW);
   lcd.setCursor(0,0);
   lcd.print(Sensor);
   lcd.setCursor(0,1);
   lcd.print(" NOTABSCHALTUNG ");
   betriebsmodus = 2;
      } 
  }

Ob es ein "guter" bzw sauberer Code ist weiß ich nicht, ich kann nur für mich behaupten, dass es funktioniert :slight_smile:

Danke für die "Starthilfe" die ich gebraucht habe, auch wenn manche Antworten nicht unbedingt zum Verständniss dazugetragen haben.

Gruß, Micha3582

PS: @Gunter: Momentan läuft das Laminiergerät auch mit dem Bimetallschalter, allerdings musste ich den 160er einbauen und laut meinem Multimeter geht die Temperatur trotzdem bis 200°C hoch, schaltet dann aber wie gewollt ab - ABER ich wollte diesen doofen Code fertig bekommen :smiling_imp:

Micha3582:
PS: @Gunter: Momentan läuft das Laminiergerät auch mit dem Bimetallschalter, allerdings musste ich den 160er einbauen und laut meinem Multimeter geht die Temperatur trotzdem bis 200°C hoch, schaltet dann aber wie gewollt ab - ABER ich wollte diesen doofen Code fertig bekommen :smiling_imp:

Hallo Micha,

ohne deinen Enthusiasmus bremsen zu wollen: Dass deine Heizung zu hohe Temperaturen erreicht liegt vor allem an der Thermischen Trägheit. Das wirst du auch mit einem elektronischen 2-Punkt Regler nicht ändern. (den passenden Code hatte ich schon in Post #2)

Du musst entweder den Sensor woanders platzieren, oder über einen anderen Regler (z.B. PID) eine feinere, vorausschauende Regelung einsetzen.

Aber unterm Strich kann ich dir bestätigen: einfach einen anderen TemperaturSchalter und es läuft. (ich finde nur nicht mehr raus, welchen ich damals verbaut habe)

Hallo Gunther,

guntherb:
Aber unterm Strich kann ich dir bestätigen: einfach einen anderen TemperaturSchalter und es läuft. (ich finde nur nicht mehr raus, welchen ich damals verbaut habe)

bei mir war es der 160°C - damit funktioniert das Laminiergerät wie gewünscht.

Deinen Code aus Post2 war aber eigentlich nicht das, was ich mir vorstellte...

Nach dem Code wäre die Heizung sagen wir von Wert 0 auf 800 gefahren, bei 801 aus, bei 799 wieder ein - bis unendlich.
Soll heißen: Das Relais und die Heizung wären im Dauerstress gewesen.

Ich wollte ein erstmaliges erreichen eines Wertes und im zweiten Schritt ein unterschreiten des Wertes welcher vorher "true" war welcher aber jetzt "false" ist.

Also:

0 --> 800 JA
799 --> 600 NEIN

Aber wie oben durch Dich bereits geschrieben: Es läuft auch ohne Arduino und wahrscheinlich wird es auch erstmal so bleiben.
Mir ging es einfach nur darum, nachdem ich mich von dem Gedanke den Arduino mit meinem Laminiergerät zu verheiraten verabschiedet hatte, einen Code zu schreiben der doch so klappen müsste wie ich es mir vorstellte... Da ich bis auf Java durch meine Hausautomation (RasPi3 - ioBroker) und bischen php und html noch kein C oder C++ (oder wie auch immer) kennengelernt hatte, bin ich schon ganz zufrieden und gewappnet für neue Ideen :slight_smile:

Gruß, Micha

Micha3582:
Nach dem Code wäre die Heizung sagen wir von Wert 0 auf 800 gefahren, bei 801 aus, bei 799 wieder ein - bis unendlich.

Ich weiß, es ist eigentlich nicht mehr wichtig, aber nein, das ist nicht so.

if (sensorValue < 400)  {  // wenn kleiner 170°C: Heizung EIN
   digitalWrite(led, HIGH);
  }
if (sensorValue > 500)  {  //wenn größer 180°C: Heizung Aus
   digitalWrite(led, LOW);
  }

Solange die Tempertur unter 400 (willkürlicher Schwellwert) ist, wird die Heizung eingeschalten,
wenn die Temperatur oberhalb 500 ist, wird ausgeschalten.

Also: Start: Temp < 170°C, Heizung ein.
das bleibt so bis die 180°C überschritten werden, dann wird die Heizung abgeschalten, die Temperatur sinkt.
Unter 170°C wird wieder eingeschalten.
Mit anderen Worten: ein Zweipunktregler.