Arduino:Примеры/TimeArduinoDue

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

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


Синхронизация времени с помощью RTC (для Arduino Due)[1]

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

Код

/*
 
Синхронизация времени с помощью RTC (Для Arduino Due)

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

Этому скетчу требуется библиотека RTC, написанная
Маркусом Лэнжем (Markus Lange), и скачать ее можно тут:
https://github.com/MarkusLange/Arduino-Due-RTC-Library

*/

#include <TimeLib.h>
#include <rtc_clock.h>

// Выбираем источник для RTC:
//RTC_clock rtc_clock(RC);
RTC_clock rtc_clock(XTAL);

void setup()  {
  Serial.begin(9600);
  rtc_clock.init();
  if (rtc_clock.date_already_set() == 0) {
 
    // К сожалению, если применить сброс на плате Arduino Due, то она,
    // по всей видимости, не сохраняет состояние RTC.
    // Маркус описывает это следующим образом: «Фых! Если использовать 
    // контакт NRSTB, то Due делает сброс. Причем сброс выполняется на 
    // всем чипе и на всех бэкап-областях, включая RTC, RTT и SC. 
    // Впрочем, если вместо NRSTB использовать NRST, то эти области 
    // сохранят свои прежние значения».

    rtc_clock.set_time(__TIME__);
    rtc_clock.set_date(__DATE__);

    // Впрочем, это может сработать на других неофициальных платах 
    // на базе SAM3X с RESET-схемой, отличной от Arduino Due. 
  }
  setSyncProvider(getArduinoDueTime);
  if(timeStatus()!= timeSet) 
     Serial.println("Unable to sync with the RTC");  //  "Не удалось синхронизироваться с RTC"
  else
     Serial.println("RTC has set the system time");  //  "RTC настроено на системное время"
}

time_t getArduinoDueTime()
{
  return rtc_clock.unixtime();
}

void loop()
{
   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);
}

См.также

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