首页 > 解决方案 > Beacon NRF52832 从组装好的 SHT30 传感器读取温度/湿度值

问题描述

我有一个 esp32 微控制器,我试图从带有 SHT30 传感器(http://www.mouser.com/ds/2/682/Sensirion_Humidity_Sensors_SHT3x_Datasheet_digital-971521.pdf)的 NRF52832 信标中读取温度/湿度值,但没有BLE 广告中的服务。很长一段时间后,我发现在BLE服务器上每次连接后都会发生变化的“制造商数据”。我怀疑传感器的读取字节是否在“制造商数据”上以及如何提取它。

输出“制造商数据”示例:59000215fda5069300010002d8 0eee14362c196d66dfac1500 -> 这部分更改每个连接

我尝试将此十六进制值转换为大端 uint16 并发现一些有趣的值,但没有正确。

谢谢 :)

编辑: 我放置此数据表是因为显示了 SHT30 如何以这种格式发送数据的方式(第 10 页): 来自 SHT30 传感器的数据发送格式

信标链接:这里

标签: arduinobluetooth-lowenergyibeaconesp32

解决方案


如果您想尝试“逆向工程”制造商数据以搜索温度读数,您需要知道如何为该传感器编码/计算温度。换句话说,如何将来自传感器的原始数据/字节转换为实际值。

我在SHT3x 的代码示例中发现了这一点:

static ft SHT3X_CalcTemperature(u16t rawValue)
{
  // calculate temperature [°C]
  // T = -45 + 175 * rawValue / (2^16-1)
  return 175.0f * (ft)rawValue / 65535.0f - 45.0f;
}

考虑到这一点,我会尝试这样的事情:

  1. 尝试制造商数据中的每一对连续字节。

    • for 0eee14362c196d66dfac1500,那是0e+ ee,然后是ee+ 14,等等。
  2. 将这两个字节转换为 uint16。由于我们不知道字节顺序,因此您需要同时尝试 MSB 和 LSB。

    • 例如,对于0e+ ee,同时尝试0eeeee0e
  3. 使用该 uint16 作为rawValue上面的函数来获取温度。

然后您可以查看您获得的任何输出是否实际上类似于温度读数。


推荐阅读