This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Higher precision in BLE_UUID_HEALTH_THERMOMETER_SERVICE

Hi,

I am trying to include temperature (read from DS18B20) in advertisement data using BLE_UUID_HEALTH_THERMOMETER_SERVICE. So far it works fine, but my temperature is multiplied by 10 (234 instead of 23.4). I use following code (inspired by examples I found), on nrf51822:

  uint32_t temperature_data = measure_temp_ds18b20();

  service_data[1].service_uuid = BLE_UUID_HEALTH_THERMOMETER_SERVICE;
  service_data[1].data.size    = sizeof(temperature_data);
  service_data[1].data.p_data  = (uint8_t *) &temperature_data;

Temperature is shown correctly (e.g. in nRF Temp app on android) but of course as 234, instead of 23.4. Is it possible to send this value as fractional?

greetings, Bartek

Parents
  • If you're using the health thermometer service then the data format is defined by the BT SIG, so if it says you send a 10 x integer, you have to send an scaled integer. In general you don't want to send floats because you don't want to deal with them on the BTLE chip which (unless you're nRF52) doesn't have built-in floating point and floats require more care to ensure what you send out (probably IEEE value, little endian) is received correctly the other end.

    You can add extra descriptors to a characteristic to say what format it's in so that a generic device can read it, that includes scaled integers, where you can define the power of 10 scaling.

    If this is your own service, just define that you'll send a x10 or x100 or x1000 integer and then process it appropriately in the app the other end.

Reply
  • If you're using the health thermometer service then the data format is defined by the BT SIG, so if it says you send a 10 x integer, you have to send an scaled integer. In general you don't want to send floats because you don't want to deal with them on the BTLE chip which (unless you're nRF52) doesn't have built-in floating point and floats require more care to ensure what you send out (probably IEEE value, little endian) is received correctly the other end.

    You can add extra descriptors to a characteristic to say what format it's in so that a generic device can read it, that includes scaled integers, where you can define the power of 10 scaling.

    If this is your own service, just define that you'll send a x10 or x100 or x1000 integer and then process it appropriately in the app the other end.

Children
No Data
Related