#include <TinyGPS++.h>
#define GPS_BAUDRATE 9600
#define RXD2 16
#define TXD2 17
TinyGPSPlus gps;
void initSerial();
void readGPSData();
void printLocation();
void printSpeed();
void printDateTime();
void checkNoGPSData();
void setup() {
initSerial();
}
void loop() {
readGPSData();
checkNoGPSData();
}
// ------------------ Initialization ------------------
void initSerial() {
Serial.begin(9600);
Serial2.begin(GPS_BAUDRATE, SERIAL_8N1, RXD2, TXD2);
Serial.println(F("NEO6M GPS Module Simulation on ESP32"));
}
// ------------------ GPS Reading ------------------
void readGPSData() {
while (Serial2.available() > 0) {
if (gps.encode(Serial2.read())) {
printLocation();
printSpeed();
printDateTime();
Serial.println();
}
}
}
// ------------------ Output Functions ------------------
void printLocation() {
Serial.print(F("Location:\t("));
if (gps.location.isValid()) {
Serial.print(F("Latitude: "));
Serial.print(gps.location.lat(), 6);
Serial.print(F(", Longitude: "));
Serial.print(gps.location.lng(), 6);
Serial.print(F(", Altitude: "));
if (gps.altitude.isValid()) {
Serial.print(gps.altitude.meters());
} else {
Serial.print(F("INVALID"));
}
} else {
Serial.print(F("INVALID"));
}
Serial.println(F(")"));
}
void printSpeed() {
Serial.print(F("Speed:\t\t"));
if (gps.speed.isValid()) {
Serial.print(gps.speed.kmph());
Serial.println(F(" km/h"));
} else {
Serial.println(F("INVALID"));
}
}
void printDateTime() {
Serial.print(F("GPS Date&Time:\t"));
if (gps.date.isValid() && gps.time.isValid()) {
Serial.print(gps.date.year());
Serial.print(F("-"));
Serial.print(gps.date.month());
Serial.print(F("-"));
Serial.print(gps.date.day());
Serial.print(F(" "));
Serial.print(gps.time.hour());
Serial.print(F(":"));
Serial.print(gps.time.minute());
Serial.print(F(":"));
Serial.println(gps.time.second());
} else {
Serial.println(F("INVALID"));
}
}
// ------------------ Error Checking ------------------
void checkNoGPSData() {
if (millis() > 5000 && gps.charsProcessed() < 10) {
Serial.println(F("No GPS data received: check wiring"));
}
}