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

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;
}