arduino - 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 传感器的数据发送格式
信标链接:这里
解决方案
如果您想尝试“逆向工程”制造商数据以搜索温度读数,您需要知道如何为该传感器编码/计算温度。换句话说,如何将来自传感器的原始数据/字节转换为实际值。
我在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;
}
考虑到这一点,我会尝试这样的事情:
尝试制造商数据中的每一对连续字节。
- for
0eee14362c196d66dfac1500
,那是0e
+ee
,然后是ee
+14
,等等。
- for
将这两个字节转换为 uint16。由于我们不知道字节顺序,因此您需要同时尝试 MSB 和 LSB。
- 例如,对于
0e
+ee
,同时尝试0eee
和ee0e
- 例如,对于
使用该 uint16 作为
rawValue
上面的函数来获取温度。
然后您可以查看您获得的任何输出是否实际上类似于温度读数。
推荐阅读
- java - 如何为java创建正则表达式,如sql
- firebase - GoogleStorage 403:xxx-iam.gserviceaccount.com 没有 storage.objects.list 访问 Google Cloud Storage 存储桶的权限
- flash - swf 无法与 API 外部服务器交互
- ios - 创建自己的 pod 时没有这样的模块“Firebase”
- selenium - 如何在xpath中匹配正则表达式
- python - ModuleNotFoundError:没有名为“apps.news”的模块;'apps' 不是一个包
- html - 检查html中的空角度对象
- autohotkey - Shift,Ctrl,Win 拦截我的自动点击热键
- java - 获取 JschException 的原始原因
- java - 已创建客户端时无法使用 Jersey 2.x 修改身份验证凭据