基于Arduino与MLX90614的DIY红外测温仪制作全攻略

发布时间:2026/6/1 13:01:10

基于Arduino与MLX90614的DIY红外测温仪制作全攻略 1. 项目概述与核心思路最近在整理工作室的工具时发现手头缺一个方便的非接触式测温工具。无论是检查3D打印机热床的温度均匀性还是偶尔想测一下电路板上某个元件的发热情况传统的热电偶或热敏电阻探头总显得不够方便。市面上成品红外测温枪虽然不贵但对于一个喜欢动手的电子爱好者来说自己做一个显然更有乐趣也能更深入地理解其背后的技术。于是我决定动手制作一个基于Arduino和MLX90614传感器的便携式红外测温仪。这个项目的核心目标很明确制作一个体积小巧、便于手持、能够快速测量并显示物体表面温度的设备。它需要具备非接触测量的基本功能最好还能有一些人性化的提示比如测量开始和结束的蜂鸣声。整个系统的构建思路围绕着“集成度”和“便携性”展开。主控选择了大家熟悉的Arduino Nano一方面是其丰富的库支持和社区资源另一方面是其相对紧凑的尺寸非常适合嵌入到小型外壳中。传感器则选用了MLX90614这是一款通过I2C总线通信的单点红外测温传感器精度和响应速度对于DIY项目来说完全够用。显示部分一块0.96英寸的OLED屏幕是绝配它功耗低、显示清晰同样支持I2C可以和传感器共用总线极大简化了布线。为了让设备真正脱离电脑和USB线独立工作电源方案是重中之重我最终选择了一块带充电功能的升压板配合聚合物锂电池实现了可重复充电的5V供电。2. 核心器件选型与原理剖析2.1 主控板为何是Arduino Nano在嵌入式DIY项目中主控板的选择往往是第一个关键决策。市面上常见的Arduino板型有Uno、Mega、Pro Mini、Nano等。对于这个红外测温仪我最终锁定了Arduino Nano主要基于以下几点考量首先尺寸是决定性因素。Arduino Uno虽然经典且接口丰富但其板型较大会直接导致整个测温仪外壳尺寸膨胀失去便携性。Arduino Pro Mini尺寸极小非常诱人但它缺少了USB转串口芯片这意味着每次上传程序都需要额外的USB转TTL模块对于开发和调试阶段来说便利性大打折扣。Arduino Nano则完美地取得了平衡它拥有与Uno几乎相同的核心处理器ATmega328P和I/O能力但尺寸缩小了近一半并且板上集成了CH340或FTDI芯片可以直接通过Micro-USB线连接电脑进行编程和供电开发体验极其流畅。其次引脚布局与扩展性。Nano的引脚以双列直插的形式排列非常适合插入面包板或使用杜邦线进行快速原型验证。本项目需要用到的数字I/O口驱动蜂鸣器和模拟输入口虽然本项目未使用都一应俱全。更重要的是它提供了独立的I2C引脚A4/SDA, A5/SCL方便与传感器和显示屏连接。注意市面上有些第三方生产的Nano板其USB转串口芯片可能是CH340需要在电脑上单独安装CH340的驱动程序否则电脑无法识别。这是新手常遇到的一个小坑如果插上USB线后IDE里找不到端口首先应检查驱动。2.2 传感核心MLX90614红外测温传感器解析MLX90614是本项目感知世界的“眼睛”。它的工作原理基于普朗克黑体辐射定律。所有温度高于绝对零度-273.15°C的物体都会向外辐射红外能量且辐射的强度与波长分布与其表面温度有着严格的函数关系。MLX90614内部集成了一个红外热电堆探测器和一个专用的信号处理芯片ASIC。热电堆探测器负责接收目标物体辐射的红外能量并将其转换为微弱的电压信号。这个信号非常小且容易受到环境温度传感器自身温度的干扰。因此MLX90614内部还集成了一个高精度的环境温度传感器通常是PTAT元件。ASIC芯片的核心作用就是同步采集热电堆电压和环境温度数据通过内置的算法和校准参数利用斯蒂芬-玻尔兹曼定律等进行计算最终补偿掉环境温度的影响直接输出已经计算好的物体温度值Ta和传感器自身温度值Tobj并通过I2C接口提供给主控。选择MLX90614常见的是MLX90614ESF-BAA-000测量范围-40°C ~ 125°C而非其兄弟型号MLX90615主要是出于可用性和成本的考虑。MLX90615通常精度更高或量程更广但在常规电子元器件商城MLX90614的库存更充足价格也更亲民。对于测量人体体温需要医疗级校准或高温工业场景可能需要更专业的型号但对于大多数创客项目的常温测量例如0°C ~ 80°CMLX90614完全胜任。2.3 人机交互OLED显示屏与蜂鸣器显示部分我选择了SSD1306驱动的0.96英寸128x64像素OLED屏幕。选择它而非LCD屏原因有三一是超低功耗OLED是自发光器件显示深色部分几乎不耗电这对于电池供电设备至关重要二是高对比度与可视角度即使在强光下也能清晰阅读三是接口简单支持I2C通信仅需SDA、SCL、VCC、GND四根线即可驱动与MLX90614共用I2C总线节省了宝贵的I/O口。听觉提示部分增加了一个有源蜂鸣器。它的作用是在用户按下测量键或系统启动测量时发出“滴”的一声提示开始测量稳定后再发出“滴滴”两声提示完成。这种即时反馈能极大提升用户体验让操作者明确知道设备已响应并完成了工作避免了因等待而产生的疑惑。有源蜂鸣器内部集成了振荡电路只需在控制引脚上给予高电平就会发声驱动非常简单。2.4 动力心脏升压充电一体板与电池方案让设备“无线”是便携性的终极体现。Arduino Nano的工作电压是5V常见的供电方案有9V方块电池电压足够但容量小通常约500mAh不可充电长期使用成本高且体积不够扁平不利于设计轻薄外壳。两节18650锂电池串联电压约7.4V通过Nano板上的稳压芯片降到5V。容量大但两节电池加 holder 的体积和重量会显著增加且需要独立的充电管理电路。单节锂聚合物电池升压板这是我最终选择的方案。使用一块3.7V、容量数百毫安时的扁平聚合物锂电池俗称“软包电池”搭配一块集成了充电管理如TP4056芯片和升压如MT3608芯片功能的一体化模块。这个方案的优点非常突出电池薄且形状灵活可以轻松放入亚克力外壳的夹层一体化模块简化了布线Micro-USB口既可充电也可在开发时作为5V输出给整个系统供电效率相对较高升压电路在中等电流输出下效率可达85%以上。一块600mAh的电池理论上可以支持整个系统连续工作数小时对于间歇性使用的测温仪来说续航完全足够。3. 硬件电路设计与焊接组装3.1 系统连接原理图与布线规划整个系统的电路连接并不复杂核心是围绕Arduino Nano的I2C总线展开。为了清晰和可靠我建议在将电路固定到外壳前先在面包板上完成所有功能的验证。接线明细表如下元件引脚连接至 Arduino Nano 引脚说明OLED 屏幕VCC5V电源正极GNDGND电源地SDAA4I2C 数据线SCLA5I2C 时钟线MLX90614VCC5V电源正极GNDGND电源地SDAA4I2C 数据线与OLED并联SCLA5I2C 时钟线与OLED并联有源蜂鸣器正极 ()D8通过数字引脚控制负极 (-)GND电源地升压充电板BAT锂电池正极红线连接电池BAT-锂电池负极黑线连接电池OUTNano VIN 或 5V*输出5V至系统电源OUT-GND系统电源地重要提示关于I2C总线的上拉电阻。MLX90614模块和OLED模块上大多数已经集成了4.7kΩ或10kΩ的上拉电阻。如果模块上没有或者连接后通信不稳定屏幕乱码、传感器读数为0则需要在Arduino的A4SDA和A5SCL引脚上分别连接到5V各加一个4.7kΩ的电阻。电源连接注意升压板的OUT可以连接到Nano的VIN引脚输入电压范围7-12V板载稳压到5V也可以直接连接到Nano的5V引脚。但切记如果连接到5V引脚请确保升压板的输出电压是精确稳定的5V且绝对不要在此时同时通过USB口供电否则可能损坏Nano的稳压芯片。最稳妥的做法是接VIN。3.2 焊接与在板固定步骤在面包板验证无误后就可以进行永久性的焊接和组装了。为了追求紧凑我没有使用额外的PCB而是选择了一个小型万用板洞洞板。布局规划先将所有元件Nano、OLED、MLX90614、蜂鸣器、升压板在万用板上比划确定一个最紧凑、走线最短的布局。原则是Nano居中I2C设备靠近蜂鸣器放在边缘升压板和电池预留空间。焊接主控与总线首先固定并焊接Arduino Nano。然后焊接连接A4和A5的公共SDA、SCL走线。使用细导线或直接利用万用板背面的铜箔走线。焊接外设将OLED和MLX90614的引脚弯折合适角度焊接到对应的总线SDA, SCL, 5V, GND上。蜂鸣器的正极焊接到Nano的D8引脚延伸出来的线上负极接地。焊接电源焊接升压板的输出端OUT, OUT-到万用板的电源总线。再将万用板的电源总线连接到Nano的VIN和GND。最后将聚合物锂电池的插头焊接到升压板的BAT和BAT-上。务必注意电池极性反接会损坏充电芯片绝缘与固定所有焊接点检查无误后可以使用热熔胶或泡沫胶将电池和升压板固定在万用板的空白处。特别要注意电池避免其引脚短路。可以用一层绝缘胶带包裹电池主体。3.3 外壳设计与加工为了让测温仪有更好的手感和保护我设计了一个简单的双层亚克力外壳。使用激光切割机切割出以下部件前面板开有OLED屏幕窗口、MLX90614传感器探头孔、蜂鸣器出声孔。后面板。中间层框架用于隔开前后板形成容纳电路板和电池的腔体。侧边条用于固定所有层。使用亚克力专用胶水或螺栓进行组装。在组装前确保将焊接好的电路板单元放入腔体传感器探头要对准前面板的孔OLED屏幕要从内侧对准窗口。可以在电路板底部粘贴尼龙柱或泡沫胶防止其在壳内晃动。4. 软件编程与功能实现4.1 开发环境搭建与库安装编程在Arduino IDE中进行。首先需要安装必要的库文件这是项目成功的关键一步。Adafruit MLX90614 库在IDE的“工具” - “管理库...”中搜索“Adafruit MLX90614”选择安装。这个库封装了与传感器通信的复杂细节让我们可以轻松调用readObjectTempC()等函数。Adafruit SSD1306 库和Adafruit GFX 库同样在库管理中搜索并安装“Adafruit SSD1306”和“Adafruit GFX”。前者驱动OLED后者提供图形绘制功能。Wire 库这是Arduino内置的I2C通信库无需额外安装。4.2 核心程序逻辑与代码解读程序的逻辑流程图可以概括为初始化 - 循环测量 - 滤波处理 - 显示与提示。下面结合代码关键部分进行解释。#include Wire.h #include Adafruit_MLX90614.h #include Adafruit_GFX.h #include Adafruit_SSD1306.h // 引脚定义 #define BUZZER_PIN 8 #define OLED_RESET -1 // 如果OLED没有RESET引脚则设为-1 // 初始化对象 Adafruit_MLX90614 mlx Adafruit_MLX90614(); Adafruit_SSD1306 display(128, 64, Wire, OLED_RESET); // 变量定义 float objectTemp 0.0; float ambientTemp 0.0; float tempHistory[5]; // 用于简单移动平均滤波的数组 int historyIndex 0; void setup() { Serial.begin(9600); pinMode(BUZZER_PIN, OUTPUT); digitalWrite(BUZZER_PIN, LOW); // 初始化OLED if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 地址0x3C Serial.println(F(SSD1306 allocation failed)); for(;;); // 死循环阻止继续执行 } display.clearDisplay(); display.setTextSize(2); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(IR Thermometer); display.display(); delay(2000); // 初始化MLX90614 if (!mlx.begin()) { Serial.println(Error connecting to MLX90614); while (1); } // 蜂鸣器启动提示 beep(200); } void loop() { // 1. 读取原始温度 float rawTemp mlx.readObjectTempC(); // 2. 简单移动平均滤波 (减少读数跳动) tempHistory[historyIndex] rawTemp; historyIndex (historyIndex 1) % 5; objectTemp 0; for (int i0; i5; i) { objectTemp tempHistory[i]; } objectTemp / 5.0; ambientTemp mlx.readAmbientTempC(); // 3. 显示到OLED display.clearDisplay(); display.setTextSize(2); display.setCursor(0, 0); display.print(Obj:); display.print(objectTemp, 1); // 显示一位小数 display.println( C); display.setCursor(0, 30); display.print(Amb:); display.print(ambientTemp, 1); display.println( C); // 添加一个小提示 display.setTextSize(1); display.setCursor(0, 55); display.println(Aim Hold Steady); display.display(); // 4. 通过串口输出方便调试 Serial.print(Object ); Serial.print(objectTemp); Serial.println( *C); Serial.print(Ambient ); Serial.print(ambientTemp); Serial.println( *C); delay(500); // 每500ms更新一次 } // 蜂鸣器提示函数 void beep(int duration) { digitalWrite(BUZZER_PIN, HIGH); delay(duration); digitalWrite(BUZZER_PIN, LOW); }代码关键点解析滤波算法红外测温传感器读数容易受微小抖动影响。代码中采用了一个大小为5的数组tempHistory来存储历史数据每次新读数替换最旧的一个然后计算这5个数的平均值作为最终显示值。这是一种简单的移动平均滤波能有效让屏幕上的数字稳定下来不会频繁跳动。I2C地址display.begin(SSD1306_SWITCHCAPVCC, 0x3C)中的0x3C是OLED屏幕的I2C地址。绝大多数0.96英寸OLED都是这个地址。如果屏幕不显示首先检查地址是否正确有时可能是0x3D。精度与单位mlx.readObjectTempC()直接返回摄氏度值。display.print(objectTemp, 1)中的,1表示显示小数点后1位这对于温度显示来说精度足够。4.3 功能扩展思路基础功能实现后可以考虑以下增强按键控制增加一个轻触开关。常态下屏幕休眠或显示待机界面按下按键才启动一次测量蜂鸣器响一声测量稳定后例如连续3次读数差值小于0.2°C再响两声并锁定显示结果数秒。这能进一步节省电量。温度报警设置一个阈值如38°C当测量温度超过阈值时屏幕闪烁或蜂鸣器长鸣报警。单位切换通过按键在摄氏度和华氏度之间切换。数据记录增加一个微型SD卡模块定时将测量到的时间和温度值记录到文件中用于简单的温度监控。5. 校准、测试与常见问题排查5.1 传感器校准与精度验证MLX90614在出厂时已经过校准但对于精度要求极高的场合或者怀疑传感器有偏差时可以进行简单的验证和补偿。验证方法需要一个已知准确温度的黑体辐射源或高精度接触式测温仪作为参考。在稳定的室温环境下测量一个静止的、表面发射率较高的物体如一杯搅拌均匀的温水、一块哑光黑胶带。同时用参考仪器测量该物体表面温度与MLX90614的读数对比。多次测量取平均计算偏差。软件补偿如果发现存在固定的偏差如始终偏高0.5°C可以在代码中进行补偿。在滤波计算后加上或减去一个修正值即可objectTemp objectTemp - 0.5;。注意这种补偿是线性的只在特定温度段有效。关于发射率MLX90614默认假设被测物体是发射率接近0.95的黑体像橡胶、皮肤、木材。对于光亮的金属发射率很低读数会严重偏低。高级应用需要根据物体材质调整传感器的发射率设置这需要通过向传感器写入特定寄存器来完成操作较为复杂一般DIY项目可忽略或主要测量非金属表面。5.2 系统测试流程上电测试连接电池或USB线观察OLED是否正常点亮并显示启动信息蜂鸣器是否短响一声。传感器测试用手靠近MLX90614传感器不要触摸观察OLED上“Obj”温度是否迅速上升至接近体温约30-34°C手移开后是否缓慢下降至环境温度。功耗测试使用万用表电流档串联在电池和升压板之间测量系统在工作状态和待机如果实现了休眠状态下的电流。计算理论续航时间电池容量(mAh) / 工作电流(mA)。续航测试充满电后连续开机工作记录从满电到升压板输出不足导致系统重启或屏幕变暗的时间。5.3 常见问题与解决方案速查表问题现象可能原因排查与解决方法OLED屏幕不亮/白屏1. 电源未接通或接反。2. I2C地址错误。3. 复位引脚未正确处理。1. 检查VCC和GND连接确保电压为5V。2. 尝试将代码中的I2C地址从0x3C改为0x3D。3. 如果OLED有RST引脚尝试在setup()中用代码控制复位或检查硬件连接。屏幕显示乱码1. I2C总线通信受干扰。2. 电源不稳定。1. 确保SDA、SCL线连接牢固并尝试加上拉电阻4.7kΩ到5V。2. 用示波器或逻辑分析仪查看I2C波形。3. 检查5V电源电压是否稳定尤其在蜂鸣器响时是否被拉低。MLX90614读数始终为01. 传感器损坏或接触不良。2. I2C总线冲突。1. 重新插拔传感器检查焊接点。2. 运行I2C扫描程序Arduino IDE示例中有查看是否能检测到传感器地址MLX90614默认0x5A。3. 如果总线上有多个设备确保地址不冲突。温度读数跳动剧烈1. 传感器对准目标不稳定。2. 环境气流干扰如风扇。3. 测量高反光表面。1. 保持设备稳定对准目标。2. 远离风扇、空调出风口。3. 尝试测量发射率高的表面如贴一小块黑色电工胶带。4. 在代码中增强滤波算法如增大平均窗口。蜂鸣器不响1. 引脚连接错误或接触不良。2. 有源/无源蜂鸣器弄混。3. 驱动电流不足。1. 检查蜂鸣器正负极是否接对控制引脚是否设为OUTPUT。2. 确认使用的是有源蜂鸣器给电就响。无源的需要PWM驱动。3. 尝试用digitalWrite直接驱动如果声音小可考虑增加一个三极管驱动电路。电池耗电过快1. OLED屏幕常亮且亮度高。2. 未实现低功耗模式。3. 升压板静态功耗高。1. 增加屏幕休眠功能调用display.ssd1306_command(SSD1306_DISPLAYOFF)。2. 让Arduino在测量间隙进入Sleep模式。3. 选择静态功耗低的升压芯片模块。升压板发热严重1. 输出电流过大。2. 输入输出电压差过大。3. 模块质量差或短路。1. 检查后端电路是否有短路。2. 测量工作电流是否在模块额定范围内。3. 电池电压过低时升压电路负担重及时充电。完成以上所有步骤后一个功能完整、外观小巧的自制红外测温仪就诞生了。它不仅是一个实用的工具更是一个融合了传感器技术、嵌入式编程、电源管理和机械设计的综合实践项目。通过这个过程你会对非接触测温的原理、I2C总线通信、低功耗设计有更深刻的理解。下次再需要测量温度时拿起自己做的设备那种成就感是购买成品无法比拟的。如果想让它的外观更精致还可以用3D打印来制作外壳或者增加一个激光指示器来帮助瞄准这些就留给大家自由发挥了。

相关新闻