Wahoo Kickr Bike - External Gear Display

I have not looked at your git yet, but I assume the average power is taken from the time the device is booted?

{ edit - I see how it’s done. }

The 3 second and 10 second avg power on the bottom right are calculating from the trailing x seconds. If you are in 10s mode, and you stop pedaling, you can watch that value decrease for 10 seconds before reaching 0.

The avg power in the fine print on the lower left is the average calculated while under power. It does not include rest periods.

Thank you.
I think the best thing about your version is the graph on the right, and the color changes depending on zone.
Since I don’t have a KICKR BIKE, I have a KICKER SHIFT, I’ll probably mod it around a bit to get rid of the grade and show watts and W/kg all the time. Also my old eyes can’t read the small gears, so I’ll get rid of the graphic and show only the gear number in a larger font like I did in an earlier post.

A great addition is the demo mode!
It has saved me a bunch of time going out to the workshop and back to my computer to verify layout changes.

I made a few modifications.
I made it 4 equal sized boxes, with the power graph on the right narrowed (10 instead of 20).
Upper left is gear, text only. Upper right is watts.
Lower left is avg power, lower right is W/Kg.

I found that the toggle between instant, 3 second and 10 second is not persistent between boots, even though it looks like the code is supposed to write that state to the EEPROM.

As I mentioned earlier, I wanted to make a mount for the display - just wanted something simple and still use the original box. Pretty happy with this super simple solution:


1 Like

that is awesome!
do you have a repo with your stuff you can share?
thanks!

I can put it up on Thingiverse later…

1 Like

Can you share this also? I don’t need the power also and your approach is quite cool
thanks

Hi Dan_Kothlow, I am happy you found my Wahoo Kickr Display Dingus code useful. WRT persistently saving the power mode (instant vs 3s, 10s) and Watts vs W/KG - I purposely only save those when you go thru the config mechanism that sets FTP and weight.

So, if you want to save your power & watts/wkg setting - get them how you like them, then press both buttons at once to go into the weight/ftp config screens. Even if you don’t change your weight/ftp settings, when you exit that mode, all of the settings including power watts/wkg will be saved.

Note that if you are tinkering with your code and update your sketch, when you burn that to your board, you will wipe out all saved settings made on the device itself until you go thru the config screens again.

The reason I made it this way is that I fear I might wear out the flash memory prematurely - it is only guaranteed for 10k writes. I ride pretty much every day, and fiddle with the buttons throughout the ride - I figure in 3 years I could screw up the flash.

But, if you want to save it each time, I added the logic to do that to the code in the checkButtons() routine. I updated git, but leave those commands commented out. Grab the new version, and uncomment them if you would like to save the change each time you toggle.

The relevant section of code shown below:

Another option is to use the spiff library to save/retrieve data - it apparently rotates the locations used to spread the wear and effectively gives you a lot more writes - but for my purposes, the code bloat and complexity didn’t seem worth it.

Sure, I have added my code in a github repository at /cbj42/KickrBikeDisplay

It is still a work in progress, but it works.

I also put the STL-files for the mount in the same repository if anyone wants them…

1 Like

@Jay_Wheeler Thank you for the detailed explanation.
I’ll take a look and see what I can implement.

@cj42 thank you so much!!
When I have time I’m going to base mine on yours and try to map the bike keys to keyboard keys.
There are 2 ways of doing it, via USB or via BTLE using keyboard libraries. Would be awesome to use BTLE but not sure if it’s possible to emulate a keyboard while connected to the bike.

This is what I ended up with.

It still takes multiple restarts of the device to connect for some reason.

I’ve had problems with connecting as well - I am currently tweaking the parameters for the BLE scan to see what is better. You can check out my code, I posted earlier today, to see what I am currently doing, it’s not optimal, but it will restart the scanning and always finds my bike after a few tries at worst.

Another detail I found was, that turning on the bike first, then the display second seems to connect faster.

Thank you, I’ll look at your code to see if I can incorporate it.
The small LilyGo that shows only gears connects right away every time, so it must be the additional items it’s looking for that causes it to not realize it is connected.
As I mentioned before I have the SHIFT, and remarked out the tilt parameters, so in theory it should not be waiting for that parameter.

If you have code that works better for the other hardware, try and check out how the BLE-scan is set up on that version and try to port that as well…

I did have some time so I’ve added the option to change orientation so we can have the usb on the left or right sides: just press both buttons on the LILYGO.

I’ve also added the Bluetooth Keyboard library so we can map the Bike Buttons to keyboard buttons, just need to pair the device as a normal bluetooth keyboard:
github . com /joaoasilva/KickrBikeDisplay

Next step is to study a way to enter deep sleep when not in use, anyone have any ideas?

2 Likes

I’ve updated the code to put the device to deep sleep when not in use.
If no buttons pressed or no gradient changes in 30 minutes it will go into deep sleep, just press the reset button to start it again.

I just posted an update to my Wahoo Kickr Display Dingus, based on accumulated fixes and enhancements since the end of December.

Newest code here:

htt*s://github.com/ejwheeler3/WahooKickrDisplayDingus

Changes include:

  • Added Average and Max indicators to the power chart. Power chart now starts out scaled from 0 to 100 FTP, but rescales itself as your max exceeds 100% FTP.
  • Reorganized layout - power chart is now in the middle, separating grade / gears on the left from power details on the right.
  • Changed the power zone ranges and colors to match Zwift
  • Rouvy power zones and colors are also in there if your prefer - just change which block is commented out.
  • Added % FTP as an alternative to displaying power in Watts or Watts/KG.
  • Added a “coasting” mode - if the dingus picks up 0 or no power for more than 4 seconds or so, it switches to display max / avg / seconds under power in larger fonts. When you resume pedaling it reverts to normal display.
  • All power displays (power chart, power read out, max and averages) now fully respond to your selection of instant, 3 second or 10 second mode as well as to the toggle between watts / watts/kg and % FTP.

Note that averages are only calculated for full periods on 3 seconds and 10 seconds - in other words, unless all three (or 10) trailing seconds are non-zero, the corresponding average is not updated.

Fuzzy photos of the normal and coasting screens below.

Depending on the signal strength I get BLE notifications every 100-400ms, but the bike itself changes values at the rate of 1hz. Therefore, value changes are not within the 1sec period each time. I would advise to take more measurements within the second to avoid loosing a value change and to smooth the average. I calculate the moving average with a circular buffer where I change the buffer size dynamically to switch between 3s and 10s.