1. 项目缘起从一堆模块到无线称重台最近在工作室整理物料翻出来一堆之前玩过的Hexabitz模块。Hexabitz这个平台挺有意思的它把各种功能比如处理器、传感器、无线通信、电机驱动都做成了一个个可以任意拼接的六边形小模块用磁吸接口一碰就能连上既解决了物理连接也自动完成了电路和软件上的组网。看着这些模块我就在想能不能用它们快速搭一个有点实用价值的东西出来正好手边有个厨房电子秤坏了于是念头就来了用Hexabitz模块组一个无线智能称重台。这个想法听起来简单但细想下来挺有玩头。传统的电子秤显示和称重传感器是一体的你要读数就得凑过去看。而我想做的这个“无线Scale”核心是把“感知”和“显示/控制”彻底分开。称重传感器模块可以放在厨房台面下、货架底部等任何不起眼的地方而显示终端可以是一个放在手边的小屏幕甚至是手机或电脑。数据通过无线实时同步你不需要弯腰或移动物品就能看到重量变化。这对于烘焙时精确控制配料、实验室记录试剂添加量、甚至是一些小型仓储管理场景都挺实用的。项目涉及几个核心模块H0FR6x作为主控和无线中枢、H3R9x高精度模拟前端用于读取称重传感器、H1FR6x带屏幕的模块作为显示终端以及最重要的——一个合适的称重传感器比如常见的铝合金悬臂梁式传感器。整个项目的挑战不在于单个模块的使用而在于如何让这些模块在无线Mesh网络中稳定、可靠、低延迟地协同工作并处理好传感器数据的校准、滤波和传输。2. 硬件选型与系统架构设计2.1 核心模块功能解析Hexabitz项目的乐趣在于像拼乐高一样组合功能。针对这个无线称重项目我选择的模块组合和理由如下主控与网络协调器H0FR6x系列我选用的是H0FR6。它是基于STM32的模块自带ARM Cortex-M处理器和Sub-1GHz射频芯片。在这个项目中它承担两个核心角色一是作为整个Hexabitz网状网络的协调器管理模块间的发现、路由和通信二是运行主要的应用程序逻辑包括读取传感器数据、处理、并通过无线发送给显示端。选择Sub-1GHz而非蓝牙或Wi-Fi是考虑到穿透性和抗干扰能力更强适合家庭或小工作室环境传输距离更有保障。高精度模拟前端H3R9x系列称重传感器的输出是微弱的毫伏级差分信号需要高精度的ADC来采集。H3R9模块集成了24位Σ-Δ ADC和可编程增益放大器专门用于桥式传感器如称重传感器、压力传感器。它的精度和噪声指标远优于普通MCU内置的ADC是获得稳定、准确重量读数的硬件基础。我将它直接与称重传感器连接并通过Hexabitz的串行接口与H0FR6主控模块通信。显示终端H1FR6x系列我手头有一个H1FR6它集成了一个小型OLED屏幕和几个按键。它作为远程显示单元通过无线接收来自主控模块的重量数据并实时显示。同时其上的按键可以用于实现“去皮”、“单位切换”、“校准”等交互功能。它的存在使得整个系统无需依赖手机或电脑是一个独立的终端设备。称重传感器与配套电路我选用了一个量程5kg的铝合金悬臂梁式称重传感器型号类似HBM Z6。这类传感器通常需要组成一个全桥电路并需要一个稳定的激励电压通常5V或10V。H3R9模块可以提供这个激励电压。此外还需要设计一个坚固的机械结构承重台来安装传感器确保受力方向正确这是精度的重要保证往往比电路本身更重要。2.2 无线Mesh网络拓扑规划Hexabitz模块上电后会自动寻找邻居并形成网状网络。对于本项目最简单的拓扑是星型H0FR6作为中心H3R9和H1FR6作为终端节点直接与之通信。但Hexabitz的优势在于自组网和多跳路由。我可以设计更灵活的布局方案A紧凑型所有模块物理上拼接在一起放在称重台内部。H3R9读取传感器H0FR6处理数据H1FR6显示。无线功能主要用于未来扩展比如再增加一个远程的H1FR6放在别处。这种方案布线最简单但显示部分位置固定。方案B分离式H3R9和称重传感器安装在承重台内部。H0FR6可以放在稍远一点比如1米内的位置通过有线与H3R9连接负责数据处理和无线发射。H1FR6作为完全无线的显示终端可以在房间内任意位置移动。这种方案充分发挥了无线显示的优势。方案C多终端中继如果房间结构复杂一个H1FR6信号不佳可以增加一个H0FRx或H0FR6模块作为中继节点扩展无线覆盖范围确保显示终端在任何位置都能稳定接收数据。我最终采用了方案B因为它最贴合“无线”和“灵活”的项目初衷。H0FR6与H1FR6之间通过Sub-1GHz射频通信实测在非屏蔽的室内环境下穿透两堵砖墙后信号依然稳定延迟在可接受的100毫秒以内。注意在规划模块位置时要尽量避免将无线模块紧贴大型金属物体或放置在封闭的金属盒内这会严重衰减射频信号。我的承重台是亚克力材质对信号影响很小。3. 固件开发从驱动程序到应用逻辑硬件连接好后真正的挑战在软件。Hexabitz提供了基于FreeRTOS的HAL库和一套消息传递框架我们需要在此基础上编写固件。3.1 H3R9模块的传感器驱动与数据采集首先是为H3R9模块编写称重传感器驱动程序。核心步骤是配置其内部寄存器初始化配置通过Hexabitz消息接口向H3R9发送配置命令。需要设置PGA增益根据传感器灵敏度选择我用的传感器2mV/V在5V激励下满量程输出10mV故选择PGA128倍、输出数据速率ODR我选择10Hz以平衡响应速度和噪声、以及启用内部基准电压等。数据读取循环在主控模块H0FR6上创建一个任务定期例如每秒10次向H3R9发送读取ADC值的命令。H3R9会返回一个24位的原始数据。原始值转换这个原始值是一个有符号整数需要转换为电压再转换为重量。公式大致为电压 (原始值 / (2^23 - 1)) * 参考电压 / PGA增益重量 (电压 - 零点电压) / 灵敏度其中“零点电压”是空载时的输出电压“灵敏度”是单位重量对应的电压变化mV/kg这两个参数需要通过校准获得。这里的一个关键点是数字滤波。称重传感器读数会存在高频噪声。我在H0FR6的固件中实现了一个简单的滑动平均滤波器窗口大小为10个样本效果显著。对于更复杂的抖动可以考虑使用一阶低通滤波软件实现。// 伪代码示例在H0FR6上处理H3R9数据的任务片段 void WeightSensor_Task(void *argument) { int32_t raw_adc_buffer[10] {0}; uint8_t index 0; float filtered_weight 0.0; while(1) { // 1. 发送命令读取H3R9的ADC值 sendMessageToModule(H3R9_ID, CMD_READ_ADC, NULL, 0); // ... 等待并接收回复解析出raw_adc ... // 2. 更新滑动平均缓冲区 raw_adc_buffer[index] raw_adc; index (index 1) % 10; // 3. 计算平均值 int64_t sum 0; for(int i0; i10; i) sum raw_adc_buffer[i]; int32_t avg_raw sum / 10; // 4. 转换为重量 (需预先校准) // filtered_weight (avg_raw - cal_zero_offset) * cal_scale_factor; // 5. 将重量数据发布到无线消息队列供显示模块订阅 postWeightToWirelessQueue(filtered_weight); osDelay(100); // 10Hz采样 } }3.2 无线通信协议与消息设计Hexabitz的无线栈已经处理了底层的射频和网络层。我们需要定义应用层的消息协议。我设计了一个非常简单的结构消息类型WEIGHT_UPDATE(0x01)载荷一个4字节的浮点数单精度float表示当前重量单位克。在H0FR6端每当滤波后的重量值有显著变化例如变化超过0.1克时就组播一条WEIGHT_UPDATE消息。组播地址可以设定为一个项目专用的地址这样网络中所有对此感兴趣的模块如H1FR6显示模块都能收到。在H1FR6显示模块端固件需要订阅这个组播地址。一旦收到WEIGHT_UPDATE消息就解析出浮点数重量值并刷新OLED屏幕的显示。实操心得无线通信最怕数据洪流。不要以采样率如10Hz来无线发送数据这毫无必要且浪费带宽、增加干扰。应该只在“值发生变化且变化超过某个阈值”或“定期但较低频率如1Hz发送心跳包”时才发送。我采用了“变化超过0.1克或距离上次发送超过1秒”的双重条件极大降低了无线流量。3.3 H1FR6显示模块的人机交互H1FR6的固件相对独立。它的主要任务是连接无线网络订阅重量更新组播。在OLED屏幕上以清晰易读的字体显示重量例如“235.6 g”。响应按键事件。我定义了三个按键KEY1去皮将当前重量值设为新的零点。KEY2单位切换在克g、千克kg、盎司oz之间循环切换。这只需要在显示端进行单位换算即可无需通知主控。KEY3校准模式长按进入校准模式此时屏幕显示引导信息需要与主控模块配合完成两点校准零点校准和满量程校准。校准参数需要存储到H0FR6的Flash中。显示模块的UI刷新也需要优化。不要每次收到无线消息就全屏刷新这样会导致屏幕闪烁。我只刷新重量数字变化的区域。Hexabitz的图形库通常支持局部更新功能。4. 系统校准与精度提升实战一套称重系统是否可用校准是关键。DIY项目的精度往往就卡在这一步。4.1 两点校准法实操校准的目的是得到前面公式中的“零点偏移”和“缩放因子”。我采用经典的两点法零点校准确保承重台上无任何物品。通过H1FR6的按键触发零点校准命令该命令通过无线发送给H0FR6。H0FR6收到命令后连续采集100个H3R9的原始ADC值取平均值将此值存储为cal_zero_raw。满量程或已知重量点校准在承重台上放置一个已知精确重量的砝码。我使用了一个经过计量的500g标准砝码。同样通过H1FR6触发满量程校准并输入已知重量值500.0。H0FR6采集加载砝码后的100个原始ADC平均值记为cal_weight_raw。计算缩放因子scale_factor 已知重量 / (cal_weight_raw - cal_zero_raw)将cal_zero_raw和scale_factor存储到STM32的Flash备份区域或EEPROM模拟区。此后任何一次测量的重量计算为weight (current_raw - cal_zero_raw) * scale_factor4.2 影响精度的常见因素与处理即使校准后读数可能仍有漂移或跳动。以下是我遇到并解决的问题温度漂移传感器和放大器的特性会随温度变化。在长时间工作或环境温度变化大时会发现零点缓慢漂移。对于要求不高的场合可以定期如每小时自动进行零点校准前提是能确保台上无物。对于更高要求需要考虑使用温度传感器进行软件补偿但这会复杂很多。机械安装应力这是最大的坑如果称重传感器安装不平、受力点歪斜、或者固定螺丝拧得太紧导致壳体变形都会引入巨大的非线性误差和重复性误差。务必确保传感器只承受垂直方向的力并且安装底座和压头平整、牢固但不过度挤压传感器本体。我最初用3D打印的支架发现重复性很差后来改用精加工的铝合金支架效果立竿见影。电源噪声为H3R9和传感器提供干净的电源至关重要。如果使用开关电源噪声可能被引入信号链。我最终选择使用一块线性稳压芯片如LM317为传感器桥路和H3R9的模拟部分供电数字部分则用单独的DCDC模块。地线的布局也要注意模拟地和数字地单点连接。数字滤波参数调优滑动平均的窗口大小需要权衡。窗口太小滤波效果差窗口太大重量变化响应迟钝。对于10Hz的采样率窗口大小5-15是一个合理的范围。可以通过实验观察放上物品后显示值稳定下来的速度和稳定后的波动幅度来调整。5. 项目扩展与进阶玩法基础功能实现后这个无线称重台可以扩展出很多有趣的应用多传感器融合与多点称重可以使用多个H3R9模块和称重传感器组成一个大型称重平台比如货架。每个H3R9负责一个“支点”H0FR6主控汇总所有数据计算总重甚至可以估算重心位置。这在一些简单的仓储或实验设备中有应用场景。数据记录与云端同步为H0FR6增加一个ESP8266 Wi-Fi模块通过Hexabitz的UART接口连接就可以将每次称重的数据带时间戳上传到物联网平台如ThingsBoard、阿里云IoT或简单的私有服务器。这样就可以实现烘焙配方步骤的重量记录、实验室样品称重日志等。阈值报警与自动化触发在固件中设置重量阈值。例如当重量低于某个值时说明物料快用完了通过无线消息触发另一个Hexabitz模块如H0FRx控制一个LED灯闪烁报警或者通过Wi-Fi模块发送一封提醒邮件。与PC软件集成在电脑上写一个简单的Python程序通过USB转TTL适配器连接一个Hexabitz模块作为无线接收节点实时接收重量数据并绘制曲线图。这对于需要观察重量变化过程的实验如吸水率、蒸发率非常有用。改进用户界面使用分辨率更高的彩色屏幕模块如果Hexabitz有提供可以显示重量曲线图、历史记录列表或者更丰富的菜单系统。这个项目的核心价值不在于做出了一个比市售电子秤更便宜或更精确的产品而在于它完整地演示了一个基于模块化、无线Mesh网络的物联网设备从硬件选型、网络搭建、嵌入式编程到校准调试的全过程。每一个环节遇到的问题和解决方案对于从事嵌入式或物联网开发的爱好者来说都是非常宝贵的实战经验。Hexabitz平台极大地降低了硬件连接和底层通信的复杂度让我们能把更多精力集中在应用逻辑和性能优化上。下次如果你手头也有一些功能模块不妨也试试把它们组合起来解决一个实际的小问题这个过程带来的成就感远超单纯地调用一个API。