Коррекция времени по атомным часам без подключения к интернет
27 января 2017

Коррекция времени по атомным часам
DCF77 — позывной длинноволнового передатчика точного времени, обеспечивающий функционирование часов с автоматической синхронизацией (англ. Radio controlled), а также систем телеметрии в Европе.
Передатчик DCF-77 расположен в Германии недалеко от Франкфурта, и на СДВ-частоте 77.5КГц передаются метки точного времени. При этом используется двоичный формат, расшифровкой которого и занимается ниже приведенная библиотека.
Карта покрытия передатчика DCF77

Для реализации проекта, Вам понадобятся Arduino и приемник DCF77
В проекте использовался приемник «DCF-Empfänger BN 641138″
Схема подключения


Код для ардуино
#include <dcf77.h> //https://github.com/thijse/Arduino-Libraries/downloads
#include <timelib.h>
#define DCF_PIN 2 // Connection pin to DCF 77 device
#define DCF_INTERRUPT 0 // Interrupt number associated with pin
time_t prevDisplay = 0; // when the digital clock was displayed
time_t time;
DCF77 DCF = DCF77(DCF_PIN,DCF_INTERRUPT);
void setup() {
Serial.begin(9600);
DCF.Start();
setSyncInterval(30);
setSyncProvider(getDCFTime);
// It is also possible to directly use DCF.getTime, but this function gives a bit of feedback
//setSyncProvider(DCF.getTime);
Serial.println("Waiting for DCF77 time ... ");
Serial.println("It will take at least 2 minutes until a first update can be processed.");
while(timeStatus()== timeNotSet) {
// wait until the time is set by the sync provider
Serial.print(".");
delay(2000);
}
}
void loop()
{
if( now() != prevDisplay) //update the display only if the time has changed
{
prevDisplay = now();
digitalClockDisplay();
}
}
void digitalClockDisplay(){
// digital clock display of the time
Serial.println("");
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.print(year());
Serial.println();
}
void printDigits(int digits){
// utility function for digital clock display: prints preceding colon and leading 0
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
unsigned long getDCFTime()
{
time_t DCFtime = DCF.getTime();
// Indicator that a time check is done
if (DCFtime!=0) {
Serial.print("X");
}
return DCFtime;
}
0 комментариев