GPS (неверное отображение времени)

Кто-нибудь поможет? Время показывает неправильное. Пожалуйста, помогите.

  /* Conexion pines
     Arduino        GPS         
        D3           RX
        D4           TX
  */

  #include <SoftwareSerial.h>  //включить SoftwareSerial
  #include <TinyGPS.h>         //мы включаем TinyGPS

  TinyGPS gps;  //Объявляем объект GPS
  SoftwareSerial serialgps(10,11);      //Объявляем контакты 4 (Tx GPS) и 3 (Rx GPS)

  //Объявляем переменные для получения данных
  int year;
  byte month, day, hour, minute, second, hundredths;
  unsigned long chars;
  unsigned short sentences, failed_checksum;

  void setup()
  {
   Serial.begin(9600);  // Инициализируем последовательный порт
   serialgps.begin(9600); //Инициализируем последовательный порт GPS

   //Выводим на последовательный монитор:
   Serial.println("");

  }

  void loop()
  {
   while(serialgps.available()) 
   {
    int c = serialgps.read(); 
    if(gps.encode(c)) 
    {
     float latitude, longitude;
     gps.f_get_position(&latitude, &longitude);
     Serial.print("Latitud/Longitud: "); 
     Serial.print(latitude,5); 
     Serial.print(", "); 
     Serial.println(longitude,5);
     gps.crack_datetime(&year,&month,&day,&hour,&minute,&second,&hundredths);
     Serial.print("Date: "); Serial.print(day, DEC); Serial.print("/"); 
     Serial.print(month, DEC); Serial.print("/"); Serial.print(year);
     Serial.print(" Time: "); Serial.print(hour, DEC); Serial.print(":"); 
     Serial.print(minute, DEC); Serial.print(":"); Serial.print(second, DEC); 
     Serial.print("."); Serial.println(hundredths, DEC);
     Serial.print("Altitud (metros): "); Serial.println(gps.f_altitude()); 
     Serial.print("Rumbo (grados): "); Serial.println(gps.f_course()); 
     Serial.print("Velocidad(kmph): "); Serial.println(gps.f_speed_kmph());
     Serial.print("Satelites: "); Serial.println(gps.satellites());
     Serial.println();
     gps.stats(&chars, &sentences, &failed_checksum);

     delay(10000);
    }
   }
  }

, 👍0


1 ответ


1

Как и советовал Маженко, необходимо сдвинуть время UTC на ваше местное время. Библиотека времени поможет вам в этом.

Есть и другие проблемы:

  • Нельзя ждать 10 секунд без обработки символов. Приёмный буфер Arduino вмещает только 64 символа. За это время GPS-устройство могло отправить 10 000 символов, поэтому большая их часть будет потеряна. Это не позволяет библиотеке GPS успешно обработать данные. В конечном итоге, через 10 секунд, она «увидит» полный набор данных. Вы можете видеть данные каждые 11 секунд, а не каждые 10.

  • Вы печатаете несколько значений, даже если они могут быть недействительными. Например, если вы не двигаетесь или у вас плохой приём спутникового сигнала, GPS-устройство может не показывать скорость.

  • Часы Arduino millis() не будут синхронизированы с часами GPS. Вы можете использовать обновления GPS как точные часы с точностью до 1 секунды. Просто отсчитайте 10 исправлений по мере их поступления, и это будет означать, что прошло 10 секунд.

  • Вам следует использовать другой последовательный порт и/или библиотеку. В этом ответе описаны различные варианты: HardwareSerial (т. е. Serial на контактах 0 и 1), AltSoftSerial (8 и 9 на UNO) или NeoSWSerial (любые два контакта).

Вот NeoGPS версия вашего скетча, которая решает эти проблемы:

#include <NeoSWSerial.h>
#include <NMEAGPS.h>

NMEAGPS gps;  //Объявление объекта GPS
gps_fix fix;  // все поля GPS, включая дату/время, местоположение и т. д.
uint8_t fixCount;
NeoSWSerial serialgps(10,11);

void setup()
{
 Serial.begin(9600);  //Начало серии «Пуэрто»
 serialgps.begin(9600); //Начать серию GPS-путешествий

 //Внедрение монитора последовательного порта:
 Serial.println( F("Test") );

}

void loop()
{
 // Проверка символов GPS и их анализ
 if (gps.available( serialgps )) 
 {
  // Раз в секунду формируется полная структура GPS-координат. Получите её.
  fix = gps.read();

  // Подсчет прошедших секунд
  fixCount++;

  if (fixCount >= 10)
  {
    fixCount = 0; // сбросить счетчик

    // настроить с UTC на местное время
    if (fix.valid.time)
      adjustTime( fix.dateTime );

    printGPSdata();
  }
 }
}


void printGPSdata()
{
  Serial.print( F("Latitud/Longitud: ") ); 
  if (fix.valid.location) {
    Serial.print( fix.latitude(), 5 ); 
    Serial.print( F(", ") ); 
    Serial.print( fix.longitude(), 5 );
  }
  Serial.println();

  Serial.print( F("Date: ") );
  if (fix.valid.date) {
    Serial.print( fix.dateTime.date  ); Serial.print('/'); 
    Serial.print( fix.dateTime.month ); Serial.print('/');
    Serial.print( fix.dateTime.year  );
  }

  Serial.print( F(" Time: ") );
  if (fix.valid.time) {
    Serial.print( fix.dateTime.hours ); Serial.print(':'); 
    if (fix.dateTime.minutes < 10)
      Serial.print( '0' );
    Serial.print(fix.dateTime.minutes); Serial.print(':');
    if (fix.dateTime.seconds < 10)
      Serial.print( '0' );
    Serial.print( fix.dateTime.seconds ); 
    Serial.print('.');
    if (fix.dateTime_cs < 10)
      Serial.print( '0' );
    Serial.print( fix.dateTime_cs );
  }
  Serial.println();

  Serial.print( F("Altitud (metros): ") );
  if (fix.valid.altitude)
    Serial.print( fix.altitude() );
  Serial.println();

  Serial.print( F("Rumbo (grados): ") );
  if (fix.valid.heading)
    Serial.print( fix.heading() ); 
  Serial.println();

  Serial.print( F("Velocidad(kmph): ") );
  if (fix.valid.speed)
    Serial.print( fix.speed_kph() );
  Serial.println();

  Serial.print( F("Satelites: ") );
  if (fix.valid.satellites)
    Serial.println( fix.satellites );
  Serial.println();
  Serial.println();
}


//-------------------------

void adjustTime( NeoGPS::time_t & dt )
{
  NeoGPS::clock_t seconds = dt; // преобразовать структуру даты/времени в секунды

  // Смещение по местному времени
  const int32_t          zone_hours  = +8L;
  const NeoGPS::clock_t  zone_offset = zone_hours * NeoGPS::SECONDS_PER_HOUR;
  seconds += zone_offset;

  dt = seconds; // преобразовать секунды обратно в структуру даты/времени

} // отрегулировать время

Если хотите попробовать, NeoGPS, AltSoftSerial и NeoSWSerial доступны в менеджере библиотек IDE, в меню Sketch -> Include Library -> Manage Libraries. NeoGPS меньше, быстрее, надёжнее и точнее всех других библиотек GPS.

Даже если вы им не пользуетесь, на страницах «Установка» и «Устранение неполадок» вы найдете множество рекомендаций.

,