Hallo Beieinander
Bei der Realisierung meines Schaltuhr Projekts hänge ich mal wieder fest.
Das Problem besteht beim Übergang der Einschaltzeit über die Mitternachtsgrenze also von 23:59 auf 0:00
Die Einschaltzeit wird folgendermaßen berechnet:
Feste Ausschaltzeit : hier 6:59
Einschaltdauer ist variabel und wird mittels Inkrementalgeber eingestellt ( zwischen 0 und 8 Stunden)
Einschaltzeit wird aus Ausschalzeit und Schaltdauer berechnet aber natürlich dann rückwärtz
Beispiel Ausschaltzeit: 6:59 6:59
Schaltdauer: 2:00 1:30
errechnete Einschaltdauer 4:59 5:29
Fehler:
- beim Übergang der errechneten Einschaltzeit von 23:59 auf 0:00 wird nicht 0:00 angezeigt sondern 0:59 und wird dann wider
runtergezählt - Die Schaltzeitberechnung funktioniert nur wenn ich die Minuten der Ausschaltzeit auf 59 setze ( Das ligt an der berechnung die nicht
richtig funkt wenn die errechnete Einschaltzeit von 0:00 auf 0:-1 geht )
Hier noch der Code:
// Schaltuhr für Elektroheizung
//
// noch zu erledigen: Entprellen des Inkrementalgebers verfeinern
// Errechnen des Ladebeginns
// Festlegen des Ladeendes
// Ladedauer in 10er Schritten erhöhen
// Anschluß DS1302
// DS1302: RST pin -> Arduino Digital 10
// DAT pin -> Arduino Digital 11
// CLK pin -> Arduino Digital 12
// VCC über eine Diode an +5V da sich die Batterei sonst eventuell entladen kann
// Anschluss Incrementalgeber
// Gemeinsamer Pin auf Masse
// ein Pin auf Digital 2
// ein Pin auf Digital 3
#include <LiquidCrystal.h>
#include <DS1302.h>
int AusgangLadung = 13;
int MinutenLadeende;
int StundenLadeende;
Time t;
int LadeZeitMinuten=00;
int LadeZeitStunden=6; // bei Stromausfall wird mit 6 Stunden gestartet
int encoderPin1 = 2;
int encoderPin2 = 3;
int LadeendeMinuten = 30; // Eingabe nur 59
int LadeendeStunden = 6;
int LadeanfangStunden = 23;
int LadeanfangMinuten;
int LadeanfangTag = 1; //wird nur benötigt für den Übergang Mitternacht
// Den DS1302 initialisieren
DS1302 rtc(10, 11, 12);
// Das LCD initialisieren
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
void setup()
{
digitalWrite(encoderPin1, HIGH); //der Pullupwiderstand wird aktiviert
digitalWrite(encoderPin2, HIGH); //der Pullupwiderstand wird aktiviert
attachInterrupt(0, updateEncoder, FALLING);//Der Interrupt reagiert auf fallende Flanke
rtc.halt(false); // setzt die Uhr in den run-Modus
rtc.writeProtect(false); // Hebt den Schreibschutz auf
// Einstellen auf ein LCD mit 16x4 Zeichen
lcd.begin(20, 4); //Achtung imme richtige Anzahl der Spalten und Zeilen eingeben
// hier wird die Zeit gesetzt ( Achtung wenn das Einstellen erfolgt ist dann auskommentieren und nochmals übertragen )
////////rtc.setTime(21, 05, 0);
}
void updateEncoder ()
{ // Eingabewert auf 8 Stunden begrenzt
if (digitalRead(encoderPin2) & LadeZeitStunden < 8) {LadeZeitMinuten ++;}
else {LadeZeitMinuten--;}
if (LadeZeitMinuten >59)
{ LadeZeitMinuten = 0;
LadeZeitStunden ++;}
if (LadeZeitMinuten < 0)
if (LadeZeitStunden > 0)
{ LadeZeitMinuten = 59 ;
LadeZeitStunden --;}
else
{ LadeZeitMinuten = 0;}
}
void loop()
{
//Berechnung der Zeit Ladeanfang
LadeanfangStunden = LadeendeStunden - LadeZeitStunden ;
LadeanfangMinuten = LadeendeMinuten - LadeZeitMinuten ;
// Uhrzeit anzeigen
lcd.setCursor (0, 0);
lcd.print("Uhrzeit");
lcd.setCursor(8, 0);
lcd.print(rtc.getTimeStr());
lcd.setCursor (0, 1);
lcd.print ("Ladedauer=");
lcd.setCursor (12, 1);
lcd.print (LadeZeitStunden);
lcd.setCursor (13, 1);
lcd.print (":");
if (LadeZeitMinuten <10) lcd.print("0"); // wenn Minuten einstellig wird eine 0 dafor geschrieben
lcd.print (LadeZeitMinuten);
// Ladeende anzeigen
lcd.setCursor (0, 2);
lcd.print("Ladeende=");
lcd.setCursor (12, 2);
lcd.print (LadeendeStunden);
lcd.print (":");
lcd.print (LadeendeMinuten);
//ladeanfang in Zeitformat umsetzen
if (LadeanfangMinuten >59)
{ LadeanfangMinuten = 0; //Bei Ladeanfang von 59 auf 60 Minuten auf 0 setzen
LadeanfangStunden ++;} //Bei Ladeanfang von 59 auf 60 Minuten Stunden um eins erhöhen
if (LadeanfangStunden >23)
{ LadeanfangStunden = 0; //Bei Ladeanfang von 23 auf 24 Sunden auf 0 setzen
LadeanfangTag ++;} //Bei Ladeanfang von 23 auf 24 Tag um eins erhöhen
if (LadeanfangMinuten < 0)
if (LadeanfangStunden > 0)
{ LadeanfangMinuten = 59 ;
LadeanfangStunden --;}
else
{ LadeanfangStunden = 0;}
if (LadeanfangStunden < 0)
if (LadeanfangTag > 0)
{ LadeanfangStunden = 23 ;
LadeanfangTag --;}
else
{ LadeanfangStunden = 0;}
// errechnete Ladeanfang anzeigen
lcd.setCursor (0, 3);
lcd.print ("Ladeanfang=");
lcd.setCursor (12, 3);
lcd.print (LadeanfangTag);
lcd.print (":");
lcd.print (LadeanfangStunden);
if (LadeanfangStunden <10) lcd.print("0"); // wenn Stunden einstellig wird eine 0 dafor geschrieben
lcd.print (":");
if (LadeanfangMinuten <10) lcd.print("0"); // wenn Minuten einstellig wird eine 0 dafor geschrieben
lcd.print (LadeanfangMinuten);
t = rtc.getTime();
delay(10); //just here to slow down the output, and show it will work even during a delay
}
Eventuell hat ja Jemand eine Idee an was es liegen könnte.
Schonmal Danke im Vorraus Rudi