#include <LCD_I2C.h>
LCD_I2C LCD1(0x27, 20, 4);
//Taster für Heizschlangen unten
const int Taster_Heizschlangen_unten = 50;
int tasterStatus = HIGH;
int Tasterzaehler = 0;
bool LEDSTATUS = false;
int entprellZeit = 100; //Hier wird die Zeit die entprellt wird eingestellt.
unsigned long tasterZeit = 0; //Hier wird die Zeit in ms abgespei
int LCD_Variable_HeizenOben_1 = 0;
//Taster für Heizschlangen oben
const int Taster_Heizschlangen_oben = 48;
int tasterStatus_1 = HIGH;
int Tasterzaehler_1 = 0;
bool LEDSTATUS_1 = false;
int entprellZeit_1 = 100; //Hier wird die Zeit die entprellt wird eingestellt.
unsigned long tasterZeit_1 = 0; //Hier wird die Zeit in ms abgespeichert
int LCD_Variable_HeizenUnten = 0;
//Temperatursimulation
int Heizen = A7;
int Heizen_MIN = 0;
int Heizen_MAX = 400;
int HeizenState;
int HeizenValue; //Müsste eigentlich der Mittelwert aus den Sensorwerten sein
//Counter-Poti Parameter
int CounterValue;
int CounterState;
bool CounterStarted = false;
int Poti_Counter_MIN = 0;
int Poti_Counter_MAX = 120;
//Temperatur-Poti Parameter
int TemperaturValue;
int TemperaturState;
int Poti_Temperatur_MIN = 100;
int Poti_Temperatur_MAX = 400;
//"Relaisausgaenge"
int Heizschlange_KF1 = 6;
int Heizschlange_KF2 = 32;
int Heizschlange_KF3 = 33;
int Heizschlange_KF4 = 7;
int Heizschlange_KF5 = 34;
int Luefter_oben = 9;
int Luefter_unten = 8;
int Summer = 28;
//Funktionsvariablen
int selectedHeater = 0; //0 fuer untere Heizschlangen, 1 fuer obere Heizschlangen. Wenn beide angewaehlt Wert = 3
bool HeizschlangenStatus = false;
bool CounterGO = false;
long unsigned int start;
long unsigned int intervall = 1000; // 1 Sekunde = "delay"
void setup()
{
LCD1.begin();
LCD1.backlight();
Serial.begin(9600);
pinMode(Heizschlange_KF1, OUTPUT);
pinMode(Heizschlange_KF2, OUTPUT);
pinMode(Heizschlange_KF3, OUTPUT);
pinMode(Heizschlange_KF4, OUTPUT);
pinMode(Heizschlange_KF5, OUTPUT);
pinMode(Luefter_oben, OUTPUT);
pinMode(Luefter_unten, OUTPUT);
pinMode(Summer, OUTPUT);
pinMode(Taster_Heizschlangen_oben, INPUT_PULLUP);
pinMode(Taster_Heizschlangen_unten, INPUT_PULLUP);
}
void loop()
{
//*******************************************Einschalten der Luefter im Einschaltmoment der Steuerung**************************
digitalWrite(Luefter_oben, HIGH);
digitalWrite(Luefter_unten, HIGH);
//*****************************************************************************************************************************
//********************************************************Tasterabfrage fuer Taster Heizschlagen oben**************************
tasterStatus_1 = digitalRead(Taster_Heizschlangen_oben);
if(tasterStatus_1 == LOW)
{
tasterZeit_1 = millis();
Tasterzaehler_1 = 1;
}
if ((millis() - tasterZeit_1 > entprellZeit_1) && Tasterzaehler_1 == 1)
{
LEDSTATUS_1 = !LEDSTATUS_1;
Tasterzaehler_1 = 0;
}
if(LEDSTATUS_1 == true)
{
selectedHeater = 1; //Oberen Heizschlangen angewaehlt
LCD_Variable_HeizenOben_1 = 1;
digitalWrite(Heizschlange_KF1, HIGH);
digitalWrite(Heizschlange_KF2, HIGH);
}
else
{
LCD_Variable_HeizenOben_1 = 0;
digitalWrite(Heizschlange_KF1, LOW);
digitalWrite(Heizschlange_KF2, LOW);
}
//************************************************************Heizschlangen unten**********************************************FERTIG!!!!!!
tasterStatus = digitalRead(Taster_Heizschlangen_unten);
if(tasterStatus == LOW)
{
tasterZeit = millis();
Tasterzaehler = 1;
}
if ((millis() - tasterZeit > entprellZeit) && Tasterzaehler == 1)
{
LEDSTATUS = !LEDSTATUS;
Tasterzaehler = 0;
}
if(LEDSTATUS == true)
{
selectedHeater = 2; //Untere Heizschlangen angewaehlt
LCD_Variable_HeizenUnten = 1;
digitalWrite(Heizschlange_KF5, HIGH);
digitalWrite(Heizschlange_KF4, HIGH);
digitalWrite(Heizschlange_KF3, HIGH);
}
else
{
LCD_Variable_HeizenUnten = 0;
digitalWrite(Heizschlange_KF5, LOW);
digitalWrite(Heizschlange_KF4, LOW);
digitalWrite(Heizschlange_KF3, LOW);
}
//******************************************************************************************************************************
//******************************************************Verweis auf Funktion je nach Auswahl der Heizschlangen******************
if (LEDSTATUS && LEDSTATUS_1) // Bedingung wenn beide Taster betätigt wurden.
{
selectedHeater = 3;
Temperaturstabilisierung_both(); // Fertig
}
else if (LEDSTATUS) // Bedingung wenn Heizschlangen unten angewählt wurden
{
selectedHeater = 1;
Temperaturstabilisierung_unten(); // Fertig
}
else if (LEDSTATUS_1)
{
selectedHeater = 2; // Bedingung wenn Heizschlangenoben angewählt wurden
Temperaturstabilisierung_oben();
}
else // Bedingung wenn kein taster betätigt wurde
{
selectedHeater = 0;
}
//Potiabfrage für Counter
CounterState = analogRead(A0);
CounterValue = map(CounterState, 0, 1023, Poti_Counter_MIN, Poti_Counter_MAX );
//Potiabfrage für Temperatur
TemperaturState = analogRead(A1);
TemperaturValue = map(TemperaturState, 0, 1023, Poti_Temperatur_MIN, Poti_Temperatur_MAX);
//Simulation Heizschlange mit Poti
HeizenState = analogRead(A7);
HeizenValue = map(HeizenState, 0, 1023, Heizen_MIN, Heizen_MAX);
Serial.print("Temperatur =");
Serial.println(HeizenValue);
//*********************************************************Verweis auf LCD-Funktion************************************************
updateLCD();
//*********************************************************************************************************************************
//*********************************************************Verweis auf TimerFunction sobald die eingestellte Temperatur erreich wurde*******
if(CounterGO)
{
unsigned long currentMillis = millis(); // Aktuelle Zeit abrufen
if(currentMillis - start >= intervall) // Intervall = 1 Sekunde.
{
start = currentMillis;
if(CounterValue > 0)
{
CounterValue--;
Serial.print("CounterValue");
Serial.println(CounterValue);
}
}
}
//*****************************************************************************************************************************************
}//Loop geschlossen
/*currentMillis wird initalisiert und bekommt im Moment der initialisierung den Wert aus millis(). Dadurch das aber millis logischerweise im Startmoment = 0 ist, hat die Variable currentMillis auch den Wert = 0.
innerhalb der if-Abfrage wird dann die Startzeit (currentMillis) - der letzten Zeit abgezogen. Beim ersten durchlauf ergibt das also 0-0 = 0 (if-Abfrage nicht erfüllt). Jetzt wird vor der if-Abfrage solange gewartet (1000ms)
bis currentMillis > als intervall ist. Das bedeutet die if-Abfrage ist somit true. Innerhalb der if-Abfrage wird der Wert von currentMillis an start übergeben. Das bedeutet also das start nun den Wert 1000 hat. Da ja die
if-Abfrage erst true war wenn der intervall >= der Berechnung war. Im nächsten Durchlauf passiert nun das selbe. Der wird von currentMillis wird wieder auf 0 gesetzt und die if-Abfrage ist erst dann true wenn 1000ms vergangen
sind. Somit wird statt einem delay(1000); bei dem das Programm stehen bleibt übergangen. Kurz gesagt ist die Variable intervall gleich dein delay() denn man normalerweise eintellt.*/
//********************************************************Fertig*********************************************************************
void Temperaturstabilisierung_oben()
{
if(HeizenValue < TemperaturValue && !HeizschlangenStatus)
{
HeizschlangenStatus = true;
}
else if(HeizenValue >= TemperaturValue && HeizschlangenStatus)
{
HeizschlangenStatus = false;
CounterGO = true;
}
if(HeizschlangenStatus == true)
{
digitalWrite(Heizschlange_KF1, HIGH);
digitalWrite(Heizschlange_KF2, HIGH);
}
if(HeizschlangenStatus == false)
{
digitalWrite(Heizschlange_KF1, LOW);
digitalWrite(Heizschlange_KF2, LOW);
}
}
//********************************************************************************************************************************
//********************************************************Fertig****************************************************************
void Temperaturstabilisierung_unten()
{
if(HeizenValue < TemperaturValue && !HeizschlangenStatus)
{
HeizschlangenStatus = true;
}
else if(HeizenValue >= TemperaturValue && HeizschlangenStatus)
{
HeizschlangenStatus = false;
CounterGO = true;
}
if(HeizschlangenStatus == true)
{
digitalWrite(Heizschlange_KF5, HIGH);
digitalWrite(Heizschlange_KF4, HIGH);
digitalWrite(Heizschlange_KF3, HIGH);
}
if(HeizschlangenStatus == false)
{
digitalWrite(Heizschlange_KF5, LOW);
digitalWrite(Heizschlange_KF4, LOW);
digitalWrite(Heizschlange_KF3, LOW);
}
}
//********************************************************************************************************************************
//********************************************************Fertig****************************************************************
void Temperaturstabilisierung_both()
{
if(HeizenValue < TemperaturValue && !HeizschlangenStatus)
{
HeizschlangenStatus = true;
}
else if(HeizenValue >= TemperaturValue && HeizschlangenStatus)
{
HeizschlangenStatus = false;
CounterGO = true;
}
if(HeizschlangenStatus == true)
{
digitalWrite(Heizschlange_KF5, HIGH);
digitalWrite(Heizschlange_KF4, HIGH);
digitalWrite(Heizschlange_KF3, HIGH);
digitalWrite(Heizschlange_KF2, HIGH);
digitalWrite(Heizschlange_KF1, HIGH);
}
if(HeizschlangenStatus == false)
{
digitalWrite(Heizschlange_KF5, LOW);
digitalWrite(Heizschlange_KF4, LOW);
digitalWrite(Heizschlange_KF3, LOW);
digitalWrite(Heizschlange_KF2, LOW);
digitalWrite(Heizschlange_KF1, LOW);
}
}
//********************************************************************************************************************************
void updateLCD()
{
delay(500);
switch(10*LCD_Variable_HeizenUnten + 1*LCD_Variable_HeizenOben_1 )
{
case 11:LCD1.clear();
LCD1.setCursor(0,0);
LCD1.print("Counter = ");
LCD1.print(CounterValue);
LCD1.setCursor(13,0);
LCD1.print("Minuten");
LCD1.setCursor(0,1);
LCD1.print("Temperatur =");
LCD1.setCursor(13,1);
LCD1.print(TemperaturValue);
LCD1.setCursor(0,2);
LCD1.print("Heizen oben = EIN");
LCD1.setCursor(0,3);
LCD1.print("Heizen unten EIN");
break;
case 10: LCD1.clear();
LCD1.setCursor(0,0);
LCD1.print("Counter = ");
LCD1.print(CounterValue);
LCD1.setCursor(13,0);
LCD1.print("Minuten");
LCD1.setCursor(0,1);
LCD1.print("Temperatur =");
LCD1.setCursor(13,1);
LCD1.print(TemperaturValue);
LCD1.setCursor(0,2);
LCD1.print("Heizen oben = AUS");
LCD1.setCursor(0,3);
LCD1.print("Heizen unten EIN");
break;
case 1: LCD1.clear();
LCD1.setCursor(0,0);
LCD1.print("Counter = ");
LCD1.print(CounterValue);
LCD1.setCursor(13,0);
LCD1.print("Minuten");
LCD1.setCursor(0,1);
LCD1.print("Temperatur =");
LCD1.setCursor(13,1);
LCD1.print(TemperaturValue);
LCD1.setCursor(0,2);
LCD1.print("Heizen oben = EIN");
LCD1.setCursor(0,3);
LCD1.print("Heizen unten AUS");
break;
default: LCD1.clear();
LCD1.setCursor(0,0);
LCD1.print("Counter = ");
LCD1.print(CounterValue);
LCD1.setCursor(13,0);
LCD1.print("Minuten");
LCD1.setCursor(0,1);
LCD1.print("Temperatur =");
LCD1.setCursor(13,1);
LCD1.print(TemperaturValue);
LCD1.setCursor(0,2);
LCD1.print("Heizen oben = AUS");
LCD1.setCursor(0,3);
LCD1.print("Heizen unten AUS");
break;
}
}
Falls ihr euch wundern solltet wo die Temperatur gemessen wird, einfach nicht beachten. Der steckt noch in einem anderen Teil. Stattdessen habe ich ganz einfach die Variable "HeizenValue" verwendet um die Temperatur innerhalb des Ofens schneller simulieren zu könne. Und das funktioniert auch so. Verwendet wird im übrigen der Arduino Mega 2560. Bei Fragen einfach kommentieren. Ich versuche schnellstmöglich darauf zu reagieren.
Danke im Vorraus!