Plate I · On the water
nomaduino-gps
A GPS receiver that sends NMEA 0183 sentences over WiFi to a single configured chartplotter or navigation app.
At a glance
Bill of materials
What it does
The board sits somewhere with a view of the sky and reads NMEA 0183 sentences from a GPS module over a serial connection. It joins your boat’s WiFi network and sends those sentences as UDP packets to a single configured destination — one chartplotter or navigation app, not a broadcast every device on the network can pick up. The display shows current position, speed, and fix status at a glance.
Wiring
The GPS breakout talks to the ESP32-S3 over a UART. Four connections:
| GPS breakout | T-Display S3 | Notes |
|---|---|---|
| VIN | 3V3 | The Ultimate GPS accepts 3.3V |
| GND | GND | |
| TX | GPIO18 | GPS transmit into the board’s receive pin |
| RX | GPIO21 | Board transmit into the GPS’s receive pin — easy to swap with TX, so double-check before powering up |
The two side buttons on GPIO14 and GPIO0 cycle the display pages, and the backlight is driven from GPIO38 — none of that needs wiring, it is on the board already.
Assembly
- Wire the GPS breakout to the board as above.
- Flash the firmware — see below.
- Power the board over USB-C and wait for the display to come up.
Configuration
On first boot the board has no WiFi credentials, so it starts its own access point and
serves a configuration portal. Join it, set your network’s SSID and password, and the
board reboots onto your network with a hostname of GPS_S3- plus a short device-specific
suffix generated from its MAC address, so two units on the same network don’t collide.
Everything else is configured from the same web interface once the board is on your network:
| Setting | Key | Default |
|---|---|---|
| GPS serial baud rate | baud |
9600 |
| Fix rate | gpsFixRate |
1 Hz |
| Update rate | gpsUpdateRate |
1 Hz |
| NMEA sentence set | gpsDataMode |
RMC + GGA |
| UDP output | udpEnabled |
off |
| UDP destination host | udpHost |
(empty) |
| UDP port | udpPort |
10110 |
| Display brightness | backlight |
100 |
UDP output is off by default. To feed a chartplotter, enable udpEnabled and set
udpHost to the device running your navigation software. This is a single destination,
not a broadcast — if you run two navigation apps aboard, only the one on the configured
host receives data. Port 10110 is the conventional port for NMEA 0183 over UDP, so most
apps will be listening there already. Because udpManager is only constructed at boot
if udpEnabled is already on, flipping udpEnabled on from the web UI doesn’t take
effect until the board reboots.
Firmware updates after the first flash go over the network — the board runs ElegantOTA, so you can upload a new build from the web interface without plugging in.
Troubleshooting
No fix. The Ultimate GPS needs a clear view of the sky and can take a while to get a first fix from cold. The display shows fix status; if it never leaves “no fix”, check the TX and RX wiring — swapping them is the usual cause.
Board joins WiFi but the chartplotter sees nothing. Confirm udpEnabled is on and
udpHost points at the right device. Both must be on the same network segment. If you
just turned udpEnabled on from the web UI, reboot the board — it only starts the UDP
sender at boot when udpEnabled is already set, so a live toggle has no effect until
the next power cycle.
Nothing on the display. Confirm the board is a LilyGO T-Display S3 specifically — the pin assignments in this firmware are board-specific and will not work on a bare ESP32-S3 module.
For full configuration reference, telnet commands, and the changelog, see the repository.
Reference & troubleshooting
Full configuration keys, protocol details, and the changelog live in the repository.
Repository documentation