Der Code hat zu viele Zeichen darum muss ich ihn auf zwei mal einfügen.
Insgesamt könnte es so funktionieren. Das heißt, es funktioniert, wenn der Taster mit den Schaltzeiten nicht wäre. Beim einbauen des Tasters klemmt es...
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define RTC_I2C_ADDRESS 0x68 // I2C Adresse der RTC ist 0x68 für DS1307 und DS3231
LiquidCrystal_I2C lcd(0x27,20,4); // I2C Adresse des 20x4 LCD
#define EIN HIGH // Active-High
#define AUS LOW // Active-High
// Konstanten
const int tasterPin = 4; // Taster an Pin 4 angeschlossen
const int RelaisPin = 10; // Relais an Pin 8 angeschlossen
// Variablen
int lichtmodus = 0; // Variable für die verschiedenen festgelegten Farben
int tasterStatus = LOW; // Variable zu speichern des Tasterstatus
char tm[15]; // für Zeit auf LCD
char wtag[4]; // für Wochentag auf LCD
/*****************Lampen-Schaltplan*******************/
struct schaltRelais_t{
byte pin;
int ein1; int aus1;
};
// Hier die Relais-Pins definieren mit Ein- und Ausschaltzeiten
schaltRelais_t schaltRelais[2]={
{8, 600, 2100}, // Pin, Einschaltzeit, Ausschaltzeit (08:00 - 19:00) //keine führenden Nullen!
};
/*****************END - Lampen-Schaltplan*************/
/*****************Beregnungs-Timer***************************/
struct timerRelais_t{
byte pin;
byte dauer;
int timer1;
int timer2;
};
timerRelais_t timerRelais={6, 25, 930, 1400}; // Timer an Pin-6 für 25 Sekunden um 09:30 und 14:00 //keine führenden Nullen!
/*****************END - Beregnungs-Timer*********************/
void relaisTimerNachZeit(int thishour, int thisminute)
{
int thisTime= thishour*100+thisminute;
if (thisTime==timerRelais.timer1 || thisTime==timerRelais.timer2)
{
Serial.println("Timer Start");
digitalWrite(timerRelais.pin,EIN);
lcd.clear();
lcd.setCursor ( 2, 1 );
lcd.print("TIMER AKTIV!"); //Ausgabe auf LCD vor delay()
delay(timerRelais.dauer*1000L);
lcd.clear();
digitalWrite(timerRelais.pin,AUS);
Serial.println("Timer Stopp");
}
}
void relaisSchaltenNachZeit(int thishour, int thisminute)
// Schaltet die Zeitschaltuhr ein und aus und setzt den Ausgang entsprechend
{
boolean state;
// Aus der aktuellen Zeit eine Schaltzeit bilden
int thisTime= thishour*100+thisminute;
// Alle Schaltzeiten durchgehen, falls eine davon EIN sagt, einschalten
for (int i=0;i<sizeof(schaltRelais)/sizeof(schaltRelais_t);i++)
{
state=AUS; // Amnahme: Es sei nichts geschaltet
if (
(thisTime>=schaltRelais[i].ein1 && thisTime<schaltRelais[i].aus1)
)
{
state=EIN;
}
if (digitalRead(schaltRelais[i].pin)!=state) // Falls geschaltet werden soll
{ // ein paar Debug-Ausgaben machen
Serial.print("Relais ");
Serial.print(i+1); // Relais-Index zählt ab 0, einfach 1 dazuzählen
Serial.print(": ");
if (state==EIN) Serial.println("EIN"); else Serial.println("AUS");
}
digitalWrite(schaltRelais[i].pin, state); // Schaltzustand setzen
}
}
/*****************Display RTC auf LCD************************/
void updateDisplay(int &wochentag, int &stunden, int &minuten, int &sekunden)
{
/*****************Wochentag - Zahl zu Wort*******************/
switch (wochentag) {
case 1:
strcpy(wtag, "Mo");
break;
case 2:
strcpy(wtag, "Di");
break;
case 3:
strcpy(wtag, "Mi");
break;
case 4:
strcpy(wtag, "Do");
break;
case 5:
strcpy(wtag, "Fr");
break;
case 6:
strcpy(wtag, "Sa");
break;
case 7:
strcpy(wtag, "So");
break;
}
/*****************END - Wochentag - Zahl zu Wort*******************/
sprintf(tm, "%02d:%02d:%02d",stunden, minuten, sekunden);
lcd.setCursor ( 8, 0 ); // Anzeige Zeile 1 rechts
lcd.print(wtag);
lcd.print(", ");
lcd.print(tm);
}
/*****************END - Display RTC auf LCD************************/
int jahre,monate,tage,wochentag,stunden,minuten,sekunden;
// wochentag bleibt in diesem Test-Sketch berücksichtigt
void rtcReadTime(int &jahre, int &monate, int &tage, int &wochentag, int &stunden, int &minuten, int &sekunden)
// aktuelle Zeit aus RTC auslesen
{
// Reset the register pointer
Wire.beginTransmission(RTC_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(RTC_I2C_ADDRESS, 7);
// A few of these need masks because certain bits are control bits
sekunden = bcdToDec(Wire.read() & 0x7f);
minuten = bcdToDec(Wire.read());
stunden = bcdToDec(Wire.read() & 0x3f); // Need to change this if 12 hour am/pm
wochentag = bcdToDec(Wire.read()); // Wochentag berücksichtigt!
tage = bcdToDec(Wire.read());
monate = bcdToDec(Wire.read());
jahre = bcdToDec(Wire.read())+2000;
}
void rtcWriteTime(int jahre, int monate, int tage, int wochentag, int stunden, int minuten, int sekunden)
// aktuelle Zeit in der RTC speichern
{
Wire.beginTransmission(RTC_I2C_ADDRESS);
Wire.write(0);
Wire.write(decToBcd(sekunden)); // 0 to bit 7 starts the clock
Wire.write(decToBcd(minuten));
Wire.write(decToBcd(stunden)); // If you want 12 hour am/pm you need to set bit 6 (also need to change readDateDs1307)
Wire.write(decToBcd(wochentag)); // Wochentag berücksichtigt!
Wire.write(decToBcd(tage));
Wire.write(decToBcd(monate));
Wire.write(decToBcd(jahre-2000));
Wire.endTransmission();
}
byte decToBcd(byte val) // Hilfsfunktion zum Lesen/Schreiben der RTC
// Convert decimal number to binary coded decimal
// Hilfsfunktion für die Echtzeituhr
{
return ( (val/10*16) + (val%10) );