Hallo
Ich spiel grad mit Zeitmodulen rum (DS3231-RTC-Modul und DCF77-Modul).
Mein Sketch soll die Zeiten von beiden Modulen auf einem LCD-Display anzeigen.
Eigentlich wollte ich den Aufbau eine Weile in die Schublade legen und nach ein paar Wochen schauen, ob das RTC-Modul noch richtig geht.
Zum Testen liegt der Aufbau jetzt eine Weile neben mir, dabei ist mir folgendes aufgefallen:
Beide Zeiten laufen gleich, beim Minutenwechsel springt die DCF-Zeit dann manchmal eine Sekunde vor.
Beim nächsten erfolgreichen Signal-Empfang springt die Zeit wieder zurück.
Das Ganze passiert so alle 10 Minuten mal.
Bei einer Uhr spielt das kaum eine Rolle, merkt ja keiner ob die gelegentlich mal eine Sekunde falsch geht.
Mich würde aber interessieren, wo der Fehler herkommt.
Gruß, e0mc2
Code:
#include <DCF77.h>
#include <Time.h>
#include <TimeLib.h>
#include <DS3231.h>
#include <Wire.h>
#include <LiquidCrystal.h>
#define DCF_PIN 2 // DCF77 Pin
#define DCF_INTERRUPT 0 // Interrupt mit Pin
DS3231 clock;
RTCDateTime dt;
time_t time;
DCF77 DCF = DCF77(DCF_PIN,DCF_INTERRUPT);
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int RTCStd = 0;
int RTCMin = 0;
int RTCSek = 0;
int DCFStd = 0;
int DCFMin = 0;
int DCFSek = 0;
void setup()
{
lcd.begin (16, 2);
DCF.Start();
clock.begin();
}
void loop()
{
time_t DCFtime = DCF.getTime(); //Prüfen ob neue DCF-Zeit vorhanden ist
if (DCFtime!=0)
{
setTime(DCFtime);
}
dt = clock.getDateTime();
// Variablem RTC setzen
RTCStd = dt.hour;
RTCMin = dt.minute;
RTCSek = dt.second;
// Variablen DCF setzen
DCFStd = hour();
DCFMin = minute();
DCFSek = second();
// RTC anzeigen
lcd.setCursor (0, 0);
lcd.print ("RTC: ");
if (RTCStd < 10) lcd.print ("0");
lcd.print (RTCStd);
lcd.print (":");
if (RTCMin < 10) lcd.print ("0");
lcd.print (RTCMin);
lcd.print (":");
if (RTCSek < 10) lcd.print ("0");
lcd.print (RTCSek);
lcd.setCursor (0, 1);
// DCF anzeigen
lcd.print ("DCF77: ");
if (DCFStd < 10) lcd.print ("0");
lcd.print (DCFStd);
lcd.print (":");
if (DCFMin < 10) lcd.print ("0");
lcd.print (DCFMin);
lcd.print (":");
if (DCFSek < 10) lcd.print ("0");
lcd.print (DCFSek);
}