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
相关产品推荐
相关产品推荐

