Arduino:Примеры/TimeSerial

Материал из Онлайн справочника
Версия от 20:49, 19 октября 2016; Myagkij (обсуждение | вклад)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

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


Настройка библиотеки 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; // время будет отправлено позже в ответ на сообщение, 
            // присланное по последовательному порту
}

См.также

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