Project Notes

Turning a Raspberry Pi Pico W into a Spin Bike Dashboard

At a Glance

Why Build This

Spin bikes are very good at making you sweat and rather less good at letting you own your data. The Bowflex IC4 / Schwinn IC4 already broadcasts useful Bluetooth Low Energy data, so the obvious question was: can a small Raspberry Pi board listen in and make a better local dashboard?

This project answers yes. It uses a Raspberry Pi Pico W running MicroPython, paired with a Waveshare 1.44-inch LCD, to create a self-contained display that sits with the bike and shows the numbers that matter while riding. No phone app, no subscription, no ceremony. Refreshingly uncivilised, in the best possible way.

The Hardware

The build centres on the Raspberry Pi Pico W, using its Bluetooth capability to scan for the bike and subscribe to its Cycling Speed and Cadence service. The display is a Waveshare Pico LCD 1.44-inch module with a 128 x 128 ST7735R screen, SPI connection, PWM backlight, and four built-in tactile buttons.

Those buttons make the project feel like an actual device rather than a loose script with delusions of grandeur. Button A shows cadence, B shows speed, X shows distance, and Y shows a summary screen. Holding Y resets the trip distance.

The Bluetooth Bit

The IC4 advertises the standard Cycling Speed and Cadence service, UUID 0x1816, and exposes CSC Measurement notifications on characteristic 0x2A5B. The Pico scans for a device named IC Bike, connects, enables notifications, and then listens for crank revolution updates.

The bike reports cumulative crank revolutions and a last crank event timestamp. From those two values, the code calculates cadence by comparing the current notification with the previous one. If the crank stops moving, cadence snaps back to zero after a short timeout rather than drifting down lazily like a polite but useless speedometer.

From Cadence To A Ride Dashboard

The IC4 data used here is cadence-focused, so speed and distance are calculated rather than read directly from a wheel sensor. The code derives virtual speed from cadence using a calibration constant, then accumulates distance over elapsed wall-clock time.

That gives the Pico enough information to show live cadence, derived speed, distance, average cadence, maximum cadence, elapsed time, and progress toward a 10 km trip target. It is not pretending to be a laboratory instrument. It is a practical dashboard that can be tuned to match the bike display closely enough for training feedback.

Designing For 128 Pixels

The display is tiny, so the UI has to be direct. The project uses colour-coded screens, large numbers, arc gauges, compact labels, and a BLE status dot. Green means connected; red means searching. Cadence uses cyan, speed uses orange, distance uses green, and summary stats get their own rows.

That is the interesting design problem: making the data legible during a workout without needing a menu system. When you are halfway through a ride, squinting at a microscopic interface is not character-building. It is just bad design wearing Lycra.

Resilience Matters

The main loop is asynchronous. One task handles the BLE connection and notifications, while another polls the physical buttons every 100 ms. If the bike disconnects, the display drops back to a searching state and the code attempts to reconnect automatically.

That matters because exercise hardware tends to live in the real world: batteries fade, Bluetooth has moods, and users press buttons at inconvenient times. Keeping the UI responsive while the connection layer does its work makes the project feel much more finished.

What I Like About It

This is a neat example of using open standards to make ordinary hardware more useful. The bike already emits the data. The Pico W is inexpensive, capable, and small. MicroPython keeps the code approachable. The result is a focused little device that does one job well: turn hidden BLE telemetry into glanceable ride feedback.

It is also exactly the sort of project that rewards iteration. Better calibration, persistent workout totals, lap modes, power estimates, or exporting ride summaries would all be natural next steps. For now, it is a very satisfying proof that a tiny board and a tiny screen can make a commercial spin bike feel a bit more personal.

Project Link

The code is on GitHub: Tim-Dawson/IC4-RPI-Bluetooth.