RaceChrono BLE Integration

Stream real-time telemetry to RaceChrono via the DIY BLE protocol

The ApexDuck dashboard supports real-time telemetry streaming to the RaceChrono motorsport data logging app over Bluetooth Low Energy (BLE). The implementation uses the RaceChrono DIY BLE protocol to broadcast 16 vehicle parameters as virtual CAN-Bus PID packets.

When enabled, the dashboard advertises as a BLE peripheral and accepts a single RaceChrono connection. All 16 channels are always streamed — there is no per-channel enable/disable. The only user-facing toggle is global BLE streaming on/off.

Two-Way Communication

The BLE link between ApexDuck and RaceChrono works in both directions, giving you a complete telemetry and timing loop over a single connection.

ApexDuck → RaceChrono

Live engine data is streamed from ApexDuck to RaceChrono, so parameters like RPM, gear, speed, coolant and oil temperatures, boost, AFR, oil pressure and battery voltage can be shown directly on the RaceChrono video overlay — perfect for on-board footage.

RaceChrono → ApexDuck

Timing data is streamed back from RaceChrono to ApexDuck, so lap times and the live delta to your reference lap appear on the ApexDuck display in real time while you drive.

The following data is received from RaceChrono:

Parameter Channel name
Current Lap Time RACECHRONO_LAP_TIME
Previous Lap Time RACECHRONO_PREVIOUS_LAP_TIME
Best Lap Time RACECHRONO_BEST_LAP_TIME
Delta RACECHRONO_DELTA_LAP_TIME
Lap Number RACECHRONO_LAP_NUMBER
Number of satellites RACECHRONO_SATELLITES
GPS Speed [km/h] RACECHRONO_SPEED

Setup Instructions

1. Enable BLE Streaming

Enable BLE streaming using the Configurator website.

2. Connect RaceChrono

Open RaceChrono on your phone/tablet, go to Settings → DIY CAN-Bus devices → Add new device, select RaceChrono DIY BLE as the device type, scan for BLE devices — the dashboard appears as ApexDuck_XXXX (where XXXX is the last 4 hex digits of the device MAC address, displayed on the Device Config Page). Pair and connect.

3. Configure Channels in RaceChrono

For each channel you want to log, add a new "CAN-Bus channel" in RaceChrono with the virtual PID (hex value) and the equation from the channel table below.

Channels

All 16 channels are streamed simultaneously when a client is connected.

Channel Virtual PID Unit RaceChrono Equation
RPM 0x40000000 rpm A + B * 256
GEAR 0x40000001 — if(A > 127, A - 256, A)
SPEED 0x40000002 km/h (A + B * 256) * 0.1 / 3.6
CLT 0x40000003 °C (A + B * 256) * 0.1
IAT 0x40000004 °C (A + B * 256) * 0.1
AFR 0x40000005 λ×14.7 (A + B * 256) * 0.001
LAMBDA 0x40000006 λ (A + B * 256) * 0.0001
OIL_TEMP 0x40000007 °C (A + B * 256) * 0.1
GEARBOX_TEMP 0x40000008 °C (A + B * 256) * 0.1
BOOST 0x40000009 bar if((A + B * 256) > 32767, (A + B * 256) - 65536, A + B * 256) * 0.1
MAP 0x4000000A bar (A + B * 256) * 0.1
TPS 0x4000000B % (A + B * 256) * 0.1
EGT 0x4000000C °C A + B * 256
BATT 0x4000000D V (A + B * 256) * 0.01
OIL_PRESSURE 0x4000000E bar (A + B * 256) * 0.1
FUEL_PRESSURE 0x4000000F bar (A + B * 256) * 0.1

Encoding: All values are little-endian uint16. A is the 1st byte, B is the 2nd byte (after the PID is stripped by RaceChrono). Full uint16 value = A + B × 256.

Units: When using RaceChrono's built-in channel types (e.g., "Speed (km/h)"), the app expects values in base SI units (m/s for speed). The speed equation includes ÷ 3.6 for the km/h → m/s conversion. For temperature channels, RaceChrono accepts °C directly. Use "Custom" channel type if you prefer no unit conversion.

Runtime-Resolved Channels

RPM, GEAR, and SPEED respect the dashboard's runtime configuration — if you configure RPM to come from CAN, the BLE stream uses the CAN RPM value as well.

Data Source Resolution

All remaining channels use EMU data when EMU Serial is the primary data provider. Otherwise, CAN data is used as the fallback source.

Connection & Advertising