Ich komm nicht so recht weiter

Hallo zusammen, Ich habe vor ein paar Monaten mir die Rheinturmuhr gebaut leider habe ich innerhalb einer Woche 5 Minuten Plus an Differenz bei der Uhrzeit. Verbaut ist dort ein RTC DS1307. Das Problem ist ein DCF77 mit anzuschließen ohne das ich ständig Fehlermeldungen bekomme.Habe da folgenden Sketch ( ohne DCF77 )

/* Rheinturmuhr mit NeoPixel WS2812 LED-Streifen */

#include <Adafruit_NeoPixel.h>
#include <Wire.h>
#include <RtcDS1307.h>
RtcDS1307<TwoWire> Rtc(Wire);

#define PIN 6         // Pin, an dem der Datenpin der Neopixel angeschlossen ist
#define NUMPIXELS 51  // Anzahl der LEDs

int blinkgeschwindigkeit = 1000;  // hier kann man die roten Trenn-LEDs blinken lassen – wenn man das nicht will, kann man die Variable auf 1 setzen

int theLEDsAus[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0 };
int theLEDs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0 };

Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);  // Anlegen des Neopixel-Objektes

/* ***** ***** ***** ***** SETUP ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */
void setup() {
  pixels.begin();            // Initialisierung des Neopixel Objektes
  pixels.setBrightness(50);  // Set BRIGHTNESS to about 1/5 (max = 255)
  rtcInit();                 // Real Time Clock Initialisierung
}

/* ***** ***** ***** ***** LOOP ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** */
void loop() {
  if (!Rtc.IsDateTimeValid()) {
    if (Rtc.LastError() != 0) {
      // we have a communications error
      // see https://www.arduino.cc/en/Reference/WireEndTransmission for
      // what the number means
      Serial.print("RTC communications error = ");
      Serial.println(Rtc.LastError());
    } else {
      // Common Causes:
      //    1) the battery on the device is low or even missing and the power line was disconnected
      Serial.println("RTC lost confidence in the DateTime!");
    }
  }

  RtcDateTime now = Rtc.GetDateTime();

  printDateTime(now);
  Serial.print(" ");
  updateTime(now);
  showTime();
  Serial.println();

  delay(10);
}

void updateTime(const RtcDateTime& dt) {
  /* Reset aller LED Einträge */
  for (int i = 0; i < NUMPIXELS; i++) {
    theLEDs[i] = theLEDsAus[i];
  }

  /* Sekunden Einer */
  for (int i = 0; i < dt.Second() % 10; i++) {
    theLEDs[i] = 1;
  }
  /* Sekunden Zehner */
  for (int i = 0; i < dt.Second() / 10; i++) {
    theLEDs[15 - i] = 1;
  }

  /* Minuten Einer */
  for (int i = 0; i < dt.Minute() % 10; i++) {
    theLEDs[19 + i] = 1;
  }
  /* Minuten Zehner */
  for (int i = 0; i < dt.Minute() / 10; i++) {
    theLEDs[34 - i] = 1;
  }

  /* Stunden Einer */
  for (int i = 0; i < dt.Hour() % 10; i++) {
    theLEDs[38 + i] = 1;
  }

  /* Stunden Zehner */
  for (int i = 0; i < dt.Hour() / 10; i++) {
    theLEDs[50 - i] = 1;
  }
}

void showTime() {

  pixels.clear();  // Schalte alle LEDs aus

  for (int i = 0; i < NUMPIXELS; i++) {
    switch (theLEDs[i]) {
      case 0:
        Serial.print("-");
        pixels.setPixelColor(i, pixels.Color(0, 0, 0));
        break;
      case 1:
        Serial.print("*");
        pixels.setPixelColor(i, pixels.Color(100, 100, 100));
        break;
      case 2:
        Serial.print(" ");
        break;
      case 3:
        if (millis() % blinkgeschwindigkeit < blinkgeschwindigkeit / 2) {
          Serial.print("|");
          pixels.setPixelColor(i, pixels.Color(0, 0, 0));
        } else {
          Serial.print("–");
          pixels.setPixelColor(i, pixels.Color(100, 0, 0));
        }
        break;
    }
  }
  pixels.show();  // Sende die Farbinformationen an den LED-Streifen
}

/* ***** ***** ***** ***** Methoden für die Real Time Clock ***** ***** ***** ***** ***** ***** */

void rtcInit() {
  Serial.begin(115200);

  Serial.print("compiled: ");
  Serial.print(__DATE__);
  Serial.println(__TIME__);

  //--------RTC SETUP ------------
  // if you are using ESP-01 then uncomment the line below to reset the pins to
  // the available pins for SDA, SCL
  // Wire.begin(0, 2); // due to limited pins, use pin 0 and 2 for SDA, SCL

  Rtc.Begin();

  RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__);
  printDateTime(compiled);
  Serial.println();

  if (!Rtc.IsDateTimeValid()) {
    if (Rtc.LastError() != 0) {
      // we have a communications error
      // see https://www.arduino.cc/en/Reference/WireEndTransmission for
      // what the number means
      Serial.print("RTC communications error = ");
      Serial.println(Rtc.LastError());
    } else {
      // Common Causes:
      //    1) first time you ran and the device wasn't running yet
      //    2) the battery on the device is low or even missing

      Serial.println("RTC lost confidence in the DateTime!");
      // following line sets the RTC to the date & time this sketch was compiled
      // it will also reset the valid flag internally unless the Rtc device is
      // having an issue

      Rtc.SetDateTime(compiled);
    }
  }

  if (!Rtc.GetIsRunning()) {
    Serial.println("RTC was not actively running, starting now");
    Rtc.SetIsRunning(true);
  }

  RtcDateTime now = Rtc.GetDateTime();
  if (now < compiled) {
    Serial.println("RTC is older than compile time!  (Updating DateTime)");
    Rtc.SetDateTime(compiled);
  } else if (now > compiled) {
    Serial.println("RTC is newer than compile time. (this is expected)");

  } else if (now == compiled) {
    Serial.println("RTC is the same as compile time! (not expected but all is fine)");
  }

  // never assume the Rtc was last configured by you, so
  // just clear them to your needed state
  Rtc.SetSquareWavePin(DS1307SquareWaveOut_Low);
}

#define countof(a) (sizeof(a) / sizeof(a[0]))

void printDateTime(const RtcDateTime& dt) {
  char datestring[20];

  snprintf_P(datestring,
             countof(datestring),
             PSTR("%02u/%02u/%04u %02u:%02u:%02u"),
             dt.Month(),
             dt.Day(),
             dt.Year(),
             dt.Hour(),
             dt.Minute(),
             dt.Second());
  Serial.print(datestring);
}

wo müsste ich was eintragen damit der DCF77 funktioniert ? Vielleicht ist jemand so nett und kann mir weiterhelfen.
Bin Anfänger ohne viel Ahnung deshalb die komische Frage.Vielen Dank für Eure Hilfe
Gruß Jürgen

Nimm eine RTC3231 ... dann hast Du das Problem nicht mehr.

Schaltet das auch die sommer winterzeit automatisch ? was müsste ich denn dafür im sketch ändern

Nein, die DS3231 (Link als Beispiel) ist eine sehr genaue RTC, um Sommer zeit Normalzeit haben gibt es Beispiele hier im Forum, suche verwenden.

Du kannst auch einen ESP8266 oder ESP32 nehmen und die Zeit per WLan aus dem Web holen. Dann hast du eine automatische Umschaltung.

Zur ersten Frage: Nein

Zweite Frage: wenn Du die Library verwendest, die ich vermute, dann musst Du eigentlich nur folgendes ändern:

Aus

#include <RtcDS1307.h>
RtcDS1307<TwoWire> Rtc(Wire);

wird

#include <RtcDS3231.h>
RtcDS3231<TwoWire> Rtc(Wire);

Was die Umstellung auf Sommerzeit betrifft kann auf den den letzten Sonntag im März und auf den letzten Sonntag im Oktober getestet werden und wenn die Bedingung zutrifft
dann addiert man eine Stunde um 2Uhr oder subtrahiert eine Stunde um 3Uhr

Das könnte so aussehen:

// Sets the clock to the new time every time the clock changes
void setSummerOrWinterTime(DateTime &dt) {
  // dayOfTheWeek = 0 is Sunday
  // Check if summertime begins (last Sunday of March 02:00 AM)
  if (dt.month() == 3 && dt.day() > 24 && dt.dayOfTheWeek() == 0 && dt.hour() == 2) {
    rtc.adjust(dt + TimeSpan(0, 1, 0, 0));
  }
  // Check if summertime ends (last Sunday of Oktober 03:00 AM)
  if (dt.month() == 10 && dt.day() > 24 && dt.dayOfTheWeek() == 0 && dt.hour() == 3) {
    rtc.adjust(dt + TimeSpan(0, -1, 0, 0));
  }
}

Dieser Code dürfte aber nicht auf deine Bibliothek passen. Hier wurde die RTCLib von Adafruit verwendet (GitHub - adafruit/RTClib: A fork of Jeelab's fantastic RTC Arduino library). Aber ich denke das Prinzip ist erkennbar und sollte auf die von Dir verwendete Bibliothek (GitHub - Makuna/Rtc: Arduino Library for RTCs, Ds1302, Ds1307, Ds3231, Ds3232, Ds3234 and Pcf8563/BM8563 with deep support. Please refer to the Wiki for more details. Please use the Github Discussions to ask questions as the GitHub Issues feature is used for bug tracking. ? ) anpassbar sein.

Das ist (jedenfalls bei mir) ein ganz dunkles Kapitel.
Ich habe hier auch so ein Ding rumliegen, dass auf einem Pin die amtlich verbreitete Zeit eintickern soll. Allerdings habe ich das am Uno/Nano nie sauber zum Laufen gebracht.

Was für ein DCF-Modul hast Du?

Also ich habe da vor ein paar Jahren mal was gebastelt... läuft einwandfrei:

Wurde mit einem ATtiny88 umgesetzt...

1 Like

Wollte dem TO das nicht schreiben habe sogar zwei Module, keiner Funktioniert ob wohl unzählige DCF Sachen zu hause habe.

Was für Modul? Wenn noch in Erinnerung, hab's aufgegeben

Ist auf der Github-Seite verlinkt. Ist das DCF77 Modul von ELV.

Ja, ist verlinkt, danke!
Für nicht selbst-Sucher hier der Link: ELV DCF Modul.
Meins ist wohl ähnlich, nach Betrachtung Deiner Schaltung muss ich wohl erstmal Vorräte an MOSFETs anlegen. Da zieht die Grabbelkiste momentan nämlich blank :frowning:

Das ist ein DCF-3850M-800 Modul

das ist die seite mit dem Skript

Ah ja, hab's gesucht und bei eBay gefunden. Sieht aus wie meins von Amazon.
Nach dem Hinweis von @Kai-R ist da externe Beschaltung nötig (auf seinem ersten Link ganz unten ist ein Schaltplan verlinkt).

hatte auch gedacht das es einfacher wäre :thinking:

Ich fände WLAN einfacher, ist natürlich abhängig vom Standpunkt des Betrachters. Eine große Siebensegment-Uhr mit LED-Streifen zeigt mir die Zeit genau an.

Einfacher geht auch.
Tommy hat da einen schönen Spruch mit "Holz hacken".

ich auch.

Ich glaube im August hatten wir den Lichtzeitpegel/Rheinturmuhr schon mal ... da sollte sich auch ein Sketch von mir für den ESP finden ...

Linearuhr (Lichtzeitpegel Rheinturm Düsseldorf) für den ESP

1 Like