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.

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.

Remote Debugging

Optional telnet logging (port 23) when debug mode is enabled — mirrors all logs over WiFi for troubleshooting.

Hardware Specifications

Resolution

128×32 pixels (two 64×32 HUB75 panels) by default. Optional 128×64 with four panels (panelRows=2) for up to 7 departure rows.

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 (4 panels, panelRows=2, up to 7 rows)
  • 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

Automatic pin detection — firmware adjusts based on hardware variant.

→ Wiring Guide

Ready to Build?

Get the parts list and start building your own SpojBoard.