Wortuhr Stunden Fehler

Ich hab einen sporadischen Fehler:

Wenn es ungefähr HH:55 bis HH:59 wird manchmal eine Stunde später angezeigt also HH+1:59

Weiß jemand an was das liegen kann, ich finde den Fehler im Code leider nicht...

#include <DS3232RTC.h>
#include <Time.h> 
#include <Wire.h>  
#include <FastLED.h> 





FASTLED_USING_NAMESPACE
#define DATA_PIN    3
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB
#define NUM_LEDS    209      
CRGB leds[NUM_LEDS];


uint8_t BRIGHTNESS        = 200;  

uint8_t Stunde     = 0;
uint8_t Minute     = 15; 
uint8_t WochenTag  = 0;   
uint8_t Tag        = 30;
uint8_t Monat      = 10;
boolean DST        = false;


int Es[]     = {}; 
int Ist[]     = {}; 

int Eins[]      = {}; 
int Ein[]       = {};
int Zwei[]      = {}; 
int Drei[]      = {}; 
int Vier[]      = {}; 
int Fuenf[]     = {}; 
int Sechs[]     = {}; 
int Sieben[]    = {}; 
int Acht[]      = {}; 
int Neun[]      = {}; 
int Zehn[]      = {}; 
int Elf[]       = {};
int Zwoelf[]    = {};
int MZwanzig[]  = {}; 
int MFuenf[]    = {}; 
int MZehn[]     = {}; 

int Viertel[]   = {}; 
int Vor[]       = {};  
int Nach[]      = {}; 
int Halb[]      = {}; 
int Uhr[]       = {}; 
int Und[]       = {}; 

int EinsM[]     = {}; 
int ZweiM[]     = {}; 
int DreiM[]     = {}; 
int VierM[]     = {}; 

int i;
int oldminute;
long farbe = 0xFFFFFF;

void setup() {
  delay(3000);
  Serial.begin(19200);
  
  FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalPixelString);

  
  setSyncProvider(RTC.get);
  if(timeStatus() != timeSet) {
     //Serial.println("Unable to sync with the RTC");
  }else if(timeStatus() != timeNeedsSync){
     //Serial.println("RTC has set the system time"); 
  }else{
    //Serial.println("RTC has set the system time but needs Sync");  
  }
  oldminute = minute();
}

void SwitchLED(int MyArray[], int n) {
  
 
  for (i = MyArray[0]; i < MyArray[0]+n; i++) {
      leds[i] = farbe;                      
      FastLED.setBrightness(BRIGHTNESS);
  }
}

void displaytime(void){
  
  fill_solid( leds, NUM_LEDS, CHSV(0, 0, 0));
  CheckDST();
  SwitchLED(Es, (sizeof(Es)/2));
  SwitchLED(Ist, (sizeof(Ist)/2));
  if (((Minute>4) && (Minute<10)) || (Minute>54)) { 
    SwitchLED(MFuenf, (sizeof(MFuenf)/2));
  }
  if (((Minute>9) && (Minute<15)) || ((Minute>49) && (Minute<55))) { 
    SwitchLED(MZehn, (sizeof(MZehn)/2));
  }
  if (((Minute>14) && (Minute<20)) || ((Minute>44) && (Minute<50))) {
    SwitchLED(Viertel, (sizeof(Viertel)/2)); 
  }
  if (((Minute>19) && (Minute<25)) || ((Minute>39) && (Minute<45))) { 
    SwitchLED(MZwanzig, (sizeof(MZwanzig)/2)); 
  }
  if (((Minute>24) && (Minute<30)) || ((Minute>34) && (Minute<40))) { 
    SwitchLED(MFuenf, (sizeof(MFuenf)/2)); 
    SwitchLED(Und, (sizeof(Und)/2));
    SwitchLED(MZwanzig, (sizeof(MZwanzig)/2)); 
  }  
  if ((Minute>29) && (Minute<35)) {
    SwitchLED(Halb, (sizeof(Halb)/2));
  }

  if (Minute <5){
    switch (Stunde) {
      case 1: 
        SwitchLED(Ein, (sizeof(Ein)/2));
        break;
      case 2: 
        SwitchLED(Zwei, (sizeof(Zwei)/2));
        break;
      case 3: 
        SwitchLED(Drei, (sizeof(Drei)/2));
        break;
      case 4: 
        SwitchLED(Vier, (sizeof(Vier)/2));
        break;
      case 5: 
        SwitchLED(Fuenf, (sizeof(Fuenf)/2));
        break;
      case 6: 
        SwitchLED(Sechs, (sizeof(Sechs)/2));
        break;
      case 7: 
        SwitchLED(Sieben, (sizeof(Sieben)/2));
        break;
      case 8: 
        SwitchLED(Acht, (sizeof(Acht)/2));
        break;
      case 9: 
        SwitchLED(Neun, (sizeof(Neun)/2));
        break;
      case 10: 
        SwitchLED(Zehn, (sizeof(Zehn)/2));
        break;
      case 11: 
        SwitchLED(Elf, (sizeof(Elf)/2));
        break;
      case 12: 
        SwitchLED(Zwoelf, (sizeof(Zwoelf)/2));
        break;
    }
    SwitchLED(Uhr, (sizeof(Uhr)/2));
  }
  else if ((Minute < 30) && (Minute >4)) {
    SwitchLED(Nach, (sizeof(Nach)/2));
    switch (Stunde) {
      case 1: 
        SwitchLED(Eins, (sizeof(Eins)/2));
        break;
      case 2: 
        SwitchLED(Zwei, (sizeof(Zwei)/2));
        break;
      case 3: 
        SwitchLED(Drei, (sizeof(Drei)/2));
        break;
      case 4: 
        SwitchLED(Vier, (sizeof(Vier)/2));
        break;
      case 5: 
        SwitchLED(Fuenf, (sizeof(Fuenf)/2));
        break;
      case 6: 
        SwitchLED(Sechs, (sizeof(Sechs)/2));
        break;
      case 7: 
        SwitchLED(Sieben, (sizeof(Sieben)/2));
        break;
      case 8: 
        SwitchLED(Acht, (sizeof(Acht)/2));
        break;
      case 9: 
        SwitchLED(Neun, (sizeof(Neun)/2));
        break;
      case 10: 
        SwitchLED(Zehn, (sizeof(Zehn)/2));
        break;
      case 11: 
        SwitchLED(Elf, (sizeof(Elf)/2));
        break;
      case 12: 
        SwitchLED(Zwoelf, (sizeof(Zwoelf)/2));
        break;
    }
  }
  else{
    if ((Minute>29) && (Minute<35)){
      switch (Stunde) {
        case 1: 
          SwitchLED(Zwei, (sizeof(Zwei)/2));
          break;
        case 2: 
          SwitchLED(Drei, (sizeof(Drei)/2));  
          break;
        case 3: 
          SwitchLED(Vier, (sizeof(Vier)/2));  
          break;
        case 4: 
          SwitchLED(Fuenf, (sizeof(Fuenf)/2));
          break;
        case 5: 
          SwitchLED(Sechs, (sizeof(Sechs)/2)); 
          break;
        case 6: 
          SwitchLED(Sieben, (sizeof(Sieben)/2));
          break;
        case 7: 
          SwitchLED(Acht, (sizeof(Acht)/2));
          break;
        case 8: 
          SwitchLED(Neun, (sizeof(Neun)/2));  

          break;
        case 9: 
          SwitchLED(Zehn, (sizeof(Zehn)/2)); 
          break;
        case 10: 
          SwitchLED(Elf, (sizeof(Elf)/2)); 
          break;
        case 11: 
          SwitchLED(Zwoelf, (sizeof(Zwoelf)/2));
          break;
        case 12: 
          SwitchLED(Eins, (sizeof(Eins)/2));
          break;
        }
      }
      else{
        SwitchLED(Vor, (sizeof(Vor)/2));
        switch (Stunde) {
          case 1: 
            SwitchLED(Zwei, (sizeof(Zwei)/2));
            break;
          case 2: 
            SwitchLED(Drei, (sizeof(Drei)/2));  
            break;
          case 3: 
            SwitchLED(Vier, (sizeof(Vier)/2));  
            break;
          case 4: 
            SwitchLED(Fuenf, (sizeof(Fuenf)/2));
            break;
          case 5: 
            SwitchLED(Sechs, (sizeof(Sechs)/2)); 
            break;
          case 6: 
            SwitchLED(Sieben, (sizeof(Sieben)/2));
            break;
          case 7: 
            SwitchLED(Acht, (sizeof(Acht)/2));
            break;
         case 8: 
            SwitchLED(Neun, (sizeof(Neun)/2));  
            break;
          case 9: 
            SwitchLED(Zehn, (sizeof(Zehn)/2)); 
            break;
         case 10: 
            SwitchLED(Elf, (sizeof(Elf)/2)); 
            break;
          case 11: 
            SwitchLED(Zwoelf, (sizeof(Zwoelf)/2));
            break;
          case 12: 
            SwitchLED(Eins, (sizeof(Eins)/2)); 
            break;
        }
      }
    }
  
  uint8_t MinCount = Minute-(floor(Minute/10)*10);
  if(MinCount > 5)
    MinCount = MinCount - 5;
  switch(MinCount){
    case 4:
      SwitchLED(VierM, (sizeof(VierM)/2));
    case 3:
      SwitchLED(DreiM, (sizeof(DreiM)/2));
    case 2:
      SwitchLED(ZweiM, (sizeof(ZweiM)/2));
    case 1:
      SwitchLED(EinsM, (sizeof(EinsM)/2));
  }
  FastLED.show();
   
}

void CheckDST(void){ 

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

}

void loop() {

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

   if(oldminute != minute()){
    oldminute = minute();
    displaytime();  
    }
}

Hi

SwtichLED - setBrightness ist GLOBAL - Das gilt für den ganzen String - deshalb reicht ein Aufruf in setup().
Die Helligkeit sollte sich SO auch nicht verstellen lassen (nehme dagegen gerne eine Belehrung entgegen !!).

SwitchLED(Es, (sizeof(Es)/2));
--> SwitchLED(Es, (sizeof(Es)/sizeof( Es[0])); //hier ist es egal, welchen Datentyp Du benutzt und musst nicht händisch /2 ... /4 eintragen

Spontan geraten: Das hier gibt Rundungsfehler oder einen Überlauf
uint8_t MinCount = Minute-(floor(Minute/10)*10);

Deinem Sketch würden Kommentare ganz gut tun, ist nicht sonderlich erfrischend, sich Da durchzuwühlen.

MfG

Das ist kein funktionsfähiger Sketch.

Ich musste leider die Kommentare rauslöschen und die definitionen der einzelnen Leds da ich sonst die Zeichen anzahl überschritten hätte...

@uwefed abgesehn vom Obrigen funktioniert mein Code einwandfrei

  1. damit wir nicht nur Fehler raten spielen brauchen wir den ganzen sketch.
  2. Den sketch kannst Du auch als Anhang anhängen.
    Grüße Uwe