Features

Real-time transit data, smart display features, and flexible configuration for your LED matrix display.

Multi-Source Transit Data

Direct API Integration

  • Prague: Golemio API (official Prague public transit API)
  • Berlin: BVG API (Berlin public transport)
  • Configurable refresh intervals (10-300 seconds)

MQTT Integration

  • Connect to Home Assistant or any MQTT broker
  • Server-side aggregation and filtering
  • Dual ETA modes (timestamp or pre-calculated)
  • Custom JSON field mapping
→ MQTT Integration Guide

Multi-Stop Support

  • Query up to 12 transit stops
  • Partial results paint as each stop responds
  • A failed stop keeps its last-known departures
  • Automatic sorting by departure time
  • 1-second rate limiting to prevent API abuse

Smart Display Features

Real-Time ETA Updates

Local ETA calculation: Updates every 10 seconds from cached timestamps.
Reduces server load while keeping display fresh.
No additional API calls between data refreshes.

Configurable Display Modes

Four display layouts to match your needs:

  • Vanilla: Line + Destination + ETA (maximum destination space)
  • Platform: Adds platform/stop letter for multi-platform stations
  • Dual ETA: Shows next two departure times to see frequency
  • Dual ETA + Platform: Full information mode

Trade-off: More information = less space for destination names. The display compensates automatically.

Adaptive Font Rendering

Automatically switches to condensed font for long destination names, fitting up to 23 characters on screen.
Horizontal scrolling for destinations that still don't fit.
Smart thresholds that adjust based on display mode (platform, dual ETA).

Czech Language Support

Custom 8-bit ISO-8859-2 fonts with automatic UTF-8 conversion:

  • Czech: ž, š, č, ř, ň, ť, ď, ú, ů, á, é, í, ó, ý
  • German: ß, ä, ö, ü

Automatic headsign shortening for long Czech words (e.g., "Nádraží" → "Nádr.")

Configuration & Setup

WiFi Setup Portal

Automatic AP mode with captive portal when WiFi fails — no code editing needed. Just connect to the "SpojBoard-XXXX" network (XXXX = the last 4 hex characters of the device MAC) and configure.

Web-Based Configuration

  • Tabbed interface for easy setup
  • City selector for quick API configuration
  • Per-tab save for incremental updates
  • Demo mode to preview custom departures before API setup

Persistent Settings

All configuration stored in ESP32 flash memory, survives reboots and power cycles.

Additional Features

Custom Line Colors

Configure colors for specific transit lines via web interface. Matching uses positional wildcards — * is a required single-character position and ? an optional one after a * — resolved in three passes (exact → fixed-length → flexible). A "Restore Defaults" button returns to the built-in Prague palette.

Direction Arrows

Map platforms or stop IDs to directional arrows (←/→) to indicate which way the stop is from your location.

AC Indicator

Shows asterisk (*) for air-conditioned vehicles (Prague transit only).

Trip Filtering

Configurable minimum departure time (default 3 minutes) to hide departures that are too soon to catch.

Weather Display

Optional weather info in status bar from Open-Meteo API (free, no API key required).

Rest Mode

Scheduled display power saving — configure time periods when the display turns off automatically to save energy. The sleep button works during a scheduled rest too, and a manual choice holds until the schedule next changes, rather than switching the schedule off.

Infotext / Service Alerts

Live transit service alerts scroll across the status bar, alternating with the date and time. Multiple alerts are concatenated automatically.

Ticker Mode

Easter-egg candlestick price chart via the Twelve Data API — track stocks or crypto right on the matrix.

Panel Setup Without Reflashing

Panel arrangement, RGB channel order, driver chip and the whole pin map are settings on the Hardware tab. A test pattern draws labelled R/G/B bars so a channel swap takes seconds to spot, and a restore button reboots back to the built-in wiring. All of it reachable in setup mode, so a blank panel is recoverable without a USB cable.

Configuration Backup

Download every setting as a JSON file and restore it — before a firmware update, or to set up a second board without retyping a long API key. A restore only changes what the file contains, and a factory reset can optionally keep your WiFi credentials and panel setup.

Debug Logging

Debug mode enables detailed logging on the serial console for troubleshooting.

Hardware Specifications

Resolution

128×32 pixels (two 64×32 HUB75 panels) by default. Optional 128×64 for up to 7 departure rows — four 64×32 in a 2×2 grid, two 64×64 chained, or one 128×64 module. Chosen on the Hardware tab, not at flashing time.

Colors

Full RGB support with configurable line colors

Refresh Rate

10-300 seconds (configurable per API source)

Brightness

Adjustable 0-255 (default 90 for low power)

Display Technology

  • HUB75 RGB LED matrix panels
  • 128×32 default (2× 64×32 panels)
  • Optional 128×64, up to 7 rows (4× 64×32 grid, 2× 64×64 chained, or one 128×64 module)
  • Panel arrangement and wiring are settings, not builds
  • 16-bit color depth
  • Brightness control 0-255

Fonts & Rendering

  • Custom 8-bit ISO-8859-2 fonts
  • Automatic UTF-8 conversion
  • Adaptive font switching for long names
  • Optional scrolling for long text

Power Consumption

  • Normal: ~0.3A @ 5V (1.5W)
  • Max brightness: ~0.7A @ 5V (3.5W)
  • Boot spikes: up to 1.6A
  • Recommended PSU: 5V 2-3A

Processor

  • ESP32-S3 dual-core @ 240MHz
  • 8MB flash, 2MB PSRAM minimum
  • WiFi 802.11 b/g/n (2.4GHz)
  • OTA firmware updates

Firmware & Updates

GitHub-Based OTA Updates

  • Check for new releases directly from web interface
  • User confirmation required before update
  • Safe rollback if update fails

Dual-Core Architecture

FreeRTOS multi-task design:

  • Core 0: WiFi interrupts and network stack
  • Core 1: Display rendering, API fetching, web server

All tasks run concurrently for responsive operation even during network activity.

Hardware Flexibility

Two supported variants:

  • MatrixPortal S3 (Adafruit) — plug & play
  • Generic ESP32-S3 N8R2 — manual wiring

One pin map, one firmware per board — the two builds differ only in the RGB channel order they default to, and that is a setting you can change on the Hardware tab.

→ Wiring Guide

Ready to Build?

Get the parts list and start building your own SpojBoard.