c++ - 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℃。
谁能帮助我解释为什么我在假设为负时得到正的浮点值?
我正在使用的库可以在这里找到
根据用户的建议,我注意到我的问题不在于我的代码,而在于库。代码太长,无法发布,但上面提供了链接。问题似乎在于 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
推荐阅读
- node.js - 如何解决运行 NodeJs 程序时出现的错误
- amazon-web-services - 将数据从一个 AWS 账户中的 S3 存储桶复制到具有 acl 权限的另一个 AWS 账户中的 S3 存储桶
- python-3.x - 使用 pandas 读取 CSV 文件时出现解析器错误
- android - 外部库在发布 apk android 中不起作用
- laravel - 具有静态字段值的 Elasticsearch multi_query
- javascript - 使用 Google 跟踪代码管理器创建自定义 cookie 的最佳方法是什么?
- java - 更新 Map 的 Map 值
- firebase - Firebase 基于角色的访问
- haskell - QuickCheck 中的相关收缩
- git - 文件系统已损坏:表示损坏 格式错误的表示标头