【问题标题】:Beacon NRF52832 read temp/humidity value from a SHT30 sensor assembledBeacon NRF52832 从组装好的 SHT30 传感器读取温度/湿度值
【发布时间】:2019-08-01 17:41:58
【问题描述】:

我有一个 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 页): Data send format from the SHT30 sensor

信标链接:here

【问题讨论】:

  • 随附的数据表无助于找到答案。 BLE 制造商广告的格式取决于 ESP32 内部的固件。使用适当的固件,可以将温度数据放入您看到的广告中。如果没有适当的固件,它可能根本就没有。找出是哪种情况意味着(1)获取有关固件的文档,或(2)尝试自己对其进行逆向工程。由于只有一个广告字节数据点,本论坛中的其他任何人都不太可能有足够的信息对其进行逆向工程。
  • 我不知道我是否清楚。温度/湿度的服务应该在信标上,而不是在 esp32 上。我连接信标并从他那里接收这个“制造商数据”。这个值不应该是恒定的吗?除非我更改信标上的一些数据,例如主要和次要值。当我转换一些最终字节并在数据表上的公式中使用时,我得到了有趣的值。
  • 我在安卓手机上也连接了beacon,beacon没有宣传温度服务。我认为数据在“制造商数据”中。
  • 对不起,我误读了你的问题——我现在明白必须公布温度或暴露 GATT 服务以获取温度的固件在 NRF52832 内部,而不是 ESP32 内部。但我的评论的其余部分仍然有效。您需要有关自定义 NRF52832 固件如何执行此操作的文档。它是否公开 GATT 服务?它会在制造商数据中发送吗?为什么你认为两者都可能是真的?你在什么地方读过这个吗?如果有,在哪里?
  • 感谢您的合作@davidgyoung。我试图联系卖家,但没有回复我。所以我无权访问我的信标的特定文档。没有温度服务,只有少数其他服务,如通用访问 (0x1800)、当前时间服务 (0x1805) 等,我认为这是 BLE 信标的默认设置。阅读 SHT30 数据表并观察“制造商数据”的不同字节,我想这可能是答案。如果您对 BLE 库有所了解,我可以解释代码以便更好地理解。

标签: arduino bluetooth-lowenergy ibeacon esp32


【解决方案1】:

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

我在code samples for 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. 尝试制造商数据中的每一对连续字节。

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

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

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

【讨论】:

  • 这正是我试图做的。经过几天的尝试,我发现了这个“制造商数据”的组成:manufacturerId |子类型和长度 |接近UUID |专业 |未成年人 | signalPower 1B 3B 16B 2B 2B 1B 次要和主要值,转换为大端 uint16,显示了一个有趣的结果。我没有其他方法来计算温度和湿度,但是当我将这个 uint16 值转换并放入我的代码(与您发布的相同)时,结果看起来就像天气预报。
  • ?,不确定您是否还能做其他事情……除了尝试在该信标上找到编程引脚并刷新您自己的固件(;
  • 我暂时没有这方面的技能,所以我认为我的问题已经部分解决了。谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
相关资源
最近更新 更多