中学生STEM实践:用3D打印与Arduino自制红外温度计
1. 项目缘起:为什么中学生需要动手做一台红外温度计?
几年前,我在一所中学的创客社团做指导老师,发现一个挺有意思的现象:学生们对物理课本上“温度与热辐射”的概念总是觉得抽象,公式背得滚瓜烂熟,但一提到实际应用就两眼一抹黑。直到有一次,一个学生拿着家里的额温枪问我:“老师,这个不用碰到我,怎么就知道我发烧了呢?” 那一刻我意识到,一个生活中随处可见的“非接触式红外温度计”,恰恰是连接抽象理论与鲜活实践的最佳桥梁。
这个项目,就是为中学生量身打造的。它不只是一个简单的Arduino传感器应用,而是一个融合了3D设计与打印、电子电路搭建、嵌入式编程逻辑以及物理原理验证的综合性工程实践课题。通过亲手从零开始制作一台能实际工作的温度计,学生们能直观地理解斯特藩-玻尔兹曼定律(虽然我们不会讲得那么深奥)、传感器的信号转换、微控制器的数据处理,以及如何用3D建模解决一个具体的结构封装问题。这远比在试卷上做十道选择题来得深刻。
更重要的是,它完美契合了STEM(科学、技术、工程、数学)教育的核心理念。项目中的每一个环节——从用卡尺测量传感器尺寸开始3D建模,到焊接杜邦线连接Arduino,再到调试代码让LCD屏幕显示出正确的温度——都是一个完整的“发现问题、设计方案、动手实现、测试优化”的微型工程闭环。对于中学生而言,成功点亮屏幕、测出第一组温度数据时的那种成就感,是任何理论灌输都无法替代的。
2. 核心器件选型与原理浅析:MLX90614为何是首选?
市面上红外温度传感器不少,比如GY-906模块常用的MLX90614,以及一些更简单的热电堆传感器。为什么在这个项目里,我强烈推荐使用MLX90614ESF-BAA这款型号呢?这背后有几个针对教学场景的深度考量。
首先,集成度与易用性。MLX90614是一个完全校准的数字传感器,内部集成了红外热电堆探测器、信号调理放大器、17位ADC以及强大的DSP单元,出厂时已经完成了校准。这意味着学生拿到手后,不需要复杂的模拟电路知识去处理微弱的电压信号,也无需自己进行繁琐的、容易出错的温度标定。它通过I2C接口直接输出数字温度值,极大降低了入门门槛。想象一下,如果让学生从处理几个毫伏的模拟信号开始,光是噪声滤波和放大电路就能劝退一大半人。
其次,精度与量程足够。MLX90614的测量精度在常温范围内可以达到±0.5°C,测量范围从-70°C到380°C(视具体型号而定)。对于测量人体体温(约35-42°C)或室内外环境温度,这个性能绰绰有余。在教学场景中,我们可以让学生用它测量自己的手心、额头、一杯热水、甚至窗外的地面,对比水银温度计或其它测温仪,直观地感受“非接触”测量的特点以及可能存在的误差来源(如发射率设置)。
注意:MLX90614有多个版本,如面向人体的MLX90614ESF-BCI和更通用的BAA。对于课程,选择BAA版本(物体温度测量)更具普适性,我们可以通过讲解“发射率”的概念,引导学生思考为什么测人体和测黑板擦需要不同的参数设置。
它的工作原理,我们可以用一个“黑盒子”模型向学生解释:所有高于绝对零度的物体都会向外辐射红外线,辐射的强度与物体表面温度的四次方成正比(这里可以简单提一下斯特藩-玻尔兹曼定律,但不展开公式)。传感器前端的透镜将特定波长的红外能量聚焦到内部的热电堆探测器上,产生一个微弱的电压信号。这个模拟信号经过内部芯片的放大、模数转换和复杂的计算(基于出厂校准数据和设定的发射率),最终通过I2C总线输出一个代表物体温度的数字。我们可以告诉学生,这个小小的模块里,完成了一次从“光”(红外辐射)到“电”(电压),再到“数”(温度值)的奇幻旅程。
至于主控,Arduino Uno是不二之选。它生态成熟、资料海量、引脚兼容性好,避免了在驱动和库文件上消耗过多时间。配套的1602 LCD屏(I2C版本)则用于显示,I2C通信只需要连接4根线(VCC, GND, SDA, SCL),接线清晰,非常适合教学演示。
3. 从零开始的3D建模:用Fusion 360设计一个专属外壳
电路可以搭在面包板上,但一个裸露着芯片和飞线的装置,怎么看都像个“科学怪人”的试验品。我们需要为它设计一个既美观又实用,还能保护内部元件的外壳。这就是3D建模与打印环节的价值所在——将电子项目产品化、实体化的关键一步。
我选择Autodesk Fusion 360作为教学软件,因为它对教育用户免费,且集成了参数化建模、渲染甚至简单的仿真功能,非常适合入门。整个建模过程,可以分解为几个符合工程设计逻辑的步骤:
3.1 第一步:测量与规划——所有设计始于数据让学生们拿起游标卡尺,亲自测量MLX90614传感器模块、Arduino Uno板、LCD屏幕的精确尺寸(长、宽、高、安装孔位、引脚位置)。这是工程实践的第一课:精准测量是成功设计的基础。记录下这些数据,并在纸上画出简单的布局草图:传感器需要伸出外壳前端以便“看到”被测物体,屏幕需要朝上以便观察,主板和线路需要容纳在内,还要考虑电池盒或USB电源线的入口。
3.2 第二步:主体结构建模——创建基础的“房子”在Fusion 360中,我们从创建基础草图开始。根据测量得到的主板最大尺寸(通常是Arduino Uno),拉伸出一个长方体作为外壳底座。这里可以引入“参数”的概念:将外壳的长、宽、高设置为命名参数(如外壳长度、外壳高度)。这样,如果后期测量有误或想调整大小,只需修改参数值,整个模型会自动更新,这是参数化设计的核心优势。
接着,使用“抽壳”命令,将实心长方体变成一个有壁厚(建议2-2.5mm,兼顾强度和打印速度)的盒子。底部可以封闭,作为底板。
3.3 第三步:开孔与布尔运算——为功能部件“开门窗”这是最考验细心的一步,需要根据之前测量的数据,精确地开出各种孔洞:
- 传感器孔:在外壳前端面,创建一个与传感器探头直径匹配的圆,拉伸切除。为了固定传感器,可以在内部设计一个小的卡槽或支柱。
- 屏幕窗口:在外壳顶面,开一个比LCD显示区域稍大的矩形窗口。为了美观和防止屏幕脱落,可以在内侧设计一个台阶用于承托屏幕模块。
- 按钮孔:如果设计了一个复位按钮或模式切换按钮,需要在对应位置开圆柱孔。
- 电源/数据接口开口:在侧面为Arduino的USB接口和电源开关开一个U型槽。
- 散热孔:在顶部或侧面设计一些小的圆形或菱形阵列孔,帮助电路散热。
这个过程会大量用到“拉伸切除”和“组合”菜单下的“切割”布尔运算。我会提醒学生,每做一个切除操作前,最好先保存一下,或者使用“时间轴”回退功能,这是避免建模崩溃的好习惯。
3.4 第四步:细节优化与装配验证——让设计更可靠基础结构完成后,进行“虚拟装配”。将测量好的传感器、Arduino板、屏幕的简化模型(可以做成方块)导入到Fusion 360,装配到外壳内部。检查是否有干涉(比如螺丝柱顶到了芯片),空间是否足够走线。然后添加一些工程细节:
- 螺丝柱:在底壳内部角落,设计4个带通孔(用于M3螺丝)的圆柱,用于固定主板。螺丝柱的高度要确保主板安装后,其背面的插针不会碰到底壳内壁。
- 卡扣或螺丝孔:设计上盖与底壳的连接方式。对于中学生,我更推荐使用螺丝连接(在四角设计带螺柱的孔位),比卡扣更可靠,打印容错率更高。可以在底壳设计沉头孔,让螺丝头埋进去。
- 圆角/倒角:对所有尖锐的边缘进行倒角处理(1-2mm),这不仅使外观更柔和,也能减少3D打印时的应力集中,使模型更坚固,同时避免划伤手。
最后,将完整的模型导出为STL格式,准备进行切片。
4. 3D打印实战:从STL到实物的关键参数设置
有了STL文件,下一步就是通过3D打印将它变为现实。这里我以最常用的FDM(熔融沉积)打印技术为例,使用Ultimaker Cura这款免费切片软件进行讲解。打印过程本身可以自动化,但前期的参数设置决定了成败。
4.1 模型检查与修复将STL文件导入Cura。首先,使用“视图”模式检查模型是否为“流形”(即水密性良好,没有破面)。有时从Fusion 360导出的STL会有微小错误,可以用Cura自带的“修复模型”功能或更专业的Netfabb进行修复。对于我们的外壳,要确保所有面都封闭,内部没有非流形几何体。
4.2 核心打印参数设置详解这是教学的重点,每一个参数都对应着一个物理或工程原理:
- 层高:通常设为0.2mm。层高越小,表面越光滑,但打印时间成倍增加。向学生解释,这就像画画时的笔触粗细,笔触细(层高低)画面细腻,但画得慢。
- 壁厚与顶底厚度:壁厚建议设置为喷嘴直径(通常0.4mm)的整数倍,如0.8mm或1.2mm。顶/底层厚度一般设置为层高的4-6倍(如0.8mm-1.2mm),以确保外壳顶部和底部完全密封,不透光且结实。
- 填充密度与模式:对于外壳这类需要一定强度的功能件,填充密度设置在15%-25%足够。填充模式选择“网格”或“三角形”即可,它们能提供良好的强度重量比。可以向学生展示不同填充率(如5%, 50%)的切片预览图,让他们直观理解内部结构。
- 支撑结构:这是最容易出问题的地方。我们的外壳通常主体部分不需要支撑,但如果设计了内凹的卡扣、或者螺丝柱内部有悬空,就必须开启支撑。支撑类型选择“可溶”或“易拆”,并将“支撑悬垂角度”设置为大于45度(比如50度)。一定要告诉学生,支撑与模型的接触面(“支撑顶面距离”和“支撑与模型间距”)可以适当调大(如0.2mm),这样后期拆除时会容易得多,避免损坏模型表面。
- 打印温度与速度:使用最通用的PLA材料,喷嘴温度205-215°C,热床温度60°C。打印速度,外壁速度可以慢一些(30-40mm/s)以保证外观质量,内壁和填充可以快一些(50-60mm/s)。首层速度一定要慢(20mm/s),这是保证模型牢牢粘在热床上的关键。
4.3 切片、预览与打印设置好参数后,点击“切片”。然后务必进入“预览”模式。这是让学生们兴奋的一步,他们可以逐层查看打印头是如何一层一层构建出他们的设计的。仔细检查支撑生成是否合理,有没有在不需要的地方生成支撑。确认无误后,将生成的Gcode文件保存到SD卡,开始打印。
实操心得:打印第一个原型时,我建议先打印一个缩小比例(比如50%)的模型,或者只打印外壳的关键部分(如带螺丝柱的一角),用来快速验证尺寸和装配是否合适。这能节省大量时间和耗材。PLA材料冷却后会收缩,孔洞的实际尺寸会比设计值小0.1-0.3mm,在设计螺丝孔时,可以预先将其直径放大0.2mm。
5. 电子系统搭建与编程:让温度计“活”起来
当3D打印的外壳还在机器上忙碌时,我们就可以在面包板上搭建电路、编写程序了。这部分是项目的“大脑”和“神经网络”。
5.1 电路连接图与接线逻辑我们需要一个清晰、可靠的连接方案。使用I2C总线可以极大简化接线:
| 元件 | 引脚 | 连接到 Arduino Uno |
|---|---|---|
| MLX90614 | VIN | 5V |
| GND | GND | |
| SCL | A5 (或SCL引脚) | |
| SDA | A4 (或SDA引脚) | |
| LCD 1602 (I2C) | VCC | 5V |
| GND | GND | |
| SCL | A5 (与传感器共用) | |
| SDA | A4 (与传感器共用) |
关键点:I2C总线允许多个设备共用SDA和SCL两条线,每个设备有唯一地址。MLX90614的默认地址是0x5A,而常见的I2C LCD模块地址通常是0x27或0x3F。这不会冲突。接线时,确保电源正负极不要接反,这是烧毁元件最常见的原因。对于中学生,我要求他们先用万用表的蜂鸣档检查每根杜邦线的通断,再连接电路。
5.2 Arduino编程:从读取数据到显示编程部分,我们使用Arduino IDE。首先需要安装两个库:用于MLX90614的Adafruit MLX90614 Library和用于LCD的LiquidCrystal_I2C。可以通过IDE的库管理器直接搜索安装。
#include <Wire.h> #include <Adafruit_MLX90614.h> #include <LiquidCrystal_I2C.h> // 初始化传感器对象 Adafruit_MLX90614 mlx = Adafruit_MLX90614(); // 初始化LCD对象,参数为(I2C地址, 列数, 行数) LiquidCrystal_I2C lcd(0x27, 16, 2); // 地址可能需要修改为0x3F void setup() { Serial.begin(9600); // 启动LCD,并打开背光 lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("IR Thermometer"); lcd.setCursor(0, 1); lcd.print("Initializing..."); // 启动传感器 if (!mlx.begin()) { lcd.clear(); lcd.print("Sensor Error!"); while (1); // 如果传感器初始化失败,就停在这里 } delay(2000); lcd.clear(); } void loop() { // 读取物体温度和环境温度(摄氏度) float objectTemp = mlx.readObjectTempC(); float ambientTemp = mlx.readAmbientTempC(); // 在LCD第一行显示物体温度 lcd.setCursor(0, 0); lcd.print("Object: "); lcd.print(objectTemp, 1); // 显示一位小数 lcd.print((char)223); // 显示度符号 lcd.print("C"); // 在LCD第二行显示环境温度 lcd.setCursor(0, 1); lcd.print("Ambient: "); lcd.print(ambientTemp, 1); lcd.print((char)223); lcd.print("C"); // 也可以通过串口监视器查看,方便调试 Serial.print("Object = "); Serial.print(objectTemp); Serial.println(" *C"); Serial.print("Ambient = "); Serial.print(ambientTemp); Serial.println(" *C"); delay(1000); // 每秒更新一次 }代码逻辑解析:在setup()中,我们初始化了LCD和传感器。mlx.begin()会尝试通过I2C与传感器通信,如果失败(比如接线错误或地址不对),程序会卡住并提示错误,这是一个简单的故障排查机制。在loop()中,我们每秒读取一次数据,并格式化输出到LCD屏幕。(char)223是度符号(°)的ASCII码。串口输出部分对于调试至关重要,当LCD显示不正常时,打开串口监视器看数据是否正确,能快速定位是传感器问题还是显示问题。
5.3 常见问题与调试技巧
- LCD不显示:首先检查背光是否亮起(调整I2C模块上的电位器)。然后检查I2C地址,使用一个简单的I2C扫描程序(Arduino IDE示例中有)来确认LCD模块的真实地址,将代码中的
0x27改为扫描到的地址。 - 温度读数异常(如-273°C或999°C):这通常是I2C通信失败。检查SDA、SCL是否接反或接触不良,检查传感器是否供电正常。确保没有其他程序占用串口监视器。
- 测量值偏差大:MLX90614默认发射率(Emissivity)为0.95,适用于大多数有机材料和氧化表面。但如果测量光亮金属表面,读数会严重偏低。这时可以向学生引入“发射率”概念,并演示如何通过修改库文件或查找传感器手册,发送I2C命令来调整发射率参数。这是一个很好的拓展知识点。
6. 系统集成、测试与项目拓展
当外壳打印完成,电路和程序也调试通过后,就进入了最激动人心的集成与测试阶段。
6.1 装配的艺术小心地将Arduino主板用M3螺丝固定在外壳内部的螺丝柱上。将MLX90614传感器从前方孔洞伸出,可以用一点热熔胶在内部固定其电路板,确保探头方向朝前且稳固。将I2C LCD屏幕嵌入顶部的窗口,同样用热熔胶或卡槽固定。最后,将所有连接线用扎带或胶布整理好,避免杂乱。盖上上盖,拧紧螺丝。一台亲手制作的、有模有样的非接触式红外温度计就诞生了。
6.2 测试与误差分析让学生们用自己的作品进行一系列测试:
- 基准对比:测量一杯已知温度的水(用水银温度计或高精度电子温度计校准),记录红外温度计的读数,计算误差。
- 人体测温:测量自己或同学的手心、额头温度,与医用额温枪对比。讨论为什么测量额头(皮肤暴露、无遮挡)比测量手心(可能出汗、握拳)更接近真实体温。
- 环境影响:在空调出风口、阳光下、阴凉处分别测量同一物体的温度,观察环境温度(
ambientTemp)的变化以及其对物体温度读数的影响。MLX90614内部已经做了环境温度补偿,但这个实验能让学生理解补偿的重要性。 - 发射率实验(拓展):尝试测量黑板擦(橡胶/塑料)、不锈钢水杯、一张白纸。引导学生发现不同材质表面的测量差异,并解释这是由于它们的红外发射率不同。
6.3 项目拓展与思考一个基础版本完成后,这个项目还有巨大的拓展空间,可以满足不同兴趣和层次学生的需求:
- 功能拓展:增加一个按钮,实现摄氏度和华氏度的切换;增加一个蜂鸣器,当检测到温度超过设定阈值(如37.5°C)时报警。
- 数据记录:增加一个SD卡模块,将温度数据连同时间戳保存到txt文件中,用于长期环境监测。
- 无线传输:用ESP8266或ESP32替换Arduino Uno,将温度数据通过Wi-Fi上传到物联网平台(如Blynk、ThingsBoard),在手机APP上远程查看。
- 结构优化:根据第一版原型的使用反馈,用Fusion 360修改外壳设计。比如增加一个扳机式的按钮结构、设计一个可折叠的支架、优化散热孔布局等,然后打印V2.0版本。
这个“3D+Arduino”红外温度计项目,就像一颗种子。它从测量一个简单的温度开始,却生根发芽,触及了工业设计、电子工程、计算机编程和物理学的多个基础领域。对于中学生而言,最重要的不是做出了一个多么精密仪器,而是在这个动手实现的过程中,建立起的系统化思维、解决真实问题的能力,以及那份“我能创造”的自信。当看到他们举着自己设计打印、自己编程调试的温度计,像发现新大陆一样测量周围一切物体时,你就知道,工程与创新的火花,已经被点燃了。
