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
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 GuideReady to Build?
Get the parts list and start building your own SpojBoard.