#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <TinyGPS++.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define GPS_BAUDRATE 9600 // The default baudrate of NEO-6M is 9600
#define RX_PIN 16 // RX pin for GPS UART
#define TX_PIN 17 // TX pin for GPS UART
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
TinyGPSPlus gps; // the TinyGPS++ object
void setup() {
Serial.begin(9600);
Serial2.begin(GPS_BAUDRATE, SERIAL_8N1, RX_PIN, TX_PIN); // Serial2 initialization with custom RX and TX pins
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Don't proceed, loop forever
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println(F("ESP32 - GPS Data"));
display.display();
}
void loop() {
if (Serial2.available() > 0) {
if (gps.encode(Serial2.read())) {
display.clearDisplay();
display.setCursor(0, 0);
if (gps.location.isValid()) {
display.print(F("Latitude: "));
display.println(gps.location.lat(), 6);
display.print(F("Longitude: "));
display.println(gps.location.lng(), 6);
display.print(F("Altitude: "));
if (gps.altitude.isValid())
display.println(gps.altitude.meters());
else
display.println(F("INVALID"));
} else {
display.println(F("Location: INVALID"));
}
display.print(F("Speed: "));
if (gps.speed.isValid()) {
display.print(gps.speed.kmph());
display.println(F(" km/h"));
} else {
display.println(F("INVALID"));
}
display.print(F("GPS date&time: "));
if (gps.date.isValid() && gps.time.isValid()) {
display.print(gps.date.year());
display.print(F("-"));
display.print(gps.date.month());
display.print(F("-"));
display.print(gps.date.day());
display.print(F(" "));
display.print(gps.time.hour());
display.print(F(":"));
display.print(gps.time.minute());
display.print(F(":"));
display.println(gps.time.second());
} else {
display.println(F("INVALID"));
}
display.display();
}
}
if (millis() > 5000 && gps.charsProcessed() < 10) {
display.clearDisplay();
display.setCursor(0, 0);
display.println(F("No GPS data: check wiring"));
display.display();
}
}