Arduino:Примеры/TimeSerial

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Настройка библиотеки 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 }

См.также

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