Justera GPS datum och tid till din tidszon
Jag kan ha helt fel genom att sätta upp detta Instructables men jag har kämpat för att hitta ett enkelt sätt att korrigera GPS-tid och datum data till min tidszon här i Australien. Jag har gjort några Arduino projekt som har med en GPS-modul med någon form av data loggning. Varje gång jag har haft svårigheter konvertera UTC tid fångas från strängen NMEA data till lokal tid eller har helt enkelt gav upp och används en RTC i mitt projekt.
Det finns några lösningar på webben innehåller ett par här på Instructables men som en amatör programmerare har jag kämpat för att integrera koden i mina egna skisser.
Förhoppningsvis kommer att detta inlägg ge dem lika kämpar, en enkel lösning. Jag har försökt att hålla koden så enkla som möjligt med massor av alternativ för att passa din setup, Uno eller Mega, programvara och maskinvara seriella anslutningar. Jag har också satt tidszon beräkningen i en enkel funktion som kan kopieras och klistras rakt in i din egen skiss.
Måste du installera TinyGPS ++-bibliotek och AltSoftSerial bibliotek för skissen att kompilera korrekt. Jag har haft bättre kompatibilitet med de GPS-moduler har jag genom att använda det TinyGPS ++-biblioteket. AltSoftSerial biblioteket gör det lättare att ha flera seriell enhet ansluten till din Uno. Detta är inte ett problem när du använder en Mega men om du vill bifoga din seriella enheter på olika digitala stift, detta är den enklaste bibliotek har jag hittat.
Här är skissen nedan:
#include < Time.h > / / tid bibliotek
#include < TinyGPS ++ .h > / / GPS bibliotek
#include < AltSoftSerial.h > / / tillåter två seriella anslutningar
Ställ in GPS RX och TX stift om du använder programvara seriella anslutningar.
Se nedan för att använda hårdvara seriella anslutningar
statisk const int RXPin = 4, TXPin = 3; Exempel Uno
statisk const int RXPin = 48, TXPin = 46. Exempel Mega
statisk const uint32_t GPSBaud = 4800;
statisk const uint32_t GPSBaud = 9600;
Objektet TinyGPS ++
TinyGPSPlus gps;
Seriell anslutning till GPS-enheten
AltSoftSerial Serial_GPS;
#define Serial_GPS Serial1 / / avkommentera denna linje & kommentar
ovanför linjen att använda en hårdvara
Serial Port
Ändra det här värdet för att passa din tidszon
CONST int UTC_offset = 10; Östra Australien tid
tid prevDisplay = 0; Räkna för när tid senast visas
void setup()
{
Serial.BEGIN(9600);
Serial_GPS.BEGIN(GPSBaud); Starta GPS seriell anslutning
Serial.println ("väntar på GPS-tid... ");
}
void loop()
{
GPS_Timezone_Adjust(); Samtal tid justera funktion
}
void GPS_Timezone_Adjust() {
samtidigt (Serial_GPS.available()) {
om (gps.encode(Serial_GPS.read())) {
int år = gps.date.year();
byte månad = gps.date.month();
byte dag = gps.date.day();
byte timme = gps.time.hour();
byte minut = gps.time.minute();
byte näst = gps.time.second();
Ställ in tiden från GPS datasträng
setTime (timme, minut, sekund, dag, månad, år);
Calc Aktuell tidszon tid av offset-värde
adjustTime(UTC_offset * SECS_PER_HOUR);
}
}
--Ta bort det här avsnittet om inte Visa tiden---/ /
om (timeStatus()! = timeNotSet) {
om (now()! = prevDisplay) {
prevDisplay = now();
SerialClockDisplay();
}
}
--Ta bort funktionen SerialClockDisplay ()---/ /
} / / Hålla
void SerialClockDisplay() {
Seriella bildskärm nya beräknade tid-
en gång GPS tiden lagras i nu() Time Library
beräkningar eller visar kan göras.
om (hour() < 10) Serial.print(F("0"));
Serial.Print(Hour());
Serial.Print(F(":"));
om (minute() < 10) Serial.print(F("0"));
Serial.Print(Minute());
Serial.Print(F(":"));
om (second() < 10) Serial.print(F("0"));
Serial.Print(Second());
Serial.Print("");
om (day() < 10) Serial.print(F("0"));
Serial.Print(Day());
Serial.Print(F("/"));
om (month() < 10) Serial.print(F("0"));
Serial.Print(Month());
Serial.Print(F("/"));
Serial.println(Year());
}
Jag hoppas du har hittat denna användbara och det gör ditt nästa GPS datalogging projekt mycket lättare.