A real-time PCB map of the Helsinki Region train network, powered by an ESP32-C3 microcontroller. Train movements are displayed using addressable RGB LEDs, with live data fetched over Wi-Fi.
- Real-time Train Tracking: Displays the approximate locations of trains on the HSL and VR commuter network.
- Addressable LEDs: ~290 WS2812B-compatible RGB LEDs (1.6x1.5mm) for a vibrant display.
- Wi-Fi Connectivity: ESP32-C3's built-in Wi-Fi fetches live train data.
- Custom PCB: Designed for JLCPCB manufacturing limits.
- Open Source: Hardware and firmware are open source.
- Microcontroller: Expressif ESP32-C3FH4 (RISC-V, 160 MHz, 4 MB Flash, QFN32)
- Level shifter: Texas Instruments SN74LVC4245APWR (3.3V to 5V)
- LEDs: ~290 x XingLight XL-1615RGBC-WS2812B (1.6mm x 1.5mm)
- PCB: 249mm x 71.5mm, JLCPCB-friendly
- Antenna: On-board PCB antenna (TI CC2430DB design)
- Ports: Two USB Type-C ports for redundancy
Inspiration for the layout was taken from the VR rail map used on commuter trains (above the doors).
Each LED represents a double-track line
-
8-tracked sections (4 LEDs wide):
- Helsinki-Pasila
-
Quad-tracked sections (2 express commuter & intercity, 2 slower commuter):
- Pasila-LeppΓ€vaara-(Kauklahti [Under construction])
- Pasila-Kerava
-
Exceptions to single-track lines:
- Tavastila-Kotkan satama
- Siuntio-Hanko
- Designed in KiCad V9.0 using JLCPCB KiCad Library
- View Online: Interactive PCB Layout (Kicanvas)
- Source Files:
/PCBdirectory
Led chains are located on other pages
NOTE! Software and firmware have been moved to another repo
The ESP32-C3 firmware is responsible for:
- Connecting to Wi-Fi
- Fetching live train data from the API
- Processing data to determine train locations
- Controlling WS2812B LED chains to display train positions
- Handling button inputs and status LEDs
- Hosting a web page for configuration
- Flash the Firmware:
- Use the Web Installer (recommended, no drivers needed)
- Or flash manually using PlatformIO (
Firmware/directory)
- Connect to Wi-Fi:
- On first boot, use the web installer interface to configure Wi-Fi credentials. They are saved locally on the device.
- Power the Board:
- Use a 5V USB-C power supply capable of at least ~1A (~2A recommended for compatibility with higher brightness settings).
- Configure in the :
- Visit the IP address of your device (shown in Web Installer)
- Configure options like tails, brightness and mode
- Enjoy the Live Train Map!
The top (π) power led is hardwired to the power rail
The middle and bottom status leds are controlled by the MCU
| LED | Light | Meaning |
|---|---|---|
| top (π) | π© green | The board is powered |
| top (π) | β¬ none | The board is not powered |
| top (π) | π₯ red | This shouldn't happen although it's techically possible if there's severe issues in the pcb |
| middle (α―€) | π© green | Connected to the API |
| middle (α―€) | π© green (blinking) | Mode change pending |
| middle (α―€) | β¬ none | Connecting to the API |
| middle (α―€) | π₯ red | Failed to connect to API |
| bottom (π) | π© green (blinking) | Connecting to wifi |
| bottom (π) | π© green | Connected to wifi |
| bottom (π) | β¬ none | Failed to boot |
| bottom (π) | π₯ red | Failed to connect to wifi |
There are 4(+1) map modes on the device. You can switch the mode by pressing the map (πΊοΈ) button or by going to the control panel.
- Shows commuter trains by line
- Only commuter trains
- Some colors are reused on lines that do not intersect
| Color | Line | |
|---|---|---|
| Z | ||
| A | ||
| E,O | ||
| P,G | ||
| M,I | ||
| K | ||
| Y,L,H | ||
| U | ||
| D,T,R | ||
| V, Other | Look up on juliadata.fi |
* V is used in transfer services
- Shows the delay state of trains
- Only commuter trains
| Color | Delay (min) | Description |
|---|---|---|
| < 0 | Ahead of schedule | |
| 0 - 2 | On time | |
| 2 - 10 | Mild delay | |
| > 20 | Severe delay | |
| - | Unknown delay amount |
- Shows the locomotives/EMUs of trains
- ALL trains shown (incl. InterCity, freight)
| Color | Loco | Description |
|---|---|---|
| EMUs | ||
| Sm2 | Commuter, old | |
| Sm3 | Pendolino (IC) | |
| Sm4 | Commuter, longer distances | |
| Sm5 | Commuter, shorter distances | |
| Sm6 | Allegro (IC) | |
| Sm7 | Commuter, not in regular service yet | |
| Locos | ||
| Sr2 | IC locomotive | |
| Sr3 | Newer IC locomotive | |
| Other | ||
| N/A | No composition found (most likely freight) | |
| Other | Other locomotive with no color defined (Look up on juliadata.fi) |
- Shows the types of trains
- ALL trains shown (incl. InterCity, freight)
| Color | Code | Description |
|---|---|---|
| IC | Double-decker intercity trains | |
| VET | Locomotive train | |
| MUS, MUV | Heritage train | |
| S | Pendolino train | |
| T | Freight train | |
| HL | Commuter train | |
| HV | Commuter train transfer | |
| PAR, PAI, VEV, W, SAA | Shunting | |
| Other | Other train type with no color defined (Look up on juliadata.fi) |
- Shows the types of LEDs
| Color | Type | Description | Technical logic |
|---|---|---|---|
| Station | All services stop | Train has arrived, but not departed | |
| Stop | Express services skip | Same as station | |
| Between | Single LED between stops/stations | Train left previous, not arrived at next | |
| MultiBetween | Multiple LEDs between stops/stations | Same as between, but exact position is appoximated using timetable |
- Shows disruptions for stations and trains
| Color | Disruption |
|---|---|
| Cancellation | |
| Infrastructure disruption | |
| Other disruption | |
| Track work | |
| Private train | |
| Replacement service | |
| Missing/replaced wagon(s) | |
| Unclassified |
Easily flash the latest firmware to your ESP32-C3 using your browser:
Open the Helsinki LED Train Map Web Installer
- Works with Chrome, Edge, or any Web Serial-compatible browser
- Follow on-screen instructions to connect and flash your device
View the map without having the physical pcb:
Open the Helsinki LED Train Map Web Simulator
- Use the map mode button to switch display modes, just like on the real thing
- Works with most modern browsers
- Fetches data from the API
A 3d-printable stand to hold up the board. Files are located in /3D Models
Processes train running data from digitraffic. Documentation for the train API is available at https://www.digitraffic.fi/rautatieliikenne. Most of it is only available in finnish.
- express: API handling
- mqtt: Listening to MQTT train messages
- node-sqlite & sqlite3: Database for cached train compositions and stats
- node-cron: Cron jobs for recaching data and cleaning the database
The api is tunneled to ltm.hekinav.dev.
Install npm packages
npm install
Start the api in dev mode (watches files) (uses port 3001 by default)
npm run dev
Compile TS to JS
npm run build
Start the server
npm run start or in PM2 pm2 start ./ecosystem.config.cjs
Contributions are welcome! Open an issue or submit a pull request for improvements, bug fixes, or feature suggestions.
Thanks to Chris (CDFER) for the base and support of this project. Check out his store with multiple LED Rail Maps at keastudios.co.nz
This project is released under the MIT license.
Β© 2025 Chris Dirks & Unto Ahti


