We bought the Volta IT40 incline trainer earlier this year to help with elevation training and training when general life logistics make it hard to get out.
The treadmill is decent - it has 40 steps of incline, in theory to 40% but it’s basic. It has a counter for distance, time and incline level. It doesn’t count elevation gain, it doesn’t have any bluetooth functionality (except to pair your phone to a speaker built in) and I’m not sure if the incline steps are actually relative to percent.
I tend to workout at level 25/30/40 for whole or half kilometers so that I can work out the elevation gain (1km at 40% for example = 400m elevation). Ideally I would be able to vary this more and just count the elevation but if I’m constantly adjusting there’s no way I’ll keep up with the math. It got me thinking…
I wondered if the bluetooth was capable of more than just the speaker … discussed it with my “friend” Claude… did some port scanning using nRF Connect on my phone. No Joy, it’s just a bluetooth speaker.
There’s a couple of connectors in the wiring between the motor and the screen running along the frame. Could I plug something in-between and broadcast the data? and that’s when the discussion became fruitful… but rather than mess with the wiring I would just attach my own device and sensors to get the data and broadcast it.
I placed an order with The Pi Hut:
Double-Sided Foam Tape - 10m
Pack of 100 Cable Ties (180mm x 4.6mm)
USB-C to USB-C Cable - Black
Premium Female/Female Jumper Wires
Hall effect sensor
ESP32-S3 1.47” IPS LCD Display Dev Board (172x320)
It came to £33.70 - aside this I just needed a couple of 8x3mm magnets I got from Amazon (in a pack of 80! if anyone happens to need a few I have spare).
When the parts arrived I downloaded Arduino IDE and started writing sketches. Plugged in the hall sensor, tested as I passed a magnet close and it blinked. I could see the output in the IDE from the accelerometer and magnet passing. This might just work and it was going surprisingly smoothly thanks Where were the hours of frustration as you run into an issue like in the olden days?



Next up was to get under the treadmill. The idea was that I attach the magnet (or a couple stacked if needed) to a roller for the tread and place the hall sensor where it would pick it up.
This was an easy win. The front roller is easily accessible (once you jack up the heavy treadmill), the magnets (I used two stacked) stuck to the roller edge without needing tape or glue and there was space that it wouldn’t catch anywhere. I stuck the hall sensor to the edge and left the ESP dangling to test, whilst plugged into my laptop so I could see the output.



The LEDs on the sensor were extra helpful since I could see them blink as the magnet passed when I rotated the tread by hand.
Next was to figure out how many times the magnet would pass the sensor in one full iteration of the tread. I added masking tape on the tread and the frame with marked line, then reset the board and counted the pulses in one iteration, five and 10. It worked out an average of 40.6 passes.
Then I needed to know the distance/length of each full tread cycle. I managed to wrap a tape measure all the way around the tread pretty tight.






So we had the speed/distance figured out. Next was the incline for this I managed to stick the board upside down in the frame. It doesn’t matter too much what the angle it’s stuck is as it zeros on reset.
After some back and forth in testing and calibration, I updated the code to broadcast as FTMS like a smart trainer would, downloaded the treadmill app to my Suunto race watch and BOOM. Data is being received.
You can see the results in the video above. Speed is fairly accurate already and incline isn’t bad. Incline is jumping about a bit because the ESP isn’t stuck well, it was just some double sided tape on the screen protector and it came looser the more I tested. Of course with it stuck this way I also couldn’t use the screen.
The screen was an initial requirement I had to help me debug and because I wasn’t sure how broadcasting would go but since it was reaching my watch successfully I could have got a board without screen.
Next I told my friend and colleague Jamie about this. He has a 3D printer and offered to print me a case, I got my micrometer out, did some measuring and got Claude to generate the files. I had the case a week later :) - thanks Jamie!
I made a few errors. I measured the board width, not the button width, which stuck out a little further. So I needed to get my hacksaw out. I didn’t think much on the mounting suggestion since I really wasn’t sure how/where I’d attach it anyway.
Some zip ties and some wedging of the board and case in place and it’s fairly solid. At this point I also moved from Claude Chat to Claude Code so I could remove myself from sending the updates to the board. I learnt a little less this way but I was now focused on fixing the casing more than the code.






I’ve run using the board connected to my watch a couple of times and so far it’s working well. I can now vary the incline as I go and my watch is counting the total for me no matter how many adjustments I make. Mission successful.
The incline can vary sometimes and I’m unsure if this is due to the treadmill not rising and lowering to the same points each time or if there is still some movement from the board in the case. So I’d call it a work in progress but a usable work in progress.
The case is something I think I could continue to improve and perhaps might be my excuse to buy a 3d printer in the near future (I have some other ideas!). All in I think I spent about £35 and around 6 hours. Time well spent. A really fun way to build something useful and level up skills.

