You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32 Micropython读取RuuviTag(数据格式5)如何正确计算温度?

解决RuuviTag数据格式5的温度计算问题

你的问题出在两个关键地方:字节位置取错,以及未处理温度的有符号整数属性,具体修正如下:

1. 正确的字节位置定位

RuuviTag数据格式5的厂商特定数据结构(对应你的27字节payload)为:

  • 字节0: BLE数据类型(0xFF)
  • 字节1-2: Ruuvi厂商ID(0x9904,大端字节序)
  • 字节3: 数据格式版本(0x05)
  • 字节4-5: 温度(16位有符号整数,大端字节序,单位0.01℃)
  • 后续字节: 湿度、气压等其他传感器数据

你当前取的payload[2]和payload[3]是厂商ID的第二个字节和格式版本,并非温度数据,正确的温度字节应为payload[4]和payload[5]。

2. 处理有符号整数

温度是16位有符号整数,当数值大于等于0x8000时,需要转换为负数(补码规则)。

修正后的代码

# 从payload中提取温度字节
temp_high = payload[4]
temp_low = payload[5]

# 组合为16位整数
temp_16bit = (temp_high << 8) | temp_low

# 处理有符号整数
if temp_16bit >= 0x8000:
    temp_16bit = temp_16bit - 0x10000

# 转换为实际温度值
temperature = temp_16bit / 100.0
print(f"Lämpötila: {temperature:.2f} °C")

验证你的payload解析结果

用你的payload FF99040512CB3580C90EFFF8FFFC03E0ABD60ECEF5E7F5E4369B59 计算:

  • 温度字节为0x12和0xCB,组合后为0x12CB = 4811
  • 转换为温度:4811 / 100 = 48.11℃,这与RuuviTag数据格式5的标准解析结果一致。

App显示不一致的可能原因

你提到Ruuvi App显示24.07℃,这可能是以下情况导致:

  • 接收的payload并非当前设备的实时测量数据(比如缓存的旧数据)
  • App连接的是另一台RuuviTag设备
  • 设备固件或App存在临时异常

内容的提问来源于stack exchange,提问作者Jarno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:27:08