Arduino:Примеры/TimeSerialDateStrings
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Настройка библиотеки Time при помощи последовательного порта (со строковыми сообщениями)[1]
Это скетч для библиотеки Time и платы Arduino, который демонстрирует, как настраивать время Arduino с помощью сообщений, присланных по последовательному порту. Добавляет в скетч функционал для работы со строковыми сообщениями, содержащими информацию о дате.
Код
/*
Настройка библиотеки Time при помощи последовательного порта (со строковыми сообщениями)
Этот пример демонстрирует настройку библиотеки Time
с помощью строк даты.
Этот скетч добавляет в скетч «Настройка библиотеки Time при помощи
последовательного порта» функционал для работы со строками даты.
Кроме того, он показывает, как обращаться с разными сообщениями.
Сообщения, начинающиеся с заголовка «T», задают время. Чтобы
автоматически отправлять сообщения, можно воспользоваться скетчем
на Processing, который есть в папке с библиотекой. На Linux
можно воспользоваться командой «date +T%s\n > /dev/ttyACM0»
(часовые пояса по UTC).
Сообщения, начинающиеся с заголовка «F*», задает формат даты. Чтобы
задать короткий формат, используйте «Fs\n», чтобы задать длинный
формат, используйте «Fl\n»
*/
#include <TimeLib.h>
// 1-символьные теги для сообщений:
#define TIME_HEADER 'T' // тег заголовка для сообщений
// с информацией о синхронизации времени,
// приходящих по последовательному порту
#define FORMAT_HEADER 'F' // тег заголовка для сообщений,
// задающих формат даты
#define FORMAT_SHORT 's' // короткие строки для месяца и дня
#define FORMAT_LONG 'l' // (маленькая «l») короткие строки для месяца и дня
#define TIME_REQUEST 7 // ASCII-символ для запроса сообщений
// с информацией о синхронизации времени
static boolean isLongFormat = true;
void setup() {
Serial.begin(9600);
while (!Serial) ; // нужно только для Leonardo
setSyncProvider( requestSync); // функция, вызываемая, когда требуется синхронизация времени
Serial.println("Waiting for sync message"); // "Ждем синхронизирующего сообщения"
}
void loop(){
if (Serial.available() > 1) { // ждем как минимум 2 символа
char c = Serial.read();
if( c == TIME_HEADER) {
processSyncMessage();
}
else if( c== FORMAT_HEADER) {
processFormatMessage();
}
}
if (timeStatus()!= timeNotSet) {
digitalClockDisplay();
}
delay(1000);
}
void digitalClockDisplay() {
// показываем цифровые часы:
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" ");
if(isLongFormat)
Serial.print(dayStr(weekday()));
else
Serial.print(dayShortStr(weekday()));
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
if(isLongFormat)
Serial.print(monthStr(month()));
else
Serial.print(monthShortStr(month()));
Serial.print(" ");
Serial.print(year());
Serial.println();
}
void printDigits(int digits) {
// вспомогательная функция для печати данных о времени
// на монитор порта; добавляет в начале двоеточие и ноль:
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
void processFormatMessage() {
char c = Serial.read();
if( c == FORMAT_LONG){
isLongFormat = true;
Serial.println(F("Setting long format")); // "Задаем длинный формат"
}
else if( c == FORMAT_SHORT) {
isLongFormat = false;
Serial.println(F("Setting short format")); // "Задаем короткий формат"
}
}
void processSyncMessage() {
unsigned long pctime;
const unsigned long DEFAULT_TIME = 1357041600; // 1 января 2013 года – Пол, может лучше задать это в «time.h»?
pctime = Serial.parseInt();
if( pctime >= DEFAULT_TIME) { // проверяем, корректно ли время (больше 1 января 2013 года)
setTime(pctime); // синхронизируем часы Arduino в соответствии с временем, присланным по последовательному порту
}
}
time_t requestSync() {
Serial.write(TIME_REQUEST);
return 0; // время будет отправлено позже в ответ на сообщение,
// присланное по последовательному порту
}