Arduino:Примеры/TimeSerialDateStrings

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

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


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

См.также

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