Arduino:Примеры/TimeGPS

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

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


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

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

Код

/*
Синхронизация времени с помощью GPS

Это пример, иллюстрирующий, как синхронизировать время 
при помощи GPS.

*/

#include <TimeLib.h>
#include <TinyGPS.h>       // http://arduiniana.org/libraries/TinyGPS/
#include <SoftwareSerial.h>
// Библиотеки TinyGPS и SoftwareSerial написаны
// Микалом Хартом (Mikal Hart)

SoftwareSerial SerialGPS = SoftwareSerial(10, 11);  // прием данных будет на 10-ом контакте
TinyGPS gps; 

// Если вы хотите воспользоваться аппаратным последовательным портом, 
// который гораздо эффективнее SoftwareSerial, раскомментируйте 
// эту строчку и удалите строчку с SoftwareSerial (см. выше):
//#define SerialGPS Serial1

// смещение часов от GPS-времени (UTC):
const int offset = 1;     // центрально-европейское время
//const int offset = -5;  // восточное время (США)
//const int offset = -4;  // восточное дневное время (США)
//const int offset = -8;  // тихоокеанское время (США)
//const int offset = -7;  // тихоокеанское дневное время (США)

// В идеале часовой пояс можно определить на основе данных 
// о GPS-позиции. Однако для этого потребуется сложная библиотека, 
// где нужно будет использовать данные вроде векторных файлов 
// с часовыми поясами от Эрика Мюллера. 
// Вот сайт: http://efele.net/maps/tz 

time_t prevDisplay = 0; // когда будут отображаться цифровые часы

void setup()
{
  Serial.begin(9600);
  while (!Serial) ; // нужно только для Leonardo
  SerialGPS.begin(4800);
  Serial.println("Waiting for GPS time ... ");  //  "Ждем GPS-времени... " 
}

void loop()
{
  while (SerialGPS.available()) {
    if (gps.encode(SerialGPS.read())) { // обрабатываем GPS-сообщения
      // когда TinyGPS сообщает новые данные...
      unsigned long age;
      int Year;
      byte Month, Day, Hour, Minute, Second;
      gps.crack_datetime(&Year, &Month, &Day, &Hour, &Minute, &Second, NULL, &age);
      if (age < 500) {
        // ...задаем время в соответствии с последним GPS-сообщением:
        setTime(Hour, Minute, Second, Day, Month, Year);
        adjustTime(offset * SECS_PER_HOUR);
      }
    }
  }
  if (timeStatus()!= timeNotSet) {
    if (now() != prevDisplay) { // обновляем дисплей, только если время изменилось
      prevDisplay = now();
      digitalClockDisplay();  
    }
  }
}

void digitalClockDisplay(){
  // показываем цифровые часы:
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year()); 
  Serial.println(); 
}

void printDigits(int digits) {
  // вспомогательная функция для печати данных о времени 
  // на монитор порта; добавляет в начале двоеточие и ноль:
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

См.также

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