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);
}
}
}

@Megumichan, 👍0
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.
Даже если вы им не пользуетесь, на страницах «Установка» и «Устранение неполадок» вы найдете множество рекомендаций.
- GPS-модуль uBlox Neo 6M не отвечает
- TinyGPS не дает долготу, широту и другие данные
- последовательная передача данных на GPS-экране duinopeak
- GPS-модуль не работает с датчиком
- Могу ли я объединить ультразвуковой датчик и GPS вместе?
- Модуль GPS выводит вопросительные знаки в последовательном окне
- Neo 6m выводит что-то, что я как нуб не могу понять
- Получение «Открыть сбой питания GPS» на модуле SIM808