Arduino:Примеры/TimeRTCSet
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Установка 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;
}