Make a smart treadmill for Zwift running with $5

I am an avid cyclist and runner on the zwift platform however with my unreliable footpod it is time i made my treadmill smarter than my foot

Public Chat
Similar projects worth following
This project had three objectives:
1. determine the speed of my treadmill
2. Mimic a footpod and send my speed to zwift using BLE
3. Run on zwift with accurate speeds

In line with recommendations in comments i purchased a reed switch ( $3 AUD) from ebay and replaced the LM393 sensor with it up against existing treadmill magnet. other than some denouncing required it worked a treat.

In this project a used an LM393 speed sensor and an ESP32 to determine speed and send results to zwift using BLE and the Zwift app.

Using basic BLE GATT i fumbled my way through the running speed and cadence service and measurement characteristic to send the speed to ZWIFT.

All worked a treat but the speed sensor Measurement (ie the car clamped to the treadmill) was unsustainable.
I have also looked at using the LM393 to measure the rotation of the treadmill motor using a lip of ducktape. Also ungraceful.

Enjoy this project?



marpelto wrote 04/01/2022 at 09:52 point

Garmin Fenix 5X connects to the device but the speed shows 0.0.

It does not show the speed at all. Any idea?

  Are you sure? yes | no

realemmasmith wrote 01/22/2022 at 15:27 point

Your idea sounds great and it would be really good if you'll be able to pull it of. Are you looking for something like this?

  Are you sure? yes | no

etehis267 wrote 10/08/2021 at 17:43 point

I like your idea. Can you make similar program for other fitness products? I have seen similar work of treadmill on this blog, you can see here

  Are you sure? yes | no

Rob wrote 03/16/2021 at 18:46 point

Did you look at the CSAFE protocol? Supposedly it's been around for a while and Wahoo are using it for their Treadmill Zwift bridge:

  Are you sure? yes | no

peterw1966 wrote 02/22/2021 at 18:39 point

Hi, great project well done.  I have a question about the following bit of code -

(unsigned byte)inst_speed, (unsigned byte)(inst_speed >> 8),
(unsigned byte)inst_cadence,
(unsigned byte)inst_stride_length, (unsigned byte)(inst_stride_length >> 8),
(unsigned byte)total_distance, (unsigned byte)(total_distance >> 8), (unsigned byte)(total_distance >> 16), (unsigned byte)(total_distance >> 24)};byte charArray[10] = {

Why do you put the speed in Byte 1 and 2, the stride length in 4 and 5 and the total distance in 6, 7, 8 and 9.  Reading the BLE spec, I can't see why you need to put each value in more than once.  Clearly I am missing something as I have seen the same thing done elsewhere.  Can you help or point me at some documentation that explains it?

Many thanks


  Are you sure? yes | no

Mario wrote 01/19/2021 at 13:12 point

Nice project!

Were you also able to connect with a smartwatch / garmin?

Connecting to swift via PC works . With the garmin watch (fenix 5x) I am able to select / add the "footpod", but when I try to connect to it, it always fails.... :-(

  Are you sure? yes | no

Michael Smith wrote 04/12/2020 at 12:15 point

Would you be keen on sharing your code for the BLE interface to Zwift? I'm trying to make a speedometer with arduino to monitor my indoor bike trainer.

  Are you sure? yes | no

Michael wrote 04/20/2020 at 23:54 point


Is a link to a manual version (ie i set my speed with buttons not sensor). However the sending and setup of BLE should be the same. FYI i changed the bytearray code for this running sensor from a cycling speed cadence example so there are likely already examples set up for Cycling Speed Cadence sensors

  Are you sure? yes | no

Kevin wrote 02/03/2020 at 18:44 point

I second the idea of a magnet and reed switch.  My very old salvaged treadmill uses this setup to measure speed.  The magnet is in the flywheel connected to the tread rollers.  Alternately you could use some sort of led and photoresistor with your duct tape flag to get rpm.  

I'm interested in how you figured out the zwift protocol because I'd like to make my own zwift sensor to connect my bike rollers to the zwift bike app.

  Are you sure? yes | no

Michael wrote 04/20/2020 at 22:44 point

Hi Kevin, 

I found that the Zwift protocol just search's for the BLE outputs using existign GATT profiles. Therefore if you create a BLE profile/service for either the 

CSCP - Cycling Speed and Cadence OR RSCP Running Speed and Cadence then zwift will recognize it. I use an iphone and the zwift companion app to receive it.

  Are you sure? yes | no

Pabluski wrote 09/10/2019 at 17:09 point

Seems that the treadmill probably has some kind of speed sensor already ... can you tap into it?

What about hiding the wheel inside the front cover?

What about painting lines on the floor and using a ir ?

What about magnets glued to the tread and a reed switch?

  Are you sure? yes | no

Dan Maloney wrote 09/10/2019 at 16:02 point

Interesting. But aren't you worried about drifting over to the side of the belt and stepping on it? When I ran on the treadmill I found myself wandering all over the place - sometimes even off the back, of course.

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates