A real-time flight tracking display for HUB75 LED matrices, running on the Pimoroni Interstate 75 W with RP2350/RP2040.
This project is a MicroPython port of the original FlightTracker by Colin Waddell, designed for Raspberry Pi with RGB LED matrices.
Ported for Pimoroni Interstate 75 W by Richard Burford.
- Pimoroni Interstate 75 W (RP2350 or RP2040 version)
- HUB75 LED Matrix Panel (64x32 recommended, other sizes supported)
- USB-C cable for power and programming
- Optional: Speaker/buzzer on GP20 for audio notifications
- Optional: 3D printed enclosure (see below)
A 3D printable enclosure is available for the FlightTracker:
- Model file: FlightTracker-box.3mf
The enclosure is designed to house the Interstate 75 W and a 64x32 LED matrix panel.
- Real-time flight tracking using FlightRadar24 API (with airplanes.live fallback)
- Displays flight number, origin/destination airports
- Aircraft type lookup with friendly names (e.g., "Boeing 787-8 Dreamliner")
- Scrolling weather information with colour-coded values
- Clock and date display when no flights overhead
- Bing-bong audio notification for new flights
- Button A triggers audio notification
- Fallback WiFi network support
- Onboard RGB LED status indicator
Download the latest Pimoroni MicroPython firmware for Interstate 75 W from: https://github.com/pimoroni/pimoroni-pico/releases
Flash the firmware:
- Hold the BOOT button and press RST on the Interstate 75 W
- The board appears as a USB drive
- Copy the
.uf2firmware file to the drive - The board will reboot automatically
Copy all project files to your Interstate 75 W using Thonny, rshell, or mpremote:
# Using mpremote
mpremote cp -r . :
# Or using rshell
rshell -p /dev/ttyACM0 rsync . /pyboard/Create secrets.py with your WiFi credentials:
# Primary WiFi
WIFI_SSID = "YourNetworkName"
WIFI_PASSWORD = "YourPassword"
# Fallback WiFi (optional)
WIFI_SSID_FALLBACK = "BackupNetwork"
WIFI_PASSWORD_FALLBACK = "BackupPassword"Create or edit config.py with your location settings:
# Geographic zone for tracking (lat/lon bounds)
ZONE_HOME = {
"tl_y": 56.5, # North boundary
"tl_x": -5.0, # West boundary
"br_y": 55.5, # South boundary
"br_x": -3.5 # East boundary
}
# Your home location [lat, lon, altitude_km]
LOCATION_HOME = [55.8642, -4.2518, 6371]
# Weather location (lat, lon)
WEATHER_LAT = 55.8642
WEATHER_LON = -4.2518
# Your local airport code to highlight
JOURNEY_CODE_SELECTED = "GLA"
# Temperature units: "metric" or "imperial"
TEMPERATURE_UNITS = "metric"
# Display brightness (0-100)
BRIGHTNESS = 50
# Altitude filter (feet)
MIN_ALTITUDE = 0
MAX_ALTITUDE = 45000
# Audio pin (optional)
AUDIO_PIN = 20The tracker starts automatically when the board powers on.
Or run manually via Thonny/REPL:
import main
main.main()When flights are overhead:
┌────────────────────────────────┐
│ GLA ────> LHR 12°C │ Route + Temperature
├────────────────────────────────┤
│ BA1234 ──────────────── 1/3 │ Flight number + Counter
├────────────────────────────────┤
│ Airbus A320 450kts ↑32000ft │ Scrolling aircraft info
└────────────────────────────────┘
When no flights are overhead:
┌────────────────────────────────┐
│ 14:35 12°C │ Clock + Temperature
├────────────────────────────────┤
│ Partly Cloudy 15km/h SW 65% │ Scrolling weather
├────────────────────────────────┤
│ Thu 5 Dec │ Date
└────────────────────────────────┘
| Option | Description | Default |
|---|---|---|
ZONE_HOME |
Geographic bounds for flight tracking | Glasgow area |
LOCATION_HOME |
Your location for distance calculation | Glasgow |
WEATHER_LAT/LON |
Coordinates for weather API | Glasgow |
TEMPERATURE_UNITS |
"metric" or "imperial" | metric |
MIN_ALTITUDE |
Ignore flights below this (feet) | 0 |
MAX_ALTITUDE |
Ignore flights above this (feet) | 45000 |
BRIGHTNESS |
Display brightness (0-100) | 50 |
JOURNEY_CODE_SELECTED |
Airport code to highlight | GLA |
AUDIO_PIN |
GPIO pin for speaker | 2 |
Set DRIVER_TYPE in setup/screen.py:
32x3264x32(recommended)64x64128x64
The onboard RGB LED indicates system status:
| Colour | Meaning |
|---|---|
| Blue | No flights / Idle |
| Green | Flights detected |
| Yellow | Fetching data |
| Button | Action |
|---|---|
| A (GP14) | Play bing-bong notification |
- FlightRadar24 - Primary source for flight data (includes origin/destination)
- airplanes.live - Fallback ADS-B data (used only if FR24 fails)
- Open-Meteo - Weather data (free, no API key required)
This MicroPython port has some differences:
- Synchronous operation - No background threads; data fetched between display updates
- Built-in fonts - Uses PicoGraphics bitmap fonts instead of BDF files
- Direct HTTPS - Custom TLS implementation for MicroPython
- Simplified audio - PWM tone generation instead of WAV playback
- No external dependencies - All code runs standalone on the microcontroller
- Check SSID and password in
secrets.py - Ensure 2.4GHz network (5GHz not supported by Pico W)
- Try adding a fallback network
- Verify your
ZONE_HOMEcoordinates are correct - Check flights in your area using FlightRadar24
- Ensure
MIN_ALTITUDEisn't filtering out all flights
- Check panel is connected correctly to HUB75 header
- Verify
DRIVER_TYPEinsetup/screen.pymatches your panel - Try reducing
BRIGHTNESSif display looks washed out
- Check speaker is connected to correct GPIO pin (default GP2)
- Verify
AUDIO_PINin config.py matches your wiring
GPL v3.0 - Same as original project.