基于ESP32与MLX90614的智能红外测温枪DIY全攻略
2026/7/29 7:53:22
网站开发
1. 项目缘起为什么用ESP32做一把自己的测温枪夏天一到各种设备发热就成了心头大患。电脑CPU温度、路由器外壳烫不烫、给宠物准备的水是不是太热了甚至想看看阳台上的多肉是不是被晒伤了。虽然市面上红外测温枪不少但要么功能单一要么数据无法记录要么就是价格不菲。作为一个喜欢折腾的硬件爱好者我总觉得如果能自己动手做一把既能精确测温又能把数据传到手机或电脑上记录分析甚至设置高温报警那才叫一个得心应手。这个想法让我把目光投向了FireBeetle ESP32开发板。选择它理由很充分。首先ESP32自带Wi-Fi和蓝牙这意味着我做的测温枪不再是信息孤岛测得的温度可以实时上传到云端比如自己搭的服务器或物联网平台或者在手机App上实时查看这是传统测温枪做不到的。其次ESP32性能足够强大双核处理器能轻松处理传感器数据、运行逻辑判断并管理网络通信不会因为处理速度慢而影响测温响应。最后FireBeetle这个系列的设计通常比较紧凑、功耗控制得也不错很适合做成一个便携的、甚至可以电池供电的“智能”设备。所以这个项目的核心目标就很明确了利用FireBeetle ESP32作为大脑搭配一个非接触式红外测温传感器比如MLX90614制作一把功能远超普通测温枪的智能设备。它不仅能“感受”夏天的温度更能“理解”和“记录”温度。2. 核心器件选型与电路设计思路一把红外测温枪硬件上主要分为三大部分感知单元红外传感器、处理与控制单元主控MCU、以及人机交互单元显示和输入。我们的设计将围绕FireBeetle ESP32展开。2.1 主控为什么是FireBeetle ESP32市面上ESP32开发板很多我选择DFRobot的FireBeetle ESP32主要是看中以下几点极致低功耗设计FireBeetle系列以低功耗见长。对于可能用电池供电的便携设备深度睡眠模式下的极低电流据说可达10μA级别至关重要能大幅延长续航。紧凑的板型与丰富接口它的板子尺寸较小集成了锂电池充电管理电路可以直接连接一块3.7V的锂电池同时通过USB供电或充电省去了外接充电模块的麻烦。GPIO口也基本够用。良好的社区与文档支持DFRobot提供的文档和库比较齐全遇到问题相对容易找到解决方案。当然其他ESP32开发板如NodeMCU-32S、TTGO T-Display等也完全可行只是可能在电源管理或外围集成度上需要自己多费点心思。2.2 红外测温传感器MLX90614 vs AMG8833这是测温枪的“眼睛”选择至关重要。常见的有两种MLX90614这是一款单点红外测温芯片通过I2C接口通信。它内部集成了信号调理、DSP单元和低噪声放大器直接输出经过校准的物体温度和自身温度环境温度精度通常在±0.5°C以内在医疗级版本中。它测量的是一个小视场角内的平均温度非常适合测量一个特定点的温度比如芯片表面、液体表面等。AMG8833这是一款8x864像素的红外热成像传感器同样使用I2C。它能输出一个微型的温度矩阵可以粗略看到温度分布。但每个像素的精度相对MLX90614要低约±2.5°C且数据处理更复杂需要生成图像。对于我们的“测温枪”项目目标是快速、精确地测量一个点的温度MLX90614无疑是更合适的选择。它的使用非常简单精度高代码库成熟。我们选择MLX90614ESF-BAA这个型号视场角90°精度±0.5°C就足够了。它有一个重要的参数叫“视场角”FOV这里90°的FOV比较宽意味着你需要离被测物体比较近才能确保测量的是你想要的那个点而不是它周围的环境。这对于测温枪的使用习惯来说是匹配的。2.3 其他关键部件与电路连接显示屏为了便携和直观我们需要一块小屏幕。我选用0.96英寸的OLED显示屏SSD1306驱动128x64像素同样是I2C接口。它功耗低、显示清晰足以显示温度数值和简单状态信息。按键至少需要两个按键。一个作为“测量触发键”半按对焦、全按测温模仿相机快门另一个作为“模式切换键”比如切换显示单位°C/°F、切换测量对象物体温度/环境温度、或者进入Wi-Fi配置模式。电源一块3.7V、500mAh以上的锂电池配合FireBeetle板载的充放电管理可以提供数小时的连续使用时间。ESP32和传感器在深度睡眠时耗电极低可以做成一个“拿起唤醒放下休眠”的智能设备。蜂鸣器可选用于按键提示音或高温报警提示。电路连接示意图基于I2C总线FireBeetle ESP32的I2C引脚通常是GPIO 21 (SDA)和GPIO 22 (SCL)。MLX90614VIN - 3.3V, GND - GND, SDA - GPIO21, SCL - GPIO22。OLED (SSD1306)VCC - 3.3V, GND - GND, SDA - GPIO21, SCL - GPIO22。这里有个关键点MLX90614和OLED可以共享同一个I2C总线因为它们有各自不同的设备地址I2C Address。MLX90614的默认地址是0x5ASSD1306的默认地址是0x3C。在代码中我们分别初始化这两个地址的设备即可无需额外引脚。按键连接则需要连接到普通的GPIO并启用内部上拉电阻。例如将测量键连接到GPIO 32模式键连接到GPIO 33。注意MLX90614的工作电压是3.3V务必连接到ESP32的3.3V输出引脚而不是5V否则会损坏传感器。3. 固件开发从数据采集到网络同步硬件搭好只是骨架让设备智能起来的是固件。我们将使用Arduino IDE进行开发因为它对ESP32和各类传感器库的支持非常友好。3.1 开发环境搭建与库安装首先确保你的Arduino IDE已经安装了ESP32开发板支持。可以通过“文件”-“首选项”-“附加开发板管理器网址”中添加https://espressif.github.io/arduino-esp32/package_esp32_index.json来安装。然后需要安装以下库通过“工具”-“管理库...”搜索安装Adafruit MLX90614 Library用于驱动MLX90614传感器。Adafruit SSD1306和Adafruit GFX Library用于驱动OLED显示屏。WiFi和WebServerESP32内置用于Wi-Fi连接和创建配网页面。PubSubClient可选如果你打算使用MQTT协议将数据发布到服务器如EMQX、Mosquitto。3.2 核心代码逻辑剖析程序的整体逻辑是一个状态机主要包含以下几个状态休眠、等待测量、测量中、数据显示、网络通信。这里我分享核心环节的代码和思路。初始化与传感器校准#include Wire.h #include Adafruit_MLX90614.h #include Adafruit_SSD1306.h Adafruit_MLX90614 mlx Adafruit_MLX90614(); Adafruit_SSD1306 display(128, 64, Wire, -1); // -1表示无RESET引脚 void setup() { Serial.begin(115200); Wire.begin(21, 22); // 初始化I2C指定SDA, SCL引脚 // 初始化OLED if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { Serial.println(F(SSD1306 allocation failed)); for(;;); // 死循环阻止继续执行 } display.display(); delay(1000); // 初始化MLX90614 if (!mlx.begin()) { Serial.println(F(Could not find a valid MLX90614 sensor, check wiring!)); while (1); } Serial.println(F(MLX90614 Found!)); // 连接Wi-Fi这里可以先写死SSID和密码后期改为智能配网 connectToWiFi(); }在setup()中依次初始化串口、I2C总线、OLED和MLX90614。务必检查每个设备是否初始化成功这是硬件调试的第一步。温度读取与滤波红外测温传感器读数可能会有微小波动。为了显示稳定我们需要进行简单的软件滤波。float readFilteredObjectTemp() { int numReadings 5; float sum 0; for (int i 0; i numReadings; i) { sum mlx.readObjectTempC(); // 读取物体温度摄氏度 delay(10); // 短暂延迟避免读取过快 } return sum / numReadings; // 返回平均值 }这里采用了最简单的移动平均滤波读取5次后取平均。对于要求更高的场景可以引入卡尔曼滤波但对于体温、物体表面温度测量平均值已足够。按键中断与低功耗管理为了实现“拿起就用放下就睡”我们需要利用ESP32的深度睡眠功能和外部中断。#define MEASURE_BUTTON_PIN 32 #define MODE_BUTTON_PIN 33 void setup() { // ... 其他初始化 pinMode(MEASURE_BUTTON_PIN, INPUT_PULLUP); pinMode(MODE_BUTTON_PIN, INPUT_PULLUP); // 配置测量按键为中断唤醒源下降沿触发即按键按下 esp_sleep_enable_ext0_wakeup(GPIO_NUM_32, 0); // 0 LOW level } void loop() { // 主循环中检测模式按键 if(digitalRead(MODE_BUTTON_PIN) LOW) { delay(50); // 消抖 if(digitalRead(MODE_BUTTON_PIN) LOW) { switchMode(); // 切换显示模式 while(digitalRead(MODE_BUTTON_PIN) LOW); // 等待按键释放 } } // 检查测量按键也可以用中断这里用轮询简化 if(digitalRead(MEASURE_BUTTON_PIN) LOW) { delay(50); if(digitalRead(MEASURE_BUTTON_PIN) LOW) { performMeasurement(); // 测量完成后可以考虑在一段时间无操作后自动进入睡眠 lastActionTime millis(); } } // 如果超过30秒无操作进入深度睡眠 if(millis() - lastActionTime 30000) { display.clearDisplay(); display.display(); Serial.println(Entering deep sleep); esp_deep_sleep_start(); // 进入深度睡眠等待按键中断唤醒 } }这段代码实现了基本的按键操作和低功耗逻辑。测量键按下时执行测温模式键切换显示。如果30秒内无任何操作设备清屏并进入深度睡眠此时功耗极低。只有当测量键连接GPIO32被按下时才会产生中断将ESP32唤醒从头开始执行setup()。实操心得esp_sleep_enable_ext0_wakeup只能使用特定的RTC GPIO如GPIO0, 2, 4, 12-15, 25-27, 32-39。FireBeetle的引脚可能已经对应好了但务必查阅板子的原理图确认你使用的引脚支持外部唤醒否则睡眠后无法唤醒。3.3 网络功能实现数据上传与Web配网让测温枪联网是它的“智能”所在。我们可以实现两个功能数据上传和Web服务器配网。1. 数据上传以MQTT为例你可以将温度数据发布到MQTT服务器然后由Node-RED、Home Assistant或其他自定义服务端订阅并处理。#include PubSubClient.h #include WiFi.h WiFiClient espClient; PubSubClient client(espClient); const char* mqtt_server your.mqtt.broker.ip; void reconnectMQTT() { while (!client.connected()) { if (client.connect(ESP32_Thermometer)) { Serial.println(MQTT connected); } else { Serial.print(failed, rc); Serial.print(client.state()); Serial.println( try again in 5 seconds); delay(5000); } } } void publishTemperature(float temp) { if (!client.connected()) { reconnectMQTT(); } char msg[50]; snprintf(msg, 50, %.2f, temp); client.publish(home/thermometer/temperature, msg); Serial.printf(Temperature published: %s°C\n, msg); }在performMeasurement()函数中读取温度后调用publishTemperature()即可。你还可以同时发布环境温度、电池电压等信息。2. Web服务器智能配网第一次使用或在新的网络环境中我们不可能每次都修改代码里的Wi-Fi密码。更好的方式是让设备启动后如果无法连接已知网络就自己变成一个Wi-Fi热点AP并启动一个Web服务器让用户用手机连接这个热点后在网页上选择家里的Wi-Fi并输入密码。#include WebServer.h #include WiFiManager.h // 强烈推荐使用WiFiManager库它封装了所有复杂逻辑 WiFiManager wm; void setup() { // ... 其他初始化 // 初始化WiFiManager wm.setConfigPortalTimeout(180); // 配置门户超时时间秒超时后继续尝试连接保存的网络 if (!wm.autoConnect(Thermometer_AP)) { Serial.println(Failed to connect and hit timeout); esp_restart(); // 重启并重试 } Serial.println(Connected to WiFi!); }使用WiFiManager库后代码变得极其简单。设备首次启动会创建名为“Thermometer_AP”的热点手机连上后访问192.168.4.1即可出现配网页面。配网成功后凭证会保存在ESP32的Flash中下次启动自动连接。踩坑记录在同时使用深度睡眠和WiFiManager时要注意。深度睡眠唤醒后ESP32会经历完整的重启WiFiManager会读取之前保存的配置尝试连接。如果连接失败它会再次进入AP模式。这意味着你的设备在无法联网的环境下被唤醒可能会意外打开热点增加功耗。一个解决方案是在进入深度睡眠前判断是否处于可预见的无网络环境比如被带出门如果是则先调用wm.erase()清除网络配置或者用另一个按键长按来触发清除配置并进入配网模式。4. 结构设计与组装调试要点硬件和软件都准备好后我们需要给这把“枪”一个外壳。你可以使用3D打印来制作一个专属外壳这是最灵活的方式。设计思路握柄内部预留空间放置FireBeetle ESP32主板和锂电池。握柄底部设计一个可开合的盖子用于更换电池或充电通过Micro USB口。枪身前端有一个圆孔用于固定MLX90614传感器确保其红外接收窗对准前方且与外壳平齐或略微内陷以防刮擦。传感器周围最好做一些遮光结构减少侧面杂散光干扰。顶部区域安装OLED屏幕屏幕略向后倾斜便于握持时观看。屏幕两侧或下方开孔安装两个轻触按键。扳机在握柄前方设计一个可活动的“扳机”结构内部通过连杆或直接按压的方式触发我们连接在GPIO 32上的测量微动开关。这是提升手感的关键组装与调试步骤焊接与测试先将MLX90614、OLED、按键、蜂鸣器通过杜邦线或直接焊接连接到FireBeetle ESP32上。不要急着装进外壳先上电测试所有功能是否正常屏幕亮不亮按键能不能用串口能否打印出温度Wi-Fi能否连接功耗测试这是很多DIY项目忽略的一步。使用万用表的电流档串联在电池和主板之间。分别测试正常工作时电流、屏幕点亮但待机时电流、深度睡眠时电流。记录这些数据可以估算电池续航。如果深度睡眠电流远大于1mA就要检查是否有外围电路比如某些传感器、LED在持续耗电需要确保它们在睡眠前被设置为低功耗模式或断电。装入外壳测试无误后小心地将所有元件装入3D打印的外壳。注意线材的整理和固定避免挤压短路。传感器位置要精准。可以使用热熔胶或螺丝进行固定。标定与验证可选但重要MLX90614出厂已校准但如果你追求极高精度可以用一个已知准确温度的黑体辐射源或一个高精度水银温度计配合恒温水浴进行对比测试。如果发现系统误差可以在代码里加一个修正偏移量。例如实测某恒温37.0°C的物体传感器读数为36.7°C那么可以在代码输出前统一加上0.3°C。一个常见的显示界面设计示例 智能测温枪 物体: 36.5 °C 环境: 25.1 °C 电池: 3.8V Wi-Fi: 已连接 按下[M]键切换模式第一行显示物体温度这是核心数据。第二行显示传感器自身的温度环境温度参考。第三行显示电池电压方便判断电量。第四行显示网络状态。底部是操作提示。5. 功能扩展与进阶玩法基础功能实现后这个基于ESP32的智能测温枪平台还有巨大的扩展潜力。1. 数据记录与可视化通过MQTT将数据发送到服务器后可以用InfluxDB时序数据库存储然后用Grafana制作一个漂亮的实时温度监控看板。你可以看到一天内电脑机箱的温度变化曲线或者记录宠物水盆的水温历史。2. 高温报警与联动在固件中设置一个温度阈值比如40°C。当测量温度超过阈值时除了本地蜂鸣器报警还可以通过MQTT发送一条告警消息。服务器端如Node-RED可以接收到这条消息然后执行联动操作比如发送一条Telegram消息到你的手机“警告书房电脑CPU温度过高”或者自动打开家里的智能插座给风扇供电。3. 多点测量与热图模拟进阶如果你将传感器换成AMG8833热成像传感器就可以获取8x8的64点温度矩阵。虽然分辨率很低但通过插值算法和颜色映射可以在OLED上显示一个非常粗略的“热力图”用来判断物体表面的温度分布是否均匀比如检查电路板是否有局部过热。4. 电池电量精准监测FireBeetle ESP32的某些型号可以通过ADC读取电池电压。但锂电池的电压与电量关系是非线性的放电曲线。要实现精准的电量百分比显示需要先测量电池满电电压如4.2V和亏电截止电压如3.3V然后在代码中实现一个简单的映射函数或者使用库来管理电池电量显示。5. 固件无线升级OTA这是让产品变得“专业”的关键一步。ESP32 Arduino核心支持OTAOver-The-Air更新。你可以编写代码让设备定期从指定的服务器检查是否有新固件并自动下载更新。这意味着你修复bug或增加新功能后用户无需再用USB线连接电脑设备自己就能完成升级。实现OTA后你甚至可以为你的智能测温枪开发一个简单的手机App用MIT App Inventor或Blynk都可以快速搭建用App来查看实时温度、设置报警阈值、执行OTA升级体验就完全像一个成熟的消费电子产品了。从一把简单的测温枪出发通过ESP32的连接和计算能力我们把它变成了一个物联网传感器节点。这个过程里你不仅学会了传感器应用、低功耗设计和网络通信更重要的是一种“系统化”的硬件开发思维如何将想法分解为硬件选型、电路连接、固件逻辑、结构设计和云端应用。这把自己造的“红外测温枪”测量的不仅是夏天的温度更是你动手实现一个完整智能设备项目的能力热度。