Umstellung Wordclock von Nano auf Wemos D1

Hallo,

Das Update der Uhrzeit meiner Wordclock läuft derzeit über ein DCF-Modul (sehr frickelig) und deshalb wollte ich den Code umstellen und ein Wemos D1 nutzen um die Uhrzeit über das WLAN zu holen.
Die Uhrzeit zu holen ist anscheinend nicht das Problem, aber ich bekomme sie nicht in den Code übergeben...

  1. Wo ist der Fehler warum die Uhrzeit nicht an die Darstellung übergeben wird?
  2. Der Wemos D1 steuert auch nicht die LEDs an, obwohl er das "müsste"... Auch hier: Wo ist mein Fehler?
#include <DS3232RTC.h> //https://github.com/JChristensen/DS3232RTC
#include <TimeLib.h> //https://github.com/PaulStoffregen/Time
#include <Wire.h>  
#include <FastLED.h> //https://github.com/FastLED/FastLED
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>
#include <FastLED.h>



FASTLED_USING_NAMESPACE
#define DATA_PIN    D3
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB
#define NUM_LEDS    114      // Gesamtanzahl der WS2812 LEDs
CRGB leds[NUM_LEDS];

// WiFi Settings
const char *ssid = "xxx";         // Replace with your WiFi SSID
const char *password = "xxx"; // Replace with your WiFi password

// NTP Client Setup
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 3600, 60000); // NTP server, GMT+1, update interval


uint8_t maxBrightness     = 35;  // Wenn Fotoresistor benutzt wird, hier min. Helligkeit eintragen (0=Off->255=max)
uint8_t minBrightness     = 210;   // Wenn Fotoresistor benutzt wird, hier max. Helligkeit eintragen (0=Off->255=max)
uint8_t AmbientLightPin   = 0;    // Fotoresistor Pin 
uint8_t BRIGHTNESS        = 120;  // Wenn kein Fotoresistor benutzt wird hier dauerhafte Helligkeit eintragen

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


//***HIER LED POSITIONEN EINTRAGEN***//
int Es[]        = {0, 1};
int Ist[]       = {3, 4, 5};
int Eins[]      = {62, 63, 64, 65};
int Ein[]       = {63, 64, 65};
int Zwei[]      = {55, 56, 57, 58};
int Drei[]      = {66, 67, 68, 69};
int Vier[]      = {73, 74, 75, 76};
int Fuenf[]     = {51, 52, 53, 54};
int Sechs[]     = {83, 84, 85, 86, 87};
int Sieben[]    = {88, 89, 90, 91, 92, 93};
int Acht[]      = {77, 78, 79, 80};
int Neun[]      = {44, 45, 46, 47};
int Zehn[]      = {106, 107, 108, 109};
int Elf[]       = {59, 60, 61};
int Zwoelf[]    = {94, 95, 96, 97, 98};
int MZwanzig[]  = {11, 12, 13, 14, 15, 16, 17};
int MZehn[]     = {22, 23, 24, 25};
int MFuenf[]     = {7, 8, 9, 10};
int Viertel[]   = {26, 27, 28, 29, 30, 31, 32};
int Vor[]       = {41, 42, 43};
int Nach[]      = {33, 34, 35, 36};
int Halb[]      = {37, 38, 39, 40};
int Uhr[]       = {99, 100, 101};
int Und[]       = {19, 20, 21};

int EinsM[]     = {110}; //Minuten Punkt 1
int ZweiM[]     = {111}; //Minuten Punkt 2
int DreiM[]     = {112}; //Minuten Punkt 3
int VierM[]     = {113}; //Minuten Punkt 4
//**********************************//

int i, Ambient, LastAmbient;

void setup() {
Serial.begin(115200);
  delay(1000);

  // Connect to WiFi
  connectToWiFi();

  // Initialize NTP Client
  timeClient.begin();

  // Initialize LED strip
  FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalPixelString);
  FastLED.setTemperature(Tungsten40W);

  Serial.println("Word Clock started...");
}

void connectToWiFi() {
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void updateTimeFromNTP() {
  timeClient.update();
  Stunde = (timeClient.getHours() % 12 == 0) ? 12 : timeClient.getHours() % 12;  // Convert to 12-hour format
  Minute = timeClient.getMinutes();
  Sekunden = timeClient.getSeconds();
  Serial.print("Time: ");
  Serial.print(Stunde);
  Serial.print(":");
  Serial.print(Minute);
  //Serial.print(":");
  //Serial.println(Sekunden);
}

void SwitchLED(int MyArray[], int n) {
  //Umgebungshelligkeit überprüfen (sofern gewünscht)
  if(maxBrightness != 0){
      Ambient = analogRead(AmbientLightPin);
      //Nur bei größeren Helligkeitsänderungen soll die Helligkeit der LEDs angepasst werden:
      if((Ambient > LastAmbient*1.10) || (Ambient < LastAmbient*0.90)){
        BRIGHTNESS = map(Ambient, 0, 1023, maxBrightness, minBrightness);
        LastAmbient = Ambient;
      }
  }
  //Funktion zum Anschalten der LEDs in warmweiß (oder gewünschter Farbe)
  for (i = MyArray[0]; i < MyArray[0]+n; i++) {
      leds[i] = 0xFFC58F;                         // HEX Warmweiß | Hier gewünschte LED Farbe (HEX) eintragen
      FastLED.setBrightness(BRIGHTNESS);
      //leds[i] = CHSV(140, 27, BRIGHTNESS);      // ODER hier gewünschte Farbe in HSV (  CHSV(FARBE, SÄTTIGUNG, BRIGHTNESS)  )
      //leds[i].setRGB(255, 68, 221);             // ODER hier gewünschte Farbe in RGB (  .setRGB(Rot,Grün,Blau)   )
  }
}

void displaytime(void){
  //zuerst setzten wir alle LEDs zurück
  fill_solid( leds, NUM_LEDS, CHSV(0, 0, 0));

  // Nun suchen wir die richtigen LEDs und übergeben sie an die Funktion zum Anschalten
  Serial.print("Es ist ");
  SwitchLED(Es, (sizeof(Es)/2));
  SwitchLED(Ist, (sizeof(Ist)/2));
  
  if (((Minute>4) && (Minute<10)) || (Minute>54)) { 
    SwitchLED(MFuenf, (sizeof(MFuenf)/2));
    Serial.print("5 Minuten ");
  }
  if (((Minute>9) && (Minute<15)) || ((Minute>49) && (Minute<55))) { 
    SwitchLED(MZehn, (sizeof(MZehn)/2));
    Serial.print("10 Minuten ");
  }
  if (((Minute>14) && (Minute<20)) || ((Minute>44) && (Minute<50))) {
    SwitchLED(Viertel, (sizeof(Viertel)/2)); 
    Serial.print("Viertel ");
  }
  if (((Minute>19) && (Minute<25)) || ((Minute>39) && (Minute<45))) { 
    SwitchLED(MZwanzig, (sizeof(MZwanzig)/2)); 
    Serial.print("20 Minuten ");
  }
  if (((Minute>24) && (Minute<30)) || ((Minute>34) && (Minute<40))) { 
    SwitchLED(MFuenf, (sizeof(MFuenf)/2)); 
    SwitchLED(Und, (sizeof(Und)/2));
    SwitchLED(MZwanzig, (sizeof(MZwanzig)/2)); 
    Serial.print("25 Minuten ");
  }  
  if ((Minute>29) && (Minute<35)) {
    SwitchLED(Halb, (sizeof(Halb)/2));
    Serial.print("Halb ");
  }

  if (Minute <5){
    switch (Stunde) {
      case 1: 
        SwitchLED(Ein, (sizeof(Ein)/2));
        Serial.print("1 ");
        break;
      case 2: 
        SwitchLED(Zwei, (sizeof(Zwei)/2));
        Serial.print("2 ");
        break;
      case 3: 
        SwitchLED(Drei, (sizeof(Drei)/2));
        Serial.print("3 ");
        break;
      case 4: 
        SwitchLED(Vier, (sizeof(Vier)/2));
        Serial.print("4 ");
        break;
      case 5: 
        SwitchLED(Fuenf, (sizeof(Fuenf)/2));
        Serial.print("5 ");
        break;
      case 6: 
        SwitchLED(Sechs, (sizeof(Sechs)/2));
        Serial.print("6 ");
        break;
      case 7: 
        SwitchLED(Sieben, (sizeof(Sieben)/2));
        Serial.print("7 ");
        break;
      case 8: 
        SwitchLED(Acht, (sizeof(Acht)/2));
        Serial.print("8 ");
        break;
      case 9: 
        SwitchLED(Neun, (sizeof(Neun)/2));
        Serial.print("9 ");
        break;
      case 10: 
        SwitchLED(Zehn, (sizeof(Zehn)/2));
        Serial.print("10 ");
        break;
      case 11: 
        SwitchLED(Elf, (sizeof(Elf)/2));
        Serial.print("11 ");
        break;
      case 12: 
        SwitchLED(Zwoelf, (sizeof(Zwoelf)/2));
        Serial.print("12 ");
        break;
    }
    SwitchLED(Uhr, (sizeof(Uhr)/2));
    Serial.println("Uhr");
  }
  else if ((Minute < 30) && (Minute >4)) {
    SwitchLED(Nach, (sizeof(Nach)/2));
    Serial.print("nach ");
    switch (Stunde) {
      case 1: 
        SwitchLED(Eins, (sizeof(Eins)/2));
        Serial.println("1 ");
        break;
      case 2: 
        SwitchLED(Zwei, (sizeof(Zwei)/2));
        Serial.println("2 ");
        break;
      case 3: 
        SwitchLED(Drei, (sizeof(Drei)/2));
        Serial.println("3 ");
        break;
      case 4: 
        SwitchLED(Vier, (sizeof(Vier)/2));
        Serial.println("4 ");
        break;
      case 5: 
        SwitchLED(Fuenf, (sizeof(Fuenf)/2));
        Serial.println("8 ");
        break;
      case 6: 
        SwitchLED(Sechs, (sizeof(Sechs)/2));
        Serial.println("6 ");
        break;
      case 7: 
        SwitchLED(Sieben, (sizeof(Sieben)/2));
        Serial.println("7 ");
        break;
      case 8: 
        SwitchLED(Acht, (sizeof(Acht)/2));
        Serial.println("8 ");
        break;
      case 9: 
        SwitchLED(Neun, (sizeof(Neun)/2));
        Serial.println("9 ");
        break;
      case 10: 
        SwitchLED(Zehn, (sizeof(Zehn)/2));
        Serial.println("10 ");
        break;
      case 11: 
        SwitchLED(Elf, (sizeof(Elf)/2));
        Serial.println("11 ");
        break;
      case 12: 
        SwitchLED(Zwoelf, (sizeof(Zwoelf)/2));
        Serial.println("12 ");
        break;
    }
  }
  else{
    if ((Minute>29) && (Minute<35)){
      switch (Stunde) {
        case 1: 
          SwitchLED(Zwei, (sizeof(Zwei)/2));
          Serial.println("2 ");
          break;
        case 2: 
          SwitchLED(Drei, (sizeof(Drei)/2));  
          Serial.println("3");
          break;
        case 3: 
          SwitchLED(Vier, (sizeof(Vier)/2));  
          Serial.println("4 ");
          break;
        case 4: 
          SwitchLED(Fuenf, (sizeof(Fuenf)/2));
          Serial.println("5 ");
          break;
        case 5: 
          SwitchLED(Sechs, (sizeof(Sechs)/2)); 
          Serial.println("6 ");
          break;
        case 6: 
          SwitchLED(Sieben, (sizeof(Sieben)/2));
          Serial.println("7 ");
          break;
        case 7: 
          SwitchLED(Acht, (sizeof(Acht)/2));
          Serial.println("8 ");
          break;
        case 8: 
          SwitchLED(Neun, (sizeof(Neun)/2));  
          Serial.println("9 ");
          break;
        case 9: 
          SwitchLED(Zehn, (sizeof(Zehn)/2)); 
          Serial.println("10 ");
          break;
        case 10: 
          SwitchLED(Elf, (sizeof(Elf)/2)); 
          Serial.println("11 ");
          break;
        case 11: 
          SwitchLED(Zwoelf, (sizeof(Zwoelf)/2));
          Serial.println("12 ");
          break;
        case 12: 
          SwitchLED(Eins, (sizeof(Eins)/2));
         Serial.println("1 ");
          break;
        }
      }
      else{
        SwitchLED(Vor, (sizeof(Vor)/2));
        Serial.print("vor ");
        switch (Stunde) {
          case 1: 
            SwitchLED(Zwei, (sizeof(Zwei)/2));
            Serial.println("2 ");
            break;
          case 2: 
            SwitchLED(Drei, (sizeof(Drei)/2));  
            Serial.println("3");
            break;
          case 3: 
            SwitchLED(Vier, (sizeof(Vier)/2));  
            Serial.println("4 ");
            break;
          case 4: 
            SwitchLED(Fuenf, (sizeof(Fuenf)/2));
            Serial.println("5 ");
            break;
          case 5: 
            SwitchLED(Sechs, (sizeof(Sechs)/2)); 
            Serial.println("6 ");
            break;
          case 6: 
            SwitchLED(Sieben, (sizeof(Sieben)/2));
            Serial.println("7 ");
            break;
          case 7: 
            SwitchLED(Acht, (sizeof(Acht)/2));
            Serial.println("8 ");
            break;
         case 8: 
            SwitchLED(Neun, (sizeof(Neun)/2));  
            Serial.println("9 ");
            break;
          case 9: 
            SwitchLED(Zehn, (sizeof(Zehn)/2)); 
            Serial.println("10 ");
            break;
         case 10: 
            SwitchLED(Elf, (sizeof(Elf)/2)); 
            Serial.println("11 ");
            break;
          case 11: 
            SwitchLED(Zwoelf, (sizeof(Zwoelf)/2));
            Serial.println("12 ");
            break;
          case 12: 
            SwitchLED(Eins, (sizeof(Eins)/2));
            Serial.println("1 ");
            break;
        }
      }
    }
  // Minuten Zähler
  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){
  //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);
}

fangen wir mal von vorne an: auf einem ESP brauchst du keine externe Library für NTP ... das kann der ESP mit der Standard time.h inkl. Sommer/Normalzeit.

das wäre das erste was ich zusammeräumen würde. Siehe auch hier:
https://werner.rothschopf.net/201802_arduino_esp8266_ntp.htm

danach stell noch mal deinen aktualisierten Sketch ein.

Hallo noiasca,

Danke für deine schnelle Antwort!
habe ich versucht, aber jetzt funktioniert natürlich der Output nicht mehr und auch die NTP Zeit wird nicht angezeigt....

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
//#include <NTPClient.h>
//#include <TimeLib.h>
#include <FastLED.h>
#include <time.h>                   // for time() ctime()

// WiFi-Zugangsdaten
const char *ssid     = "Voyager";  // Deine WiFi SSID
const char *password = "Ein Ring, sie zu knechten,";  // Dein WiFi Passwort

// NTP Client Setup
#define MY_NTP_SERVER "ptbtime1.ptb.de"
#define MY_TZ "CET-1CEST,M3.5.0,M10.5.0/3" 
time_t now;                         // this are the seconds since Epoch (1970) - UTC
tm tm;                              // the structure tm holds time information in a more convenient way

FASTLED_USING_NAMESPACE
#define DATA_PIN    D6  // D4 auf Wemos D1 entspricht Pin 2 (GPIO2)
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB
#define NUM_LEDS    114      // Gesamtanzahl der WS2812 LEDs
CRGB leds[NUM_LEDS];

uint8_t maxBrightness     = 35;  // Min. Helligkeit
uint8_t minBrightness     = 210; // Max. Helligkeit
uint8_t AmbientLightPin   = A0;  // Fotoresistor Pin (analog)
uint8_t BRIGHTNESS        = 120; // Standard-Helligkeit
uint8_t Stunde = 0;
uint8_t Minute = 0;

//***HIER LED POSITIONEN EINTRAGEN***//
int Es[]        = {0, 1};
int Ist[]       = {3, 4, 5};
int Eins[]      = {62, 63, 64, 65};
int Ein[]       = {63, 64, 65};
int Zwei[]      = {55, 56, 57, 58};
int Drei[]      = {66, 67, 68, 69};
int Vier[]      = {73, 74, 75, 76};
int Fuenf[]     = {51, 52, 53, 54};
int Sechs[]     = {83, 84, 85, 86, 87};
int Sieben[]    = {88, 89, 90, 91, 92, 93};
int Acht[]      = {77, 78, 79, 80};
int Neun[]      = {44, 45, 46, 47};
int Zehn[]      = {106, 107, 108, 109};
int Elf[]       = {59, 60, 61};
int Zwoelf[]    = {94, 95, 96, 97, 98};
int MZwanzig[]  = {11, 12, 13, 14, 15, 16, 17};
int MZehn[]     = {22, 23, 24, 25};
int MFuenf[]     = {7, 8, 9, 10};
int Viertel[]   = {26, 27, 28, 29, 30, 31, 32};
int Vor[]       = {41, 42, 43};
int Nach[]      = {33, 34, 35, 36};
int Halb[]      = {37, 38, 39, 40};
int Uhr[]       = {99, 100, 101};
int Und[]       = {19, 20, 21};

int EinsM[]     = {110}; //Minuten Punkt 1
int ZweiM[]     = {111}; //Minuten Punkt 2
int DreiM[]     = {112}; //Minuten Punkt 3
int VierM[]     = {113}; //Minuten Punkt 4
//**********************************//

//int i, Ambient, LastAmbient;

void setup() {
Serial.begin(115200);
  delay(1000);

  // Connect to WiFi
  connectToWiFi();



  // Initialize LED strip
  FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalPixelString);
  FastLED.setTemperature(Tungsten40W);

  Serial.println("Word Clock started...");
}

void connectToWiFi() {
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void updateTimeFromNTP() {
 time(&now);                       // read the current time
  localtime_r(&now, &tm);           // update the structure tm with the current time
  Serial.print("year:");
  Serial.print(tm.tm_year + 1900);  // years since 1900
  Serial.print("\tmonth:");
  Serial.print(tm.tm_mon + 1);      // January = 0 (!)
  Serial.print("\tday:");
  Serial.print(tm.tm_mday);         // day of month
  Serial.print("\thour:");
  Serial.print(tm.tm_hour);         // hours since midnight  0-23
  Serial.print("\tmin:");
  Serial.print(tm.tm_min);          // minutes after the hour  0-59
  Serial.print("\tsec:");
  Serial.print(tm.tm_sec);          // seconds after the minute  0-61*
  Serial.print("\twday");
  Serial.print(tm.tm_wday);  
}

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



void displaytime(void){
  //zuerst setzten wir alle LEDs zurück
  fill_solid( leds, NUM_LEDS, CHSV(0, 0, 0));

  // Nun suchen wir die richtigen LEDs und übergeben sie an die Funktion zum Anschalten
  Serial.print("Es ist ");
  SwitchLED(Es, (sizeof(Es)/2));
  SwitchLED(Ist, (sizeof(Ist)/2));
  
  if (((Minute>4) && (Minute<10)) || (Minute>54)) { 
    SwitchLED(MFuenf, (sizeof(MFuenf)/2));
    Serial.print("5 Minuten ");
  }
  if (((Minute>9) && (Minute<15)) || ((Minute>49) && (Minute<55))) { 
    SwitchLED(MZehn, (sizeof(MZehn)/2));
    Serial.print("10 Minuten ");
  }
  if (((Minute>14) && (Minute<20)) || ((Minute>44) && (Minute<50))) {
    SwitchLED(Viertel, (sizeof(Viertel)/2)); 
    Serial.print("Viertel ");
  }
  if (((Minute>19) && (Minute<25)) || ((Minute>39) && (Minute<45))) { 
    SwitchLED(MZwanzig, (sizeof(MZwanzig)/2)); 
    Serial.print("20 Minuten ");
  }
  if (((Minute>24) && (Minute<30)) || ((Minute>34) && (Minute<40))) { 
    SwitchLED(MFuenf, (sizeof(MFuenf)/2)); 
    SwitchLED(Und, (sizeof(Und)/2));
    SwitchLED(MZwanzig, (sizeof(MZwanzig)/2)); 
    Serial.print("25 Minuten ");
  }  
  if ((Minute>29) && (Minute<35)) {
    SwitchLED(Halb, (sizeof(Halb)/2));
    Serial.print("Halb ");
  }

  if (Minute <5){
    switch (Stunde) {
      case 1: 
        SwitchLED(Ein, (sizeof(Ein)/2));
        Serial.print("1 ");
        break;
      case 2: 
        SwitchLED(Zwei, (sizeof(Zwei)/2));
        Serial.print("2 ");
        break;
      case 3: 
        SwitchLED(Drei, (sizeof(Drei)/2));
        Serial.print("3 ");
        break;
      case 4: 
        SwitchLED(Vier, (sizeof(Vier)/2));
        Serial.print("4 ");
        break;
      case 5: 
        SwitchLED(Fuenf, (sizeof(Fuenf)/2));
        Serial.print("5 ");
        break;
      case 6: 
        SwitchLED(Sechs, (sizeof(Sechs)/2));
        Serial.print("6 ");
        break;
      case 7: 
        SwitchLED(Sieben, (sizeof(Sieben)/2));
        Serial.print("7 ");
        break;
      case 8: 
        SwitchLED(Acht, (sizeof(Acht)/2));
        Serial.print("8 ");
        break;
      case 9: 
        SwitchLED(Neun, (sizeof(Neun)/2));
        Serial.print("9 ");
        break;
      case 10: 
        SwitchLED(Zehn, (sizeof(Zehn)/2));
        Serial.print("10 ");
        break;
      case 11: 
        SwitchLED(Elf, (sizeof(Elf)/2));
        Serial.print("11 ");
        break;
      case 12: 
        SwitchLED(Zwoelf, (sizeof(Zwoelf)/2));
        Serial.print("12 ");
        break;
    }
    SwitchLED(Uhr, (sizeof(Uhr)/2));
    Serial.println("Uhr");
  }
  else if ((Minute < 30) && (Minute >4)) {
    SwitchLED(Nach, (sizeof(Nach)/2));
    Serial.print("nach ");
    switch (Stunde) {
      case 1: 
        SwitchLED(Eins, (sizeof(Eins)/2));
        Serial.println("1 ");
        break;
      case 2: 
        SwitchLED(Zwei, (sizeof(Zwei)/2));
        Serial.println("2 ");
        break;
      case 3: 
        SwitchLED(Drei, (sizeof(Drei)/2));
        Serial.println("3 ");
        break;
      case 4: 
        SwitchLED(Vier, (sizeof(Vier)/2));
        Serial.println("4 ");
        break;
      case 5: 
        SwitchLED(Fuenf, (sizeof(Fuenf)/2));
        Serial.println("8 ");
        break;
      case 6: 
        SwitchLED(Sechs, (sizeof(Sechs)/2));
        Serial.println("6 ");
        break;
      case 7: 
        SwitchLED(Sieben, (sizeof(Sieben)/2));
        Serial.println("7 ");
        break;
      case 8: 
        SwitchLED(Acht, (sizeof(Acht)/2));
        Serial.println("8 ");
        break;
      case 9: 
        SwitchLED(Neun, (sizeof(Neun)/2));
        Serial.println("9 ");
        break;
      case 10: 
        SwitchLED(Zehn, (sizeof(Zehn)/2));
        Serial.println("10 ");
        break;
      case 11: 
        SwitchLED(Elf, (sizeof(Elf)/2));
        Serial.println("11 ");
        break;
      case 12: 
        SwitchLED(Zwoelf, (sizeof(Zwoelf)/2));
        Serial.println("12 ");
        break;
    }
  }
  else{
    if ((Minute>29) && (Minute<35)){
      switch (Stunde) {
        case 1: 
          SwitchLED(Zwei, (sizeof(Zwei)/2));
          Serial.println("2 ");
          break;
        case 2: 
          SwitchLED(Drei, (sizeof(Drei)/2));  
          Serial.println("3");
          break;
        case 3: 
          SwitchLED(Vier, (sizeof(Vier)/2));  
          Serial.println("4 ");
          break;
        case 4: 
          SwitchLED(Fuenf, (sizeof(Fuenf)/2));
          Serial.println("5 ");
          break;
        case 5: 
          SwitchLED(Sechs, (sizeof(Sechs)/2)); 
          Serial.println("6 ");
          break;
        case 6: 
          SwitchLED(Sieben, (sizeof(Sieben)/2));
          Serial.println("7 ");
          break;
        case 7: 
          SwitchLED(Acht, (sizeof(Acht)/2));
          Serial.println("8 ");
          break;
        case 8: 
          SwitchLED(Neun, (sizeof(Neun)/2));  
          Serial.println("9 ");
          break;
        case 9: 
          SwitchLED(Zehn, (sizeof(Zehn)/2)); 
          Serial.println("10 ");
          break;
        case 10: 
          SwitchLED(Elf, (sizeof(Elf)/2)); 
          Serial.println("11 ");
          break;
        case 11: 
          SwitchLED(Zwoelf, (sizeof(Zwoelf)/2));
          Serial.println("12 ");
          break;
        case 12: 
          SwitchLED(Eins, (sizeof(Eins)/2));
         Serial.println("1 ");
          break;
        }
      }
      else{
        SwitchLED(Vor, (sizeof(Vor)/2));
        Serial.print("vor ");
        switch (Stunde) {
          case 1: 
            SwitchLED(Zwei, (sizeof(Zwei)/2));
            Serial.println("2 ");
            break;
          case 2: 
            SwitchLED(Drei, (sizeof(Drei)/2));  
            Serial.println("3");
            break;
          case 3: 
            SwitchLED(Vier, (sizeof(Vier)/2));  
            Serial.println("4 ");
            break;
          case 4: 
            SwitchLED(Fuenf, (sizeof(Fuenf)/2));
            Serial.println("5 ");
            break;
          case 5: 
            SwitchLED(Sechs, (sizeof(Sechs)/2)); 
            Serial.println("6 ");
            break;
          case 6: 
            SwitchLED(Sieben, (sizeof(Sieben)/2));
            Serial.println("7 ");
            break;
          case 7: 
            SwitchLED(Acht, (sizeof(Acht)/2));
            Serial.println("8 ");
            break;
         case 8: 
            SwitchLED(Neun, (sizeof(Neun)/2));  
            Serial.println("9 ");
            break;
          case 9: 
            SwitchLED(Zehn, (sizeof(Zehn)/2)); 
            Serial.println("10 ");
            break;
         case 10: 
            SwitchLED(Elf, (sizeof(Elf)/2)); 
            Serial.println("11 ");
            break;
          case 11: 
            SwitchLED(Zwoelf, (sizeof(Zwoelf)/2));
            Serial.println("12 ");
            break;
          case 12: 
            SwitchLED(Eins, (sizeof(Eins)/2));
            Serial.println("1 ");
            break;
        }
      }
    }
  // Minuten Zähler
  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){
  //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() {
  // NTP-Zeit aktualisieren
  //timeClient.update();
  //unsigned long epochTime = timeClient.getEpochTime();
  
 // Stunde = tm_hour;
 // Minute = minute(tm_minute);

  if (Stunde > 12) {
    Stunde -= 12;  // 12-Stunden-Format
  } else if (Stunde == 0) {
    Stunde = 12;
  }

  //Serial.print("Stunde: ");
  //Serial.println(Stunde);
  //Serial.print("Minute: ");
  //Serial.println(Minute);

  displaytime();
  FastLED.delay(250);
}


was meinst du damit genau?

die Zeit wird z.B. in der updateTimeFromNTP() auf der Seriellen ausgegeben - du rufst diese Funktion aber auch nirgends auf. Daher erfolgt auch keine Ausgabe auf der Seriellen Schnittstelle.

und dein anderer Versuch displaytime() ... greift auf globale Variablen Minute und Stunde zu die offenbar nirgends gesetzt werden.

Genau das was du hier auskommentierst hast

 // Stunde = tm_hour;
 // Minute = minute(tm_minute);

musst du anpassen.

Ungetestet, evtl. mit Fehler:

  time(&now);                       // read the current time
  localtime_r(&now, &tm);           // update the structure tm with the current time
  Stunde = tm.tm_hour;
  Minute = tm.tm_min;

Hallo,

danke für deinen Input!
Zeit wird jetzt richtig auf dem Seriellen Monitor ausgegeben und auch die NTP funktioniert.

Jetzt brauche ich noch einen Hinweis, warum es nicht auf den LEDs angezeigt wird. Die bleiben komplett dunkel...

Kann es am verwendeten Pin auf dem Wemos D1 liegen? FastLED scheint Einschränkungen zu haben bei den ESP8266?

Hier der Stand mit funktionierendem NTP:

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
//#include <NTPClient.h>
//#include <TimeLib.h>
#include <FastLED.h>
#include <time.h>                   // for time() ctime()

// WiFi-Zugangsdaten
const char *ssid     = "xxx";  // Deine WiFi SSID
const char *password = "xxx";  // Dein WiFi Passwort

// NTP Client Setup
#define MY_NTP_SERVER "ptbtime1.ptb.de"
#define MY_TZ "CET-1CEST,M3.5.0,M10.5.0/3" 
time_t now;                         // this are the seconds since Epoch (1970) - UTC
tm tm;                              // the structure tm holds time information in a more convenient way

FASTLED_USING_NAMESPACE
#define DATA_PIN    D6  // D4 auf Wemos D1 entspricht Pin 2 (GPIO2)
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB
#define NUM_LEDS    114      // Gesamtanzahl der WS2812 LEDs
CRGB leds[NUM_LEDS];

uint8_t maxBrightness     = 35;  // Min. Helligkeit
uint8_t minBrightness     = 210; // Max. Helligkeit
uint8_t AmbientLightPin   = A0;  // Fotoresistor Pin (analog)
uint8_t BRIGHTNESS        = 120; // Standard-Helligkeit
uint8_t Stunde = 0;
uint8_t Minute = 0;

//***HIER LED POSITIONEN EINTRAGEN***//
int Es[]        = {0, 1};
int Ist[]       = {3, 4, 5};
int Eins[]      = {62, 63, 64, 65};
int Ein[]       = {63, 64, 65};
int Zwei[]      = {55, 56, 57, 58};
int Drei[]      = {66, 67, 68, 69};
int Vier[]      = {73, 74, 75, 76};
int Fuenf[]     = {51, 52, 53, 54};
int Sechs[]     = {83, 84, 85, 86, 87};
int Sieben[]    = {88, 89, 90, 91, 92, 93};
int Acht[]      = {77, 78, 79, 80};
int Neun[]      = {44, 45, 46, 47};
int Zehn[]      = {106, 107, 108, 109};
int Elf[]       = {59, 60, 61};
int Zwoelf[]    = {94, 95, 96, 97, 98};
int MZwanzig[]  = {11, 12, 13, 14, 15, 16, 17};
int MZehn[]     = {22, 23, 24, 25};
int MFuenf[]     = {7, 8, 9, 10};
int Viertel[]   = {26, 27, 28, 29, 30, 31, 32};
int Vor[]       = {41, 42, 43};
int Nach[]      = {33, 34, 35, 36};
int Halb[]      = {37, 38, 39, 40};
int Uhr[]       = {99, 100, 101};
int Und[]       = {19, 20, 21};

int EinsM[]     = {110}; //Minuten Punkt 1
int ZweiM[]     = {111}; //Minuten Punkt 2
int DreiM[]     = {112}; //Minuten Punkt 3
int VierM[]     = {113}; //Minuten Punkt 4
//**********************************//

//int i, Ambient, LastAmbient;

void setup() {
Serial.begin(115200);
  delay(1000);

  // Connect to WiFi
  connectToWiFi();

Serial.println("\nNTP TZ DST - bare minimum");
 configTime(MY_TZ, MY_NTP_SERVER);

  // Initialize LED strip
  FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalPixelString);
  FastLED.setTemperature(Tungsten40W);

  Serial.println("Word Clock started...");
}

void connectToWiFi() {
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void showTime() {
 time(&now);                       // read the current time
  localtime_r(&now, &tm);           // update the structure tm with the current time
  Serial.print("year:");
  Serial.print(tm.tm_year + 1900);  // years since 1900
  Serial.print("\tmonth:");
  Serial.print(tm.tm_mon + 1);      // January = 0 (!)
  Serial.print("\tday:");
  Serial.print(tm.tm_mday);         // day of month
  Serial.print("\thour:");
  Serial.print(tm.tm_hour);         // hours since midnight  0-23
  Serial.print("\tmin:");
  Serial.print(tm.tm_min);          // minutes after the hour  0-59
  Serial.print("\tsec:");
  Serial.print(tm.tm_sec);          // seconds after the minute  0-61*
  Serial.print("\twday");
  Serial.print(tm.tm_wday); 
   if (tm.tm_isdst == 1)             // Daylight Saving Time flag
    Serial.print("\tDST");
  else
    Serial.print("\tstandard");
  Serial.println(); 
}

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



void displaytime(void){
  //zuerst setzten wir alle LEDs zurück
  fill_solid( leds, NUM_LEDS, CHSV(0, 0, 0));

  // Nun suchen wir die richtigen LEDs und übergeben sie an die Funktion zum Anschalten
  Serial.print("Es ist ");
  SwitchLED(Es, (sizeof(Es)/2));
  SwitchLED(Ist, (sizeof(Ist)/2));
  
  if (((Minute>4) && (Minute<10)) || (Minute>54)) { 
    SwitchLED(MFuenf, (sizeof(MFuenf)/2));
    Serial.print("5 Minuten ");
  }
  if (((Minute>9) && (Minute<15)) || ((Minute>49) && (Minute<55))) { 
    SwitchLED(MZehn, (sizeof(MZehn)/2));
    Serial.print("10 Minuten ");
  }
  if (((Minute>14) && (Minute<20)) || ((Minute>44) && (Minute<50))) {
    SwitchLED(Viertel, (sizeof(Viertel)/2)); 
    Serial.print("Viertel ");
  }
  if (((Minute>19) && (Minute<25)) || ((Minute>39) && (Minute<45))) { 
    SwitchLED(MZwanzig, (sizeof(MZwanzig)/2)); 
    Serial.print("20 Minuten ");
  }
  if (((Minute>24) && (Minute<30)) || ((Minute>34) && (Minute<40))) { 
    SwitchLED(MFuenf, (sizeof(MFuenf)/2)); 
    SwitchLED(Und, (sizeof(Und)/2));
    SwitchLED(MZwanzig, (sizeof(MZwanzig)/2)); 
    Serial.print("25 Minuten ");
  }  
  if ((Minute>29) && (Minute<35)) {
    SwitchLED(Halb, (sizeof(Halb)/2));
    Serial.print("Halb ");
  }

  if (Minute <5){
    switch (Stunde) {
      case 1: 
        SwitchLED(Ein, (sizeof(Ein)/2));
        Serial.print("1 ");
        break;
      case 2: 
        SwitchLED(Zwei, (sizeof(Zwei)/2));
        Serial.print("2 ");
        break;
      case 3: 
        SwitchLED(Drei, (sizeof(Drei)/2));
        Serial.print("3 ");
        break;
      case 4: 
        SwitchLED(Vier, (sizeof(Vier)/2));
        Serial.print("4 ");
        break;
      case 5: 
        SwitchLED(Fuenf, (sizeof(Fuenf)/2));
        Serial.print("5 ");
        break;
      case 6: 
        SwitchLED(Sechs, (sizeof(Sechs)/2));
        Serial.print("6 ");
        break;
      case 7: 
        SwitchLED(Sieben, (sizeof(Sieben)/2));
        Serial.print("7 ");
        break;
      case 8: 
        SwitchLED(Acht, (sizeof(Acht)/2));
        Serial.print("8 ");
        break;
      case 9: 
        SwitchLED(Neun, (sizeof(Neun)/2));
        Serial.print("9 ");
        break;
      case 10: 
        SwitchLED(Zehn, (sizeof(Zehn)/2));
        Serial.print("10 ");
        break;
      case 11: 
        SwitchLED(Elf, (sizeof(Elf)/2));
        Serial.print("11 ");
        break;
      case 12: 
        SwitchLED(Zwoelf, (sizeof(Zwoelf)/2));
        Serial.print("12 ");
        break;
    }
    SwitchLED(Uhr, (sizeof(Uhr)/2));
    Serial.println("Uhr");
  }
  else if ((Minute < 30) && (Minute >4)) {
    SwitchLED(Nach, (sizeof(Nach)/2));
    Serial.print("nach ");
    switch (Stunde) {
      case 1: 
        SwitchLED(Eins, (sizeof(Eins)/2));
        Serial.println("1 ");
        break;
      case 2: 
        SwitchLED(Zwei, (sizeof(Zwei)/2));
        Serial.println("2 ");
        break;
      case 3: 
        SwitchLED(Drei, (sizeof(Drei)/2));
        Serial.println("3 ");
        break;
      case 4: 
        SwitchLED(Vier, (sizeof(Vier)/2));
        Serial.println("4 ");
        break;
      case 5: 
        SwitchLED(Fuenf, (sizeof(Fuenf)/2));
        Serial.println("8 ");
        break;
      case 6: 
        SwitchLED(Sechs, (sizeof(Sechs)/2));
        Serial.println("6 ");
        break;
      case 7: 
        SwitchLED(Sieben, (sizeof(Sieben)/2));
        Serial.println("7 ");
        break;
      case 8: 
        SwitchLED(Acht, (sizeof(Acht)/2));
        Serial.println("8 ");
        break;
      case 9: 
        SwitchLED(Neun, (sizeof(Neun)/2));
        Serial.println("9 ");
        break;
      case 10: 
        SwitchLED(Zehn, (sizeof(Zehn)/2));
        Serial.println("10 ");
        break;
      case 11: 
        SwitchLED(Elf, (sizeof(Elf)/2));
        Serial.println("11 ");
        break;
      case 12: 
        SwitchLED(Zwoelf, (sizeof(Zwoelf)/2));
        Serial.println("12 ");
        break;
    }
  }
  else{
    if ((Minute>29) && (Minute<35)){
      switch (Stunde) {
        case 1: 
          SwitchLED(Zwei, (sizeof(Zwei)/2));
          Serial.println("2 ");
          break;
        case 2: 
          SwitchLED(Drei, (sizeof(Drei)/2));  
          Serial.println("3");
          break;
        case 3: 
          SwitchLED(Vier, (sizeof(Vier)/2));  
          Serial.println("4 ");
          break;
        case 4: 
          SwitchLED(Fuenf, (sizeof(Fuenf)/2));
          Serial.println("5 ");
          break;
        case 5: 
          SwitchLED(Sechs, (sizeof(Sechs)/2)); 
          Serial.println("6 ");
          break;
        case 6: 
          SwitchLED(Sieben, (sizeof(Sieben)/2));
          Serial.println("7 ");
          break;
        case 7: 
          SwitchLED(Acht, (sizeof(Acht)/2));
          Serial.println("8 ");
          break;
        case 8: 
          SwitchLED(Neun, (sizeof(Neun)/2));  
          Serial.println("9 ");
          break;
        case 9: 
          SwitchLED(Zehn, (sizeof(Zehn)/2)); 
          Serial.println("10 ");
          break;
        case 10: 
          SwitchLED(Elf, (sizeof(Elf)/2)); 
          Serial.println("11 ");
          break;
        case 11: 
          SwitchLED(Zwoelf, (sizeof(Zwoelf)/2));
          Serial.println("12 ");
          break;
        case 12: 
          SwitchLED(Eins, (sizeof(Eins)/2));
         Serial.println("1 ");
          break;
        }
      }
      else{
        SwitchLED(Vor, (sizeof(Vor)/2));
        Serial.print("vor ");
        switch (Stunde) {
          case 1: 
            SwitchLED(Zwei, (sizeof(Zwei)/2));
            Serial.println("2 ");
            break;
          case 2: 
            SwitchLED(Drei, (sizeof(Drei)/2));  
            Serial.println("3");
            break;
          case 3: 
            SwitchLED(Vier, (sizeof(Vier)/2));  
            Serial.println("4 ");
            break;
          case 4: 
            SwitchLED(Fuenf, (sizeof(Fuenf)/2));
            Serial.println("5 ");
            break;
          case 5: 
            SwitchLED(Sechs, (sizeof(Sechs)/2)); 
            Serial.println("6 ");
            break;
          case 6: 
            SwitchLED(Sieben, (sizeof(Sieben)/2));
            Serial.println("7 ");
            break;
          case 7: 
            SwitchLED(Acht, (sizeof(Acht)/2));
            Serial.println("8 ");
            break;
         case 8: 
            SwitchLED(Neun, (sizeof(Neun)/2));  
            Serial.println("9 ");
            break;
          case 9: 
            SwitchLED(Zehn, (sizeof(Zehn)/2)); 
            Serial.println("10 ");
            break;
         case 10: 
            SwitchLED(Elf, (sizeof(Elf)/2)); 
            Serial.println("11 ");
            break;
          case 11: 
            SwitchLED(Zwoelf, (sizeof(Zwoelf)/2));
            Serial.println("12 ");
            break;
          case 12: 
            SwitchLED(Eins, (sizeof(Eins)/2));
            Serial.println("1 ");
            break;
        }
      }
    }
  // Minuten Zähler
  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){
  //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() {
  // NTP-Zeit aktualisieren
  //timeClient.update();
  //unsigned long epochTime = timeClient.getEpochTime();
  
  Stunde = tm.tm_hour;
  Minute = tm.tm_min;

  if (Stunde > 12) {
    Stunde -= 12;  // 12-Stunden-Format
  } else if (Stunde == 0) {
    Stunde = 12;
  }

  Serial.print("Stunde: ");
  Serial.println(Stunde);
  Serial.print("Minute: ");
  Serial.println(Minute);
  showTime();
  displaytime();
  FastLED.delay(250);
}

Ich tippe eher auf ein Spannungsproblem. Die Leds brauchen 5Volt zur Ansteuerung, der ESP liefert nur 3,3Volt.
Da hilft es einen Levelshifter zu verwenden oder die erste Led per Diodenschaltung anzusteuern.

Hi HotSystems,

die LEDs bekommen die Spannung separat über eine 5V Verbindung (über der auch der Wemos beliefert wird) . Der Wemos selber soll nur das Signal liefern an die LEDs-

Zudem habe ich sie schon angesteuert bekommen in einem Testscript, aber im "richtigen" bekomme ich es nicht zu laufen-

Danke
Arne

Ergänze in setup():

leds[0] = 0xFF0000;
leds[1] = 0x00FF00;
leds[2] = 0x0000FF;
FastLED.show();
delay(1000);

Wenn Du das auch nicht siehst, könnte es am falschen Pin liegen.

Und genau das ist dein Problem. Die 3,3V reichen nicht.

Ah, ok. Das kam später. Wenn das funktioniert hat, muss es tatsächlich "noch" ein anderes Problem sein.

@Arne3a1
Poste den funktionierenden Testsketch.

Hallo,

die Ausgabe funktioniert... Nachdem auch der testsketch nicht mehr lief, habe ich es auf einen Wackelkontakt in der Stromversorgung zurückführen können... (Tut mir leid)-

Dadurch zeigte sich aber ein neues Problem in der Darstellung. Das "alte" Script über den Nano zeigt die Uhrzeit korrekt an.
Das neue Script ist aber irgendwie verschoben und lässt bei der Zeit "Zwanzig nach zwei" viel mehr LEDs leuchten als dürften, zB "vor" und "halb" und auch Teile von Wörtern, so als wäre die Definition der LEDs verschoben?
Irgendeine Idee wo es dran liegen könnte?

Ich danke euch für die Hilfe!
Arne

Auch das kann ein Problem mit der Spannung sein.

Speise mal die erste Led über eine Diode mit 5Volt und alle weiteren direkt mit 5Volt.

Nano rechnet mit 8 Bit und ESP8266 mit 32. Konkret liefert (sizeof(MZwanzig) / 2) einen falschen Wert, weil int beim Nano 16 Bit lang ist, beim ESP8266 aber 32. (sizeof(MZwanzig) / 4) könnte helfen, wobei eine solche magische Zahl als const byte laengeInt = sizeof(MZwanzig[0]); und (sizeof(MZwanzig) / laengeInt) vermieden werden kann (ungetestet).

Eventuell sind noch andere Stellen betroffen.

1 Like

Wobei man auch die kritische Frage stellen soll warum für die Arrays ein Vorzeichenbehafteter integer verwendet wird statt einem einfachen uint8_t . Sind ja nur 144 LEDs

edit:

mal ein wenig überarbeitet. Trotzdem noch viel Duplicate Code ... testen kann ich es nicht:

/*
 *  yet another wordclock
 *  https://forum.arduino.cc/t/umstellung-wordclock-von-nano-auf-wemos-d1/1308205/5
 *
 */
 
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <FastLED.h>
#include <time.h>                   // for time() ctime()

// WiFi-Zugangsdaten
const char *ssid     = "xxx";  // Deine WiFi SSID
const char *password = "xxx";  // Dein WiFi Passwort

// NTP Client Setup
#define MY_NTP_SERVER "ptbtime1.ptb.de"
#define MY_TZ "CET-1CEST,M3.5.0,M10.5.0/3"
time_t now;                         // this are the seconds since Epoch (1970) - UTC
tm tm;                              // the structure tm holds time information in a more convenient way

FASTLED_USING_NAMESPACE
#define DATA_PIN    D6  // D4 auf Wemos D1 entspricht Pin 2 (GPIO2)
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB
#define NUM_LEDS    114      // Gesamtanzahl der WS2812 LEDs
CRGB leds[NUM_LEDS];

uint8_t maxBrightness     = 35;  // Min. Helligkeit
uint8_t minBrightness     = 210; // Max. Helligkeit
constexpr uint8_t AmbientLightPin   = A0;  // Fotoresistor Pin (analog)
uint8_t BRIGHTNESS        = 120; // Standard-Helligkeit
uint8_t Stunde = 0;
uint8_t Minute = 0;

//***HIER LED POSITIONEN EINTRAGEN***//
constexpr uint8_t Es[]        = {0, 1};
constexpr uint8_t Ist[]       = {3, 4, 5};
constexpr uint8_t Eins[]      = {62, 63, 64, 65};
constexpr uint8_t Ein[]       = {63, 64, 65};
constexpr uint8_t Zwei[]      = {55, 56, 57, 58};
constexpr uint8_t Drei[]      = {66, 67, 68, 69};
constexpr uint8_t Vier[]      = {73, 74, 75, 76};
constexpr uint8_t Fuenf[]     = {51, 52, 53, 54};
constexpr uint8_t Sechs[]     = {83, 84, 85, 86, 87};
constexpr uint8_t Sieben[]    = {88, 89, 90, 91, 92, 93};
constexpr uint8_t Acht[]      = {77, 78, 79, 80};
constexpr uint8_t Neun[]      = {44, 45, 46, 47};
constexpr uint8_t Zehn[]      = {106, 107, 108, 109};
constexpr uint8_t Elf[]       = {59, 60, 61};
constexpr uint8_t Zwoelf[]    = {94, 95, 96, 97, 98};
constexpr uint8_t MZwanzig[]  = {11, 12, 13, 14, 15, 16, 17};
constexpr uint8_t MZehn[]     = {22, 23, 24, 25};
constexpr uint8_t MFuenf[]    = {7, 8, 9, 10};
constexpr uint8_t Viertel[]   = {26, 27, 28, 29, 30, 31, 32};
constexpr uint8_t Vor[]       = {41, 42, 43};
constexpr uint8_t Nach[]      = {33, 34, 35, 36};
constexpr uint8_t Halb[]      = {37, 38, 39, 40};
constexpr uint8_t Uhr[]       = {99, 100, 101};
constexpr uint8_t Und[]       = {19, 20, 21};

constexpr uint8_t EinsM[]     = {110}; //Minuten Punkt 1
constexpr uint8_t ZweiM[]     = {111}; //Minuten Punkt 2
constexpr uint8_t DreiM[]     = {112}; //Minuten Punkt 3
constexpr uint8_t VierM[]     = {113}; //Minuten Punkt 4
//**********************************//

//int i, Ambient, LastAmbient;

void setup() {
  Serial.begin(115200);
  delay(1000);

  // Connect to WiFi
  connectToWiFi();

  Serial.println("\nNTP TZ DST - bare minimum");
  configTime(MY_TZ, MY_NTP_SERVER);

  // Initialize LED strip
  FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalPixelString);
  FastLED.setTemperature(Tungsten40W);

  Serial.println("Word Clock started...");
}

void connectToWiFi() {
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void showTime() {
  time(&now);                       // read the current time
  localtime_r(&now, &tm);           // update the structure tm with the current time
  Serial.print("year:");
  Serial.print(tm.tm_year + 1900);  // years since 1900
  Serial.print("\tmonth:");
  Serial.print(tm.tm_mon + 1);      // January = 0 (!)
  Serial.print("\tday:");
  Serial.print(tm.tm_mday);         // day of month
  Serial.print("\thour:");
  Serial.print(tm.tm_hour);         // hours since midnight  0-23
  Serial.print("\tmin:");
  Serial.print(tm.tm_min);          // minutes after the hour  0-59
  Serial.print("\tsec:");
  Serial.print(tm.tm_sec);          // seconds after the minute  0-61*
  Serial.print("\twday");
  Serial.print(tm.tm_wday);
  if (tm.tm_isdst == 1)             // Daylight Saving Time flag
    Serial.print("\tDST");
  else
    Serial.print("\tstandard");
  Serial.println();
}

void SwitchLED(const uint8_t MyArray[], size_t n) {
  for (size_t i = MyArray[0]; i < MyArray[0] + n; i++) {
    leds[i] = 0xFFC58F;  // Warmweiß
    FastLED.setBrightness(BRIGHTNESS);
  }
}

void displaytime(void) {
  //zuerst setzten wir alle LEDs zurück
  fill_solid( leds, NUM_LEDS, CHSV(0, 0, 0));

  // Nun suchen wir die richtigen LEDs und übergeben sie an die Funktion zum Anschalten
  Serial.print("Es ist ");
  SwitchLED(Es, (sizeof(Es) / sizeof(Es[0])));
  SwitchLED(Ist, (sizeof(Ist) / sizeof(Ist[0])));

  if (((Minute > 4) && (Minute < 10)) || (Minute > 54)) {
    SwitchLED(MFuenf, (sizeof(MFuenf) / sizeof(MFuenf[0])));
    Serial.print("5 Minuten ");
  }
  if (((Minute > 9) && (Minute < 15)) || ((Minute > 49) && (Minute < 55))) {
    SwitchLED(MZehn, (sizeof(MZehn) / sizeof(MZehn[0])));
    Serial.print("10 Minuten ");
  }
  if (((Minute > 14) && (Minute < 20)) || ((Minute > 44) && (Minute < 50))) {
    SwitchLED(Viertel, (sizeof(Viertel) / sizeof(Viertel[0])));
    Serial.print("Viertel ");
  }
  if (((Minute > 19) && (Minute < 25)) || ((Minute > 39) && (Minute < 45))) {
    SwitchLED(MZwanzig, (sizeof(MZwanzig) / sizeof(MZwanzig[0])));
    Serial.print("20 Minuten ");
  }
  if (((Minute > 24) && (Minute < 30)) || ((Minute > 34) && (Minute < 40))) {
    SwitchLED(MFuenf, (sizeof(MFuenf) / sizeof(MFuenf[0])));
    SwitchLED(Und, (sizeof(Und) / sizeof(Und[0])));
    SwitchLED(MZwanzig, (sizeof(MZwanzig) / sizeof(MZwanzig[0])));
    Serial.print("25 Minuten ");
  }
  if ((Minute > 29) && (Minute < 35)) {
    SwitchLED(Halb, (sizeof(Halb) / sizeof(Halb[0])));
    Serial.print("Halb ");
  }

  if (Minute < 5) {
    switch (Stunde) {
      case 1:
        SwitchLED(Ein, (sizeof(Ein) / sizeof(Ein[0])));
        Serial.print("1 ");
        break;
      case 2:
        SwitchLED(Zwei, (sizeof(Zwei) / sizeof(Zwei[0])));
        Serial.print("2 ");
        break;
      case 3:
        SwitchLED(Drei, (sizeof(Drei) / sizeof(Drei[0])));
        Serial.print("3 ");
        break;
      case 4:
        SwitchLED(Vier, (sizeof(Vier) / sizeof(Vier[0])));
        Serial.print("4 ");
        break;
      case 5:
        SwitchLED(Fuenf, (sizeof(Fuenf) / sizeof(Fuenf[0])));
        Serial.print("5 ");
        break;
      case 6:
        SwitchLED(Sechs, (sizeof(Sechs) / sizeof(Sechs[0])));
        Serial.print("6 ");
        break;
      case 7:
        SwitchLED(Sieben, (sizeof(Sieben) / sizeof(Sieben[0])));
        Serial.print("7 ");
        break;
      case 8:
        SwitchLED(Acht, (sizeof(Acht) / sizeof(Acht[0])));
        Serial.print("8 ");
        break;
      case 9:
        SwitchLED(Neun, (sizeof(Neun) / sizeof(Neun[0])));
        Serial.print("9 ");
        break;
      case 10:
        SwitchLED(Zehn, (sizeof(Zehn) / sizeof(Zehn[0])));
        Serial.print("10 ");
        break;
      case 11:
        SwitchLED(Elf, (sizeof(Elf) / sizeof(Elf[0])));
        Serial.print("11 ");
        break;
      case 12:
        SwitchLED(Zwoelf, (sizeof(Zwoelf) / sizeof(Zwoelf[0])));
        Serial.print("12 ");
        break;
    }
    SwitchLED(Uhr, (sizeof(Uhr) / sizeof(Uhr[0])));
    Serial.println("Uhr");
  }
  else if ((Minute < 30) && (Minute > 4)) {
    SwitchLED(Nach, (sizeof(Nach) / sizeof(Nach[0])));
    Serial.print("nach ");
    switch (Stunde) {
      case 1:
        SwitchLED(Eins, (sizeof(Eins) / sizeof(Eins[0])));
        Serial.println("1 ");
        break;
      case 2:
        SwitchLED(Zwei, (sizeof(Zwei) / sizeof(Zwei[0])));
        Serial.println("2 ");
        break;
      case 3:
        SwitchLED(Drei, (sizeof(Drei) / sizeof(Drei[0])));
        Serial.println("3 ");
        break;
      case 4:
        SwitchLED(Vier, (sizeof(Vier) / sizeof(Vier[0])));
        Serial.println("4 ");
        break;
      case 5:
        SwitchLED(Fuenf, (sizeof(Fuenf) / sizeof(Fuenf[0])));
        Serial.println("8 ");
        break;
      case 6:
        SwitchLED(Sechs, (sizeof(Sechs) / sizeof(Sechs[0])));
        Serial.println("6 ");
        break;
      case 7:
        SwitchLED(Sieben, (sizeof(Sieben) / sizeof(Sieben[0])));
        Serial.println("7 ");
        break;
      case 8:
        SwitchLED(Acht, (sizeof(Acht) / sizeof(Acht[0])));
        Serial.println("8 ");
        break;
      case 9:
        SwitchLED(Neun, (sizeof(Neun) / sizeof(Neun[0])));
        Serial.println("9 ");
        break;
      case 10:
        SwitchLED(Zehn, (sizeof(Zehn) / sizeof(Zehn[0])));
        Serial.println("10 ");
        break;
      case 11:
        SwitchLED(Elf, (sizeof(Elf) / sizeof(Elf[0])));
        Serial.println("11 ");
        break;
      case 12:
        SwitchLED(Zwoelf, (sizeof(Zwoelf) / sizeof(Zwoelf[0])));
        Serial.println("12 ");
        break;
    }
  }
  else {
    if ((Minute > 29) && (Minute < 35)) {
      switch (Stunde) {
        case 1:
          SwitchLED(Zwei, (sizeof(Zwei) / sizeof(Zwei[0])));
          Serial.println("2 ");
          break;
        case 2:
          SwitchLED(Drei, (sizeof(Drei) / sizeof(Drei[0])));
          Serial.println("3");
          break;
        case 3:
          SwitchLED(Vier, (sizeof(Vier) / sizeof(Vier[0])));
          Serial.println("4 ");
          break;
        case 4:
          SwitchLED(Fuenf, (sizeof(Fuenf) / sizeof(Fuenf[0])));
          Serial.println("5 ");
          break;
        case 5:
          SwitchLED(Sechs, (sizeof(Sechs) / sizeof(Sechs[0])));
          Serial.println("6 ");
          break;
        case 6:
          SwitchLED(Sieben, (sizeof(Sieben) / sizeof(Sieben[0])));
          Serial.println("7 ");
          break;
        case 7:
          SwitchLED(Acht, (sizeof(Acht) / sizeof(Acht[0])));
          Serial.println("8 ");
          break;
        case 8:
          SwitchLED(Neun, (sizeof(Neun) / sizeof(Neun[0])));
          Serial.println("9 ");
          break;
        case 9:
          SwitchLED(Zehn, (sizeof(Zehn) / sizeof(Zehn[0])));
          Serial.println("10 ");
          break;
        case 10:
          SwitchLED(Elf, (sizeof(Elf) / sizeof(Elf[0])));
          Serial.println("11 ");
          break;
        case 11:
          SwitchLED(Zwoelf, (sizeof(Zwoelf) / sizeof(Zwoelf[0])));
          Serial.println("12 ");
          break;
        case 12:
          SwitchLED(Eins, (sizeof(Eins) / sizeof(Eins[0])));
          Serial.println("1 ");
          break;
      }
    }
    else {
      SwitchLED(Vor, (sizeof(Vor) / sizeof(Vor[0])));
      Serial.print("vor ");
      switch (Stunde) {
        case 1:
          SwitchLED(Zwei, (sizeof(Zwei) / sizeof(Zwei[0])));
          Serial.println("2 ");
          break;
        case 2:
          SwitchLED(Drei, (sizeof(Drei) / sizeof(Drei[0])));
          Serial.println("3");
          break;
        case 3:
          SwitchLED(Vier, (sizeof(Vier) / sizeof(Vier[0])));
          Serial.println("4 ");
          break;
        case 4:
          SwitchLED(Fuenf, (sizeof(Fuenf) / sizeof(Fuenf[0])));
          Serial.println("5 ");
          break;
        case 5:
          SwitchLED(Sechs, (sizeof(Sechs) / sizeof(Sechs[0])));
          Serial.println("6 ");
          break;
        case 6:
          SwitchLED(Sieben, (sizeof(Sieben) / sizeof(Sieben[0])));
          Serial.println("7 ");
          break;
        case 7:
          SwitchLED(Acht, (sizeof(Acht) / sizeof(Acht[0])));
          Serial.println("8 ");
          break;
        case 8:
          SwitchLED(Neun, (sizeof(Neun) / sizeof(Neun[0])));
          Serial.println("9 ");
          break;
        case 9:
          SwitchLED(Zehn, (sizeof(Zehn) / sizeof(Zehn[0])));
          Serial.println("10 ");
          break;
        case 10:
          SwitchLED(Elf, (sizeof(Elf) / sizeof(Elf[0])));
          Serial.println("11 ");
          break;
        case 11:
          SwitchLED(Zwoelf, (sizeof(Zwoelf) / sizeof(Zwoelf[0])));
          Serial.println("12 ");
          break;
        case 12:
          SwitchLED(Eins, (sizeof(Eins) / sizeof(Eins[0])));
          Serial.println("1 ");
          break;
      }
    }
  }
  // Minuten Zähler
  uint8_t MinCount = Minute - (floor(Minute / 10) * 10);
  if (MinCount > 5)
    MinCount = MinCount - 5;

  // noiasca: in diesem switch habe ich 3 breaks ergänzt da sie "theoretisch" fehlen - vieleicht auch nicht - dann musst du sie wier löschen
  switch (MinCount) {
    case 4:
      SwitchLED(VierM, (sizeof(VierM) / sizeof(VierM[0])));
      break;
    case 3:
      SwitchLED(DreiM, (sizeof(DreiM) / sizeof(DreiM[0])));
      break;
    case 2:
      SwitchLED(ZweiM, (sizeof(ZweiM) / sizeof(ZweiM[0])));
      break;
    case 1:
      SwitchLED(EinsM, (sizeof(EinsM) / sizeof(EinsM[0])));
  }
  FastLED.show();
}

void loop() {
  // Zeit aktualisieren
  // lass das nicht weg, du greifst nachfolgenden auf die tm. Variablen zu - also sorg dafür, dass sie aktuell sind und mach dich nicht abhängig von der showTime()
  time(&now);                       // read the current time
  localtime_r(&now, &tm);           // update the structure tm with the current time

  Stunde = tm.tm_hour;
  Minute = tm.tm_min;

  if (Stunde > 12) {
    Stunde -= 12;  // 12-Stunden-Format
  } else if (Stunde == 0) {
    Stunde = 12;
  }

  Serial.print("Stunde: ");
  Serial.println(Stunde);
  Serial.print("Minute: ");
  Serial.println(Minute);
  showTime();
  displaytime();
  FastLED.delay(250);
}
//
2 Likes

Danke noiasca!
Das Script läuft und zeigt auch die zeit (fast :wink: ) korrekt an!!

Noch drei Fragen:

  1. die erste LED flackert; schütze ich die mit einer Diode? Wenn ja, hat einer von euch einen Link zur der Art& Weise?

  2. Ganz spezifisch zur Zeit: Wo hätte "nach" auf der Uhr auftauchen sollte, erscheint jetzt "halb". Hast du den Code irgendwo ergänzt? Finde leider selber keinen Unterschied...

  3. Im Seriellen Monitor findet sich ein interessanter Unterschied- Die Zeit ist richtig (05:19) aber die ausgeschriebene Anzeige sagt" Es ist Viertel nach 8" und die Anzeige auf der Uhr sagt : "Es ist Viertel halb fünf".

Es ist Viertel nach 8
Stunde: 5
Minute: 19
year:2024 month:10 day:6 hour:17 min:19 sec:25 wday0 DST```

Danke für eure super Hilfe!
Arne

Ich hatte es doch schon beschrieben, aber gern Hier nochmal zum nachlesen.

1 Like

Danke @HotSystems !
Da ich die noch nie benutzt habe: Welche Diode wird dafür genutzt?

Eine 1N4148 kannst dafür verwenden.

1 Like
  1. ich habe bis auf 3 breaks keine Änderungen gemacht (Zeile 389ff). Die hab ich dir aber auch kommtiert.

  2. das stand meiner Meinung schon so in deinem Code - das kannst du leicht ausbessern.

      case 5:
        SwitchLED(Fuenf, (sizeof(Fuenf) / sizeof(Fuenf[0])));
        Serial.println("8 ");
        break;

warum es zu der Kombination "viertel halb" kommen kann - mach ich aktuell nicht aus.
Sollte nur an den ifs liegen ... bei einem switch case (mit break) wäre gewährleistet dass es keine Überschneidenden Bereiche gibt.

das ist z.B. eigenartig:

  if (((Minute > 19) && (Minute < 25)) || ((Minute > 39) && (Minute < 45))) {
    SwitchLED(MZwanzig, (sizeof(MZwanzig) / sizeof(MZwanzig[0])));
    Serial.print("20 Minuten ");
  }

aber wie gesagt, das müsste man eh ein wenig zusammenkürzen.

edit:

immer noch keine Schönheit, aber schon mal wesentlich kürzer.
Evtl. kann jetzt wirklich was fehlen - aber jetzt ist das aus meiner Sicht einfacher zu korrigieren:

/*
    yet another wordclock
    https://forum.arduino.cc/t/umstellung-wordclock-von-nano-auf-wemos-d1/1308205/5

*/

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <FastLED.h>
#include <time.h>                   // for time() ctime()

// WiFi-Zugangsdaten
const char *ssid     = "xxx";  // Deine WiFi SSID
const char *password = "xxx";  // Dein WiFi Passwort

// NTP Client Setup
#define MY_NTP_SERVER "ptbtime1.ptb.de"
#define MY_TZ "CET-1CEST,M3.5.0,M10.5.0/3"
time_t now;                         // this are the seconds since Epoch (1970) - UTC
tm tm;                              // the structure tm holds time information in a more convenient way

FASTLED_USING_NAMESPACE
#define DATA_PIN    D6  // D4 auf Wemos D1 entspricht Pin 2 (GPIO2)
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB
#define NUM_LEDS    114      // Gesamtanzahl der WS2812 LEDs
CRGB leds[NUM_LEDS];

uint8_t maxBrightness     = 35;  // Min. Helligkeit
uint8_t minBrightness     = 210; // Max. Helligkeit
constexpr uint8_t AmbientLightPin   = A0;  // Fotoresistor Pin (analog)
uint8_t BRIGHTNESS        = 120; // Standard-Helligkeit
uint8_t Stunde = 0;
uint8_t Minute = 0;

//***HIER LED POSITIONEN EINTRAGEN***//
constexpr uint8_t Es[]        = {0, 1};
constexpr uint8_t Ist[]       = {3, 4, 5};
constexpr uint8_t Eins[]      = {62, 63, 64, 65};
constexpr uint8_t Ein[]       = {63, 64, 65};
constexpr uint8_t Zwei[]      = {55, 56, 57, 58};
constexpr uint8_t Drei[]      = {66, 67, 68, 69};
constexpr uint8_t Vier[]      = {73, 74, 75, 76};
constexpr uint8_t Fuenf[]     = {51, 52, 53, 54};
constexpr uint8_t Sechs[]     = {83, 84, 85, 86, 87};
constexpr uint8_t Sieben[]    = {88, 89, 90, 91, 92, 93};
constexpr uint8_t Acht[]      = {77, 78, 79, 80};
constexpr uint8_t Neun[]      = {44, 45, 46, 47};
constexpr uint8_t Zehn[]      = {106, 107, 108, 109};
constexpr uint8_t Elf[]       = {59, 60, 61};
constexpr uint8_t Zwoelf[]    = {94, 95, 96, 97, 98};
constexpr uint8_t MZwanzig[]  = {11, 12, 13, 14, 15, 16, 17};
constexpr uint8_t MZehn[]     = {22, 23, 24, 25};
constexpr uint8_t MFuenf[]    = {7, 8, 9, 10};
constexpr uint8_t Viertel[]   = {26, 27, 28, 29, 30, 31, 32};
constexpr uint8_t Vor[]       = {41, 42, 43};
constexpr uint8_t Nach[]      = {33, 34, 35, 36};
constexpr uint8_t Halb[]      = {37, 38, 39, 40};
constexpr uint8_t Uhr[]       = {99, 100, 101};
constexpr uint8_t Und[]       = {19, 20, 21};

constexpr uint8_t EinsM[]     = {110}; //Minuten Punkt 1
constexpr uint8_t ZweiM[]     = {111}; //Minuten Punkt 2
constexpr uint8_t DreiM[]     = {112}; //Minuten Punkt 3
constexpr uint8_t VierM[]     = {113}; //Minuten Punkt 4
//**********************************//

//int i, Ambient, LastAmbient;

void setup() {
  Serial.begin(115200);
  delay(1000);

  // Connect to WiFi
  connectToWiFi();

  Serial.println("\nNTP TZ DST - bare minimum");
  configTime(MY_TZ, MY_NTP_SERVER);

  // Initialize LED strip
  FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalPixelString);
  FastLED.setTemperature(Tungsten40W);

  Serial.println("Word Clock started...");
}

void connectToWiFi() {
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void showTime() {
  time(&now);                       // read the current time
  localtime_r(&now, &tm);           // update the structure tm with the current time
  Serial.print("year:");
  Serial.print(tm.tm_year + 1900);  // years since 1900
  Serial.print("\tmonth:");
  Serial.print(tm.tm_mon + 1);      // January = 0 (!)
  Serial.print("\tday:");
  Serial.print(tm.tm_mday);         // day of month
  Serial.print("\thour:");
  Serial.print(tm.tm_hour);         // hours since midnight  0-23
  Serial.print("\tmin:");
  Serial.print(tm.tm_min);          // minutes after the hour  0-59
  Serial.print("\tsec:");
  Serial.print(tm.tm_sec);          // seconds after the minute  0-61*
  Serial.print("\twday");
  Serial.print(tm.tm_wday);
  if (tm.tm_isdst == 1)             // Daylight Saving Time flag
    Serial.print("\tDST");
  else
    Serial.print("\tstandard");
  Serial.println();
}

void SwitchLED(const uint8_t MyArray[], size_t n) {
  for (size_t i = MyArray[0]; i < MyArray[0] + n; i++) {
    leds[i] = 0xFFC58F;  // Warmweiß
    FastLED.setBrightness(BRIGHTNESS);
  }
}

void displayHour(uint8_t hour) {
  if (hour > 12) {
    hour -= 12;  // 12-Stunden-Format
  } else if (hour == 0) {
    hour = 12;
  }

  switch (hour) {
    case 1:
      SwitchLED(Ein, (sizeof(Ein) / sizeof(Ein[0])));
      Serial.print("1 ");
      break;
    case 2:
      SwitchLED(Zwei, (sizeof(Zwei) / sizeof(Zwei[0])));
      Serial.print("2 ");
      break;
    case 3:
      SwitchLED(Drei, (sizeof(Drei) / sizeof(Drei[0])));
      Serial.print("3 ");
      break;
    case 4:
      SwitchLED(Vier, (sizeof(Vier) / sizeof(Vier[0])));
      Serial.print("4 ");
      break;
    case 5:
      SwitchLED(Fuenf, (sizeof(Fuenf) / sizeof(Fuenf[0])));
      Serial.print("5 ");
      break;
    case 6:
      SwitchLED(Sechs, (sizeof(Sechs) / sizeof(Sechs[0])));
      Serial.print("6 ");
      break;
    case 7:
      SwitchLED(Sieben, (sizeof(Sieben) / sizeof(Sieben[0])));
      Serial.print("7 ");
      break;
    case 8:
      SwitchLED(Acht, (sizeof(Acht) / sizeof(Acht[0])));
      Serial.print("8 ");
      break;
    case 9:
      SwitchLED(Neun, (sizeof(Neun) / sizeof(Neun[0])));
      Serial.print("9 ");
      break;
    case 10:
      SwitchLED(Zehn, (sizeof(Zehn) / sizeof(Zehn[0])));
      Serial.print("10 ");
      break;
    case 11:
      SwitchLED(Elf, (sizeof(Elf) / sizeof(Elf[0])));
      Serial.print("11 ");
      break;
    case 12:
      SwitchLED(Zwoelf, (sizeof(Zwoelf) / sizeof(Zwoelf[0])));
      Serial.print("12 ");
      break;
  }
}

void displaytime(void) {
  //zuerst setzten wir alle LEDs zurück
  fill_solid( leds, NUM_LEDS, CHSV(0, 0, 0));

  // Nun suchen wir die richtigen LEDs und übergeben sie an die Funktion zum Anschalten
  Serial.print("Es ist ");
  SwitchLED(Es, (sizeof(Es) / sizeof(Es[0])));
  SwitchLED(Ist, (sizeof(Ist) / sizeof(Ist[0])));
  uint8_t offset = 0;  // für die Stunde
  switch (Minute) {
    case 5 ... 9 :
      SwitchLED(MFuenf, (sizeof(MFuenf) / sizeof(MFuenf[0])));
      SwitchLED(Nach, (sizeof(Nach) / sizeof(Nach[0])));
      Serial.print("5 Minuten ");
      break;
    case 10 ... 14 :
      SwitchLED(MZehn, (sizeof(MZehn) / sizeof(MZehn[0])));
      SwitchLED(Nach, (sizeof(Nach) / sizeof(Nach[0])));
      Serial.print("10 Minuten ");
      break;
    case 15 ... 19 :
      SwitchLED(Viertel, (sizeof(Viertel) / sizeof(Viertel[0])));
      SwitchLED(Nach, (sizeof(Nach) / sizeof(Nach[0])));
      Serial.print("Viertel ");
      break;
    case 20 ... 24 :
      SwitchLED(MZwanzig, (sizeof(MZwanzig) / sizeof(MZwanzig[0])));
      SwitchLED(Nach, (sizeof(Nach) / sizeof(Nach[0])));
      Serial.print("20 Minuten ");
      break;
    case 25 ... 29 :
      SwitchLED(MFuenf, (sizeof(MFuenf) / sizeof(MFuenf[0])));
      SwitchLED(Und, (sizeof(Und) / sizeof(Und[0])));
      SwitchLED(MZwanzig, (sizeof(MZwanzig) / sizeof(MZwanzig[0])));
      SwitchLED(Nach, (sizeof(Nach) / sizeof(Nach[0])));
      Serial.print("25 Minuten ");
      break;
    case 30 ... 34 :
      SwitchLED(Halb, (sizeof(Halb) / sizeof(Halb[0])));
      Serial.print("Halb ");
      offset = 1;
      break;
    case 45 ... 49 :
      SwitchLED(Viertel, (sizeof(Viertel) / sizeof(Viertel[0])));
      SwitchLED(Nach, (sizeof(Vor) / sizeof(Vor[0])));
      Serial.print("Viertel ");
      offset = 1;
      break;
    case 50 ... 54 :
      SwitchLED(MZehn, (sizeof(MZehn) / sizeof(MZehn[0])));
      SwitchLED(Nach, (sizeof(Vor) / sizeof(Vor[0])));
      Serial.print("10 Minuten ");
      offset = 1;
      break;
    case 55 ... 59 :
      SwitchLED(MFuenf, (sizeof(MFuenf) / sizeof(MFuenf[0])));
      SwitchLED(Nach, (sizeof(Vor) / sizeof(Vor[0])));
      Serial.print("5 Minuten ");
      offset = 1;
      break;
  }
  displayHour(Stunde + offset);
  SwitchLED(Uhr, (sizeof(Uhr) / sizeof(Uhr[0])));
  Serial.println("Uhr");
  // Minuten Zähler
  uint8_t MinCount = Minute - (floor(Minute / 10) * 10);
  if (MinCount > 5)
    MinCount = MinCount - 5;

  // noiasca: intents ergänzt
  switch (MinCount) {
    case 4:
      SwitchLED(VierM, (sizeof(VierM) / sizeof(VierM[0])));
      [[fallthrough]];
    case 3:
      SwitchLED(DreiM, (sizeof(DreiM) / sizeof(DreiM[0])));
      [[fallthrough]];
    case 2:
      SwitchLED(ZweiM, (sizeof(ZweiM) / sizeof(ZweiM[0])));
      [[fallthrough]];
    case 1:
      SwitchLED(EinsM, (sizeof(EinsM) / sizeof(EinsM[0])));
  }
  FastLED.show();
}

void loop() {
  // Zeit aktualisieren
  // lass das nicht weg, du greifst nachfolgenden auf die tm. Variablen zu - also sorg dafür, dass sie aktuell sind und mach dich nicht abhängig von der showTime()
  time(&now);                       // read the current time
  localtime_r(&now, &tm);           // update the structure tm with the current time

  // Ausgabe nur bei Minutenwechsel
  static uint8_t previousMinute = 0;  
  if (tm.tm_min != previousMinute) {
    previousMinute = tm.tm_min;
    Stunde = tm.tm_hour;
    Minute = tm.tm_min;
    if (Stunde > 12) {
      Stunde -= 12;  // 12-Stunden-Format
    } else if (Stunde == 0) {
      Stunde = 12;
    }
    Serial.print("Stunde: "); Serial.println(Stunde);
    Serial.print("Minute: "); Serial.println(Minute);
    displaytime();
  }
  showTime();
  FastLED.delay(250);
}
//
1 Like

Hallo noiasca,
Hallo HotSystems

vielen, vielen Dank!

Das war der Schlüssel zum jetzt funktionierenden Script!!

Es fehlten noch ein paar Bedingungen, die habe ich aber einfach ergänzen können, das Problem "vor/halb/nach" lag an falschen LED Zuordnungen :man_facepalming:.

Die erste LED flackert wie ne Kerze im Wind, aber das werde ich morgen mit der Signal Diode hoffentlich klären können. Die Uhr sieht super aus; wenn ich die Diode eingebaut habe kann ich sie auch guten Gewissens länger laufen lassen.

Und dann werden einige "alte" Wordclocks umgebaut :wink:

/*
    yet another wordclock
    https://forum.arduino.cc/t/umstellung-wordclock-von-nano-auf-wemos-d1/1308205/5

*/

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <FastLED.h>
#include <time.h>                   // for time() ctime()

// WiFi-Zugangsdaten
const char *ssid     = "xxx";  // Deine WiFi SSID
const char *password = "xxx,";  // Dein WiFi Passwort

// NTP Client Setup (https://werner.rothschopf.net/201802_arduino_esp8266_ntp.htm)
#define MY_NTP_SERVER "de.pool.ntp.org" // NTP Server: https://www.ntp-server.de/ntp-server-deutschland/
#define MY_TZ "CET-1CEST,M3.5.0,M10.5.0/3"
time_t now;                         // this are the seconds since Epoch (1970) - UTC
tm tm;                              // the structure tm holds time information in a more convenient way

FASTLED_USING_NAMESPACE
#define DATA_PIN    D6  // D6 auf Wemos D1 entspricht GPIO12
#define LED_TYPE    WS2812B
#define COLOR_ORDER GRB
#define NUM_LEDS    114      // Gesamtanzahl der WS2812 LEDs
CRGB leds[NUM_LEDS];

uint8_t maxBrightness     = 35;  // Min. Helligkeit
uint8_t minBrightness     = 210; // Max. Helligkeit
constexpr uint8_t AmbientLightPin   = A0;  // Fotoresistor Pin (analog)
uint8_t BRIGHTNESS        = 120; // Standard-Helligkeit
uint8_t Stunde = 0;
uint8_t Minute = 0;

//***HIER LED POSITIONEN EINTRAGEN***//
constexpr uint8_t Es[]        = {0, 1};
constexpr uint8_t Ist[]       = {3, 4, 5};
constexpr uint8_t Eins[]      = {62, 63, 64, 65};
constexpr uint8_t Ein[]       = {63, 64, 65};
constexpr uint8_t Zwei[]      = {55, 56, 57, 58};
constexpr uint8_t Drei[]      = {66, 67, 68, 69};
constexpr uint8_t Vier[]      = {73, 74, 75, 76};
constexpr uint8_t Fuenf[]     = {51, 52, 53, 54};
constexpr uint8_t Sechs[]     = {83, 84, 85, 86, 87};
constexpr uint8_t Sieben[]    = {88, 89, 90, 91, 92, 93};
constexpr uint8_t Acht[]      = {77, 78, 79, 80};
constexpr uint8_t Neun[]      = {44, 45, 46, 47};
constexpr uint8_t Zehn[]      = {106, 107, 108, 109};
constexpr uint8_t Elf[]       = {59, 60, 61};
constexpr uint8_t Zwoelf[]    = {94, 95, 96, 97, 98};
constexpr uint8_t MZwanzig[]  = {11, 12, 13, 14, 15, 16, 17};
constexpr uint8_t MZehn[]     = {22, 23, 24, 25};
constexpr uint8_t MFuenf[]    = {7, 8, 9, 10};
constexpr uint8_t Viertel[]   = {26, 27, 28, 29, 30, 31, 32};
constexpr uint8_t Vor[]       = {37, 38, 39};
constexpr uint8_t Nach[]      = {40, 41, 42, 43};
constexpr uint8_t Halb[]      = {33, 34, 35, 36};
constexpr uint8_t Uhr[]       = {99, 100, 101};
constexpr uint8_t Und[]       = {19, 20, 21};

constexpr uint8_t EinsM[]     = {110}; //Minuten Punkt 1
constexpr uint8_t ZweiM[]     = {111}; //Minuten Punkt 2
constexpr uint8_t DreiM[]     = {112}; //Minuten Punkt 3
constexpr uint8_t VierM[]     = {113}; //Minuten Punkt 4
//**********************************//

//int i, Ambient, LastAmbient;

void setup() {
  Serial.begin(115200);
  delay(1000);

  // Connect to WiFi
  connectToWiFi();

  Serial.println("\nNTP TZ DST - bare minimum");
  configTime(MY_TZ, MY_NTP_SERVER);

  // Initialize LED strip
  FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalPixelString);
  FastLED.setTemperature(Tungsten40W);

  Serial.println("Word Clock started...");
}

void connectToWiFi() {
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void showTime() {
  time(&now);                       // read the current time
  localtime_r(&now, &tm);           // update the structure tm with the current time
  Serial.print("year:");
  Serial.print(tm.tm_year + 1900);  // years since 1900
  Serial.print("\tmonth:");
  Serial.print(tm.tm_mon + 1);      // January = 0 (!)
  Serial.print("\tday:");
  Serial.print(tm.tm_mday);         // day of month
  Serial.print("\thour:");
  Serial.print(tm.tm_hour);         // hours since midnight  0-23
  Serial.print("\tmin:");
  Serial.print(tm.tm_min);          // minutes after the hour  0-59
  Serial.print("\tsec:");
  Serial.print(tm.tm_sec);          // seconds after the minute  0-61*
  Serial.print("\twday");
  Serial.print(tm.tm_wday);
  if (tm.tm_isdst == 1)             // Daylight Saving Time flag
    Serial.print("\tDST");
  else
    Serial.print("\tstandard");
  Serial.println();
}

void SwitchLED(const uint8_t MyArray[], size_t n) {
  for (size_t i = MyArray[0]; i < MyArray[0] + n; i++) {
    leds[i] = 0xFFC58F;  // Warmweiß
    FastLED.setBrightness(BRIGHTNESS);
  }
}

void displayHour(uint8_t hour) {
 // if (Stunde > 12) {
 //   Stunde -= 12;  // 12-Stunden-Format
 // } else if (Stunde == 0) {
 //   Stunde = 12;
 // }

  switch (hour) {
    case 1:
      SwitchLED(Ein, (sizeof(Ein) / sizeof(Ein[0])));
      Serial.print("1 ");
      break;
    case 2:
      SwitchLED(Zwei, (sizeof(Zwei) / sizeof(Zwei[0])));
      Serial.print("2 ");
      break;
    case 3:
      SwitchLED(Drei, (sizeof(Drei) / sizeof(Drei[0])));
      Serial.print("3 ");
      break;
    case 4:
      SwitchLED(Vier, (sizeof(Vier) / sizeof(Vier[0])));
      Serial.print("4 ");
      break;
    case 5:
      SwitchLED(Fuenf, (sizeof(Fuenf) / sizeof(Fuenf[0])));
      Serial.print("5 ");
      break;
    case 6:
      SwitchLED(Sechs, (sizeof(Sechs) / sizeof(Sechs[0])));
      Serial.print("6 ");
      break;
    case 7:
      SwitchLED(Sieben, (sizeof(Sieben) / sizeof(Sieben[0])));
      Serial.print("7 ");
      break;
    case 8:
      SwitchLED(Acht, (sizeof(Acht) / sizeof(Acht[0])));
      Serial.print("8 ");
      break;
    case 9:
      SwitchLED(Neun, (sizeof(Neun) / sizeof(Neun[0])));
      Serial.print("9 ");
      break;
    case 10:
      SwitchLED(Zehn, (sizeof(Zehn) / sizeof(Zehn[0])));
      Serial.print("10 ");
      break;
    case 11:
      SwitchLED(Elf, (sizeof(Elf) / sizeof(Elf[0])));
      Serial.print("11 ");
      break;
    case 12:
      SwitchLED(Zwoelf, (sizeof(Zwoelf) / sizeof(Zwoelf[0])));
      Serial.print("12 ");
      break;
  }
}

void displaytime(void) {
  //zuerst setzten wir alle LEDs zurück
  fill_solid( leds, NUM_LEDS, CHSV(0, 0, 0));

  // Nun suchen wir die richtigen LEDs und übergeben sie an die Funktion zum Anschalten
  Serial.print("Es ist ");
  SwitchLED(Es, (sizeof(Es) / sizeof(Es[0])));
  SwitchLED(Ist, (sizeof(Ist) / sizeof(Ist[0])));
  uint8_t offset = 0;  // für die Stunde
  switch (Minute) {
    case 5 ... 9 :
      SwitchLED(MFuenf, (sizeof(MFuenf) / sizeof(MFuenf[0])));
      SwitchLED(Nach, (sizeof(Nach) / sizeof(Nach[0])));
      Serial.print("5 Minuten nach");
      break;
    case 10 ... 14 :
      SwitchLED(MZehn, (sizeof(MZehn) / sizeof(MZehn[0])));
      SwitchLED(Nach, (sizeof(Nach) / sizeof(Nach[0])));
      Serial.print("10 Minuten nach");
      break;
    case 15 ... 19 :
      SwitchLED(Viertel, (sizeof(Viertel) / sizeof(Viertel[0])));
      SwitchLED(Nach, (sizeof(Nach) / sizeof(Nach[0])));
      Serial.print("Viertel nach");
      break;
    case 20 ... 24 :
      SwitchLED(MZwanzig, (sizeof(MZwanzig) / sizeof(MZwanzig[0])));
      SwitchLED(Nach, (sizeof(Nach) / sizeof(Nach[0])));
      Serial.print("20 Minuten nach");
      break;
    case 25 ... 29 :
      SwitchLED(MFuenf, (sizeof(MFuenf) / sizeof(MFuenf[0])));
      SwitchLED(Und, (sizeof(Und) / sizeof(Und[0])));
      SwitchLED(MZwanzig, (sizeof(MZwanzig) / sizeof(MZwanzig[0])));
      SwitchLED(Nach, (sizeof(Nach) / sizeof(Nach[0])));
      Serial.print("25 Minuten nach");
      break;
    case 30 ... 34 :
      SwitchLED(Halb, (sizeof(Halb) / sizeof(Halb[0])));
      Serial.print("Halb ");
      offset = 1;
      break;
    case 35 ... 39 :
      SwitchLED(MFuenf, (sizeof(MFuenf) / sizeof(MFuenf[0])));
      SwitchLED(Und, (sizeof(Und) / sizeof(Und[0])));
      SwitchLED(MZwanzig, (sizeof(MZwanzig) / sizeof(MZwanzig[0])));
      SwitchLED(Vor, (sizeof(Vor) / sizeof(Vor[0])));
      Serial.print("25 Minuten vor");
      offset = 1;
      break;
    case 40 ... 44 :
      SwitchLED(MZwanzig, (sizeof(MZwanzig) / sizeof(MZwanzig[0])));
      SwitchLED(Vor, (sizeof(Vor) / sizeof(Vor[0])));
      Serial.print("20 Minuten vor");
      offset = 1;
      break;
    case 45 ... 49 :
      SwitchLED(Viertel, (sizeof(Viertel) / sizeof(Viertel[0])));
      SwitchLED(Vor, (sizeof(Vor) / sizeof(Vor[0])));
      Serial.print("Viertel vor");
      offset = 1;
      break;
    case 50 ... 54 :
      SwitchLED(MZehn, (sizeof(MZehn) / sizeof(MZehn[0])));
      SwitchLED(Vor, (sizeof(Vor) / sizeof(Vor[0])));
      Serial.print("10 Minuten vor");
      offset = 1;
      break;
    case 55 ... 59 :
      SwitchLED(MFuenf, (sizeof(MFuenf) / sizeof(MFuenf[0])));
      SwitchLED(Vor, (sizeof(Vor) / sizeof(Vor[0])));
      Serial.print("5 Minuten vor");
      offset = 1;
      break;
  }
  displayHour(Stunde + offset);
  SwitchLED(Uhr, (sizeof(Uhr) / sizeof(Uhr[0])));
  Serial.println("Uhr");
  // Minuten Zähler
  uint8_t MinCount = Minute - (floor(Minute / 10) * 10);
  if (MinCount > 5)
    MinCount = MinCount - 5;

  // noiasca: intents ergänzt
  switch (MinCount) {
    case 4:
      SwitchLED(VierM, (sizeof(VierM) / sizeof(VierM[0])));
      [[fallthrough]];
    case 3:
      SwitchLED(DreiM, (sizeof(DreiM) / sizeof(DreiM[0])));
      [[fallthrough]];
    case 2:
      SwitchLED(ZweiM, (sizeof(ZweiM) / sizeof(ZweiM[0])));
      [[fallthrough]];
    case 1:
      SwitchLED(EinsM, (sizeof(EinsM) / sizeof(EinsM[0])));
  }
  FastLED.show();
}

void loop() {
  // Zeit aktualisieren
  // lass das nicht weg, du greifst nachfolgenden auf die tm. Variablen zu - also sorg dafür, dass sie aktuell sind und mach dich nicht abhängig von der showTime()
  time(&now);                       // read the current time
  localtime_r(&now, &tm);           // update the structure tm with the current time

  // Ausgabe nur bei Minutenwechsel
  static uint8_t previousMinute = 0;  
  if (tm.tm_min != previousMinute) {
    previousMinute = tm.tm_min;
    Stunde = tm.tm_hour;
    Minute = tm.tm_min;
    if (Stunde > 12) {
      Stunde -= 12;  // 12-Stunden-Format
    } else if (Stunde == 0) {
      Stunde = 12;
    }
    Serial.print("Stunde: "); Serial.println(Stunde);
    Serial.print("Minute: "); Serial.println(Minute);
    displaytime();
  }
  showTime();
  FastLED.delay(250);
}
//