Frage: Wie ein DCF77 Empfänger mit RTC an einer Wordclock betreiben

Hallo,
ich möchte eine Wordclock mit einem DCF77 Empfänger updaten.
Dazu habe ich eine Anleitung zu einer Wordclock mit RTC (geniale Anleitung hier: https://dracarysdiy.com/word-clock-v2/) mit dem angehängten Code zum Laufen gebracht.

Zweitens habe ich aus diesem Post von jurs (https://forum.arduino.cc/index.php?topic=344948.msg2378399#msg2378399) den ebenfalls angehängten test code zum betreiben eines DCF mit RTC zum Laufen gebracht.

Beide Aufbauten und Sketche laufen unter 1.6.5, also dachte ich in meinem Überschwang, warum kombiniere ich nicht das eine mit dem anderen um meine RTC an der Wordclock mit dem DCF zu betreiben…

Wie ihr euch denken könnt, ging das nicht so richtig los. Ich habe versucht die Inhalte von dcfRTC.ino in meine Wordclock.ino zu übernehmen, um damit auf jursDCFtime.h zuzugreifen, aber bin gescheitert (bisher).

Hier nun meine Frage, gibt es einen eleganten Weg, den Code von jurs für die DCF zu übernehmen / zu referenzieren? Und ja, ich habe nicht viel Ahnung, aber versuche mir gerade das anzueignen… :slight_smile:

Ich hoffe, ich habe mich klar genug ausgedrückt.
Danke schon mal für Vorschläge!
Arne

Wordclock_WS2812_code_versuch_2.ino (12.6 KB)

DCFclockRTC.zip (3.3 KB)

Hallo kulturbereicherer ,

Danke für den Hinweis. Ich setze keine SteppUp oder SteppDown Converter ein, läuft alles bei 5V über ein externes Netzteil.

Arne3a:
Hier nun meine Frage, gibt es einen eleganten Weg, den Code von jurs für die DCF zu übernehmen / zu referenzieren?

Das Programm besteht aus einer .ino-Dateo mit einer .h Datei, in der verschiedene Funktionen aufgerufen werden, und zwar mit dieser loop-Funktion

void loop() {
  sTime time;
  if (dcfUpdate())
  {
    RTCwriteTime(lastValidDCFtime);
    Serial.println("DCF77 TIME TELEGRAM RECEIVED!");
    
  }
  if (millis()-lastPrintTimeMillis>=1000) // each second
  { // read time from RTC and print it to Serial
    lastPrintTimeMillis+=1000;
    char buf[21];
    RTCreadTime(time);
    snprintf(buf,sizeof(buf),"%02d.%02d.%04d  %02d:%02d:%02d", time.bDay, time.bMonth, time.iYear, time.bHour, time.bMinute, time.bSecond);
    Serial.println(buf); // print date and time
  }
}

Was ist daran unklar?

In der loop wird so lange dcfUpdate() aufgerufen, bis diese Funktion true zurückliefert.

Zu diesem Zeitpunkt wurde gerade ein neues DCF-Zeittelegramm empfangen und der aktuelle Zeitstempel befindet sich in de globalen struct_Variablen lastValidDCFtime, aus der Du sie herausziehen kannst.

Mein Programm nimmt dann einfach diese Zeit und stellt das RTC-Modul neu, per Funktionsaufruf:
RTCwriteTime(lastValidDCFtime);

Außerdem wird einmal pro Sekunde die Zeit aus dem RTC-Modul ausgelesen und auf Serial angezeigt.

Das passiert in diesem Codeabschnitt der loop-Funktion:

  if (millis()-lastPrintTimeMillis>=1000) // each second
  { // read time from RTC and print it to Serial
    lastPrintTimeMillis+=1000;
    char buf[21];
    RTCreadTime(time);
    snprintf(buf,sizeof(buf),"%02d.%02d.%04d  %02d:%02d:%02d", time.bDay, time.bMonth, time.iYear, time.bHour, time.bMinute, time.bSecond);
    Serial.println(buf); // print date and time

Und da könntest Du mit der Zeit, die aus der RTC in die struct.variable time eingelesen wird, natürlich auch etwas anderes machen, als Datum und Zeitin einen nullterminierten String zu formatieren und diesen an Serial zu senden.

Alles ohne Verwendung einer Library, alle benötigten Hilfsfunktionen und die Deklaration der struct Variablen habe ih mir in die inkludierte .h Datei geschrieben.

Arne3a:
Danke für den Hinweis. Ich setze keine SteppUp oder SteppDown Converter ein, läuft alles bei 5V über ein externes Netzteil.

Und auch diese externen Netzteile können Störungen produzieren, die deine DCF77 aus dem Tritt bringen kann.
Meist hilft da ein zusätzlicher Elko an der Betriebsspannung.

Genauso stören auch in der Nähe stehende Computer oder Monitore/Flachbildschirme.

Alternativ wäre es vieleicht eine Überlegung wert auf die RTC ganz zu verzichten. Wenn Du stattdessen einen Arduino Clone mit Quarz statt Resonator nimmst und meine DCF77 Bibliothek verwendest, dann brauchst Du keine RTC mehr weil die Bibliothek den Frequenzfehler des Quarz kompensieren kann.

https://travis-ci.org/udoklein/dcf77

Das Störungsproblem wird mit meiner Library massiv vermindert.

Hallo Udoklein,

udoklein:
Alternativ wäre es vieleicht eine Überlegung wert auf die RTC ganz zu verzichten. Wenn Du stattdessen einen

Das möchte ich eigentlich nicht machen, da ich davon ausgehe, das der DCF Empfänger nicht häufig ein reguläres Signal bekommt und daher die RTC die Uhrzeit sicher hat.

Hallo jurs,
evtl habe ich mich unklar ausgedrückt. Ich möchte die beiden Funktionen (DCF Empfang und RTC auslesen für die Wordclock) kombinieren. Dazu versuche ich mich gerade deinen sketch und den Wordclock sketch zu kombinieren.

  1. Ich scheitere gerade daran, das in beiden .ino Dateien "void loop" und void setup" definiert sind und anscheinend sich das im gleichen sketch ausschließt...
dcfRTC.ino: In function 'void setup()':
dcfRTC:18: error: redefinition of 'void setup()'
wordclock_DCF:68: error: 'void setup()' previously defined here
dcfRTC.ino: In function 'void loop()':
dcfRTC:28: error: redefinition of 'void loop()'
wordclock_DCF:407: error: 'void loop()' previously defined here
redefinition of 'void setup()'
  1. Ebenfalls habe ich versucht deinen dcfRTC sketch in die Wordclock.ino zu integrieren, aber auch da komme ich nicht weiter, weil es eine Unmenge an Fehlern gibt.

Wahrscheinlich gibt es eine klare, einfache Lösung von der ich derzeit einfach keine Ahnung habe??

Arne

Das ist ja genau der Punkt. Wenn DCF77 ausfällt nutzt meine Library den eingebauten Quarz um die Zeit zu bestimmen. Dazu bestimmt sie nach und nach auch die Frequenzabweichung des Quarzes. Weitehin sind die Störungen in Deutschland kein Problem für meine Library. 10-20 zufällige Bitfehler jede Minute kann meine Library locker wegsteckend und korrigieren. Mir ist schleierhaft wo in Deutschland die Empfangsbedingungen so schlecht sein sollen, daß das nicht reicht.

Die ganzen DCF77 mit RTC Ansätze gibt es nur aus 2 Gründen:

  1. Die Library hat einen naiven Dekoder
  2. Dein Arduino läuft ohne Quarz

Schau einfach mal bei github nach was die Entwickler dort so bevorzugen:

Arne3a:
Wahrscheinlich gibt es eine klare, einfache Lösung von der ich derzeit einfach keine Ahnung habe??

Es gibt in einem Sketch nur ein Setup und eine Loop.

Du musst die Anweisungen des einen Setups in dein neues Setup übernehmen, ebenso die Definitionen und darauf achten, dass nichts doppelt vorkommt.

Die Loop musst du als Funktion in den neuen Sketch aufnehmen und aus der aktuellen Loop aufrufen.

udoklein:
Alternativ wäre es vieleicht eine Überlegung wert auf die RTC ganz zu verzichten.

Würde ich auch nicht machen. Nimmt man eine DS3231, dann läuft die dank eingebauter Temperaturkompensation so genau, dass man eigentlich auf die DCF77-Synchronisation fast verzichten kann. Die hier gemessene Abweichung beträgt keine 10s. pro Jahr: DS3231 Real Time Clock Module / Arduino & Raspberry Pi - SwitchDoc Labs Blog Im Endeffekt für eine Wortuhr, die man ja kaum als Prässisionsuhr nutzt, über lange Zeiten ausreichend genau.

Der große Vorteil der RTC ist, dass sie bei Netzausfall weiter läuft. Wenn man die Uhr Nachts weil einen das leuchten stört, vom Netz trennt, ist sie sofort wieder da.

Das Argument mit der Gangabweichung verstehe ich, nur der Autotune Algorithmus tuned die Quarze ebenfalls besser als 1ppm. Das Argument mit dem Netzausfall hingegen leuchtet mir ein.

Hallo,
an diesem Hinweis habe ich mich dann mal versucht:

HotSystems:
Es gibt in einem Sketch nur ein Setup und eine Loop.

Du musst die Anweisungen des einen Setups in dein neues Setup übernehmen, ebenso die Definitionen und darauf achten, dass nichts doppelt vorkommt.

Die Loop musst du als Funktion in den neuen Sketch aufnehmen und aus der aktuellen Loop aufrufen.

Ich habe das DCF Setup in das Wordclock setup kopiert, eine neue Funktion mit Namen DCF erstellt und rufe die in der Wordclock loop auf. Soweit so gut :slight_smile:
Aber, folgender Fehler tritt bei mir auf (natürlich nicht in dem originalen DCF sketch):

wordclock_DCF:456: error: ‘lastPrintTimeMillis’ was not declared in this scope
‘lastPrintTimeMillis’ was not declared in this scope

natürlich habe ich (meiner meinung nach) ‘lastPrintTimeMillis’ deklariert, und zwar in der setup:

void setup() {
delay(3000); // Sicherheits Delay
Serial.begin(19200);

//DCF
Serial.println(F("\nDCF77 and RTC test sketch by ‘jurs’"));
if (RTCinit()) Serial.println(F(“RTC OK”));
else Serial.println(F(“RTC FAIL”));
pinMode(DCFPIN, DCF_INPUTMODE);

unsigned long lastPrintTimeMillis;
//DCF Ende

//LEDs werden eingefügt + Farbkorrektur und Farbtemperatur auf Wolfram (warmweiß)
FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalPixelString);
FastLED.setTemperature( Tungsten40W );
Serial.println(“Starte Wordclock …”);

//Versuche auf RTC zu zugreifen
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”);
}
}

Neu hinzugekommen ist der Bereich zwischen DCF. Wo ist der Fehler in der Deklaration?

Danke
Arne

Deine Definition (lt. Fehlermeldung) gehört nicht ins Setup sondern in den Definitionsbereich (Global) vor dem Setup.
Im Setup hat diese Definition nur eine Gültigkeit innerhalb (Lokal) des Setups.

Arne3a:
Neu hinzugekommen ist der Bereich zwischen DCF. Wo ist der Fehler in der Deklaration?
Danke
Arne

alle innerhalb einer Funktion deklarierte Variablen sind lokale Variablen, die NUR innerhalb(!) der Funktion ihren Sichtbarkeitsbereich haben.

Hallo,

so einfach wie ich gehofft habe, ist es leider nicht.
Ich habe die beiden ino Dateien zusammengestellt und bei Überprüfung / Kompilierung kommt auch kein Fehler.

Allerdings scheint etwas bei dem DCF Empfang zu stören…

Also, ich habe den Aufbau meiner Wordclock mit Nano, RTC und DCF. Dann teste ich den Empfang mit dem Skript von jurs (angehängt) und alles ist super. Innerhalb von wenigen Minuten ist der Empfang da.

1 88 1911 1999
00011101010110000100100101000100110110000001111100111010000 59
19:14:00 1/7/17
DCF77 TIME TELEGRAM RECEIVED!

Jetzt nehme ich mein zusammenstelltes Script (siehe Anhang) mit dem gleichen Aufbau auf dem Breadboard und ich bekomme immer (!) nur folgendes:

1 0 3277 3277
0 1
Error: Time code must contain 59 bits!

Er zählt nicht die Bits hoch, obwohl das Script für den DCF Empfang das gleiche ist, halt nur mit dem Wordclock Script zusammen… Ich stehe (wieder mal) auf dem Schlauch
Er zeigt Im seriellen Monitor nur die Ausgabe für die Wordclock an, und nichts oder fast nichts zum DCF Empfang…

Ich danke euch für einige Vorschläge!
Danke
Arne

DCFclockRTC.zip (3.3 KB)

wordclock_DCF_integriert_12Juni.zip (6.59 KB)

Hier noch als Nachtrag, was bei meinem Sketch im Monitor steht zu Beginn (mit meinen Kommentaren aus welchem Ursprungssketch es stammt):

DCF77 and RTC test sketch by 'jurs' ** DCF
RTC OK **DCF
Starte Wordclock ... ** WOrdclock
RTC has set the system time **Wordclock
01.07.2017 19:31:27 **DCF
Es ist Halb 8 **Wordclock
7 **Wordclock
31 **Wordclock
1 0 3295 3295 ** DCF
0 1 **DCF
Error: Time code must contain 59 bits! **DCF
01.07.2017 19:31:27 **DCF
Es ist Halb 9 **Wordclock
8 **Wordclock
31 **Wordclock
01.07.2017 19:31:28
Es ist Halb 8
7
31
Es ist Halb 8

Eine Funktion scheint sich zu widersprechen oder die DCF Funktion wird nicht richtig aufgerufen.
Kann es sein, das in meinem Script die DCF Funktion nur einmal aufgerufen wird und dann nicht mehr?
Ist das möglich, obwohl das in Loop liegt? Als Indiz ist, das die DCF Funktion oben nur einmal und dann nie wieder kommt....

Also etwa alle 2sec kommt so ein Eintrag
2 533 1554 2087
1 1
Error: Time code must contain 59 bits!
01.07.2017 20:28:04

Es wird nur ein Bit empfangen????? Warum?

Danke
Arne

Wenn Du Interesse daran hast, dass jemand Deine Sketche liest, dann stelle sie direkt ins Forum und bitte in Codetags (</> oben links). Anhänge werden kaum gelesen.

Gruß Tommy

HAllo,

dem Hinweis vom Tommy56 folgend hier mein Sketch (Wordclock + DCF).
Die meiner Meinung nach nicht relevanten Teile (für die Anzeige der WOrdclock) habe ich gelöscht.

#include <DS3232RTC.h> //https://github.com/JChristensen/DS3232RTC
#include <Time.h> //https://github.com/PaulStoffregen/Time
#include <Wire.h>  
#include <FastLED.h> //https://github.com/FastLED/FastLED
// DCF77 and RTC test sketch by 'jurs' for Arduino forum
// hardware required:
// RTC module: DS1307 or DS3231
// DCF77 module


// begin of user configuration area
#define DEBUGMODE 1  // 1 or 0 to show or not show debug messages
#define DCFPIN 7     // data pin of DCF77 module
#define DCF_INPUTMODE INPUT_PULLUP  // INPUT or INPUT_PULLUP
#define INVERTEDSIGNAL true  // false= normal signal, true= inverted signal
// end of user configuration area

#include "jursDCFtime.h"

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

uint8_t maxBrightness     = 35;  // Wenn Fotoresistor benutzt wird, hier max. Helligkeit eintragen (0=Off->255=max)
uint8_t minBrightness     = 190;   // Wenn Fotoresistor benutzt wird, hier min. Helligkeit eintragen (0=Off->255=max)
uint8_t AmbientLightPin   = 0;    // Fotoresistor Pin 
uint8_t BRIGHTNESS        = 100;  // 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;
boolean DST        = false;

//***HIER LED POSITIONEN EINTRAGEN***//
int EsIst[]     = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9,};

int Eins[]      = {80, 81, 82, 83, 84, 85};
int Ein[]       = {80, 81, 82, 83, 84};
int Zwei[]      = {91, 92, 93, 94, 95, 96};
int Drei[]      = {97, 98, 99, 100, 101, 102};
int Vier[]      = {103, 104, 105, 106, 107, 108};
int Fuenf[]     = {74, 75, 76, 77, 78, 79};
int Sechs[]     = {109, 110, 111, 112, 113, 114, 115, 116};
int Sieben[]    = {123, 124, 125, 126, 127, 128, 129, 130, 131, 132};
int Acht[]      = {117, 118, 119, 120, 121, 122};
int Neun[]      = {68, 69, 70, 71, 72, 73};
int Zehn[]      = {141, 142, 143, 144, 145, 146};
int Elf[]       = {86, 87, 88, 89, 90};
int Zwoelf[]    = {133, 134, 135, 136, 137, 138, 139, 140};
int MZwanzig[]  = {21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32};
int MFuenf[]    = {10, 11, 12, 13, 14, 15};
int MZehn[]     = {33, 34, 35, 36, 37, 38};

int Viertel[]   = {39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50};
int Vor[]       = {51, 52, 53, 54, 55};
int Nach[]      = {62, 63, 64, 65, 66, 67};
int Halb[]      = {56, 57, 58, 59, 60, 61};
int Uhr[]       = {147, 148, 149, 150, 151};
int Und[]       = {16, 17, 18, 19, 20};

int EinsM[]     = {152}; //Minuten Punkt 1
int ZweiM[]     = {153}; //Minuten Punkt 2
int DreiM[]     = {154}; //Minuten Punkt 3
int VierM[]     = {155}; //Minuten Punkt 4
//**********************************//

int i, Ambient, LastAmbient;
  unsigned long lastPrintTimeMillis;
void setup() {
  delay(3000); // Sicherheits Delay
  Serial.begin(19200);

  //DCF
    Serial.println(F("\nDCF77 and RTC test sketch by 'jurs'"));
  if (RTCinit()) Serial.println(F("RTC OK"));
  else Serial.println(F("RTC FAIL"));
  pinMode(DCFPIN, DCF_INPUTMODE);

//DCF Ende

  //LEDs werden eingefügt + Farbkorrektur und Farbtemperatur auf Wolfram (warmweiß)
  FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalPixelString);
  FastLED.setTemperature( Tungsten40W );
  Serial.println("Starte Wordclock ...");

  //Versuche auf RTC zu zugreifen
  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");  
  }
}

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(EsIst, (sizeof(EsIst)/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 ");
  }
>Hier fehlt was<

            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.
   */
    DCF();
    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);
}

void DCF() {
    sTime time;
  if (dcfUpdate())
  {
    RTCwriteTime(lastValidDCFtime);
    Serial.println("DCF77 TIME TELEGRAM RECEIVED!");
    
  }
  if (millis()-lastPrintTimeMillis>=1000) // each second
  { // read time from RTC and print it to Serial
    lastPrintTimeMillis+=1000;
    char buf[21];
    RTCreadTime(time);
    snprintf(buf,sizeof(buf),"%02d.%02d.%04d  %02d:%02d:%02d", time.bDay, time.bMonth, time.iYear, time.bHour, time.bMinute, time.bSecond);
    Serial.println(buf); // print date and time
  }
}

Arne3a:
Hier noch als Nachtrag, was bei meinem Sketch im Monitor steht zu Beginn (mit meinen Kommentaren aus welchem Ursprungssketch es stammt):

DCF77 and RTC test sketch by ‘jurs’ ** DCF
RTC OK **DCF
Starte Wordclock … ** WOrdclock
RTC has set the system time **Wordclock
01.07.2017 19:31:27 **DCF
Es ist Halb 8 **Wordclock
7 **Wordclock
31 **Wordclock
1 0 3295 3295 ** DCF
0 1 **DCF
Error: Time code must contain 59 bits! **DCF
01.07.2017 19:31:27 **DCF
Es ist Halb 9 **Wordclock
8 **Wordclock
31 **Wordclock
01.07.2017 19:31:28
Es ist Halb 8
7
31
Es ist Halb 8

Eine Funktion scheint sich zu widersprechen oder die DCF Funktion wird nicht richtig aufgerufen.
Kann es sein, das in meinem Script die DCF Funktion nur einmal aufgerufen wird und dann nicht mehr?
Ist das möglich, obwohl das in Loop liegt? Als Indiz ist, das die DCF Funktion oben nur einmal und dann nie wieder kommt…

Also etwa alle 2sec kommt so ein Eintrag
2 533 1554 2087
1 1
Error: Time code must contain 59 bits!
01.07.2017 20:28:04

Es wird nur ein Bit empfangen??? Warum?

Danke
Arne

Die dcfUpdate() Funktion muss mehere hundert mal pro Sekunde aufgerufen werden, aber durch das von dir eingefügte delay innerhalb der loop erfolgt der Aufruf wohl nur noch viermal pro Sekunde, womit keine Impulsdauer von 100/200ms mehr erfassbar ist. Die Programmlogik meines DCF-Dekoders hast du mit dem delay komplett zerstört.

Hallo jurs,

danke für den Hinweis.
Aber selbst wenn ich den delay entferne, kommt es zu keinem erfolgreichen Update der Zeit.
Da muss noch was anderes stören ...

Es kann durchaus zusätzlich weitere Störungen geben, die stören auf alle Fälle.
DCF77-Module sind sehr kritisch im Empfang.

Wenn das nicht geht, wäre als Alternative Netzwerk und die Zeit vom NTP-Server holen.

Gruß Tommy