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

Arduino:Примеры/TimeGPS

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

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

Контакты:

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


Синхронизация времени с помощью 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. }

См.также

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

  1. github.com - TimeGPS