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 simultaneously
- 144 departure buffer
- 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-Setup" network 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 with exact matching or pattern matching (prefix/suffix/contains).
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.
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)
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 resolution (2× 64×32 panels)
- 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.