微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 C 而不是 235.0 C。我知道这是因为 BLE 标签附带的 android 应用程序显示的温度是 -18 C,我把标签放进去一个设定在 -18 摄氏度的冰箱。

谁能帮助我解释为什么我得到一个正的浮点值,而它本来应该是负的?

我正在使用的库可以在here

根据一位用户的建议,我注意到我的问题不在于我的代码,而在于库。代码太长,无法发布,但上面提供了链接。问题似乎在于 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。