How to Build a Sports GPS Hotspot
A compact ESP32-C3 tracker with its own Wi-Fi network for live field stats
Updated

What you'll build
This guide builds the compact version of the GPS dashboard: an ESP32-C3 tracker that creates its own SportsGPS hotspot and serves a live field dashboard. It is meant for quick outdoor checks where you want to power the tracker, connect your phone, and read live stats without needing a router nearby.
The build uses an ESP32-C3 Super Mini style board, NEO-6M GPS module, LiPo battery, and the built-in LED. The dashboard runs directly on the board over soft-AP Wi-Fi, so it works in a park, on a bike, or at a test bench with no internet connection.
The useful part is the product flow: connect to the tracker network, open the dashboard address, wait for GPS lock, then watch the stats update. The guide keeps the wiring and code matched to that experience instead of treating Wi-Fi as an afterthought.
Wiring diagram
Wiring diagram
Components needed
| Component | Type | Qty | Buy |
|---|---|---|---|
| ESP32-C3 development board | board | 1 | |
| NEO-6M GPS module | sensor | 1 | €16.95 |
| LiPo battery | other | 1 | |
| Status LED | actuator | 1 |
Prices and availability are indicative and may have been updated by the supplier. Schematik may earn a commission from purchases made through affiliate links.
Assembly
Wire GPS power
Connect NEO-6M VCC to 3V3 or 5V as marked on your module, and GND to GND.
Connect GPS serial
Wire GPS TX to ESP32-C3 GPIO20 and GPS RX to GPIO21.
Add the status LED
Connect the LED through a resistor to GPIO8 and GND.
Add portable power
Feed the ESP32-C3 from the LiPo charger output only after confirming polarity.
Upload and test outside
Open Serial Monitor and take the unit near a window until it reports a fix.
Pin assignments
| Pin | Connection | Type |
|---|---|---|
| GPIO 20 | neo6m-gps TX → ESP32-C3 RX | UART |
| GPIO 21 | neo6m-gps RX → ESP32-C3 TX | UART |
| 3V3 | neo6m-gps VCC | POWER |
| GND | neo6m-gps GND | GROUND |
| GPIO 8 | status-led DIN | DIGITAL |
| GND | status-led GND | GROUND |
Code
#include <WiFi.h>
#include <TinyGPSPlus.h>
#define GPS_RX_PIN 20
#define GPS_TX_PIN 21
#define STATUS_LED_PIN 8
TinyGPSPlus gps;
HardwareSerial gpsSerial(1);
WebServer server(80);
const char* AP_NAME="Sports-GPS-Hotspot";
void handleRoot(){String body="<h1>Sports GPS</h1>"; if(gps.location.isValid()){body += "<p>Lat: "+String(gps.location.lat(),6)+"</p><p>Lng: "+String(gps.location.lng(),6)+"</p>";} else {body += "<p>Waiting for GPS fix.</p>";} server.send(200,"text/html",body);}
void setup(){pinMode(STATUS_LED_PIN,OUTPUT); Serial.begin(115200); gpsSerial.begin(9600,SERIAL_8N1,GPS_RX_PIN,GPS_TX_PIN); WiFi.mode(WIFI_AP); WiFi.softAP(AP_NAME); server.on("/",handleRoot); server.begin(); Serial.println(WiFi.softAPIP());}
void loop(){while(gpsSerial.available()) gps.encode(gpsSerial.read()); digitalWrite(STATUS_LED_PIN,gps.location.isValid()?HIGH:(millis()/500)%2); server.handleClient();}
// Run this and build other cool things at schematik.ioReady to build this?
Open this project in Schematik to get the full wiring diagram, pin assignments, and deployable code for the Sports GPS Hotspot.
Open in Schematik →