Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/TimeSerialDateStrings

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


Настройка библиотеки Time при помощи последовательного порта (со строковыми сообщениями)[1]

Это скетч для библиотеки Time и платы Arduino, который демонстрирует, как настраивать время Arduino с помощью сообщений, присланных по последовательному порту. Добавляет в скетч функционал для работы со строковыми сообщениями, содержащими информацию о дате.

Код

  1. /* 
  2.  
  3. Настройка библиотеки Time при помощи последовательного порта (со строковыми сообщениями)
  4.  
  5. Этот пример демонстрирует настройку библиотеки Time 
  6. с помощью строк даты.
  7.  
  8. Этот скетч добавляет в скетч «Настройка библиотеки Time при помощи 
  9. последовательного порта» функционал для работы со строками даты. 
  10. Кроме того, он показывает, как обращаться с разными сообщениями.
  11.  
  12. Сообщения, начинающиеся с заголовка «T», задают время. Чтобы 
  13. автоматически отправлять сообщения, можно воспользоваться скетчем 
  14. на Processing, который есть в папке с библиотекой. На Linux
  15. можно воспользоваться командой «date +T%s\n > /dev/ttyACM0»
  16. (часовые пояса по UTC).
  17.  
  18. Сообщения, начинающиеся с заголовка «F*», задает формат даты. Чтобы 
  19. задать короткий формат, используйте «Fs\n», чтобы задать длинный 
  20. формат, используйте «Fl\n»
  21.  
  22.  */ 
  23.  
  24. #include <TimeLib.h>
  25.  
  26. // 1-символьные теги для сообщений:
  27.  
  28. #define TIME_HEADER   'T'   // тег заголовка для сообщений 
  29.                             // с информацией о синхронизации времени,
  30.                             // приходящих по последовательному порту
  31. #define FORMAT_HEADER 'F'   // тег заголовка для сообщений, 
  32.                             // задающих формат даты
  33. #define FORMAT_SHORT  's'   // короткие строки для месяца и дня
  34. #define FORMAT_LONG   'l'   // (маленькая «l») короткие строки для месяца и дня
  35.  
  36. #define TIME_REQUEST  7     // ASCII-символ для запроса сообщений 
  37.                             // с информацией о синхронизации времени
  38.  
  39.  
  40. static boolean isLongFormat = true;
  41.  
  42. void setup()  {
  43.   Serial.begin(9600);
  44.   while (!Serial) ; // нужно только для Leonardo
  45.   setSyncProvider( requestSync);  //  функция, вызываемая, когда требуется синхронизация времени 
  46.   Serial.println("Waiting for sync message");  //  "Ждем синхронизирующего сообщения"
  47. }
  48.  
  49. void loop(){    
  50.   if (Serial.available() > 1) { // ждем как минимум 2 символа
  51.     char c = Serial.read();
  52.     if( c == TIME_HEADER) {
  53.       processSyncMessage();
  54.     }
  55.     else if( c== FORMAT_HEADER) {
  56.       processFormatMessage();
  57.     }
  58.   }
  59.   if (timeStatus()!= timeNotSet) {
  60.     digitalClockDisplay();  
  61.   }
  62.   delay(1000);
  63. }
  64.  
  65. void digitalClockDisplay() {
  66.   // показываем цифровые часы: 
  67.   Serial.print(hour());
  68.   printDigits(minute());
  69.   printDigits(second());
  70.   Serial.print(" ");
  71.   if(isLongFormat)
  72.     Serial.print(dayStr(weekday()));
  73.   else  
  74.    Serial.print(dayShortStr(weekday()));
  75.   Serial.print(" ");
  76.   Serial.print(day());
  77.   Serial.print(" ");
  78.   if(isLongFormat)
  79.      Serial.print(monthStr(month()));
  80.   else
  81.      Serial.print(monthShortStr(month()));
  82.   Serial.print(" ");
  83.   Serial.print(year()); 
  84.   Serial.println(); 
  85. }
  86.  
  87. void printDigits(int digits) {
  88.   // вспомогательная функция для печати данных о времени 
  89.   // на монитор порта; добавляет в начале двоеточие и ноль:
  90.   Serial.print(":");
  91.   if(digits < 10)
  92.     Serial.print('0');
  93.   Serial.print(digits);
  94. }
  95.  
  96. void  processFormatMessage() {
  97.    char c = Serial.read();
  98.    if( c == FORMAT_LONG){
  99.       isLongFormat = true;
  100.       Serial.println(F("Setting long format"));  //  "Задаем длинный формат"
  101.    }
  102.    else if( c == FORMAT_SHORT) {
  103.       isLongFormat = false;   
  104.       Serial.println(F("Setting short format"));  //  "Задаем короткий формат"
  105.    }
  106. }
  107.  
  108. void processSyncMessage() {
  109.   unsigned long pctime;
  110.   const unsigned long DEFAULT_TIME = 1357041600; // 1 января 2013 года – Пол, может лучше задать это в «time.h»?
  111.  
  112.    pctime = Serial.parseInt();
  113.    if( pctime >= DEFAULT_TIME) {  //  проверяем, корректно ли время (больше 1 января 2013 года)
  114.      setTime(pctime);  //  синхронизируем часы Arduino в соответствии с временем, присланным по последовательному порту
  115.    }
  116. }
  117.  
  118. time_t requestSync() {
  119.   Serial.write(TIME_REQUEST);  
  120.   return 0; // время будет отправлено позже в ответ на сообщение, 
  121.             // присланное по последовательному порту
  122. }

См.также

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

  1. github.com - TimeSerialDateStrings.ino