news 2026/8/19 5:32:29

基于Arduino与MLX90614的非接触红外测温仪DIY全攻略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Arduino与MLX90614的非接触红外测温仪DIY全攻略

1. 项目概述:为什么选择非接触式红外测温方案?

最近几年,大家对体温监测的关注度一直很高,无论是家庭健康管理、电子发烧友的DIY项目,还是某些特定工业场景的预检,一个快速、安全、非接触的测温工具都很有吸引力。市面上成品测温枪很多,但价格和精度参差不齐,更重要的是,作为一个喜欢动手折腾的人,我更想知道它背后的原理,并且能根据自己的需求去定制功能——比如增加距离检测、超温报警,或者把数据记录下来。这就是我动手用Arduino搭建一个非接触式红外测温仪的原因。

这个项目的核心,是利用红外热电堆传感器来测量物体表面温度。它不直接接触被测物,通过检测物体发射的红外辐射能量来换算温度,非常适合测量移动物体、高温物体或者像食品这类不宜接触的物品表面温度。我选择了常见的MLX90614作为传感核心,搭配Arduino Uno开发板,并额外增加了超声波测距模块和蜂鸣器,实现“靠近测量、超温报警”的智能化功能。整个方案成本可控,代码开源,非常适合有一定电子基础的朋友复现和二次开发。无论你是想学习传感器应用、理解I2C通信,还是单纯想做一个实用的工具,这个项目都能给你带来不少收获。

2. 核心器件选型与功能解析

2.1 传感核心:MLX90614红外测温模块详解

MLX90614是这款测温仪的“眼睛”,它的选型直接决定了项目的精度和可靠性。市面上红外测温传感器很多,比如更便宜的MLX90615,或者精度更高的工业级型号。我选择MLX90614 ESF-BAA(标准视场版)主要基于以下几点考量:

首先,测量范围与精度。MLX90614的物体温度测量范围通常是-70°C到380°C,人体测温(0°C到50°C)只是其能力的一小部分,这意味着项目后续拓展性很强,比如用来测烙铁头温度或者电机外壳温度都行。它的出厂校准精度在±0.5°C以内(针对人体测温范围),对于DIY项目来说完全足够。这里要注意传感器自身的“环境温度”补偿功能,它内部集成了环境温度传感器,用于修正计算,这是保证非接触测量准确的关键,避免了因为传感器自身发热或环境冷热带来的误差。

其次,接口与集成度。MLX90614采用标准的I2C数字接口,只需要两根线(SDA, SCL)就能与Arduino通信,极大地简化了连线。模块内部集成了低噪声放大器、17位ADC和强大的DSP单元,所有复杂的信号处理、计算和校准都在传感器内部完成,Arduino只需要简单地读取它计算好的温度值即可,省去了我们处理微弱模拟信号、设计放大滤波电路的麻烦,对新手非常友好。

最后,视场角(FOV)。我用的BAA版本视场角约为90°,这意味着在10厘米距离处,它测量的是一块直径约16厘米的圆形区域的平均温度。视场角太大,容易受背景热源干扰;太小,则对瞄准要求高。90°是一个在近距离测量(如5-15厘米)时比较均衡的选择。如果你需要测量更远距离的小目标,则应选择FOV更小的型号(如10°或5°)。

注意:购买MLX90614时务必分清“物体温度”和“环境温度”的测量范围。有些廉价模块可能是工业级裁剪下来的次品,精度和稳定性无法保证。建议选择信誉好的商家,并确认传感器型号后缀。

2.2 控制与逻辑中枢:Arduino开发板

Arduino在这个项目中扮演大脑的角色,负责读取传感器数据、处理逻辑、控制外围设备和输出信息。我选用最经典的Arduino Uno R3,原因如下:

生态与兼容性无敌。Uno拥有最庞大的社区支持和库文件,几乎任何传感器模块都能找到对应的Arduino库,MLX90614也不例外。这能让你避开底层寄存器配置的坑,快速上手。引脚资源足够。本项目需要连接MLX90614(I2C占用A4, A5)、超声波模块(至少2个数字引脚)、蜂鸣器(1个数字引脚)和用于调试的串口,Uno的14个数字IO和6个模拟IO口绰绰有余。供电与驱动简单。Uno可以通过USB口或外部7-12V电源供电,并通过其5V和3.3V引脚为其他模块提供稳定电源,MLX90614的工作电压正好是3.3V,可以直接从Uno的3.3V引脚取电。

对于初学者,Uno是零门槛的最佳选择。如果你希望项目更小巧,可以换成Arduino Nano;如果需要无线功能,ESP8266或ESP32也是很好的升级方向,它们兼容Arduino IDE且自带Wi-Fi,但需要额外注意3.3V电平匹配和库的兼容性。

2.3 辅助功能模块:超声波与蜂鸣器

为了让测温仪更智能、更好用,我增加了两个辅助模块。

HC-SR04超声波测距模块:它的作用是实现“定点测量”。非接触红外测温对距离有一定要求,太远信号弱,太近可能触碰。通过超声波实时测量传感器到被测物体的距离,我们可以在代码中设定一个理想测量区间(例如5cm-15cm)。当物体进入该区间时自动触发温度测量并读数,离开区间则停止或显示提示,这比一直盲目测量要科学得多,也提升了用户体验。

有源蜂鸣器:这是一个简单的声光报警器(虽然它只有“声”)。我将它用于超温报警。当MLX90614读取到的温度超过我们设定的阈值(例如37.5°C)时,Arduino会驱动蜂鸣器发出“滴滴”的警报声,提供即时的听觉反馈。这在工业检测或快速筛查场景下非常实用。你也可以换成LED灯,或者声光一体。

3. 电路连接与硬件搭建实操

3.1 系统接线图与原理分析

整个系统的电路连接清晰简单,遵循“电源-信号”分离的思路,可以避免很多干扰问题。下图是各模块与Arduino Uno的引脚连接关系:

模块引脚连接至 Arduino Uno 引脚说明
MLX90614VCC3.3V务必接3.3V!接5V会烧毁传感器。
GNDGND共地。
SDAA4I2C数据线。
SCLA5I2C时钟线。
HC-SR04VCC5V工作电压5V。
GNDGND共地。
Trig数字引脚 2触发测距信号。
Echo数字引脚 3接收回波信号。
有源蜂鸣器长脚 (+)数字引脚 4通过三极管或MOSFET驱动更佳。
短脚 (-)GND

接线实操要点与避坑指南

  1. 电平匹配是首要问题:MLX90614是3.3V器件,虽然其I2C引脚据说耐5V,但为保险起见,VCC必须接Uno的3.3V输出引脚。同时,确保Arduino IDE中I2C上拉电阻的设置(如果使用内部上拉)是针对3.3V电平的,不过大多数库会处理。
  2. 电源去耦:建议在MLX90614的VCC和GND之间,就近焊接一个0.1uF的陶瓷电容,用于滤除电源噪声,这对提高温度读数的稳定性有奇效。
  3. 蜂鸣器驱动:有源蜂鸣器工作电流可能达到30mA,虽然Arduino的IO口(最大40mA)可以直接驱动,但长期工作或驱动多个时,建议增加一个简单的NPN三极管(如8050)驱动电路,用IO口控制三极管基极,由VCC为蜂鸣器供电,这样可以保护Arduino的IO口。
  4. 超声波模块干扰:HC-SR04在工作时会对电源产生一定的脉冲电流干扰。如果发现开启测距时温度读数偶尔跳动,可以在其VCC和GND之间也加一个10uF的电解电容进行稳压。

3.2 硬件组装与结构安排

对于原型阶段,在面包板上搭建是最快的。但如果你想做一个手持的、像测温枪一样的设备,就需要考虑结构了。

我的做法是:找一个大小合适的塑料盒或3D打印一个外壳。将MLX90614传感器头尽可能靠近外壳前端,并为其开一个通透的孔,确保前方无遮挡(即使是透明塑料也会严重衰减红外信号)。超声波模块的发射和接收探头最好与红外传感器平行并排安装,朝向同一方向,以保证测量的是同一目标的距离。

Arduino Uno面包板(或焊接好的洞洞板)可以放在外壳中部。蜂鸣器要靠近外壳开孔处,让声音能传出来。供电可以采用9V电池通过Uno的DC插座供电,或者直接用一块移动电源通过Uno的USB口供电,后者更便携。

实操心得:在固定MLX90614时,避免其金属背面接触到其他金属或电路板,最好用热熔胶或尼龙柱悬空固定,因为其背面同时也是用来测量环境温度的,贴太近会受到板子发热的影响。

4. 软件编程与核心代码实现

4.1 开发环境与库文件准备

首先确保你安装了Arduino IDE(1.8.x或2.0版本均可)。接下来需要安装MLX90614的驱动库。最常用的是Adafruit MLX90614 Library

在Arduino IDE中,点击“工具” -> “管理库…”,打开库管理器。在搜索框中输入“Adafruit MLX90614”,找到后点击安装。这个库会同时安装依赖的Adafruit_SensorAdafruit_BusIO库,非常方便。安装完成后,你就可以在示例中找到相关的例程。

对于超声波模块,我们不需要额外库,直接用pulseIn()函数处理即可。蜂鸣器控制就是简单的digitalWrite()

4.2 核心代码逻辑拆解与编写

整个程序的逻辑流是:初始化 -> 循环测量距离 -> 判断距离是否在有效范围 -> 如果在,则读取温度 -> 判断是否超温 -> 控制蜂鸣器 -> 串口输出数据。下面是分段代码解析。

第一部分:全局定义与初始化

#include <Wire.h> #include <Adafruit_MLX90614.h> Adafruit_MLX90614 mlx = Adafruit_MLX90614(); // 创建传感器对象 // 引脚定义 const int trigPin = 2; const int echoPin = 3; const int buzzerPin = 4; // 参数定义 const float MIN_DISTANCE = 5.0; // 最小有效测量距离 (cm) const float MAX_DISTANCE = 15.0; // 最大有效测量距离 (cm) const float ALARM_TEMP = 37.5; // 超温报警阈值 (摄氏度) float objectTemp, ambientTemp; // 存储温度变量 float distance; // 存储距离变量 void setup() { Serial.begin(9600); // 初始化串口,用于调试输出 while (!Serial); // 等待串口连接(对于某些板子需要) if (!mlx.begin()) { Serial.println("Error connecting to MLX90614. Check wiring!"); while (1); // 初始化失败,程序停止 } Serial.println("MLX90614 Found!"); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(buzzerPin, OUTPUT); digitalWrite(buzzerPin, LOW); // 确保蜂鸣器初始关闭 Serial.println("Non-Contact Thermometer Ready."); }

这段代码完成了库引入、对象创建、引脚模式设置和传感器检测。mlx.begin()会尝试通过I2C地址0x5A与传感器通信,失败则报错。

第二部分:超声波测距函数

float getDistance() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); // 发出一个10us的高脉冲触发测距 delayMicroseconds(10); digitalWrite(trigPin, LOW); // 读取回声高电平持续时间,单位微秒 long duration = pulseIn(echoPin, HIGH); // 声音速度约340m/s,即0.034cm/us。距离 = (时间 * 声速) / 2 float dist = duration * 0.034 / 2.0; return dist; }

pulseIn()函数会等待指定引脚变为指定状态(这里是HIGH),并计时直到状态改变,返回持续的微秒数。这是测量超声波飞行时间的关键。

第三部分:主循环逻辑与温度读取

void loop() { // 1. 测量距离 distance = getDistance(); delay(50); // 短暂延时,稳定读数 // 2. 判断距离是否有效 if (distance >= MIN_DISTANCE && distance <= MAX_DISTANCE) { // 3. 读取温度 objectTemp = mlx.readObjectTempC(); // 读取物体温度,单位摄氏度 ambientTemp = mlx.readAmbientTempC(); // 读取环境温度(传感器自身温度) // 4. 超温判断与报警 if (objectTemp >= ALARM_TEMP) { digitalWrite(buzzerPin, HIGH); Serial.print("!!! HIGH TEMP ALARM !!! "); } else { digitalWrite(buzzerPin, LOW); } // 5. 串口输出结果 Serial.print("Dist:"); Serial.print(distance); Serial.print("cm | ObjTemp:"); Serial.print(objectTemp); Serial.print("C | AmbTemp:"); Serial.print(ambientTemp); Serial.println("C"); } else { // 距离无效,关闭蜂鸣器,显示提示信息 digitalWrite(buzzerPin, LOW); Serial.print("Object out of range ("); Serial.print(distance); Serial.println("cm). Move closer/farther."); } delay(500); // 主循环延时,控制测量频率 }

主循环是程序的核心。它先测距,然后判断。只有在有效距离内,才进行昂贵的I2C温度读取操作,这能节省能量并减少不必要的传感器访问。读取温度后,与阈值比较,控制蜂鸣器。最后将所有关键数据打印到串口监视器,方便观察和调试。

4.3 代码优化与高级功能拓展

基础功能实现后,可以考虑以下优化:

  1. 软件滤波:红外测温容易受微小抖动影响。可以对objectTemp进行滑动平均滤波。例如,创建一个数组存储最近5次读数,每次输出平均值,读数会稳定很多。

    const int numReadings = 5; float readings[numReadings]; int readIndex = 0; float total = 0; float average = 0; // ... 在读数后,更新数组并计算平均值 ...
  2. 添加显示模块:摆脱电脑,增加一个OLED显示屏(如0.96寸 SSD1306),实时显示距离、物体温度和环境温度,这样就是一个独立的设备了。需要安装Adafruit_SSD1306Adafruit_GFX库。

  3. 温度单位切换mlx.readObjectTempF()可以直接读取华氏度,可以在代码中增加一个按钮,实现摄氏/华氏切换显示。

  4. 数据记录:增加一个SD卡模块,将带时间戳的温度和距离数据记录到txt文件里,便于后续分析。

5. 系统校准、调试与精度提升

5.1 校准的必要性与方法

MLX90614在出厂时已经进行了校准,但在DIY项目中,我们仍可以通过一些方法验证和微调其读数,尤其是针对特定应用(如人体测温)。

参考基准法:这是最可靠的方法。准备一个高精度的接触式测温仪(如热电偶温度计)和一个稳定的热源(比如一杯恒温热水、一个温度恒定的金属块)。用接触式测温仪测量热源表面温度作为真实值T_real,同时用你的Arduino测温仪在固定距离(如10cm)测量同一位置,得到读数T_measured。计算偏差Offset = T_real - T_measured。然后,在你的代码中,可以将读取到的温度加上这个Offset进行软件补偿:objectTemp_calibrated = mlx.readObjectTempC() + Offset;

环境温度补偿验证:MLX90614的精度依赖于其自身环境温度测量的准确性。你可以将传感器和另一个可靠的温度计放在同一静止的室内环境中,运行代码,比较mlx.readAmbientTempC()与参考温度计的读数。如果偏差大,可能需要检查传感器是否被其他热源影响。

5.2 常见问题排查实录

在实际制作过程中,你可能会遇到以下问题:

问题现象可能原因排查与解决方法
串口打印“Error connecting to MLX90614”1. I2C接线错误(SDA, SCL接反或接触不良)。
2. 电源接错(给MLX90614接了5V)。
3. 模块损坏。
1. 用万用表检查A4/A5到模块的连通性。
2.确认VCC接的是3.3V!
3. 尝试用Arduino的I2C扫描示例程序,看能否扫描到地址0x5A的设备。
温度读数固定不变或为01. I2C通信不稳定,数据未正确读取。
2. 传感器前方有遮挡(如玻璃、塑料)。
1. 检查I2C上拉电阻。Arduino内部上拉可能较弱,尝试在SDA和SCL线上各接一个4.7kΩ电阻上拉到3.3V。
2. 确保传感器感应窗口完全裸露,无任何覆盖物。
温度读数跳动剧烈1. 电源噪声。
2. 传感器受到气流扰动(如风扇、呼吸)。
3. 测量目标温度不均匀或正在变化。
1. 在传感器VCC和GND间加0.1uF电容。
2. 在静止空气环境中测量稳定热源。
3. 在代码中增加软件滤波(如滑动平均)。
超声波测距不准或为01. 触发信号太短。
2. 回声引脚未收到信号(超出量程或物体吸声)。
3. 模块供电不足。
1. 确保Trig引脚高电平维持至少10us。
2. 测量时对准平整硬质表面(如墙壁),距离在2cm-400cm之间。
3. 检查5V供电是否稳定,可在模块VCC-GND间加10uF电容。
蜂鸣器不响或一直响1. 引脚接反(有源蜂鸣器分正负极)。
2. 驱动电流不足。
3. 程序逻辑错误,报警条件判断反了。
1. 确认蜂鸣器长脚接IO口,短脚接GND。
2. 改用三极管驱动电路。
3. 检查if (objectTemp >= ALARM_TEMP)这行代码的逻辑和ALARM_TEMP的值。

5.3 提升测量精度的实战技巧

除了校准,操作习惯也极大影响测量精度:

  1. 测量距离与光斑:记住,MLX90614测量的是其视场角内所有物体的平均温度。距离越远,光斑越大。测量小目标(如芯片引脚)时,必须靠近,确保目标充满大部分光斑。测量人体额头时,建议距离3-5厘米。
  2. 发射率设置:MLX90614默认发射率(Emissivity)设置为0.95,这是针对大多数有机材料(如皮肤、木材)和氧化表面的典型值。如果你测量的是光亮金属(发射率可能低至0.1),读数会严重偏低。MLX90614的发射率可以通过特定的I2C命令修改,但操作复杂且需要精确参考,对于通用测量,保持0.95即可。
  3. 环境热源干扰:避免在阳光直射、暖气片旁或有其他强热源(如白炽灯、运行中的电机)的环境下测量。这些热源的红外辐射会进入传感器视场,干扰读数。
  4. 目标物表面特性:测量时,确保目标物表面清洁、无灰尘、无水汽、无反光涂层。光亮表面会反射环境红外辐射,导致测量失准。

6. 项目总结与进阶玩法

完成这个基础版本后,你已经掌握了一个完整的嵌入式传感系统开发流程:从器件选型、原理理解、硬件搭接、软件编程到调试校准。这个项目本身已经是一个实用的工具,但它的潜力远不止于此。

你可以考虑将它升级为一个便携式红外热像仪的简易版:用一个舵机云台带动MLX90614进行二维扫描,逐点测量温度,并将温度数据映射成颜色,在电脑上显示出一幅低分辨率的“热力图”。这需要更复杂的机械结构和上位机软件(可以用Processing或Python编写),但会极大地提升项目的趣味性和技术深度。

另一个方向是物联网化。将主控换成ESP32,接入Wi-Fi。测温数据可以通过MQTT协议上传到云平台(如阿里云、Home Assistant),实现远程监控、历史数据图表和手机报警推送。你甚至可以做一个公共区域的非接触测温终端,配合人脸识别(当然这需要更强的硬件)进行打卡和体温记录。

我个人在多次制作和调试中的体会是,电子DIY的魅力在于“知行合一”。看数据手册(知)让你理解原理,动手焊接调试(行)让你遇到真实世界的问题。像电源噪声、时序干扰、机械振动这些在理论中轻描淡写的问题,在实践中却至关重要。这个红外测温项目就是一个很好的载体,它涉及模拟信号、数字通信、传感器特性、软件算法等多个知识点,踩过的每一个坑,最终都会变成你经验库里的宝贵财富。最后一个小建议:把所有调试过程中的参数修改、电路改动都记录下来,形成一个你自己的“项目日志”,下次再做类似项目时,它会是你最好的参考资料。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/19 5:32:20

构建自进化数据科学智能体:从LLM规划到技能学习的实战指南

1. 项目概述&#xff1a;当数据科学遇上“自进化”智能体最近在AI和数据科学圈子里&#xff0c;一个名为“EvoDS”的概念开始被频繁提及。它不是一个具体的工具或库&#xff0c;而是一种全新的范式构想&#xff1a;一个能够自我进化的自主数据科学智能体。简单来说&#xff0c;…

作者头像 李华
网站建设 2026/8/19 5:27:03

LLM编码智能体在时间序列分析中的应用与实战

1. 项目概述&#xff1a;当LLM编码智能体遇上时间序列最近在社区里看到不少关于LLM&#xff08;大语言模型&#xff09;编码智能体&#xff08;Coding Agents&#xff09;的讨论&#xff0c;从自动生成代码到辅助调试&#xff0c;热度一直很高。但一个有趣且更具挑战性的问题浮…

作者头像 李华
网站建设 2026/8/19 5:25:42

现代职场压力管理:从马斯克“最痛苦一年”看系统性压力应对策略

1. 从“最痛苦一年”看现代职场压力本质最近&#xff0c;埃隆马斯克在一次访谈中回顾了他职业生涯中“最痛苦的一年”&#xff0c;并表达了希望有胜任者能接替其职责的愿望。这个话题迅速引发了广泛讨论&#xff0c;因为它戳中了无数职场人&#xff0c;尤其是身处高压岗位的管理…

作者头像 李华
网站建设 2026/8/19 5:25:20

Python爬虫实战:打造维基百科词条信息抽取系统

前言 在当今信息爆炸的时代,维基百科作为全球最大的在线百科全书,汇聚了海量的结构化与半结构化知识。如何高效地从这些页面中提取有价值的信息,成为了数据科学、自然语言处理以及知识图谱构建等领域的重要基础任务。本文将带领读者从零开始,构建一个完整的维基百科词条信…

作者头像 李华
网站建设 2026/8/19 5:14:57

深入解析英飞凌XCM系列MCU的CPU核心:从Arm内核到实战优化

1. 从“黑盒子”到“指挥官”&#xff1a;理解MCU中的CPU核心当我们谈论一块英飞凌XCM系列微控制器&#xff08;MCU&#xff09;时&#xff0c;无论是用于电机控制、车载网关还是工业自动化&#xff0c;我们首先想到的往往是它的外设&#xff1a;丰富的定时器、高精度的ADC、灵…

作者头像 李华
网站建设 2026/8/19 5:14:21

从零构建智能光效系统:ESP32与LED灯带的分布式架构实践

1. 项目概述&#xff1a;当“光之城”不止是一个名字“A City of Light”&#xff0c;光之城。这个名字听起来像是一个宏大的城市愿景&#xff0c;或者一部科幻电影的标题。但在我们这些常年与代码、硬件和创意项目打交道的人看来&#xff0c;它更像是一个充满诱惑的命题&#…

作者头像 李华