#include <OneWire.h>
#include <DallasTemperature.h>
// Pindefinierung DS18B20 und vom Relay Shield
constexpr byte ONE_WIRE_BUS = A2;
constexpr byte noOfRelays = 4;
enum relayNames {HEIZUNG, HEIZANZEIGE, STEUERUNGSANZEIGE, FEHLERANZEIGE};
byte relayPin[noOfRelays] = {4, 7, 8, 12};
// Parameter und Steuerungsmodi
constexpr unsigned long MessIntervall = 1000UL;
constexpr unsigned long AlarmIntervall = 10*1000UL; // 10s statt der 10 min -> 10*60*1000UL;
constexpr float minTemp = 5.0;
constexpr float maxTemp = 10.0;
constexpr float differenzTemp = 2.0;
float startTemp;
enum SteuerungsModus {DONOTHING, STARTHEATING, HEATING, STOPHEATING, ERROR};
SteuerungsModus modus = DONOTHING;
SteuerungsModus lastModus = ERROR;
unsigned long heizungsStart;
unsigned long heizungsSekunden;
float actTemperature;
// Initialisierung OneWire-Bus und DallasTemperature
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void switchOn(relayNames rel) {
digitalWrite(relayPin[rel], HIGH);
}
void switchOff(relayNames rel) {
digitalWrite(relayPin[rel], LOW);
}
void checkTemperature() {
// Lesen Temperatur DS18B20
sensors.requestTemperatures();
actTemperature = sensors.getTempCByIndex(0);
// Ausgabe Serieller Monitor
Serial.print("Aktuell: ");
Serial.print(actTemperature);
if (modus == HEATING) {
Serial.print("\tStarttemperatur: ");
Serial.print(startTemp);
Serial.print("\t seit ");
Serial.print(heizungsSekunden);
Serial.print(" [s]");
}
Serial.println();
}
void messung() {
static unsigned long letzteMessung = 0;
if (millis() - letzteMessung > MessIntervall) {
letzteMessung = millis();
checkTemperature();
}
}
// {DONOTHING,STARTHEATING, HEATING, STOPHEATING, ERROR};
void stateMachine() {
static unsigned long lastCheck = 0;
messung();
switch (modus) {
case DONOTHING:
if (actTemperature < minTemp) {
modus = STARTHEATING;
}
break;
case STARTHEATING:
switchOn(HEIZUNG);
switchOn(HEIZANZEIGE);
heizungsStart = millis();
startTemp = actTemperature;
heizungsSekunden = 0;
modus = HEATING;
break;
case HEATING:
//Check for temp!
if (actTemperature > maxTemp) {
modus = STOPHEATING;
return;
};
if (millis()-lastCheck >= 1000) {
lastCheck = millis();
heizungsSekunden++;
}
if (millis() - heizungsStart > AlarmIntervall && actTemperature - startTemp < differenzTemp) {
Serial.println("Error!");
switchOff(HEIZUNG);
switchOff(HEIZANZEIGE);
switchOff(STEUERUNGSANZEIGE);
switchOn(FEHLERANZEIGE);
modus = ERROR;
}
break;
case STOPHEATING:
switchOff(HEIZUNG);
switchOff(HEIZANZEIGE);
modus = DONOTHING;
break;
case ERROR:
break;
}
}
void setup() {
Serial.begin(115200);
for (int i = 0; i < noOfRelays; i++) {
pinMode(relayPin[i], OUTPUT);
}
sensors.begin();
switchOn(STEUERUNGSANZEIGE);
}
void loop() {
stateMachine();
}