A glanceable navigation HUD for bikes and motorcycles, built on a cheap ESP32 board - no Google API key, no custom app.
I had an ESP-WROOM-32 board with a little 0.96" OLED soldered on, and one question: could it show Google Maps turn-by-turn directions on my handlebar, so I don't have to stare at my phone while riding?
Turns out - yes. And the interesting part is how the data gets there.
Google Maps has no free "give me the next turn" API you can call from a microcontroller. But while navigating, Maps posts a live Android notification with the next maneuver, distance, and arrival time. A free app called Chronos reads that notification and streams it over Bluetooth Low Energy. On the ESP32, the ChronosESP32 library turns that stream into clean data I can draw.
So the chain is:
Google Maps → Chronos app (reads the notification) → BLE → ESP32 → OLED
No API key. No paid SDK. No app to build myself.
Most hobby HUDs guess the maneuver from keywords ("if the text contains 'left', draw a left arrow"), which breaks on anything unusual. This one forwards Google's actual maneuver icon as a bitmap and draws it pixel-for-pixel. That means it faithfully shows any maneuver Maps produces:
Slight, sharp, and normal turns
U-turns
Roundabouts with the correct exit ("take the 3rd exit")
Lane guidance (keep left / keep right)
Ramps, merges, forks, and arrival
If Google can draw it, the HUD shows it.
Board: ESP-WROOM-32 with an on-board 0.96" 128x64 SSD1306 OLED (the exact one I used, from Robu)
Wiring: the OLED is on I2C, SDA = GPIO5, SCL = GPIO4, address 0x3C
Micro-USB, CP210x USB-to-serial
Big maneuver icon on the left (Google's own)
Distance to the next turn in large text
Arrival time below it
The full instruction scrolls across the bottom (ping-pongs left-right so long street names are readable)
The Maps notification is lossy - it reliably gives distance-to-turn, instruction, arrival time, and the icon, but not "minutes remaining" or "distance to destination." So the HUD shows what's actually available.
Maps sometimes drops the distance on certain steps, so the firmware holds the last known value instead of blanking.
Maps sneaks a non-standard space character before "pm" that showed up as a garbage glyph until I sanitized the text.
Android only - iOS won't let apps read Google Maps notifications.
Everything - firmware, an I2C scanner to confirm your wiring, setup instructions, and 3D-case files - is on GitHub:
fbiego/chronos-esp32 - the Chronos app and BLE library that make this possible.