资讯动态

MLX90614红外测温传感器从入门到落地:接线、I2C与校准全攻略

发布时间:2026/9/2 16:22:36 来源:尧图企业网站定制
简介这套基于STM32的红外无接触测温工程代码面向嵌入式开发者及温度监测场景已实测通过。工程通过I2C接口与mlx90614传感器通信时钟线连接PB6、数据线连接PB7读取到的温度数据经串口1输出方便用户直接观察或对接上位机。方案适用于体温快速筛查、工业非接触测温、智能家居环境监测等常见场合兼顾安全性与便利性。压缩包共110个文件以C源码.c和头文件.h为主要代码主体同时包含Keil工程配置、链接脚本及编译生成的中间文件打开工程即可重新编译和烧录包体约992KB文件归类清晰。已有1076人学习下载说明该资源在同类项目中具备较高热度与参考价值。使用本工程可快速掌握mlx90614的驱动控制、STM32外设初始化、I2C时序实现以及串口发送流程可直接移植到自身项目也可作为学习红外测温传感器开发的入门样例。 很多人手里应该都存过几份这样的压缩包从论坛、工具群或者前辈那儿拷来的名字写着xxx代码-可用xxx测试通过解压之后却只有不多几个文件。我前段时间整理移动硬盘正好翻到一个名为mlx90614红外无接触测温测试通过.rar的老包点开一看里面就三样东西一个 Arduino 工程、数据手册的寄存器截图、还有一个写着PEC 校验可以不用的说明文档。这个包勾起了我不少回忆——那时候我刚做测温项目就是靠类似这么一套东西起步的代码确实能跑串口也能打印温度但离真正能交付、能稳定用的测温设备还差着十万八千里。这篇就借这个测试通过的标题把 MLX90614 从接线、读寄存器、写代码到校准和落地的完整链路捋一遍也把我踩过的一些坑放到台面上讲讲。1. 为什么能打印温度不等于项目能用先想清楚场景再动手文件的标题说测试通过实际指的是串口能稳定输出温度值仅此而已。很多人拿到这种包就开始往产品上套结果往往会在测量场景上栽跟头。MLX90614 是 Melexis 推出的一颗红外热电堆温度传感器它的核心原理是被动接收物体表面发出的红外辐射再通过内部数字信号处理输出温度。因为不需要接触被测物体它天然适合三类场景运动中的物体、不允许交叉污染的位置、以及人够不到的高温区域。比如传送带上的电子元器件表面测温、配电柜里开关触点的发热状态检测、食品包装表面的快速温度筛查这些都是它很擅长的事。但如果你打算直接拿它测人体额温或者做医疗级体温计那就要特别小心。人体额头温度也就是 3637°C 这个区间环境温度变化 10°C传感器自身的热漂移、外壳热传导、周围热源的红外辐射都会让显示数值偏出可接受范围。我当初在 D6T、AMG8833 和它之间犹豫过一阵最终仍然选了 MLX90614不是因为它最准而是因为在单点非接触测温这个细分场景里它性价比最好、资料最全、封装兼容性也最好。1.1 那个压缩包里缺的最关键一份文档解压之后没有 README没有原理图只有三样东西一个能跑通的 Arduino 例程、一页 RAM 寄存器截图、一句PEC 校验可以不用的说明。这三样东西刚好对应把它跑起来的最小知识集合但也正好是三处容易让后来人踩坑的源头。Arduino 例程用 Wire 库写几乎上电就能出数于是很多人误以为随便怎么接都行忽略了上拉电阻和电平匹配寄存器截图告诉你要读 0x07 这个地址但没告诉你 SMBus 时序和普通 I2C 的细微差别那句PEC 可以不用虽然省了事却也意味着在电磁环境复杂的场合偶尔会读到明显跳变的坏值。如果这个包里能再加一份测温距离和视场角影响的笔记价值会高得多。MLX90614 的标配传感器的视场角大约 90°这意味着被测目标必须完整填满传感器的视场读数才代表目标本身的温度否则读到的就是目标与背景的加权平均值。后来我遇到的大量测不准案例十有八九根源都出在这。1.2 什么场景适合它什么场景真别硬用我给你划一条简单的判断线。适合用的场景是目标距离近、姿态固定、环境温度相对稳定或者目标温度明显偏离室温比如 50°C 以上再或者你允许用黑体炉或接触式温度计做过一次性标定。不适合用的场景也很明确高速运动的目标、极低发射率的光滑金属表面、要求 0.1°C 级精度的人体医学测温、以及测量距离超过 1 米的场合。光滑金属表面测出来的温度基本是环境反射温度完全不靠谱。先搞清楚被测物体的发射率、测量距离、环境温度范围这三件事再往下看接线和代码你才能真正明白测试通过离项目可用差在哪。2. 硬件接线与 I2C 通信先搞清楚这几根线再写代码我自己调试时用的是一个带稳压和电平转换的模块板四根引脚VDD、VSS地、SCL、SDA部分模块还会引出一个 SMB 引脚用于 SMBus 报警日常测温用不到。MLX90614 出厂前已经完成了校准上位机只要通过 I2C 总线的读操作去拿内部 RAM 里的温度数据就行不需要你写任何校准参数这一点比模拟输出的热电堆方案省心太多。2.1 引脚确认、供电范围与上拉电阻的坑MLX90614 数据手册标称供电范围是 2.6V 到 3.6V直接给 5V 会损坏传感器。不过市面上大多数模块板都做了板载稳压所以接 5V 也能正常工作。我这次调试用的是 3.3V 供电同时把 SCL/SDA 也接到 3.3V 电平的单片机上省掉了电平转换的麻烦。如果你拿到的是裸片或者自己画 PCB供电部分一定要按 3.3V 设计。另外一个非常容易踩的坑是上拉电阻。传感器的 SCL 和 SDA 是开漏输出必须外部上拉。开发板上一般已经贴好了 4.7kΩ 或者 10kΩ 的电阻但自己画板子时一旦忘记画I2C 通信就会时好时坏。最典型的表现是第一次读温度正常第二次返回 0xFFFF。这通常不是传感器坏了而是总线缺少高电平驱动能力数据线被拉低之后回不来。2.2 从 SMBus 到 I2C时序、地址冲突和双传感器方案MLX90614 原生支持 SMBus 协议SMBus 与 I2C 在字节级读写上兼容但时序参数有差异。绝大多数 MCU 的硬件 I2C 外设能正常通信软件模拟 I2C 的库也能跑只要总线频率别设太高比如别超过 100kHz一般都能稳定工作。我习惯把 I2C 时钟配置为 100kHz读取间隔 100ms 以上简单粗暴但足够稳定。地址冲突是另一个高频问题。默认 7 位地址是 0x5A换算成 8 位写地址就是 0xB4、读地址 0xB5。这个地址出厂就固定了同一根 I2C 总线上默认只能挂一个 MLX90614。网上很多人想接两个传感器同时测两个点结果却发现两个模块都不能正常工作原因就是地址冲突。解决方式有两个要么用 I2C 多路开关要么先通过 SMBus 协议改写其中一个传感器的地址再并联到总线上。3. 核心代码拆解从 I2C 读二进制到输出温度温度数据藏在传感器的 RAM 里具体来说0x06 地址保存环境温度 Ta0x07 地址保存物体温度 Tobj。每个寄存器读取后会返回三个字节低八位、高八位、PEC 校验字节。温度换算公式也很简单把 16 位数据处理成有符号十进制数后乘以 0.02°C/LSB再减去绝对零度的偏移量 273.15就得到了摄氏温度。3.1 一个可以直接用的 Arduino 读取例程#include Wire.h #define MLX90614_ADDR 0x5A float readMLX(uint8_t reg) { Wire.beginTransmission(MLX90614_ADDR); Wire.write(reg); Wire.endTransmission(false); Wire.requestFrom(MLX90614_ADDR, 3); uint16_t raw Wire.read() | (Wire.read() 8); // 第三个字节是 PEC演示代码先不校验 return raw * 0.02 - 273.15; } void setup() { Serial.begin(115200); Wire.begin(); } void loop() { float ta readMLX(0x06); float tobj readMLX(0x07); Serial.print(Ta); Serial.print(ta, 2); Serial.print( Tobj); Serial.println(tobj, 2); delay(500); }这段代码在 Arduino Uno 上编译上传就能用。注意 requestFrom 请求的是 3 个字节其中第三个 PEC 字节即使不校验也要读出来清掉否则会影响下一次传输的总线状态。endTransmission(false) 表示发送寄存器地址时不要发停止位这样后面才能用重复起始条件直接读数据。很多移植失败的例程就是在这里多发了停止位导致后续读取直接超时。3.2 STM32 HAL 版本的移植要点和异常值处理STM32 上用 HAL 库实现更简单可以直接用 HAL_I2C_Mem_Read 一步完成发地址读数据uint8_t buf[3]; uint16_t raw; float tobj; HAL_I2C_Mem_Read(hi2c1, 0x5A 1, 0x07, I2C_MEMADD_SIZE_8BIT, buf, 3, 100); raw buf[0] | (buf[1] 8); tobj raw * 0.02f - 273.15f;再把 0x06 的环境温度读取也做一遍加上错误判断一个稳定的读取函数就出来了。HAL 方式比手写 SMBus 稳定得多但还是要强调buf 长度必须与传感器实际返回字节数一致。传感器每次返回的就是 3 字节你只读 2 个总线上会残留数据下一次通信就会乱掉。如果你不是做固定夹具而是手持设备传感器会偶尔出现个别跳变值典型表现是温度瞬间跳到 -40°C 或者 300°C 以上。原因通常是电源毛刺、总线干扰或者目标物瞬间移出视场。最简单有效的处理方式是中值滤波连续读 5 次排序后取中间值。对温度变化本来就比较缓慢的物体中值滤波比滑动平均更好用它可以干净地丢掉毛刺而滑动平均还会把毛刺算进平均值里。4. 测试通过不等于测准了一组实测数据带来的教训串口能打印数值只是第一步真正决定项目质量的是数值准不准。我在调试时把传感器固定在一个支架上对准一个带热电偶的恒温加热源从 30°C 到 80°C 分档做了记录。实验条件为传感器距离目标 5cm目标完全填满视场。4.1 从 30°C 到 80°C 的实测偏差记录参考温度°CMLX90614 读数°C偏差°C30.230.60.440.541.00.550.150.80.760.361.20.970.071.31.380.281.91.7从这张表可以明显看出一个规律目标温度越高正偏差越大。这个偏差很大程度来自传感器外壳、电路板自身温度和环境背景红外辐射的叠加。对 70°C 以下的目标出厂默认配置能稳定做到 ±1°C 以内对更高温度的目标必须做软件校正把增益和偏移系数算出来再用。4.2 距离、视场角和发射率三个最常被忽略的参数视场角的影响前面提过目标物不能填满视场时读数就是目标与背景的加权平均值。同一个发热源测量距离从 5cm 变成 15cm读数差好几度是很正常的。实际项目里要么用固定支架把距离锁死要么加一个瞄准筒限制传感器的实际视场绝不能指望用户每次都能对准。发射率同样关键。MLX90614 出厂默认的发射率配置接近黑体标定值但真实物体的发射率几乎都小于 1。人体皮肤约 0.98普通电路板表面约 0.9抛光铝板只有 0.05 左右。如果你要测的是抛光金属表面读出来的温度很大程度是环境温度的反射。处理方法是先给被测物喷涂高发射率涂层或者贴一层黑色哑光胶带。这个细节在项目评审的时候特别容易被忽略。4.3 一个实操有效的两点校准法假设传感器读数 r 和真实温度 t 之间近似线性关系 t a × r b那么用两个已知温度点做标定就能求出 a 和 b。我实测下来这比反复调发射率更直接、更省事。具体做法把目标物分别稳定在 35°C 和 55°C记录传感器的对应读数用这两组数据解出系数然后在代码输出温度时统一套用。校准后还需要再用第三个温度点做验证确认线性假设在这个区间成立。需要特别注意的是标定点一定要覆盖实际使用的工作范围。你要是拿 35°C 和 55°C 标定完回头去测 200°C 的物体那偏差会大得离谱。5. 从工程样机到落地外壳、工艺和功耗里的那些暗坑项目到这一步测试通过确实已经达成。但如果你有量产打算或者要让它在真实环境里连续运行下面几个问题值得花时间处理。5.1 外壳开窗与红外窗口材料选择MLX90614 接收的红外辐射波段通常在中远红外范围这类辐射穿过普通 ABS 塑料外壳时会被严重衰减。如果把传感器直接塞进一个厚塑料壳里读到的很可能是外壳材料本身的温度而不是目标温度。正确做法是在传感器正前方开一个通孔或者留一个光学窗口。窗口材料必须能透过 814μm 波段常见可选高密度聚乙烯HDPE薄膜或锗玻璃普通玻璃和亚克力会挡住大部分红外辐射导致读数完全失真。我最早做样机时图省事直接用透明亚克力做了个盖板结果把 40°C 的目标测成了 24°C当时一度以为传感器坏了。后来换上 HDPE 薄膜窗口才恢复正常。另外任何窗口材料都会对读数造成 12°C 的衰减量大的话需要在软件里做固定补偿。5.2 环境温度突变、上电漂移与低功耗设计MLX90614 在工作原理上必须有环境温度参考。传感器内部的环境温度传感器会持续测量自身温度用来修正目标温度的计算。当环境温度快速变化比如从空调房一下拿到烈日下传感器外壳温度还没稳定输出读数就会在一两分钟内明显漂移。量产产品常用的办法是让传感器外壳与空气有更大的热接触面积或者把这种漂移通过系统级标定吸收掉。上电瞬间的读数也不能信。传感器内部信号链路需要一个稳定过程建议至少等 1 秒再开始取数并且直接丢弃第一次读数后续再做滤波。很多时候现场报一上电就显示 -273°C其实是正常的待机输出等两三秒就自行恢复了排查故障时先别慌加个延时再看。如果设备用电池供电你会发现 MLX90614 的空闲电流本身很低真正耗电的是 MCU 持续轮询。我一般把它放在掉电模式用定时器或者外部按键唤醒后一次性读三五个值再进睡眠平均电流能压到 1mA 以下。对连续监控的场景每 200ms 读一次就足够了再高的刷新率意义不大热电堆的响应时间本来就在百毫秒量级。最后再分享一点我的真实体会。这个测试通过的 rar 包虽然内容简陋但确实帮我走完了一个完整的开发闭环从硬件接线、I2C 通信、寄存器读取到校准验证和工艺修改每一步踩过的坑后来都变成了做其他项目的通用经验。如果让我重做一遍我会在一开始就预留好校准流程的数据接口而不是等到测出来偏了两度再临时写补偿。MLX90614 是一颗非常成熟、成本可控的传感器它不算复杂但远比接三根线、读两个寄存器这几个字要值得多。希望这篇内容能帮你把测试通过变成真正的项目可用。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价