Skip to the content
2 layers77 × 59.4 mmSpeed Limit Display v2, the printed circuit board in 3D

Speed Limit Display v2

phreakhcker/Speed-Limit-Display1

Simple speed limit display with esp32 tracked with gps board and api to show speed while driving on any road.

Size
77 × 59.4 mm
Copper layers
2
Thickness
1.6 mm
Parts
29
Nets
62
Pads
188
Tracks, vias
505, 72
Pours
2
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
29 Mar 2026
Updated
12 Apr 2026

Overview

Speed Limit Display v2 is an open-source printed circuit board by phreakhcker, from the phreakhcker/Speed-Limit-Display repository on GitHub, published under the Apache-2.0 licence. It is a 2-layer board of 77 × 59.4 mm with 29 parts on 62 nets, routed with 505 tracks and 72 vias.

It is built around the ESP32-S3-WROOM-1-N8, TLV75530PDBV and USBLC6-2P6. Its parts include 8 resistors, 6 capacitors, 4 ICs, 4 connectors and 3 switches. It belongs with the lEDs and displays and radio and wireless boards and the ESP32 boards of this library.

Main components

3

README

README.md

Speed Limit Display

A real-time speed limit display built with an ESP32, GPS module, and OLED screen. Shows the current road's speed limit with color-coded overspeed warnings (green/yellow/red).

Uses the TomTom Snap-to-Roads API for accurate road matching — sends your heading and speed so it picks the correct road, even near highway ramps and parallel roads.

Hardware

ComponentDetails
MicrocontrollerESP32 Mini (any variant: original, S2, S3, C3)
GPS ModuleAny NMEA-compatible (NEO-6M, NEO-7M, BN-220, etc.)
DisplaySSD1351 128x128 SPI OLED
ButtonOne momentary pushbutton
PowerUSB or 5V supply

Wiring

ESP32 PinConnects To
GPIO 20GPS TX
GPIO 21GPS RX
GPIO 7OLED CS
GPIO 2OLED DC
GPIO 3OLED RST
GPIO 4OLED MOSI (SDA)
GPIO 6OLED SCLK (SCL)
GPIO 10Button (other leg to GND)

Pin assignments can be changed in config.h.

Features

  • Snap-to-Roads API — sends GPS heading + speed for accurate road matching
  • GPS point buffering — 5-point trajectory for better map matching
  • Speed limit smoothing — rejects false readings from nearby roads
  • Overspeed alerts — green (ok), yellow (close to limit), red (over limit) with hysteresis
  • Dual-core HTTP — API calls on Core 0, GPS/display on Core 1 (no display freezes)
  • Non-blocking WiFi — GPS keeps working during WiFi reconnects
  • API rate limiting — exponential backoff on HTTP 429, daily quota tracking
  • Watchdog timer — auto-reboots if the device freezes
  • One-button menu — adjust brightness, alert thresholds, API timing, GPS reset
  • Persistent settings — brightness and thresholds saved across reboots

Setup

1. Install Arduino Libraries

Open Arduino IDE, go to Sketch > Include Library > Manage Libraries and install:

  • TinyGPSPlus (by Mikal Hart)
  • ArduinoJson (by Benoit Blanchon, version 6.x)
  • Adafruit GFX Library
  • Adafruit SSD1351 Library

2. Get a TomTom API Key (free)

  1. Go to developer.tomtom.com
  2. Create a free account
  3. Go to Dashboard > My Apps > Add New App
  4. Copy your API key (free tier = 2,500 requests/day)

3. Configure Credentials

  1. In the SpeedLimitDisplay/ folder, copy config_secrets_example.h to config_secrets.h
  2. Edit config_secrets.h with your WiFi name, password, and TomTom API key
  3. config_secrets.h is in .gitignore — it will never be uploaded to GitHub

4. Upload to ESP32

  1. Open SpeedLimitDisplay/SpeedLimitDisplay.ino in Arduino IDE
  2. Select your ESP32 board in Tools > Board
  3. Click Upload

5. Serial Monitor (optional, for debugging)

Open Tools > Serial Monitor at 115200 baud. Type:

  • d — full debug status dump
  • r — reboot the device

Button Controls

ActionNormal ModeMenu Mode
Short pressCycle brightnessNext menu item
Long press (1.2s)Enter menuChange selected setting
Very long press (2.5s)—Exit menu

Configuration

All tunable settings (pins, timing, thresholds) are in config.h. Secrets (WiFi, API key) are in config_secrets.h.

Custom PCB (v2)

A custom 2-layer PCB designed in KiCad 10.0 with everything on one board:

ComponentDetails
U1ESP32-S3-WROOM-1-N8 (dual core, 8MB flash, WiFi+BLE)
U2Quectel L70-R GPS module with ceramic patch antenna
U3LV75530PDBV 3.3V LDO regulator
J1USB-C connector (power + programming)
J212-pin display header
J49-pin breakout header (spare GPIOs + power for future expansion)
SW1EC11 rotary encoder with push button (menu navigation)
SW3/SW4Boot and reset buttons
BZ1Piezo buzzer (optional)

Gerber files are in PCB Design/.../Gerber/ ready to upload to PCBWay or JLCPCB.

See docs/hardware/PCB_DESIGN.md for full design details, ordering instructions, and assembly guide.

Project Structure

text
Speed-Limit-Display/
├── SpeedLimitDisplay/              # Arduino sketch folder
│   ├── SpeedLimitDisplay.ino       # Main code
│   ├── config.h                    # All tunable settings
│   ├── config_secrets.h            # Your credentials (git-ignored)
│   └── config_secrets_example.h    # Template for credentials
├── PCB Design/                     # KiCad PCB project
│   └── .../Speed-Limit-Display-v2/
│       ├── *.kicad_sch             # Schematic
│       ├── *.kicad_pcb             # PCB layout
│       ├── *.kicad_dru             # Custom DRC rules
│       └── Gerber/                 # Manufacturing files (.zip)
├── docs/
│   ├── hardware/
│   │   ├── PCB_DESIGN.md           # PCB specs, ordering, assembly guide
│   │   └── DRC_FIXES_CHECKLIST.md  # DRC fixes applied
│   └── PRODUCT_PLAN.md             # Product roadmap
├── .gitignore
├── CONTRIBUTING.md                 # How to contribute
├── LICENSE
└── README.md                       # This file

Contributing

See CONTRIBUTING.md for how to set up your environment, create branches, and submit changes.

License

See LICENSE for details.

Parts

29
QtyValueFootprintReferences
6RResistor_SMD:R_0603_1608MetricR1, R4, R5, R6, R7, R8
21uFCapacitor_SMD:C_0603_1608MetricC4, C5
25.1kResistor_SMD:R_0603_1608MetricR2, R3
2CCapacitor_SMD:C_0603_1608MetricC1, C3
2SW_PushButton_Switch_SMD:SW_SPST_PTS645Sx43SMTR92SW3, SW4
110 uFCapacitor_SMD:C_0805_2012MetricC2
110uFCapacitor_SMD:C_0805_2012MetricC6
1500mAFuse:Fuse_1206_3216MetricF1
1BuzzerBuzzer_Beeper:Buzzer_Murata_PKMCS0909EBZ1
1Conn_01x09_PinConnector_PinHeader_2.54mm:PinHeader_1x09_P2.54mm_VerticalJ4
1Conn_01x12_PinConnector_FFC-FPC:Hirose_FH12-12S-0.5SH_1x12-1MP_P0.50mm_HorizontalJ2
1Conn_CoaxialConnector_Coaxial:U.FL_Hirose_U.FL-R-SMT-1_VerticalJ3
1D_TVSDiode_SMD:D_SOD-323D2
1ESP32-S3-WROOM-1RF_Module:ESP32-S3-WROOM-1U1
1L70-RRF_GPS:Quectel_L70-RU2
1LEDLED_SMD:LED_0603_1608MetricD1
1RotaryEncoder_SwitchRotary_Encoder:RotaryEncoder_Alps_EC11E-Switch_Vertical_H20mmSW1
1TLV75530PDBVPackage_TO_SOT_SMD:SOT-23-5U3
1USBLC6-2P6Package_TO_SOT_SMD:SOT-666U4
1USB_C_ReceptacleConnector_USB:USB_C_Receptacle_GCT_USB4085J1

Similar boards

  • 4 layers190 × 145 mmMotor izleme karti, the printed circuit board in 3D

    Motor izleme karti

    melikeatilgan/asenkron-motor-bakim

    15 kW asenkron motor için arıza ağacı analizi, aylık bakım formu ve KiCad'de tasarlanmış üç izleme kartı

    191 parts1
  • 2 layers87.6 × 25.4 mmLis3dh board, the printed circuit board in 3D

    Lis3dh board

    explora26/tablet_sensor_board

    25 parts
  • 4 layers138.1 × 104.6 mmV7-kaleido, the printed circuit board in 3D

    V7-kaleido

    vroland/epdiy-hardware

    Hardware design files for EPDiy: https://github.com/vroland/epdiy.

    140 parts75CC-BY-SA-4.0
  • 4 layers48 × 35.1 mmMicro esp32-s3, the printed circuit board in 3D

    Micro esp32-s3

    atomic14/esp32-tv-hardware

    This is Work In Progress - I'm still working on this.

    81 parts29
  • 4 layers106 × 80 mmMainboard, the printed circuit board in 3D

    Mainboard

    PyroVision-ThermalCam/Mainboard

    Mainboard for the PyroVision thermal camera.

    152 parts11GPL-3.0
  • 4 layers60 × 60 mmESP32 Robo Dev Board, the printed circuit board in 3D

    ESP32 Robo Dev Board

    Amoskeag/RoboDojo

    Super Cool Small Form Factor Robotics

    72 parts6BSD-2-Clause
  • 4 layers65 × 56 mmMotorgo plink, the printed circuit board in 3D

    Motorgo plink

    Every-Flavor-Robotics/motorgo-plink-hardware

    117 parts5
  • 2 layers37 × 70.9 mmOpendiag, the printed circuit board in 3D

    Opendiag

    maximus64/opendiag-hardware

    OpenDIAG - Open Source OBD2 Interface (Hardware)

    148 parts5CERN-OHL-S-2.0

Questions

How big is the Speed Limit Display v2 PCB?

It measures 77 × 59.4 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Speed Limit Display v2 use?

29 parts, built around the ESP32-S3-WROOM-1-N8, TLV75530PDBV and USBLC6-2P6. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Speed Limit Display v2 KiCad files?

From the phreakhcker/Speed-Limit-Display repository on GitHub, at the commit this page was made from: the board is PCB Design/SCH_Speed-Limit-Display_2026-03-29_v45_2026-04-01-11-26/Speed-Limit-Display-v2/Speed-Limit-Display-v2.kicad_pcb and its schematic PCB Design/SCH_Speed-Limit-Display_2026-03-29_v45_2026-04-01-11-26/Speed-Limit-Display-v2/Speed-Limit-Display-v2.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Speed Limit Display v2 design in my own project?

Its repository publishes it under the Apache-2.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).