Dual screen remote display with ESP32

I finally finished this project of an external display for racechrono using two 3.5 inch screens and an ESP32.
I find the interface of racechrono hard to read at a glance when driving, even with a customized layout, so I made my own instead of complaining.

It turned out better than I expected and being able to test using asseto corsa is the one thing that made this possible.

There is one problem I encountered with the speed reported by the monitoring api.
I have to apply a ~3.6 multiplier to the values returned for both speed and delta speed for them to match my actual speed.
For the equation "channel(device(gps), speed)*10", I need to apply a 0.36 multiplier and for "channel(device(gps), delta_speed)*100" I need to apply a 0.036 multiplier. The exact value seems to be around 3.62 to 3.65, hard to tell with all the rounding that might be going on.
This is true both when testing with asseto corsa and when testing with my custom gps. I tried to reset the app thinking it might be a setting I'm missing but that doesn't seem to be the case. Note that the speed displayed in racechrono is correct, just the value returned by the monitoring api is wrong.


  • The multiplier is exactly 3.6. RaceChrono's internal units are meters per second.
  • A_PA_P
    edited June 2023
    That would explain it. It would be nice if that info was somewhere in the docs.
    Otherwise, great work on the api, it works surprisingly well.
  • edited July 2023
    hi, it looks very useful.Congrats, would like to share wit us the procedure step by step for uploading the code etc.Thank you!
  • The project uses PlatformIO, once you have that setup it should handle all the dependencies, building and uploading the code. You may need to modify the platformio.ini file depending on the board you're using. You also have to upload the filesystem image from PlatformIO for the pictures to work.

  • @aol_of_RaceChrono The speed delta has stopped working on my device. This could of course be due to a multitude of reasons and I will only be able to debug it for a short time tonight in between track days before I can test it again tomorrow.

    I suspect it is related to the fixes that were made in the versions distributed last month as it worked last time I tested it in early July.

    I'm curious what exactly was changed that could have caused it to stop, in the interest of speeding up the debugging process. Either the device isn't receiving the value or the formatting of the value could be different. Hard to say without looking at logs of course but any help would be appreciated.


  • So it looks like this equation : "channel(device(gps), delta_speed)" does not work anymore.
    All the equations i'm using are successfully accepted/registered by racechrono through
    bluetooth, including the delta speed one, but it's only this one that never receives a value anymore. Everything else works as it did before.

    Here are all the equations I'm using :
    channel(device(lap), lap_number)
    channel(device(lap), lap_time)
    channel(device(lap), previous_lap_time)
    channel(device(lap), best_lap_number)
    channel(device(lap), best_lap_time)
    channel(device(gps), delta_speed)
    channel(device(lap), delta_lap_time)
    channel(device(lap), comparison_lap_time)
    channel(device(gps), device_update_rate)
    channel(device(gps), satellites)

    I'm on 8.0.8, IOS.
  • @A_P Yep that changed in v8.0. The calculated channels no longer exist at the GPS device. Try:

    channel(device(calc), delta_speed)

    Same applies for the other calculated channels:
  • Thanks for letting me know. I looked through the change logs but didn't find anything.

  • Sorry for not providing better documentation. Hopefully that will change soon.
  • Hi @A_P, great work and thanks for sharing.. I could managed to make it work connecting only one screen. when selecting screen 2 ( using the right CS pin number) it works fine but for screen 1 ( for speed delta) it stays black after the connection is made. I used the latest version with 8.0.8. Any idea what it could ? I even drove couple of laps with AC to see if something will pop up. thanks
  • @A_P it seems that the delta time is not taken properly. The predictive lap time stays same in this case. I have used same code, not sure what i am doing wrong.
    /* 6 */ {true, "Time Delta", "channel(device(lap), delta_lap_time)*1000", 0.001, false, false},
Sign In or Register to comment.