如何使用Python读取MLX90393的温度值及温度原始数据转换问题
解决MLX90393温度原始数据转换错误的问题
嘿,我来帮你搞定这个温度转换的坑!你现在磁场数据正常,唯独温度算出来离谱,核心问题出在字节顺序搞反了,再加上没套用正确的温度转换公式,咱们一步步来修正:
1. 先搞懂MLX90393的数据返回顺序
根据手册,当你发送0x4F命令读取温度+XYZ磁场时,返回的9字节数据结构是:
- 字节0:状态字节
- 字节1:温度低字节(T_LSB)
- 字节2:温度高字节(T_MSB)
- 字节3:X磁场低字节
- 字节4:X磁场高字节
- ...(Y、Z磁场以此类推)
你之前的代码把温度的高低字节搞反了,用data[1] * 256 + data[2]计算,相当于把低字节当高字节来用,自然得到完全错误的原始值。
2. 正确的温度转换公式
MLX90393的温度原始值是14位补码,每1个LSB对应0.0625℃,转换为实际摄氏温度的公式是:
实际温度(℃) = (原始温度值 / 16) - 273.15
3. 修正后的代码
把字节顺序调换,再套用公式,修改后的代码如下:
data = bus.read_i2c_block_data(mlx90393_address, 0x4F, 9) # 修正温度读取与转换 temp_raw = data[2] * 256 + data[1] # 高字节在前,低字节在后 if temp_raw > 32767 : temp_raw -= 65536 # 转换为有符号整数 temp_celsius = (temp_raw / 16) - 273.15 print(f"当前温度: {temp_celsius:.2f} °C") # 磁场部分你的代码是对的,保留即可 xMag = data[4] * 256 + data[3] if xMag > 32767 : xMag -= 65536 print(f"X轴磁场: {xMag}") yMag = data[6] * 256 + data[5] if yMag > 32767 : yMag -= 65536 print(f"Y轴磁场: {yMag}") zMag = data[8] * 256 + data[7] if zMag > 32767 : zMag -= 65536 print(f"Z轴磁场: {zMag}")
验证一下
比如环境温度是22℃时,对应的原始值大概是(22 + 273.15) * 16 ≈ 4722(十六进制0x1282),此时data[1]是0x82,data[2]是0x12,调换后计算得到的温度是4722/16 -273.15 ≈21.98℃,和实际环境温度一致。
内容的提问来源于stack exchange,提问作者Marco Bobinger
相关产品推荐
相关产品推荐

