Arduino:Примеры/TimeRTCSet

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Установка RTC-времени [1]

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

Код

/*

Установка RTC-времени

Пример, демонстрирующий работу библиотеки Time с RTC 
(от «Real Time Clock», что значит «часы реального времени»).

RTC-время устанавливается при помощи сообщения, присылаемого 
по последовательному порту. Кроме того, время можно задать при помощи 
скетча на Processing, который есть в папке с библиотекой. На Linux 
можно воспользоваться командой «date +T%s > /dev/ttyACM0»
(часовые пояса по UTC).

*/

#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>  // базовая библиотека DS1307, возвращающая время в типе данных time_t

void setup()  {
  Serial.begin(9600);
  while (!Serial) ; // нужно только для Leonardo
  setSyncProvider(RTC.get);   // функция, считывающая время с RTC
  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) {
      RTC.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(); 
}

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

/*  

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

*/

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

unsigned long processSyncMessage() {
  unsigned long pctime = 0L;
  const unsigned long DEFAULT_TIME = 1357041600; // 1 января 2013 года 

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

См.также

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