Winter-/Sommerzeit einstellen bei einer Wordclock

Moin,

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).

Danke für eure Hilfe!!!
Arne

Wordclock_WS2812.ino (12.5 KB)

Arne3a:
Den kompletten Sketch habe ich angehängt (so zur Info).

In dem Sketch steht was anderes als in den hier gezeigten Codeausschnitten.

Aus Wordclock_WS2812.ino

  if(DST == true){
    if(Stunde > 12)
      Stunde = Stunde-12;
    Stunde += 1;

Wenn Stunde 12 ist, dann kommt da 13Uhr raus.

Ich würde in der Loop die Reihenfolge ändern

    Minute = minute(); 
    int Std = hour();
CheckDST();
    if(Std > 12)
      Stunde = Std-12;
    else if (Std == 0)
      Stunde = 12;
    else
      Stunde = Std;

In CheckDST wird nur Std bei Winterzeit um 1 erhöht. Dann sollte man noch modulo 24 (%24) teilen, damit es nicht 25Uhr werden kann.

Hallo Theseus,

schon mal vielen Dank für deine Antwort!

Kannst du mir erläutern, was du mit dem folgenden meinst, und wie ich das einbaue?

Theseus:
In CheckDST wird nur Std bei Winterzeit um 1 erhöht. Dann sollte man noch modulo 24 (%24) teilen, damit es nicht 25Uhr werden kann.

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;
      }
}

Wo ist der Fehler?

Danke und viele Grüße
Arne

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.

Hi Theseus,

danke für die Antwort zu später Stunde :sunglasses:

Ich habe noch mal weiter rumgepfuscht und folgendes habe ich jetzt im Versuch:

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){
    if (Stunde <= 11)
      Stunde = Stunde + 1;
    else if (Stunde > 12)
      Stunde = Stunde-12+1;
    else if (Stunde == 12)
      Stunde = 1;
    else if (Stunde == 24)
      Stunde = 1;
           //Stunde += 1;
  }
}

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;
   
    CheckDST();
    displaytime();
    FastLED.delay(250);
    Serial.println(Stunde);
    Serial.println(Minute);
}

Wie sieht das für dich aus?

Danke
Arne

    if(Std > 12)
      Stunde = Std-12;
    else if (Std == 0)
      Stunde = 12;
    else
      Stunde = Std;

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.

Ich habe noch mal weiter rumgepfuscht und folgendes habe ich jetzt im Versuch:

[...]

Wie sieht das für dich aus?

Vielleicht schaust Du mal, was Du hier verwenden kannst:
https://forum.arduino.cc/index.php?topic=154768.0

Viel spannender mit ganz viel Hintergrund:

Gruß