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

Arduino:Примеры/TimeSerial

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

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

Контакты:

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


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

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

Код

  1. /* 
  2.  
  3. Настройка библиотеки Time при помощи последовательного порта
  4.  
  5. Этот пример иллюстрирует, как настраивать библиотеку Time
  6. при помощи сообщений, приходящих по последовательному порту.
  7.  
  8. Сообщения состоят из буквы «T», за которой следуют 10 цифр, 
  9. обозначающих время (в секундах с 1 января 1970 года). К примеру, 
  10. чтобы выставить часы на полдень 1 января 2013 года, отправьте 
  11. через монитор порта сообщение «T1357041600».
  12.  
  13. Чтобы автоматически отправлять сообщения, можно воспользоваться скетчем на Processing, который есть в папке с библиотекой. На Linux
  14. можно воспользоваться командой «date +T%s\n > /dev/ttyACM0»
  15. (часовые пояса по UTC).
  16.  
  17. */ 
  18.  
  19. #include <TimeLib.h>
  20.  
  21. #define TIME_HEADER  "T"   // тег заголовка для сообщений 
  22.                            // с информацией о синхронизации времени,
  23.                            // приходящих по последовательному порту.
  24. #define TIME_REQUEST  7    // ASCII-символ для запроса сообщений 
  25.                            // с информацией о синхронизации времени
  26.  
  27. void setup()  {
  28.   Serial.begin(9600);
  29.   while (!Serial) ;  //  нужно только для Leonardo 
  30.   pinMode(13, OUTPUT);
  31.   setSyncProvider(requestSync);  // функция, вызываемая, когда требуется синхронизация времени
  32.   Serial.println("Waiting for sync message");  //  "Ждем синхронизирующего сообщения"
  33. }
  34.  
  35. void loop(){    
  36.   if (Serial.available()) {
  37.     processSyncMessage();
  38.   }
  39.   if (timeStatus()!= timeNotSet) {
  40.     digitalClockDisplay();  
  41.   }
  42.   if (timeStatus() == timeSet) {
  43.     digitalWrite(13, HIGH); // если синхронизация выполнена, включаем светодиод
  44.   } else {
  45.     digitalWrite(13, LOW);  // если нужно обновление, выключаем светодиод
  46.   }
  47.   delay(1000);
  48. }
  49.  
  50. void digitalClockDisplay(){
  51.   // показываем цифровые часы:
  52.   Serial.print(hour());
  53.   printDigits(minute());
  54.   printDigits(second());
  55.   Serial.print(" ");
  56.   Serial.print(day());
  57.   Serial.print(" ");
  58.   Serial.print(month());
  59.   Serial.print(" ");
  60.   Serial.print(year()); 
  61.   Serial.println(); 
  62. }
  63.  
  64. void printDigits(int digits){
  65.   // вспомогательная функция для печати данных о времени 
  66.   // на монитор порта; добавляет в начале двоеточие и ноль:
  67.   Serial.print(":");
  68.   if(digits < 10)
  69.     Serial.print('0');
  70.   Serial.print(digits);
  71. }
  72.  
  73.  
  74. void processSyncMessage() {
  75.   unsigned long pctime;
  76.   const unsigned long DEFAULT_TIME = 1357041600; // 1 января 2013 года
  77.  
  78.   if(Serial.find(TIME_HEADER)) {
  79.      pctime = Serial.parseInt();
  80.      if( pctime >= DEFAULT_TIME) { // проверяем, корректно ли время (больше 1 января 2013 года)
  81.        setTime(pctime); // синхронизируем часы Arduino в соответствии с временем, присланным по последовательному порту 
  82.      }
  83.   }
  84. }
  85.  
  86. time_t requestSync()
  87. {
  88.   Serial.write(TIME_REQUEST);  
  89.   return 0; // время будет отправлено позже в ответ на сообщение, 
  90.             // присланное по последовательному порту
  91. }

См.также

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

  1. github.com - TimeSerial.ino