Коррекция времени по атомным часам без подключения к интернет
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 комментариев