BLE api将负温度转换为正温度



我想使用ESP32芯片从BLE信标中提取温度。我使用了以下代码来做到这一点:

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) {
std::string strServiceData = advertisedDevice.getServiceData();
uint8_t cServiceData[100];
strServiceData.copy((char *)cServiceData, strServiceData.length(), 0);
if (advertisedDevice.getServiceDataUUID().equals(BLEUUID(beconUUID))==true) // found Eddystone UUID
{  
Serial.printf("Advertised Device: %s n", advertisedDevice.toString().c_str());advertisedDevice.getServiceDataUUID().bitSize(), advertisedDevice.getServiceDataUUID().toString().c_str(),strServiceData.length());
if (cServiceData[0]==0x20) 
{
BLEEddystoneTLM oBeacon = BLEEddystoneTLM();
oBeacon.setData(strServiceData);
Serial.printf("Eddystone Frame Type (Unencrypted Eddystone-TLM) n");
Serial.printf(oBeacon.toString().c_str());
} 
else 
{

}
} 
}
};
void setup() {
Serial.begin(115200);
BLEDevice::init("");
pBLEScan = BLEDevice::getScan(); //create new scan
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
}
void loop() {
BLEScanResults foundDevices = pBLEScan->start(scanTime);
delay(5000);
}

对于正值,温度输出很好,但当温度变为负值时,我仍然会得到一个不寻常的正数。

串行监视器输出:

Advertised Device: Name: , Address: ac:23:3f:85:2e:f3, serviceUUID: 0000feaa-0000-1000-8000-00805f9b34fb 
Eddystone Frame Type (Unencrypted Eddystone-TLM) 
Version 
art_cpu0_default mV
Temperature 241.0 °C
Adv. Count 3782
Time 0000.00:30:34

从上面的调试消息来看,这个特定的信标应该是-18摄氏度,而不是235.0摄氏度。我知道这一点,因为带有BLE标签的android应用程序显示的温度为-18摄氏度

有人能帮我解释一下为什么我得到了一个正的浮动值,而它被认为是负的吗?

我正在使用的库可以在这里找到

根据一位用户的建议,我注意到我的问题不是我的代码,而是库。代码太长,无法发布,但是上面提供了链接。问题似乎是m_eddystoneData.temp的声明和temp的无符号值强制转换。因此,输出将始终为正。

void BLEEddystoneTLM::setTemp(float temp) {
m_eddystoneData.temp = (uint16_t)temp;
} // setTemp

我查看了您链接的库,它的温度如下:

void BLEEddystoneTLM::setTemp(float temp) {
m_eddystoneData.temp = (uint16_t)temp;
} // setTemp

BLEEddystoneTLM::BLEEddystoneTLM() {
beaconUUID = 0xFEAA;
m_eddystoneData.frameType = EDDYSTONE_TLM_FRAME_TYPE;
m_eddystoneData.version = 0;
m_eddystoneData.volt = 3300; // 3300mV = 3.3V
m_eddystoneData.temp = (uint16_t) ((float) 23.00);
m_eddystoneData.advCount = 0;
m_eddystoneData.tmil = 0;
} // BLEEddystoneTLM

两者似乎都将温度定义为16位的无符号短值。我认为他们应该被签署,因此int16_t

最新更新