ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于Hexabitz模块化系统快速构建红外测温仪:从原理到实践

基于Hexabitz模块化系统快速构建红外测温仪:从原理到实践 1. 从零到一为什么选择Hexabitz来造一个红外测温仪如果你和我一样是个喜欢鼓捣硬件的创客或者是个需要快速验证产品原型的工程师那你肯定对“模块化”这个词不陌生。市面上有Arduino、树莓派还有各种功能单一的传感器模块它们让电子项目变得像搭积木一样简单。但不知道你有没有遇到过这样的烦恼当你把一堆模块用杜邦线连起来准备大干一场时却发现面包板上线缆乱成一团稍微一碰就接触不良或者想做个稍微复杂点的、带点“智能”的设备比如能联网、能多传感器协同的光是协调不同模块的通信和供电就够头疼半天。这就是我最初接触Hexabitz时最兴奋的地方。它不是一个简单的传感器模块而是一套完整的、革命性的模块化电子系统。你可以把它想象成电子世界的“乐高”但比乐高更强大——每个Hexabitz模块都是一个六边形的“小岛”它们不仅自带处理器还能通过边缘的磁性连接器和金手指触点实现物理、电气和通信的“三合一”连接。啪嗒一声两个模块吸在一起电源、地线、数据通信瞬间就通了连焊锡和杜邦线都省了。所以当我需要做一个红外测温仪时Hexabitz几乎是自然而然浮现在脑海里的首选。传统的做法你可能需要一个红外测温传感器比如MLX90614、一个主控板比如STM32或Arduino、一个显示屏、一个电源模块然后自己画PCB或者用万用板飞线焊接。这个过程对新手不友好对老手来说也耗时耗力。而用Hexabitz事情就变得优雅多了我只需要挑选对应的功能模块像拼图一样把它们组合起来写点简单的代码一个功能完整、结构坚固的原型就诞生了。这不仅仅是“做出来”而是“快速、可靠、美观地做出来”特别适合产品概念验证、教育演示甚至是小批量的定制化设备生产。这个“Hexabitz Infrared thermometer”项目核心就是利用Hexabitz的模块化特性快速构建一个非接触式体温/物体表面温度测量装置。它不仅仅是读取一个传感器数据那么简单我们将利用Hexabitz分布式系统的特点探索如何优雅地处理传感器数据、设计人机交互界面甚至为未来添加蓝牙上传、数据记录等扩展功能预留架构。接下来我会带你一步步拆解这个项目的每一个环节从模块选型到代码逻辑从结构设计到校准心得分享我踩过的坑和收获的技巧。2. 核心模块选型与系统架构设计做硬件项目第一步永远是“用什么”和“怎么连”。对于Hexabitz项目这步尤其重要因为模块的选择直接决定了系统的能力上限和扩展性。我们的红外测温仪核心功能无非是测、显、控。围绕这三点我们来搭建系统的骨架。2.1 功能模块分解与选型理由一个最基本的红外测温仪需要以下核心部件红外温度传感器模块这是项目的“眼睛”。我选择的是H0FR1x模块。这个模块集成了Melexis的MLX90614ESF红外测温芯片。为什么是它首先MLX90614是行业内的明星产品精度和稳定性经过大量验证。H0FR1x模块将其封装好提供了标准的I2C接口并通过Hexabitz的H01R0x主控模块进行管理省去了我们驱动底层传感器的麻烦。它测量物体温度TObj和环境温度TAmb两个值通过简单的函数调用即可获取。主控模块这是项目的“大脑”。我选择H01R0x系列模块例如H01R08。它是基于ARM Cortex-M0内核的微控制器模块。选它的理由很充分它性能足够处理传感器数据和逻辑控制它作为Hexabitz系统的核心负责运行我们编写的顶层应用代码并管理与其他模块的通信。所有的业务逻辑比如读取温度、判断是否发烧、控制显示等都将在这里实现。显示模块这是项目的“嘴巴”。为了有良好的用户体验一个清晰的显示屏必不可少。我推荐使用H0BR8xOLED显示模块。它尺寸小巧分辨率高128x64对比度高即使在光线一般的情况下也清晰可见。相比于LCDOLED无需背光更省电。我们将用它来实时显示测量到的温度值、单位℃/℉以及简单的状态提示如“就绪”、“测量中”。输入模块这是项目的“手”。我们需要一种方式让用户进行操作比如切换测量模式物体/体温、校准、查看历史数据等。最经济实用的选择是H0SR2x模块它提供了两个轻触开关。我们可以定义其中一个为“测量键”另一个为“模式切换键”。如果追求更交互也可以选用带旋转编码器的模块但两个按键对于初版原型来说完全够用。电源模块这是项目的“心脏”。稳定的供电是一切的基础。根据使用场景可以选择H03R0x电池管理模块搭配锂电池实现便携移动测量或者选择H0FR4xUSB-C供电模块通过USB线缆供电适合桌面固定使用。对于测温仪我建议使用电池方案真正实现无线便携。H03R0x模块集成了充电、升压和保护电路非常省心。注意Hexabitz模块型号末尾的‘x’代表引脚配置变体在购买和设计结构时需要留意其接口位置确保能拼合成你想要的形状。2.2 系统拓扑与通信规划选好模块后接下来就是怎么拼。Hexabitz模块可以拼合成任意形状但为了结构紧凑和走线合理我们需要提前规划拓扑。对于这个测温仪一个线性的“一字长蛇阵”或者紧凑的“2x2”阵列都是不错的选择。我最终采用的布局是[电源模块] - [主控模块] - [显示模块]作为核心主干将[红外传感器模块]和[输入模块]作为分支连接到主控模块的另外两侧。这样的好处是显示模块位于中间便于观看传感器模块可以单独伸出来方便对准被测物按键模块放在侧面方便单手操作。在Hexabitz世界里模块间通过基于消息传递的BitzTalk协议通信。每个模块在工厂都被赋予了一个唯一ID并在系统中有一个别名如P1 P2。在我们的系统中假设分配如下P1主控模块 (H01R0x) - 大脑P2显示模块 (H0BR8x) - 显示屏P3红外传感器模块 (H0FR1x) - 温度探头P4输入模块 (H0SR2x) - 按键P5电源模块 (H03R0x) - 电池应用程序运行在主控模块P1上。当用户按下P4的按键时P4会发送一个消息给P1“按键1被按下”。P1收到后执行对应的函数例如调用P3的API读取温度然后将结果格式化成字符串再发送消息给P2“请在屏幕上显示‘36.5℃’”。这一切都在后台通过消息队列完成我们编程时只需要关注“发生什么事件”和“要做什么事”底层通信由Hexabitz框架自动处理极其清晰。这种分布式架构的优势在后期扩展时非常明显。比如我想增加一个蜂鸣器模块H0FR3x来做高温报警只需要把它拼接到系统任意位置在P1的代码里添加一条控制指令即可无需改动硬件连线。3. 硬件组装与结构设计要点模块选好了规划好了接下来就是动手把它们变成实物。这一步看似简单但细节决定成败特别是你想做一个握持舒适、看起来不像“玩具”的测温仪的话。3.1 模块拼装与电气检查首先按照之前规划的拓扑将模块的六边形边对准利用其磁吸特性“咔哒”一声扣合。务必确保每个连接边都紧密吸合听到清脆的响声。连接后金手指触点会互相接触完成电路连接。关键检查步骤供电顺序首次组装时建议先不要安装电池或连接USB。将所有模块拼好后再上电。如果条件允许使用可调电源限流供电观察启动电流是否正常。LED状态每个Hexabitz模块上都有一个多色LED。上电后观察所有模块的LED是否进入正常的呼吸或闪烁状态具体模式取决于固件。如果某个模块的LED不亮或常亮异常首先检查它与相邻模块的物理连接是否牢固尝试重新扣合。可能是触点氧化或未对准。拓扑检测通过Hexabitz的桌面软件“Hexabitz Studio”连接主控模块通常通过其USB接口。在软件中查看“拓扑探索”功能确认软件识别出的模块数量和ID是否与你物理组装的一致。如果不一致说明某个模块的通信链路有问题需要逐段排查。3.2 外壳设计与3D打印实践裸板使用不仅不安全也影响体验。一个定制的外壳至关重要。我的设计思路是人体工学外壳设计成适合单手握持的枪形或长方体在侧面预留按键孔在顶部为红外传感器开一个精确的圆形窗口注意窗口材料普通塑料会阻挡红外线需要使用专用的红外透光材料如聚乙烯PE或者直接开孔。模块固定外壳内部需要设计精确的卡槽用于固定每个Hexabitz模块防止其在内部晃动。卡槽的尺寸要略大于模块PCB尺寸0.2-0.3mm方便放入又不会太松。显示屏开窗为OLED屏幕设计一个透明亚克力盖板窗口并用卡扣或螺丝固定保护屏幕。电池仓如果使用电池模块需要设计可打开的电池仓门方便更换或充电。散热虽然功耗不大但避免完全密封可在外壳非关键部位设计一些细小的通风孔。我使用Fusion 360进行3D建模。一个重要的技巧是先在软件中绘制出所有Hexabitz模块的精确二维草图尺寸可从官网数据手册获取然后将其作为参考围绕它们来构建外壳的内壁。这样可以确保尺寸严丝合缝。打印材料建议使用PETG或ABS它们比PLA强度更高更耐温。打印完成后可能需要用小锉刀或砂纸对卡槽内部进行轻微修整以确保模块能顺利放入。组装时可以先用少量蓝丁胶临时固定模块测试所有功能无误后再用螺丝或卡扣最终锁紧外壳。4. 固件开发从模块配置到应用逻辑硬件准备就绪接下来就是赋予它灵魂——编写固件。Hexabitz开发主要在其基于Eclipse的IDE “Hexabitz Studio”中进行它集成了项目配置、代码编写、编译下载和调试于一体。4.1 项目创建与模块接口配置首先在Hexabitz Studio中创建一个新项目选择你的主控模块型号如H01R0x。IDE会自动生成一个包含基本框架的工程。最关键的一步是配置“接口阵列”Interfaces Array。这个配置定义了系统中每个模块的端口连接关系是BitzTalk通信的基础。你需要根据实际的物理连接在代码文件interfaces.h或通过IDE的可视化工具声明每个端口连接了哪个邻居模块的哪个端口。例如// 在 interfaces.h 中或通过IDE配置 // 假设主控模块P1的端口1连接了显示模块P2的端口1 #define interf1 {1, 2, 1} // {本地端口 远程模块ID 远程端口} // 假设主控模块P2的端口2连接了传感器模块P3的端口1 #define interf2 {2, 3, 1} // ... 以此类推系统上电时会基于这个配置表建立路由确保消息能正确送达目标模块。配置错误是导致通信失败最常见的原因务必反复核对。4.2 红外测温传感器驱动与数据读取配置好接口就可以开始写应用代码了。所有用户代码主要写在main.c的UserTask()函数中这是一个由系统调度器周期性调用的任务。首先我们要能读取温度。Hexabitz为H0FR1x模块提供了现成的API函数大大简化了操作。核心步骤包括初始化传感器这通常在系统启动时执行一次。你需要调用传感器模块的初始化函数。这个函数可能通过消息发送到P3执行。// 向模块3传感器发送初始化命令 uint8_t initMsg[] {‘I’, ‘N’, ‘I’, ‘T’}; // 示例命令实际需参考H0FR1x模块的API文档 SendMessageToModule(3, initMsg, sizeof(initMsg), 1); // 发送到端口1周期性读取温度在UserTask()中可以设置一个定时器或计数器每隔一定时间如500ms读取一次温度。不是直接调用函数而是向传感器模块发送“读取温度”的指令。// 定义读取温度的命令 uint8_t readTempMsg[] {‘R’, ‘E’, ‘A’, ‘D’}; SendMessageToModule(3, readTempMsg, sizeof(readTempMsg), 1);处理返回数据传感器模块执行读数后会将数据打包成消息发送回主控模块。你需要在主控模块中编写一个消息解析回调函数例如parseSensorData()来提取温度值。void parseSensorData(uint8_t* msg, uint16_t size) { // 假设消息格式为前两个字节是物体温度单位0.01摄氏度 int16_t rawTemp (msg[0] 8) | msg[1]; float objectTemp (float)rawTemp / 100.0; // 转换为摄氏度 // 将温度值存储到全局变量供显示任务使用 currentTemperature objectTemp; }这里的关键是理解传感器模块的通信协议和数据格式务必查阅H0FR1x模块的详细API文档。4.3 OLED显示与用户界面实现获取到温度数据后需要将其显示出来。我们通过向显示模块P2发送绘图或文本命令来实现。Hexabitz的显示模块API通常提供清屏、画点、画线、显示字符串等基本功能。一个简单的显示流程如下// 1. 清屏 uint8_t clearMsg[] {‘C’, ‘L’, ‘S’}; SendMessageToModule(2, clearMsg, sizeof(clearMsg), 1); // 2. 设置光标位置和显示温度字符串 char tempStr[20]; sprintf(tempStr, “Temp: %.1f C”, currentTemperature); // 格式化为字符串 // 发送显示文本的命令命令内容需包含坐标和字符串 // 假设命令格式为 ‘T’X坐标Y坐标字符串 uint8_t displayMsg[50]; displayMsg[0] ‘T’; // 文本命令 displayMsg[1] 10; // X坐标 displayMsg[2] 20; // Y坐标 strcpy((char*)displayMsg[3], tempStr); SendMessageToModule(2, displayMsg, 3strlen(tempStr), 1);为了有更好的UI你可以设计多屏界面比如第一屏显示实时温度第二屏显示最高/最低温度记录通过按键切换。这就需要维护一个简单的状态机根据当前状态决定显示什么内容。4.4 按键中断与状态机控制用户通过按键交互。我们需要配置输入模块P4的按键为中断模式。当按键按下时P4会发送一个中断消息给主控P1。在P1中我们需要监听并处理这些消息。// 在消息处理回调中 if (sourceModuleID 4) { // 消息来自按键模块 if (msg[0] ‘K’ msg[1] ‘1’) { // 假设‘K1’代表按键1 button1Pressed true; } }在主循环UserTask()中检查button1Pressed标志如果为真则执行相应的动作比如触发一次温度测量然后清除标志。这就是一个典型的事件驱动编程模型。结合显示和按键我们可以构建一个简单的状态机状态0待机显示“Ready”。短按测量键进入状态1。状态1测量中显示“Measuring...”读取温度持续2秒后进入状态2。状态2显示结果显示温度值和单位。长按模式键切换℃/℉短按测量键返回状态0。通过状态机可以让整个设备的逻辑变得非常清晰易于维护和扩展。5. 温度校准与精度提升实战红外测温尤其是用于人体测温时精度和可靠性是生命线。MLX90614本身出厂已校准但将其集成到具体产品中还会受到多种因素影响必须进行系统级的校准。5.1 影响精度的主要因素传感器自身误差虽然出厂校准但仍有少量个体差异。发射率设置MLX90614需要设置被测物体的发射率。人体皮肤的发射率约为0.98而不同材质金属、塑料、水差异巨大。我们的测温仪如果主要用于测人体应在固件中将发射率固定为0.98。环境温度补偿传感器内部会测量环境温度TAmb用于补偿传感器自身的热电堆读数。如果传感器模块自身因工作发热会导致TAmb读数偏高从而影响物体温度TObj的计算。这是DIY项目中一个极易被忽略的误差源测量距离与光路红外传感器有一定的视场角FOV。距离越远测量的区域越大。如果测量小目标物体距离太远会混入背景温度造成误差。我们的外壳开孔必须保证传感器前方光路畅通无遮挡或反射。外壳热干扰3D打印的外壳如果长时间握在手中其热量可能会传导至传感器模块影响其环境温度读数。5.2 两步校准法环境补偿与偏移修正我的校准方法分为两步需要准备一个高精度的接触式测温仪如热电偶温度计作为参考。第一步环境温度补偿校准目标消除传感器自身发热和环境热干扰带来的误差。 方法将组装好的测温仪不上电和参考温度计置于一个稳定的室温环境如25℃中至少1小时使其温度完全一致。记录参考温度计读数T_ref_env。给测温仪上电等待5-10分钟让系统热稳定。通过调试接口读取传感器报告的环境温度T_sensor_amb。计算环境温度偏移量offset_amb T_ref_env - T_sensor_amb。在固件中每次读取到原始的T_sensor_amb后都加上这个offset_amb得到修正后的环境温度再用于物体温度计算。许多MLX90614的驱动库允许你设置这个环境温度偏移量。第二步物体温度偏移校准目标修正整个系统包括发射率、光路等的测量偏差。 方法找一个温度稳定且均匀的黑体辐射源或替代品如装满热水并搅拌均匀的保温杯内壁用参考温度计测其表面温度。将测温仪对准目标在推荐距离根据传感器FOV和光斑大小确定例如对于MLX90614测量人体通常建议3-5厘米进行测量。记录测温仪读数T_sensor_obj和参考温度计读数T_ref_obj。计算物体温度偏移量offset_obj T_ref_obj - T_sensor_obj。在固件显示最终结果前将计算出的物体温度加上offset_obj。注意这个offset_obj可能在不同温度点略有不同。如果追求高精度可以在多个温度点如35℃、37℃、40℃进行测量建立一条简单的线性校正曲线y kx b在固件中进行分段或线性补偿。对于人体测温应用重点校准35-40℃这个区间。5.3 固件中实现校准参数存储校准参数offset_amb,offset_obj, 甚至k和b需要持久化保存掉电不丢失。Hexabitz主控模块内部有Flash存储区我们可以用它来存储这些参数。通常的做法是在Flash中划定一个专门的小区域避开程序存储区定义一个结构体来存放所有校准参数。上电初始化时从Flash读取这些参数通过一个特殊的校准模式如长按某个按键10秒进入在完成校准计算后将新参数写入Flash。务必注意Flash的擦写寿命通常10万次避免在正常使用中频繁写入。6. 项目优化、调试与扩展思考一个能工作的原型只是开始一个稳定、可靠、好用的产品还需要很多优化工作。6.1 电源管理与低功耗优化作为便携设备功耗至关重要。动态功耗管理在非测量时段让系统进入低功耗模式。例如等待按键唤醒。Hexabitz的H01R0x主控支持多种低功耗模式需要合理配置。外设功耗控制OLED屏幕是耗电大户。在待机时可以发送命令关闭显示并非仅清屏。传感器模块也可以在非测量周期置于休眠模式。电池电量监测H03R0x电池管理模块通常有电量监测功能。可以在屏幕上增加一个电池图标实时显示剩余电量提醒用户充电。6.2 稳定性调试与抗干扰通信可靠性在代码中增加重要消息的应答和超时重发机制。例如主控发送读数命令后如果1秒内未收到回复可以记录错误或重试。数据滤波红外测温数据可能会有微小跳动。可以在固件中实现简单的软件滤波比如连续读取5次去掉最大最小值后取平均或者使用一阶滞后滤波算法使显示值更稳定。异常处理增加对异常情况的处理。例如传感器读数超范围如100℃或0℃、通信连续失败等应在屏幕上显示明确的错误信息如“Err1”、“Err2”方便排查。6.3 功能扩展方向基于Hexabitz的模块化特性这个测温仪有巨大的扩展潜力数据记录增加一个SD卡存储模块H0FR7x将每次测量的温度、时间戳记录到CSV文件中用于健康追踪或工业巡检。无线传输增加蓝牙模块H0BR2x或Wi-Fi模块H0BR6x将测量数据实时发送到手机App或云端服务器实现远程监控和数据汇总。声光报警增加一个蜂鸣器模块H0FR3x和一个RGB LED模块H0SR0x。当温度超过设定阈值如37.3℃时触发声光报警提升警示效果。激光指示增加一个激光二极管模块可以发射一个可见光点明确指示测量光斑的中心位置提升瞄准精度。这个“Hexabitz Infrared thermometer”项目从想法到实物的全过程充分展示了模块化硬件开发的魅力。它不仅仅是完成了一个测温功能更是构建了一个可演进、可定制的小型嵌入式系统平台。当你掌握了这套方法你会发现开发硬件原型变得前所未有的快速和清晰。下次当你再有一个智能硬件的点子时不妨先想想“能不能用Hexabitz来实现” 答案很可能是肯定的。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进