Der Code ist im Vergleich zu seiner eigentlichen Funktion ziemlich komplex, weil ich einfach viel Optimierung durchgeführt habe, die für den Benutzer eben angenehmer ist. Darunter fällt das vermeiden von Doppelklicks an Knöpfen, dass das Display nach einem eventuellen Blinken wieder den vorher eingestellten AN oder AUS Zustand erreicht (und nicht halt einfach beim letzten Blinkzustand "stehenbleibt"), etc.
Ich habe so viel Kommentiert wie grade ging, vielleicht könnt ihr ja Teile davon nachvollziehen.. Ist etwas chaotisch, da ich kein routinierter Coder bin. Vorgegebenes Blinkintervall ist übrigens 1,0 Sek und nicht 0.5, wie ich weiter oben erwähnt habe.
#include <dht.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <ds3231.h>
#include <rtc_ds3231.h>
#define I2C_ADDR 0x27
#define Rs_pin 0
#define Rw_pin 1
#define En_pin 2
#define BACKLIGHT_PIN 3
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
bool LCD_flag=1;
//Definitionen und Variablen zur Temperaturmessung
#define dht_apin A0 // Lege A0 als dht-Pin fest
dht DHT; //DHT struct Variable
int temp=0;
int luft=0;
int zaehler_f_check=1795; //Zahlvariable um eine schleife alle 1800sek (halbe stunde) aktivieren zu können
int zaehler_f_auslesen=5; //Zählvariable um eine schleife ale 5 Sek aktivieren zu können
int eingabe_min=10; //Fuer eingabe Mindesttemp
int eingabe_max=10; //Fuer eingabe Maximaltemp
bool eingabe_backlight=1;
//Variable zur Relaissteuerung
const int relaisPin1 = 3; // Zur Steuerung Temperaturabhängig (Wenn minimaltemp erreicht, dann schalte relais an)
const int relaisPin2 = 5; // Zur Steuerung Zeitabhängig (Wenn im Fenster der Zeitschaltuhr, dann schalte relais an)
//Zeitschaltuhr
bool zsu_ja=0;
int zsu_anfang=0;
int zsu_ende=0;
//LCD Funktion
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);
//Variablen für Knöpfe
int button1=13; // Knopf 1 ist am Pin 13 angebracht und wird dementsprechend in der Variablen so festgelegt
int button2=12; // Knopf 2 ist am Pin 12 angebracht und wird dementsprechend in der Variablen so festgelegt
int wert1=HIGH;
int wert2=HIGH;
int warten=0;
int timetemp=0;
void setup()
{
lcd.begin (16,2);
lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE); //Erlaube den Zugriff auf das EIN/AUS-Schalten der Hintergrundbeleuchtung
lcd.setBacklight(HIGH); // LCD von anfang an beleuchtet
pinMode(relaisPin1, OUTPUT);
pinMode(relaisPin2, OUTPUT);
digitalWrite(relaisPin1, HIGH); //Relais von anfang an aus
digitalWrite(relaisPin2, HIGH); //Relais von anfang an aus
digitalWrite(button1, HIGH); // Aktiviert pull up für knopf 1
digitalWrite(button2, HIGH); // Aktiviert Pull up für Knopf 1
DS3231_init(DS3231_INTCN);
// Der folgende Codeabschnitt ist lediglich für eine eingabe von Tempwert Max, Tempwert Min, Zeitschaltuhr aktiviert JA/Nein, und falls ZSU Ja -> Start-Zeit und Endzeit
// Um Eine saubere eingabe mit den Knöpfen zu ermöglichen habe ich code geschrieben, dass ein knopf nur alle 200ms nach dem letzten drücken wieder gedrückt werden kann, damit keine doppel/dreifachklicks durch einmaliges drücken entstehen
bool freigabe_min=1;
signed int freigabe_min_zeit=0;
lcd.clear(); // Löche alles auf dem LCD
lcd.setCursor (0,0); // Gehe im Display in die erste Zeile an den Anfang
lcd.print("Temperatur Min?"); // Schreibe "Temperatur Min?" aufs Display
lcd.setCursor(0,1);
lcd.print(eingabe_min);
while(digitalRead(button2)==HIGH)
{
lcd.setCursor(0,1);
lcd.print(eingabe_min);
if(digitalRead(button1)==LOW && freigabe_min==1){if(eingabe_min==59){eingabe_min=10; freigabe_min=0; freigabe_min_zeit=millis();}else{eingabe_min=eingabe_min+1; freigabe_min=0; freigabe_min_zeit=millis();}}else{;}
lcd.print("C");
if(millis() > (freigabe_min_zeit + 200)){freigabe_min=1;}
delay(5);
}
bool freigabe_max=1;
signed int freigabe_max_zeit=0;
lcd.clear(); // Löche alles auf dem LCD
eingabe_max=(eingabe_min+1);
lcd.setCursor (0,0); // Gehe im Display in die erste Zeile an den Anfang
lcd.print("Temperatur Max?"); // Schreibe "Temperatur Max?" aufs Display
lcd.setCursor(0,1);
lcd.print(eingabe_max);
delay(300);
while(digitalRead(button2)==HIGH)
{
lcd.setCursor(0,1);
lcd.print(eingabe_max);
if(digitalRead(button1)==LOW && freigabe_max==1){if(eingabe_max==60){eingabe_max=(eingabe_min+1); freigabe_max=0; freigabe_max_zeit=millis();}else{eingabe_max=eingabe_max+1; freigabe_max=0; freigabe_max_zeit=millis();}}else{;}
lcd.print("C");
if(millis() > (freigabe_max_zeit + 200)){freigabe_max=1;}
delay(5);
}
lcd.clear(); // Löche alles auf dem LCD
lcd.setCursor (0,0); // Gehe im Display in die erste Zeile an den Anfang
lcd.print("Zeitschaltuhr?"); // Schreibe "Zeitschaltuhr?" aufs Display
lcd.setCursor(0,1);
lcd.print("JA/NEIN");
delay(300);
while((digitalRead(button1)==HIGH) && (digitalRead(button2)==HIGH))
{delay(10);}
if(digitalRead(button1)==LOW){zsu_ja=1;} else{zsu_ja=0;}
if(zsu_ja==1)
{
bool freigabe_start=1;
signed int freigabe_start_zeit=0;
lcd.clear(); // Löche alles auf dem LCD
lcd.setCursor (0,0); // Gehe im Display in die erste Zeile an den Anfang
lcd.print("Beginn Lampe?"); // Schreibe "Beginn Lampe?" aufs Display
lcd.setCursor(0,1);
lcd.print(zsu_anfang);
delay(300);
while(digitalRead(button2)==HIGH)
{
if(digitalRead(button1)==LOW && freigabe_start==1){lcd.setCursor(0,1); lcd.print(" "); if(zsu_anfang==24){zsu_anfang=0; freigabe_start=0; freigabe_start_zeit=millis();}else{zsu_anfang=zsu_anfang+1; freigabe_start=0; freigabe_start_zeit=millis();}}else{;}
lcd.setCursor(0,1);
lcd.print(zsu_anfang);
lcd.print("Uhr");
if(millis() > (freigabe_start_zeit + 200)){freigabe_start=1;}
delay(5);
}
bool freigabe_ende=1;
signed int freigabe_ende_zeit=0;
lcd.clear(); // Löche alles auf dem LCD
lcd.setCursor (0,0); // Gehe im Display in die erste Zeile an den Anfang
lcd.print("Ende Lampe?"); // Schreibe "Ende?" aufs Display
delay(300);
lcd.setCursor(0,1);
lcd.print(zsu_ende);
while(digitalRead(button2)==HIGH)
{
if(digitalRead(button1)==LOW && freigabe_ende==1){lcd.setCursor(0,1); lcd.print(" ");if(zsu_ende==24){zsu_ende=0; freigabe_ende=0; freigabe_ende_zeit=millis();}else{zsu_ende=zsu_ende+1; freigabe_ende=0; freigabe_ende_zeit=millis();} if(zsu_ende==zsu_anfang){zsu_ende=zsu_ende+1;if(zsu_ende==25){zsu_ende=1;}}else{;}}else{;}
lcd.setCursor(0,1);
lcd.print(zsu_ende);
lcd.print("Uhr");
if(millis() > (freigabe_ende_zeit + 200)){freigabe_ende=1;}
delay(5);
}
}
else{;}
}