RTC + DCF77

Hallo,

Da ich eine selbst gebaute Led Uhr habe und diese mit einer RTC läuft wollte ich nun fragen, ob jemand einen Code hat, wo die DCF77 einmal am Tag die RTC aktualisiert. Ich weis das dieses Thema schon oft angesprochen wurde aber ich habe noch keinen konkreten Code gefunden.

Liebe Grüße und Vielen Dank im voraus,
Valli

Hast Du einen DCF77-Empfänger, der Dir die richtige Zeit liefert? Dann ist der Update des RTC nicht schwierig. Ein sauberer Empfang des DCF77-Signals und die "tolerante" Dekodierung desselben ist allerdings nicht ganz einfach und hängt unter anderem von der von Dir eingesetzten Hardware ab.

Hi!

Ein Code-Ausschnitt von meinem letzten Uhr-Projekt (aufs wesentliche gekürzt).
Wann und wie oft du dcfsync() aufrufst, kannst du selbst entscheiden.
Die Variable lastdcf speichert die Zeit des letzten Empfangs.

#include "DCF77.h"  // von https://github.com/thijse/Arduino-Libraries/downloads
#include "Time.h"
#include "Wire.h"
#define DS1307_ADDRESS 0x68
unsigned long lastdcf=0;

... setup ... loop ...


void dcfsync(){
  DCFtime = DCF.getTime(); // Check if new DCF77 time is available
  if (DCFtime!=0)
  {
    setTime(DCFtime);
    lastdcf=now();
    Wire.beginTransmission(DS1307_ADDRESS);
    Wire.write(zero); //stop Oscillator
    Wire.write(decToBcd(second(DCFtime)));
    Wire.write(decToBcd(minute(DCFtime)));
    Wire.write(decToBcd(hour(DCFtime)));
    Wire.write(decToBcd(weekday(DCFtime)));
    Wire.write(decToBcd(day(DCFtime)));
    Wire.write(decToBcd(month(DCFtime)));
    Wire.write(decToBcd(year(DCFtime)));
    Wire.write(zero); //start 
    Wire.endTransmission();
  } 
}

Viel Spaß damit und guten Empfang!

ulli.

Danke für die schnellen antworten!

Ich habe die dcf schon einmal mit einem Arduino uno getestet und sie empfängt alle 3 Minuten oder so ein Signal.
Den Code werde ich morgen mal Ausprobieren!

Liebe Grüße,
Valli

Hallo,

ich habe den Code ausprobiert, aber er wirft ein paar Fehlermeldungen aus:

sketch_jan29a.ino: In function 'void dcfsync()':
sketch_jan29a:16: error: 'DCFtime' was not declared in this scope
sketch_jan29a:16: error: 'DCF' was not declared in this scope
sketch_jan29a:22: error: 'zero' was not declared in this scope
sketch_jan29a:23: error: 'decToBcd' was not declared in this scope

Vieleicht kann mir jemand helfen.
Liebe Grüße,
Valli

Hoppla, hab wohl auf weniger als das wesentliche gekürzt. Sorry!
Kann leider erst morgen abend mehr schicken, weil ich unterwegs bin.
Alternativ kannst dir die Beispiele der Library anschauen, da sollte sich auch viel erklären...

Ulli.

So, jetz aber...

#include "DCF77.h"  // von https://github.com/thijse/Arduino-Libraries/downloads
#include "Time.h"
#include "Wire.h"
#define DS1307_ADDRESS 0x68
#define DCF_PIN 2	  // Pin, an dem der DCF-Empfänger hängt,
                          // getestet mit Conrad Artikel# 641138
#define DCF_INTERRUPT 0	  // DCF-Interrupt
DCF77 DCF = DCF77(DCF_PIN,DCF_INTERRUPT);
unsigned long lastdcf=0;
time_t DCFtime;
byte zero = 0x00;

void setup(){
  DCF.Start();
  Wire.begin();
}
void loop(){
  
  if (now()-lastdcf > 3600 || lastdcf==0) dcfsync(); //DCFsync, wenn noch nicht erfolgt oder > 1 Std vorbei
  /*
  .
  restlicher code
  .
  */
}


void dcfsync(){
  DCFtime = DCF.getTime(); // Check if new DCF77 time is available
  if (DCFtime!=0)
  {
    setTime(DCFtime);
    lastdcf=now();
    Wire.beginTransmission(DS1307_ADDRESS);
    Wire.write(zero); //stop Oscillator
    Wire.write(decToBcd(second(DCFtime)));
    Wire.write(decToBcd(minute(DCFtime)));
    Wire.write(decToBcd(hour(DCFtime)));
    Wire.write(decToBcd(weekday(DCFtime)));
    Wire.write(decToBcd(day(DCFtime)));
    Wire.write(decToBcd(month(DCFtime)));
    Wire.write(decToBcd(year(DCFtime)));
    Wire.write(zero); //start 
    Wire.endTransmission();
  } 
}

byte bcdToDec(byte val)  {
  return ( (val/16*10) + (val%16) ); // Convert binary coded decimal to normal decimal numbers
}    

byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) ); // Convert normal decimal numbers to binary coded decimal
}