Ik kan me vergissen volledig door het ophangen van deze Instructables, maar ik heb moeite te vinden een eenvoudige manier om GPS datum en tijd gegevens naar mijn tijdzone hier in Australië te corrigeren. Ik heb een paar Arduino projecten die een GPS-module met een vorm van data logging hebben opgenomen. Elke keer dat ik moeite UTC-tijd gevangen van de tekenreeks NMEA data omzetten in lokale tijd hebben gehad of hebben gewoon kreeg en gebruikt een RTC in mijn project.
Er zijn dat een paar oplossingen op het web bevatten een paar hier op Instructables, maar als een amateur coder ik heb moeite om te integreren van de code in mijn eigen schetsen.
Hopelijk zal dit bericht geven die even worstelen, een gemakkelijke oplossing. Ik heb geprobeerd te houden de code zo eenvoudig mogelijk met overvloed van opties om aan te passen uw setup, Uno of Mega, software en hardware seriële verbindingen. Ik heb ook de berekening van de tijdzone in een eenvoudige functie die kan worden gekopieerd en geplakt recht in uw eigen schets.
U moet de TinyGPS ++ bibliotheek en de AltSoftSerial bibliotheek voor de sketch om te compileren correct installeren. Ik heb betere compatibiliteit met het GPS-modules die ik heb met behulp van de TinyGPS ++-bibliotheek. De AltSoftSerial-bibliotheek maakt het gemakkelijker om meerdere serieel apparaat verbonden met uw Uno. Dit is niet een probleem bij het gebruik van een Mega maar als u koppelen uw seriële apparaten op verschillende digitale pinnen wilt, dit is de eenvoudigste bibliotheek die ik heb gevonden.
Hier is de schets hieronder:
#include <Time.h> // Time Library #include <TinyGPS++.h> // GPS Library #include <AltSoftSerial.h> // Allows two Serial connections // Set GPS RX and TX pins if using software serial connections. // See below to use hardware serial connections //static const int RXPin = 4, TXPin = 3; // Example Uno static const int RXPin = 48, TXPin = 46; // Example Mega static const uint32_t GPSBaud = 4800; //static const uint32_t GPSBaud = 9600; // The TinyGPS++ object TinyGPSPlus gps; // Serial connection to the GPS device AltSoftSerial Serial_GPS; //#define Serial_GPS Serial1 // Uncomment this line & comment // above line to use a hardware // Serial Port // Change this value to suit your Time Zone const int UTC_offset = 10; // Eastern Australia Time time_t prevDisplay = 0; // Count for when time last displayed void setup() { Serial.begin(9600); Serial_GPS.begin(GPSBaud); // Start GPS Serial Connection Serial.println("Waiting for GPS time ... "); } void loop() { GPS_Timezone_Adjust(); // Call Time Adjust Function } void GPS_Timezone_Adjust(){ while (Serial_GPS.available()) { if (gps.encode(Serial_GPS.read())) { int Year = gps.date.year(); byte Month = gps.date.month(); byte Day = gps.date.day(); byte Hour = gps.time.hour(); byte Minute = gps.time.minute(); byte Second = gps.time.second(); // Set Time from GPS data string setTime(Hour, Minute, Second, Day, Month, Year); // Calc current Time Zone time by offset value adjustTime(UTC_offset * SECS_PER_HOUR); } } // -- Delete this section if not displaying time ------- // if (timeStatus()!= timeNotSet) { if (now() != prevDisplay) { prevDisplay = now(); SerialClockDisplay(); } } // -- Also delete the SerialClockDisplay()function ---- // } // Keep void SerialClockDisplay(){ // Serial Monitor display of new calculated time - // once adjusted GPS time stored in now() Time Library // calculations or displays can be made. if (hour() < 10) Serial.print(F("0")); Serial.print(hour()); Serial.print(F(":")); if (minute() < 10) Serial.print(F("0")); Serial.print(minute()); Serial.print(F(":")); if (second() < 10) Serial.print(F("0")); Serial.print(second()); Serial.print(" "); if (day() < 10) Serial.print(F("0")); Serial.print(day()); Serial.print(F("/")); if (month() < 10) Serial.print(F("0")); Serial.print(month()); Serial.print(F("/")); Serial.println(year()); }
Ik hoop dat je vond dit nuttig en het maakt uw volgende GPS dataloggen project een stuk eenvoudiger.