Arduino:Примеры/TimeGPS
Перейти к навигации
Перейти к поиску
Поддержать проект | Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Перевод: Максим Кузьмин (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 }
См.также
Внешние ссылки