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++;
}
}