The Technogym manual indicates that the RF HR receiver outputs a 5V and 30 ms pulse for each heart beat.

A ESP32 with abilities will be the perfect µc. It's a easy job for it to read the incoming HR value and to output a pulse. Since the ESP32 works with 3,3V, we will need a 3,3V to 5v converter (see added file).

Thank's to Andreas Spiess with his Swiss accent, for his videos....

1. BLE Heat Rate sensor

Above the old T31 RF HR sensor and the smart one ....

Here you can find the detail of the data shared by the BLE sensor.

You can clearly find the Heart Rate (UUID 0x0180a) and the battery service (UUID 0x0180f).

The Heart Rate service contains 2 informations : The Heart Rate value itself (N for notification) and the Body sensor location (Read) that we will use to verify if the value is valid or not). By the way, my HR was 89 bpm...


The Battery Level (read) is currently 5A (90%).

2. Connecting a BLE Device

The BLE Heart Rate strap sends a advertising witch is used by the ESP32 to listen server to connected to on start up.

The ESP32 scans for BLE devices but connects only the devices witch able to send HR and battery level data.

If a device with this services have been found, scanning and listening is stopped

// We have found a device, let us now see if it contains the service we are looking for.
    if (advertisedDevice.haveServiceUUID() && advertisedDevice.getServiceUUID().equals(service_HR_UUID)) {
        Serial.println("Found Heart Rate device! ");
        advertisedDevice.getScan()->stop();
        pServerAddress = new BLEAddress(advertisedDevice.getAddress());
        doConnect = true;
    }

 .... and connection procedure is started

I used the ESP32 BLE arduino library by Neil Kolban.

3. We will have a quick look on the BLE services connection

The HR service needed is the UUID : 0x180D 

and the characteristic you need is the UUID : 0x2A37

static BLEUUID service_HR_UUID(BLEUUID((uint16_t)0x180D));
static BLEUUID char_HR_UUID(BLEUUID((uint16_t)0x2A37));

Since this characteristic is send by the transmitter by notification, you have to register to get this notifications.

The second service is the battery level with the UUID : 0x180F

and the UUID of the characteristic is : 0x2A19

static BLEUUID service_BATT_UUID(BLEUUID((uint16_t)0x180F));
static BLEUUID char_BATT_UUID(BLEUUID((uint16_t)0x2A19));

This characteristic cannot be send as notification by the transmitter so I have read it directly (each 60 sec in my case).

Now I can connect the ESP32 on all this services and characteristics

// Obtain a reference to the HR service of the remote BLE server.
    BLERemoteService* pRemote_HR_Service = pClient->getService(service_HR_UUID);

// Obtain a reference to the BATT service of the remote BLE server.
    BLERemoteService* pRemote_BATT_Service = pClient->getService(service_BATT_UUID);

// Obtain a reference to the HR characteristic in the service of the remote BLE server.
    pRemote_HR_Characteristic = pRemote_HR_Service->getCharacteristic(char_HR_UUID);

// Obtain a reference to the BATT characteristic in the service of the remote BLE server.
    pRemote_BATT_Characteristic = pRemote_BATT_Service->getCharacteristic(char_BATT_UUID);

// Set notification
    pRemote_HR_Characteristic->registerForNotify(notifyCallback);
    pRemote_HR_Characteristic->getDescriptor(BLEUUID((uint16_t)0x2902))->writeValue((uint8_t*)notificationOn,...
Read more »