ich habe nach einer wirklich guten Anleitung (https://dracarysdiy.com/word-clock-v2/) eine Wordclock gebaut. Die funktioniert grundsätzlich, hat aber bei der Anzeige um 1 Uhr herum "Darstellungsschwierigkeiten".
Sie zeigt also nicht "Viertel vor Eins" oder "Viertel nach Eins" an. Durch Testen meine ich das auf die Berechnung der Sommer-/Winterzeit zurückführen zu können.
(Wenn ich in der Sommerzeit als Startdatum 12:45 eingebe, dann will die Uhr "Viertel vor 13" ausgeben, was natürlich nicht funktioniert...)
(Wenn ich in der Winterzeit als Startzeit 13:45 eingebe, dann kann die Uhr "Viertel vor 1" anzeigen).
Deswegen möchte ich euch fragen, ob ihr mal speziell den Teil dieser Berechnung checken könnt. Ich komm da so nicht weiter...
void CheckDST(void){
//Funktion zum Überprüfen ob Sommer oder Winterzeit
Tag = day();
Monat = month();
WochenTag = (weekday()-1);
int Hilf = Tag-WochenTag;
if(Monat <= 2 || Monat >= 11)
DST = false; // Winterzeit
if(Monat >= 4 && Monat <= 9)
DST = true; // Sommerzeit
if((Monat == 3) && (Hilf >= 25))
DST = true; // Beginn der Sommerzeit
if((Monat == 10) && (Hilf >= 25))
DST = false; // Beginn der Winterzeit
if(DST == true){
Stunde += 1;
if(Stunde > 12)
Stunde = Stunde-12;
}
}
Macht das so Sinn, oder ist da ein Fehler drin?
Eine weitere Berechnung erfolgt dann nur bei der Stundenberechnung, aber die erscheint mir ok:
void loop() {
/* Schleifen Funktion, die die Uhrzeit ausliest und dann in die
* entsprechende Funktionen übergibt.
*/
Minute = minute();
int Std = hour();
if(Std > 12)
Stunde = Std-12;
else if (Std == 0)
Stunde = 12;
else
Stunde = Std;
Den kompletten Sketch habe ich angehängt (so zur Info).
Ok, das Problem mit der nicht angezeigten zeit um 1 Uhr ist nicht mehr da, allerdings ist jetzt das ganze Jahr durch die gleiche Zeit, sprich es erfolgt keine Korrektur der Uhrzeit um 1h...
Das kann so nicht stimmen... (Oder ich verstehe es nicht)
Folgendes habe ich jetzt eingesetzt.
void CheckDST(void){
//Funktion zum Überprüfen ob Sommer oder Winterzeit
Tag = day();
Monat = month();
int Std = hour ();
WochenTag = (weekday()-1);
int Hilf = Tag-WochenTag;
if(Monat <= 2 || Monat >= 11)
DST = false; // Winterzeit
if(Monat >= 4 && Monat <= 9)
DST = true; // Sommerzeit
if((Monat == 3) && (Hilf >= 25))
DST = true; // Beginn der Sommerzeit
if((Monat == 10) && (Hilf >= 25))
DST = false; // Beginn der Winterzeit
if(DST == true){ // Sommerzeitkorrektur
if(Std > 12)
Stunde = Std-12;
else if (Std == 0)
Stunde = 12;
else
Stunde = Std;
}
}
Es fehlt die Subtraktion oder Addition einer Stunde je nach Status von DST. Diese Codefragmente helfen sehr wenig bei der Fehlersuche, da sich die meisten Fehler und Lösungsansätze erst im Zusammenspiel mit den anderen Funktionen ergeben. In dem Fall solltest du zumindest noch die Loop dazu setzen.
Ist praktisch doppelt. sowohl in loop wie auch checkDST, so was kann sehr leicht zu Fehlern führen. Du dokterst da ziemlich herum.
Ich habe das aus checkDST rausgenommen. Die Funktion checkDST gibt nur Sommer-/Winterzeit als boolean zurück. In der loop wird erst die RTC ausgelesen, dann auf Sommerzeit geprüft, wenn Sommerzeit ist, die Stunde um eins reduziert.
boolean CheckDST(void){
//Funktion zum Überprüfen ob Sommer oder Winterzeit
Tag = day();
Monat = month();
WochenTag = (weekday()-1);
int Hilf = Tag-WochenTag;
if(Monat <= 2 || Monat >= 11)
DST = false; // Winterzeit
if(Monat >= 4 && Monat <= 9)
DST = true; // Sommerzeit
if((Monat == 3) && (Hilf >= 25))
DST = true; // Beginn der Sommerzeit
if((Monat == 10) && (Hilf >= 25))
DST = false; // Beginn der Winterzeit
return(DST);
}
void loop() {
/* Schleifen Funktion, die die Uhrzeit ausliest und dann in die
* entsprechende Funktionen übergibt.
*/
Minute = minute();
int Std = hour();
Std= (24+Std-CheckDST())%24; //Reduzierung von DST um eine Stunde, wenn Winterzeit.
if(Std > 12)
Stunde = Std-12;
else if (Std == 0)
Stunde = 12;
else
Stunde = Std;
displaytime();
FastLED.delay(250);
Serial.println(Stunde);
Serial.println(Minute);
}
Ich hoffe, ich habe nicht noch einen Fehler eingebaut. Ist nicht in der IDE geprüft.