// HotMo Steuerung Version 2.3
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Initialisierung des I2C-Displays
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Initialisierung des OneWire-Bus
OneWire oneWire(2);
DallasTemperature sensors(&oneWire);
// Definition der Pins
const int Notausschaltung = 4;
const int pinSchalter1 = 5;
const int pinSchalter2 = 6;
const int pinLEDHeiz = 7;
const int pinRelais = 8;
const int pinRegelung = 9;
const int pinLED = 10;
// Variablen für die Solltemperatur
int Tsoll = 60;
const int TsollMinimum = 60;
const int TsollMaximum = 95;
// Zustandsvariablen
bool heizungEin = false;
unsigned long letzteAenderung = 0;
unsigned long startZeitUeberschreitung = 0; // Zeitpunkt der ersten Überschreitung
bool ueberschreitungAktiv = false; // Zustand der Überschreitung
unsigned long abschaltzeit = 0;
unsigned long abschaltzeit_dauer = 14400000; // Zeit in Millisekunden für Abschalt timer, hier 4 Stunden
unsigned long previousMillis = 0;
const long interval = 1500; // 1.5 Sekunden (resample Rate des Displays)
unsigned long startTime = 0; // Startzeit, wenn das HeizungsRelais pin8 eingeschaltet wird
bool isHeating = false; // Status der Heizung zum abgleich für die 50 min abschaltung (false ist ausgeschaltet)
void setup() {
// Initialisierung des LCD-Bildschirms
lcd.init();
lcd.backlight();
// Konfiguration der Pins
pinMode(Notausschaltung, INPUT_PULLUP);
pinMode(pinSchalter1, INPUT_PULLUP);
pinMode(pinSchalter2, INPUT_PULLUP);
pinMode(pinRelais, OUTPUT);
pinMode(pinLED, OUTPUT);
pinMode(pinRegelung, INPUT_PULLUP);
pinMode(pinLEDHeiz, OUTPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Sauna Steuerung");
lcd.setCursor(0, 1);
lcd.print("HotM0 V2.3");
delay(5000);
lcd.clear();
// Starten des Temperatursensors
sensors.begin();
}
void loop() {
// Lesen der aktuellen Temperatur
sensors.requestTemperatures();
float Tist = sensors.getTempCByIndex(0);
// Abfrage der Schalter und soll Temperatur einstellung
if (!digitalRead(pinSchalter1) && (millis() - letzteAenderung > 300)) {
Tsoll = min(Tsoll + 5, TsollMaximum);
lcd.clear(); //Lösche das gesammte Display (dieser block baut display neu auf)
lcd.setCursor(0, 0);
lcd.print(Tsoll);
lcd.write(223); // Gradzeichen
lcd.print("C Soll");
lcd.setCursor(0, 1);
lcd.print(int(Tist));
lcd.write(223); // Gradzeichen
lcd.print("C Ist");
letzteAenderung = millis();
}
if (!digitalRead(pinSchalter2) && (millis() - letzteAenderung > 300)) {
Tsoll = max(Tsoll - 5, TsollMinimum);
lcd.clear(); //Lösche das gesammte Display (dieser block baut display neu auf)
lcd.setCursor(0, 0);
lcd.print(Tsoll);
lcd.write(223); // Gradzeichen
lcd.print("C Soll");
lcd.setCursor(0, 1);
lcd.print(int(Tist));
lcd.write(223); // Gradzeichen
lcd.print("C Ist");
letzteAenderung = millis();
}
// Anzeige der Temperaturen auf dem LCD
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) { // interval ist die Resample rate des displays
previousMillis = currentMillis;
if (Tist > -40) { // blendet sensor fehler aus die mit -127 angezeigt werden
lcd.clear(); //Lösche das gesammte Display
lcd.setCursor(0, 0);
lcd.print(Tsoll);
lcd.write(223); // Gradzeichen
lcd.print("C Soll");
lcd.setCursor(0, 1);
lcd.print(int(Tist));
lcd.write(223); // Gradzeichen
lcd.print("C Ist");
}
}
// Zeitabschaltung 4Stunden Dauerbetrieb
if (digitalRead(pinRegelung) == HIGH) {
abschaltzeit = millis() + abschaltzeit_dauer; // Wenn pinRegelung gesetzt ist, starte den Timer
}
if (millis() >= abschaltzeit) { // Wenn der Timer abgelaufen ist(4h), schalte die Pins (Heizung) aus
digitalWrite(pinRelais, LOW); // Ofen ausschalten
digitalWrite(pinLEDHeiz, LOW); // Heizung LED ausschalten
lcd.clear(); //Lösche das gesammte Display
lcd.setCursor(0, 0);
lcd.print("Zeit Abgelaufen");
lcd.setCursor(0, 1);
lcd.print("Heizung AUS");
int PauseRegelung = digitalRead(pinRegelung); // Lese den Eingangszustand
while (PauseRegelung == LOW) { // Programm Wartet bis PinRegelung wieder eingeschaltet wird
PauseRegelung = digitalRead(pinRegelung);
}
lcd.clear();
}
// Zeitabschaltung wenn mehr als 50 minuten dauer heizen
if (isHeating) {
if (millis() - startTime >= 3000000) { // 3000000 Millisekunden = 50 Minuten dann Heizung ausschalten
digitalWrite(pinRelais, LOW); // Ofen ausschalten
digitalWrite(pinLEDHeiz, LOW); // Heizung LED ausschalten
lcd.clear(); //Lösche das gesammte Display
lcd.setCursor(0, 0); // Schreibe Fehlermeldung
lcd.print("Notabschaltung");
lcd.setCursor(0, 1);
lcd.print("Dauerbetr.>50min");
while (true) {} // Programm anhalten
}
} else { // Setze startTime zurück, wenn die Heizung ausgeschaltet ist
startTime = millis();
}
// Notabschaltung durch zu hohe Temperatur (über 104°C) oder Plausiebeler Wert
if(Tist>104.0){ //Überprüfung ob die Max Tempertatur von 104°C Überschritten ist
delay(3000); // Warte 3 Secunden
sensors.requestTemperatures();
float Tist = sensors.getTempCByIndex(0);
if(Tist>104.0){ //Überprüfung ob die Max Tempertatur von 104°C Überschritten ist
delay(2000); // Warte 1 Secunden
sensors.requestTemperatures();
float Tist = sensors.getTempCByIndex(0);
if(Tist>104.0){ // Wenn die Temperatur immer noch über 104°C Liegt System Abschalten
digitalWrite(pinRelais, LOW); // Ofen ausschalten
digitalWrite(pinLEDHeiz, LOW); // Heizung LED ausschalten
lcd.clear(); //Lösche das gesammte Display
lcd.setCursor(0, 0); // Schreibe Fehlermeldung
lcd.print("Notabschaltung");
lcd.setCursor(0, 1);
lcd.print("OVER-Temp 105");
while (true) {} // Programm anhalten
}
}
}
// Notabschaltung durch Sensor Fehler zu tiefe Temperatur
if(Tist<-30.0){ //Überprüfung ob die Max Tempertatur von 104°C Überschritten ist
delay(4000); // Warte 3 Secunden
sensors.requestTemperatures();
float Tist = sensors.getTempCByIndex(0);
if(Tist<-30.0){ //Überprüfung ob die Max Tempertatur von 104°C Überschritten ist
delay(2000); // Warte 1 Secunden
sensors.requestTemperatures();
float Tist = sensors.getTempCByIndex(0);
if(Tist<-30.0){ // Wenn die Temperatur immer noch über 104°C Liegt System Abschalten
digitalWrite(pinRelais, LOW); // Ofen ausschalten
digitalWrite(pinLEDHeiz, LOW); // Heizung LED ausschalten
lcd.clear(); //Lösche das gesammte Display
lcd.setCursor(0, 0); // Schreibe Fehlermeldung
lcd.print("Notabschaltung");
lcd.setCursor(0, 1);
lcd.print("Temp Value Low");
while (true) {} // Programm anhalten
}
}
}
// Notabschaltung durch SF139 SEFUSE
if(!digitalRead(Notausschaltung) == LOW){ //SeFUSE ist wegen überhizung geschmolzen / Stromkreis unterbrochen
delay(5000);
if(!digitalRead(Notausschaltung) == LOW) {
digitalWrite(pinRelais, LOW); // Ofen ausschalten
digitalWrite(pinLEDHeiz, LOW); // Heizung LED ausschalten
lcd.clear(); //Lösche das gesammte Display
lcd.setCursor(0, 0);
lcd.print("Notabschaltung");
lcd.setCursor(0, 1);
lcd.print("Over-Temp SeFUSE");
while (true) {} // Programm anhalten
}
}
// Regelung der Heizung
heizungEin = !digitalRead(pinRegelung);
if (heizungEin) {
if ((Tist < Tsoll - 2) && !ueberschreitungAktiv) {
startZeitUeberschreitung = millis();
ueberschreitungAktiv = true;
}
if ((Tist > Tsoll + 3) || !heizungEin) {
ueberschreitungAktiv = false;
}
if (ueberschreitungAktiv && (millis() - startZeitUeberschreitung >= 10000)) {
digitalWrite(pinRelais, HIGH); // Ofen einschalten
digitalWrite(pinLEDHeiz, HIGH); // Heizung LED einschalten
isHeating = true;
} else {
digitalWrite(pinRelais, LOW); // Ofen ausschalten
digitalWrite(pinLEDHeiz, LOW); // Heizung LED ausschalten
isHeating = false;
}
digitalWrite(pinLED, HIGH);
} else {
digitalWrite(pinRelais, LOW);// Ofen ausschalten
digitalWrite(pinLEDHeiz, LOW); // Heizung LED ausschalten
isHeating = false;
ueberschreitungAktiv = false;
digitalWrite(pinLED, LOW);
}
}