Arduino:Примеры/TimeSerial
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Настройка библиотеки Time при помощи последовательного порта[1]
Это скетч для библиотеки Time и платы Arduino, который демонстрирует, как настраивать время Arduino с помощью сообщений, присланных по последовательному порту.
Код
/*
Настройка библиотеки Time при помощи последовательного порта
Этот пример иллюстрирует, как настраивать библиотеку Time
при помощи сообщений, приходящих по последовательному порту.
Сообщения состоят из буквы «T», за которой следуют 10 цифр,
обозначающих время (в секундах с 1 января 1970 года). К примеру,
чтобы выставить часы на полдень 1 января 2013 года, отправьте
через монитор порта сообщение «T1357041600».
Чтобы автоматически отправлять сообщения, можно воспользоваться скетчем на Processing, который есть в папке с библиотекой. На Linux
можно воспользоваться командой «date +T%s\n > /dev/ttyACM0»
(часовые пояса по UTC).
*/
#include <TimeLib.h>
#define TIME_HEADER "T" // тег заголовка для сообщений
// с информацией о синхронизации времени,
// приходящих по последовательному порту.
#define TIME_REQUEST 7 // ASCII-символ для запроса сообщений
// с информацией о синхронизации времени
void setup() {
Serial.begin(9600);
while (!Serial) ; // нужно только для Leonardo
pinMode(13, OUTPUT);
setSyncProvider(requestSync); // функция, вызываемая, когда требуется синхронизация времени
Serial.println("Waiting for sync message"); // "Ждем синхронизирующего сообщения"
}
void loop(){
if (Serial.available()) {
processSyncMessage();
}
if (timeStatus()!= timeNotSet) {
digitalClockDisplay();
}
if (timeStatus() == timeSet) {
digitalWrite(13, HIGH); // если синхронизация выполнена, включаем светодиод
} else {
digitalWrite(13, LOW); // если нужно обновление, выключаем светодиод
}
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);
}
void processSyncMessage() {
unsigned long pctime;
const unsigned long DEFAULT_TIME = 1357041600; // 1 января 2013 года
if(Serial.find(TIME_HEADER)) {
pctime = Serial.parseInt();
if( pctime >= DEFAULT_TIME) { // проверяем, корректно ли время (больше 1 января 2013 года)
setTime(pctime); // синхронизируем часы Arduino в соответствии с временем, присланным по последовательному порту
}
}
}
time_t requestSync()
{
Serial.write(TIME_REQUEST);
return 0; // время будет отправлено позже в ответ на сообщение,
// присланное по последовательному порту
}