Heizungssteuerung bleibt nach gewisser Zeit hängen

Hallo Zusammen,

habe eine selbstgebaute Heizungssteuerung hier zur Erwärmung eines Kanals.
Programm läuft, Die Temperatur wird schön geregelt und die Sensoren werden sauber ausgelesen.

Mein Problem ist aber das der Arduino nach einer gewissen Zeit hängen bleibt und dabei das SSR-Relais aktiv bleibt, heißt der Thermostatschutzschalter löst aus und schaltet die Heizung ab da diese ohne Unterbrechung durchheizt.

Hoffe jemand findet meinen Fehler wieso das Programm hängen bleibt.

Hier mein Code:

#include <SPI.h>  //SPI Library für die MAX 6675
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>  //Library für das I2C-Display
LiquidCrystal_I2C lcd(0x27, 20, 4);   
float temp1 = 123;  //Variablen für die MAX6675 Temp.Werte
float temp2 = 312;
float temp3 = 231;
int durchschnitttemp; //Variable für den Durchschnittswert
int sollread = 0;  //Variable für den Poti des Sollwerts
int sollwert = 0; //Variable für den umgerechneten Sollwert
int i = 0; //Zähler 1
int z = 0; //Zähler 2

double readCelsius(uint8_t cs) {    //Funktion zur Abfrage der MAX6675(Funktioniert einwandfrei)
    uint16_t v;
    digitalWrite(cs, LOW);
    v = SPI.transfer(0x00);
    v <<= 8;
    v |= SPI.transfer(0x00);
    digitalWrite(cs, HIGH);
    if (v & 0x4) {
        // uh oh, no thermocouple attached!
        return NAN; 
    }
    v >>= 3;
    return v*0.25;
}

void setup() 
{
lcd.init(); 
lcd.backlight();
pinMode(A2, OUTPUT); //Steuert das SSR-Relais
pinMode(5, OUTPUT);  //Steuert eine LED zur Anzeige ob Sollwert = Istwert
pinMode(7, INPUT);  //Schalter sperrt die Potiabfrage
SPI.begin();
    pinMode(10, OUTPUT);  //MAXX6675 NR3
    pinMode(9, OUTPUT);  //MAXX6675 NR2
    pinMode(8, OUTPUT);  //MAXX6675 NR1
    digitalWrite(5, LOW); 
    digitalWrite(10, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(8, HIGH);
    Serial.begin(115200);
    digitalWrite(A2, HIGH);
    delay(500);
}

void loop() 
{
if(digitalRead(7) == HIGH)  //Abfrage ob Schalter gedrückt, sonst keine Abfrage der Sollwertänderung
  {
    sollread = analogRead(0);  //Abfrage Poti
    sollwert = map(sollread, 0, 1023, 130, 0);
    sollup = sollwert + 4;
    solldown = sollwert - 4;
  }
  
if(z>9) //Abfrage ob "z" hoch genug ist um die MAX6675 abzufragen, bei zu schneller Abfrage Fehler
  {
    temp1 = readCelsius(8);
    temp2 = readCelsius(9);
    temp3 = readCelsius(10);
    durchschnitttemp = (temp2+temp3) / 2;
    z=0;  //Zurücksetzen von z
  }
  
lcd.setCursor(0, 0);        //Ausgabe an das Display
lcd.print("Umgebung: ");
//lcd.setCursor(10, 0);
lcd.print(temp1);
lcd.print((char)223);
lcd.print("C");
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Sonde 1: ");
//lcd.setCursor(10, 1);
lcd.print(temp2);
lcd.print((char)223);
lcd.print("C");
lcd.print("   ");
lcd.setCursor(0, 2);
lcd.print("Sonde 2: ");
//lcd.setCursor(10, 2);
lcd.print(temp3);
lcd.print((char)223);
lcd.print("C");
lcd.print("   ");
lcd.setCursor(0, 3);
lcd.print("IST ");
lcd.print(durchschnitttemp);
lcd.print((char)223);
lcd.print("C");
lcd.print(" ");
//lcd.setCursor(10, 3);
lcd.print("SOLL ");
lcd.print(sollwert);
lcd.print((char)223);
lcd.print("C");

if(sollwert < 100)  //Damit das letzte Zeichen des Displays geupdatet wird bei 2-stelligen Zahlen
{
lcd.print(" ");
}

if(durchschnitttemp >= sollwert - 4 && durchschnitttemp <= sollwert + 4)  //Abfrage ob Sollwert im Istwert Bereich
{digitalWrite(5, HIGH);
}
else
{digitalWrite(5, LOW);
}

if(durchschnitttemp < sollwert - 1)  //Abfrage zur Ansteuerung des SSR-Relais
{digitalWrite(A2, LOW);
}

if(durchschnitttemp > sollwert + 1  && i>140)  // der i-wert ist da damit die Heizung eine gewissen Zeit an ist, bevor diese ausgeschaltet wird (meine "Hysterese")
{digitalWrite(A2, HIGH);
i=0;
}

delay(50);  //Kleine Pause vor den Zählern, damit die Abfrage nicht zu schnell für die MAX6675 ist

if(z < 50)  //damit es zu keinen Overflow kommt
{
z++;
}

if(i < 200)  //damit es zu keinen Overflow kommt
{                
i++;
}
}

Hallo,

ein Glück, daß es nur einen Arduino gibt mit einem Prozessortyp und Ram usw.

Will sagen: auf was für einem Arduino läuft das?
Und welche LiquidCrystal_I2C Lib? Da gibt es auch ein paar...

Gruß aus Berlin
Michael

Hallo,
lass es mal ohne die Heizung laufen.
Nur das SSR und alles was mit Netzspannung zu tun hat ganz weit weg.
Ein µC kann auch durch Störimpulse aus dem Stromnetz abstürzen.

Gruß Aron

Du schreibst nach einer "gewissen Zeit", um welchen Zeitraum handelt es sich denn?
Der Sketch kompiliert bei mir gar nicht da die Variabel sollup und solldown nicht deklariert sind, bist du dir sich den richtigen Sketch erwischt zu haben?

Du benutzt die Zähler um nach bestimmten Zeiten die Temperaturen einzulesen? Es wäre vielleicht einfacher das ganze über BlinkWithoutDelay zu lösen, die Nachtwächtererklärung ist eine sehr gute Hilfe dazu.

EDIT:
Der Fehler könnte hier liegen:

if(durchschnitttemp > sollwert + 1  && i>140)  // der i-wert ist da damit die Heizung eine gewissen Zeit an ist, bevor diese ausgeschaltet wird (meine "Hysterese")
{digitalWrite(A2, HIGH);
i=0;
}

wenn durchschnitttemp eine "längere" Zeit kleiner/gleich sollwert ist, wird i nicht mehr genullt und wird immer weiter hochgezählt. Und das ist die einzigste Stelle im Sketch wo i genullt werden kann.

Gruß

Danke für die zahlreichen Antworten!

amithlon:
Hallo,

ein Glück, daß es nur einen Arduino gibt mit einem Prozessortyp und Ram usw.

Will sagen: auf was für einem Arduino läuft das?
Und welche LiquidCrystal_I2C Lib? Da gibt es auch ein paar...

Gruß aus Berlin
Michael

Also Arduino habe ich den normale UNO R3, die Library V1.1.2 habe von (https://www.arduinolibraries.info/libraries/liquid-crystal-i2-c)

ar182:
Hallo,
lass es mal ohne die Heizung laufen.
Nur das SSR und alles was mit Netzspannung zu tun hat ganz weit weg.
Ein µC kann auch durch Störimpulse aus dem Stromnetz abstürzen.

Gruß Aron

Versuche ich heute Abend, soll ich dann die 5V aus dem USB Port oder kann das 5V Schaltnetzteil(übers 230V Netz) an lassen als Spannungsquelle?

Scherheinz:
Du schreibst nach einer "gewissen Zeit", um welchen Zeitraum handelt es sich denn?
Der Sketch kompiliert bei mir gar nicht da die Variabel sollup und solldown nicht deklariert sind, bist du dir sich den richtigen Sketch erwischt zu haben?

Du benutzt die Zähler um nach bestimmten Zeiten die Temperaturen einzulesen? Es wäre vielleicht einfacher das ganze über BlinkWithoutDelay zu lösen, die Nachtwächtererklärung ist eine sehr gute Hilfe dazu.

EDIT:
Der Fehler könnte hier liegen:

if(durchschnitttemp > sollwert + 1  && i>140)  // der i-wert ist da damit die Heizung eine gewissen Zeit an ist, bevor diese ausgeschaltet wird (meine "Hysterese")

{digitalWrite(A2, HIGH);
i=0;
}



wenn durchschnitttemp eine "längere" Zeit kleiner/gleich sollwert ist, wird **i** nicht mehr genullt und wird immer weiter hochgezählt. Und das ist die einzigste Stelle im Sketch wo **i** genullt werden kann. 

Gruß

hast Recht,das mit dem sollup und solldown kann raus, ist noch aus einer alten Version drin geblieben. Die Variablen wurden auch auch nicht verwendet (habe in den if-Bedingungen jetzt die Rechnung drin)

Das mit dem "BlinkWithoutDelay lese ich später nach und baue das als Alternative ein, vllt hilft es ja

Über das Zählerproblem habe ich bereits in anderen Forenbeiträgen gelesen, deswegen habe ich folgendes eingefügt um den Zähler zu stoppen ab einer gewissen Zahl

if(z < 50)  //damit es zu keinen Overflow kommt
{
z++;
}

if(i < 200)  //damit es zu keinen Overflow kommt
{                
i++;
}
}
}

Versuche ich heute Abend, soll ich dann die 5V aus dem USB Port oder kann das 5V Schaltnetzteil(übers 230V Netz) an lassen als Spannungsquelle?

Ist egal.
Grüße Uwe