Real-time GPS monitoring system with an OLED display and WiFi dashboard, built on ESP32 + NEO-6M GPS.
This project didnโt start with a circuit diagram. It started with a simple question from my 6-year-old while riding the MRT in Malaysia:
"เถญเทเถญเทเถญเท, how do all the lights on those tall buildings blink together?"
I didnโt have an answer at the time. Later, I discovered that many skyscraper lights are actually synchronized using GPS signals. Each light gets a precise time signal, so they blink in perfect unison โ like the city itself is breathing.
That small discovery lit a spark ๐ก. Why not build something ourselves using GPS?
๐ Read the backstory here: A Little Question, A Big Wonder (LinkedIn)
https://www.linkedin.com/posts/hasithaprabhath_curiosity-parenting-diyprojects-activity-7360663645384593411-XU2c
What began as a childโs innocent curiosity has grown into this project: a real-time GPS monitor that displays data on an OLED screen and serves a live dashboard over WiFi.
- ๐ก GPS Data Parsing โ UTC time, date, latitude, longitude, altitude, speed, and course.
- ๐ฐ๏ธ Satellite Tracking โ Satellite count, fix quality, and fix status.
- ๐ฅ๏ธ OLED Display โ Minimal, glanceable UI for live data.
- ๐ WiFi Web Dashboard โ ESP32 runs as an Access Point with a responsive dashboard.
- ๐ด LED Fix Indicator โ Slow blink = GPS fix, fast blink = searching.
- ๐ Offline Mode โ Works without internet (local WiFi AP mode).
- ESP32 DevKit V1
- NEO-6M GPS Module (3.3V power only
โ ๏ธ ) - SSD1306 OLED Display (128x64, I2C)
- USB cable for flashing & power
- SSID:
ESP32_GPS_Monitor - Password:
gps123456 - Access URL:
http://192.168.4.1
The ESP32 hosts a small web server with three routes:
/โ dashboard (HTML + JS auto-refresh every 2s)/dataโ returns live JSON (time, date, coordinates, speed, fix info)/style.cssโ lightweight styling for the dashboard
The dashboard shows:
- Status Bar โ GPS Fix vs No Fix, Satellite count
- Date & Time โ UTC from GPS
- Position โ Latitude & Longitude (DMS โ decimal conversion handled in code)
- Measurements โ Altitude (m), Speed (km/h), Course (deg)
- Signal Info โ Fix quality, Fix status, Last update timestamp
The OLED updates ~every 500 ms; the browser fetches
/dataevery 2 seconds.
esp32_gps.inoโ Main Arduino sketch (GPS parsing, OLED UI, WiFi server).docs/circuit-diagram.svg
-
Clone
git clone https://github.com/hasithaishere/esp32-gps-oled-wifi-monitor.git cd esp32-gps-oled-wifi-monitor -
Install Arduino libraries
Adafruit SSD1306Adafruit GFXWiFiWebServer
-
Wire up GPS & OLED as per the diagram.
-
Flash the sketch
esp32_gps.inoto your ESP32 (Board: ESP32 Dev Module). -
Connect to the ESP32 WiFi AP:
- SSID:
ESP32_GPS_Monitor - Password:
gps123456
- SSID:
-
Open
http://192.168.4.1in your browser to view live data.
- Serial & Parsing: GPS NMEA sentences are read from UART2 and parsed for
GGA,RMC, andGSV. Time/position are decoded; speed in knots is converted to km/h. - Coordinate Conversion: Raw
ddmm.mmmm/dddmm.mmmmare converted to decimal degrees with hemisphere sign handling (S/W negative). - Staleness & Fix: If no sentence is received for 5s, the system flags
hasValidFix = false. LED blink interval is tied to fix status. - OLED UI: Large time header with supporting rows for sats/lat/lon/date for quick glances.
- Web API:
/datareturns a compact JSON snapshot for simple integrations or future logging.
- Log GPS tracks to SD card (CSV/GeoJSON)
- Google Maps integration for live plotting
- NTP fallback for time when under poor sky view
- Turn the dashboard into a PWA (installable on phones)
- Add PPS pin handling for timing experiments
MIT License ยฉ Hasitha Prabhath Gamage
Sometimes, the best engineering projects start with the smallest voices โ in this case, a childโs question about blinking lights.

