Arduino:Примеры/TimeTeensy3

Материал из Онлайн справочника
Версия от 20:54, 19 октября 2016; Myagkij (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Синхронизация времени с помощью RTC на Teensy[1]

Это скетч для библиотеки Time и платы Arduino, который демонстрирует, как синхронизировать время при помощи RTC на плате Teensy.

Чтобы использовать RTC на Teensy 3.0, к нижней части платы нужно подключить кристалл на 12,5 пФ и 32,768 КГц. Например, CFS-206 (Citizen), 300-8303-ND, 300-8762-ND, 300-8763-ND или 300-1002-ND (Digikey).

RTC на Teensy может работать и без батареи, но чтобы время и дата не сбрасывались, когда плата будет отключена от питания, имеет смысл подключить батарейку на 3V.

Код

/*

Синхронизация времени с помощью RTC на Teensy

Этот пример показывает, как синхронизировать время
с помощью RTC на Teensy.
 
*/

#include <TimeLib.h>

void setup()  {
  // задаем время библиотеки Time при помощи RTC на Teensy 3.0:
  setSyncProvider(getTeensy3Time);

  Serial.begin(115200);
  while (!Serial);  // ждем открытия монитора порта в IDE Arduino Wait 
  delay(100);
  if (timeStatus()!= timeSet) {
    Serial.println("Unable to sync with the RTC");  //  "Не удалось синхронизироваться с RTC" 
  } else {
    Serial.println("RTC has set the system time");  //  "RTC настроено на системное время"   
  }
}

void loop() {
  if (Serial.available()) {
    time_t t = processSyncMessage();
    if (t != 0) {
      Teensy3Clock.set(t); // задаем RTC
      setTime(t);
    }
  }
  digitalClockDisplay();  
  delay(1000);
}

void digitalClockDisplay() {
  // показываем цифровые часы: 
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year()); 
  Serial.println(); 
}

time_t getTeensy3Time()
{
  return Teensy3Clock.get();
}

/*  

Код, обрабатывающий сообщения с информацией о синхронизации 
времени, которые приходят по последовательному порту. 

*/
#define TIME_HEADER  "T"   // тег заголовка для сообщений 
                           // с информацией о синхронизации времени,
                           // приходящих по последовательному порту.

unsigned long processSyncMessage() {
  unsigned long pctime = 0L;
  const unsigned long DEFAULT_TIME = 1357041600; // Jan 1 2013 

  if(Serial.find(TIME_HEADER)) {
     pctime = Serial.parseInt();
     return pctime;
     if( pctime < DEFAULT_TIME) {  //  проверяем, корректно ли время (больше 1 января 2013 года)
       pctime = 0L;  //  если время не корректно, возвращаем «0»
     }
  }
  return pctime;
}

void printDigits(int digits){
  // вспомогательная функция для печати данных о времени 
  // на монитор порта; добавляет в начале двоеточие и ноль:
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

См.также

Внешние ссылки