Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/TimeRTCSet

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


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

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

Код

  1. /*
  2.  
  3. Установка RTC-времени
  4.  
  5. Пример, демонстрирующий работу библиотеки Time с RTC 
  6. (от «Real Time Clock», что значит «часы реального времени»).
  7.  
  8. RTC-время устанавливается при помощи сообщения, присылаемого 
  9. по последовательному порту. Кроме того, время можно задать при помощи 
  10. скетча на Processing, который есть в папке с библиотекой. На Linux 
  11. можно воспользоваться командой «date +T%s > /dev/ttyACM0»
  12. (часовые пояса по UTC).
  13.  
  14. */
  15.  
  16. #include <TimeLib.h>
  17. #include <Wire.h>
  18. #include <DS1307RTC.h>  // базовая библиотека DS1307, возвращающая время в типе данных time_t
  19.  
  20. void setup()  {
  21.   Serial.begin(9600);
  22.   while (!Serial) ; // нужно только для Leonardo
  23.   setSyncProvider(RTC.get);   // функция, считывающая время с RTC
  24.   if (timeStatus() != timeSet) 
  25.      Serial.println("Unable to sync with the RTC");  //  "Не удалось синхронизироваться с RTC"
  26.   else
  27.      Serial.println("RTC has set the system time");  //  "RTC настроено на системное время"       
  28. }
  29.  
  30. void loop()
  31. {
  32.   if (Serial.available()) {
  33.     time_t t = processSyncMessage();
  34.     if (t != 0) {
  35.       RTC.set(t);   // задаем RTC и системное время в соответствии с полученным значением
  36.       setTime(t);          
  37.     }
  38.   }
  39.   digitalClockDisplay();  
  40.   delay(1000);
  41. }
  42.  
  43. void digitalClockDisplay(){
  44.   // показываем цифровые часы:
  45.   Serial.print(hour());
  46.   printDigits(minute());
  47.   printDigits(second());
  48.   Serial.print(" ");
  49.   Serial.print(day());
  50.   Serial.print(" ");
  51.   Serial.print(month());
  52.   Serial.print(" ");
  53.   Serial.print(year()); 
  54.   Serial.println(); 
  55. }
  56.  
  57. void printDigits(int digits){
  58.   // вспомогательная функция для печати данных о времени 
  59.   // на монитор порта; добавляет в начале двоеточие и ноль:
  60.   Serial.print(":");
  61.   if(digits < 10)
  62.     Serial.print('0');
  63.   Serial.print(digits);
  64. }
  65.  
  66. /*  
  67.  
  68. Код, обрабатывающий сообщения с информацией о синхронизации 
  69. времени, которые приходят по последовательному порту. 
  70.  
  71. */
  72.  
  73. #define TIME_HEADER  "T"   // тег заголовка для сообщений 
  74.                            // с информацией о синхронизации времени,
  75.                            // приходящих по последовательному порту.
  76.  
  77. unsigned long processSyncMessage() {
  78.   unsigned long pctime = 0L;
  79.   const unsigned long DEFAULT_TIME = 1357041600; // 1 января 2013 года 
  80.  
  81.   if(Serial.find(TIME_HEADER)) {
  82.      pctime = Serial.parseInt();
  83.      return pctime;
  84.      if( pctime < DEFAULT_TIME) { // проверяем, корректно ли время (больше 1 января 2013 года)
  85.        pctime = 0L; // если время не корректно, возвращаем «0»
  86.      }
  87.   }
  88.   return pctime;
  89. }

См.также

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

  1. github.com - TimeRTCSet.ino