Arduino:Примеры/TimeGPS

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

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


Синхронизация времени с помощью GPS[1]

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

Код

 1 /*
 2 Синхронизация времени с помощью GPS
 3 
 4 Это пример, иллюстрирующий, как синхронизировать время 
 5 при помощи GPS.
 6 
 7 */
 8 
 9 #include <TimeLib.h>
10 #include <TinyGPS.h>       // http://arduiniana.org/libraries/TinyGPS/
11 #include <SoftwareSerial.h>
12 // Библиотеки TinyGPS и SoftwareSerial написаны
13 // Микалом Хартом (Mikal Hart)
14 
15 SoftwareSerial SerialGPS = SoftwareSerial(10, 11);  // прием данных будет на 10-ом контакте
16 TinyGPS gps; 
17 
18 // Если вы хотите воспользоваться аппаратным последовательным портом, 
19 // который гораздо эффективнее SoftwareSerial, раскомментируйте 
20 // эту строчку и удалите строчку с SoftwareSerial (см. выше):
21 //#define SerialGPS Serial1
22 
23 // смещение часов от GPS-времени (UTC):
24 const int offset = 1;     // центрально-европейское время
25 //const int offset = -5;  // восточное время (США)
26 //const int offset = -4;  // восточное дневное время (США)
27 //const int offset = -8;  // тихоокеанское время (США)
28 //const int offset = -7;  // тихоокеанское дневное время (США)
29 
30 // В идеале часовой пояс можно определить на основе данных 
31 // о GPS-позиции. Однако для этого потребуется сложная библиотека, 
32 // где нужно будет использовать данные вроде векторных файлов 
33 // с часовыми поясами от Эрика Мюллера. 
34 // Вот сайт: http://efele.net/maps/tz 
35 
36 time_t prevDisplay = 0; // когда будут отображаться цифровые часы
37 
38 void setup()
39 {
40   Serial.begin(9600);
41   while (!Serial) ; // нужно только для Leonardo
42   SerialGPS.begin(4800);
43   Serial.println("Waiting for GPS time ... ");  //  "Ждем GPS-времени... " 
44 }
45 
46 void loop()
47 {
48   while (SerialGPS.available()) {
49     if (gps.encode(SerialGPS.read())) { // обрабатываем GPS-сообщения
50       // когда TinyGPS сообщает новые данные...
51       unsigned long age;
52       int Year;
53       byte Month, Day, Hour, Minute, Second;
54       gps.crack_datetime(&Year, &Month, &Day, &Hour, &Minute, &Second, NULL, &age);
55       if (age < 500) {
56         // ...задаем время в соответствии с последним GPS-сообщением:
57         setTime(Hour, Minute, Second, Day, Month, Year);
58         adjustTime(offset * SECS_PER_HOUR);
59       }
60     }
61   }
62   if (timeStatus()!= timeNotSet) {
63     if (now() != prevDisplay) { // обновляем дисплей, только если время изменилось
64       prevDisplay = now();
65       digitalClockDisplay();  
66     }
67   }
68 }
69 
70 void digitalClockDisplay(){
71   // показываем цифровые часы:
72   Serial.print(hour());
73   printDigits(minute());
74   printDigits(second());
75   Serial.print(" ");
76   Serial.print(day());
77   Serial.print(" ");
78   Serial.print(month());
79   Serial.print(" ");
80   Serial.print(year()); 
81   Serial.println(); 
82 }
83 
84 void printDigits(int digits) {
85   // вспомогательная функция для печати данных о времени 
86   // на монитор порта; добавляет в начале двоеточие и ноль:
87   Serial.print(":");
88   if(digits < 10)
89     Serial.print('0');
90   Serial.print(digits);
91 }

См.также

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