1. 项目概述
这个智能体重秤项目是我去年为一个健康管理创业团队开发的硬件解决方案。相比传统体重秤仅能显示数字,我们基于STM32设计的这款产品可以记录用户数据、分析健康趋势,甚至通过蓝牙与手机APP联动。现在市面上很多所谓"智能体重秤"其实只是加了个蓝牙模块,而我们从硬件选型到算法优化都做了深度定制。
选择STM32作为主控有几个关键考量:首先是低功耗特性非常适合这种需要长期待机的设备;其次是丰富的外设接口能轻松连接称重传感器、显示屏和无线模块;最重要的是STM32的性价比在消费级硬件中非常突出。下面我会从硬件设计、软件实现到实际调试中的坑,完整分享这个项目的开发过程。
2. 硬件设计解析
2.1 核心器件选型
称重传感器我们最终选择了HX711模块,这个组合有几个实际优势:
- 24位ADC分辨率,对于家用级体重测量完全够用
- 内置可编程增益放大器(PGA),能直接连接应变片
- 成本控制在20元以内,远低于工业级方案
在对比测试时发现,市场上常见的5kg/10kg传感器其实不适合人体测量。经过多次实测,我们选用了150kg量程的铝合金悬臂梁传感器,这样既保证测量范围(考虑用户可能提重物称重),又不会因量程过大影响精度。实际测试中,这个配置可以达到±50g的重复测量精度。
2.2 电路设计要点
电源管理是容易被忽视的关键点。我们的方案是:
- 采用TP4056充电管理芯片配合18650锂电池
- 加入LDO稳压电路确保传感器供电稳定
- 通过MOS管实现自动开关机(用户站上秤自动唤醒)
特别要注意的是称重传感器的布线:
c复制// 正确的四线制接法
HX711.DOUT -> STM32_PA1
HX711.PD_SCK -> STM32_PA2
HX711.VCC -> 3.3V_LDO
HX711.GND -> AGND
警告:千万不要把传感器电源直接接到STM32的3.3V输出!我们早期样机就因为这个设计导致测量值漂移严重,后来单独用LDO供电才解决。
3. 软件实现细节
3.1 称重算法优化
原始数据需要经过三重处理:
- 滑动平均滤波(窗口大小取10)
- 温度补偿(通过DS18B20采集环境温度)
- 动态去皮重(检测到连续5次测量值<2kg时自动清零)
核心算法实现:
c复制float get_filtered_weight() {
static float buffer[10];
static uint8_t index = 0;
buffer[index] = hx711_read();
index = (index + 1) % 10;
float sum = 0;
for(int i=0; i<10; i++) {
sum += buffer[i];
}
return sum / 10 * calibration_factor;
}
3.2 低功耗设计
通过以下措施使待机电流降至15μA:
- 关闭所有不用的外设时钟
- 进入STOP模式等待中断唤醒
- 蓝牙模块采用事件触发式通信
实测下来,800mAh的电池可以支持超过6个月的使用。关键配置:
c复制void enter_low_power() {
HAL_ADC_DeInit(&hadc);
HAL_UART_DeInit(&huart1);
__HAL_RCC_GPIOA_CLK_DISABLE();
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
}
4. 蓝牙通信协议
4.1 数据帧设计
采用自定义精简协议提高传输效率:
code复制| 头(0xAA) | 长度(1B) | 命令(1B) | 数据(NB) | 校验(1B) |
典型数据包示例:
- 实时体重:AA 05 01 62 00 00 3C
(表示98.0kg,电池剩余60%) - 历史记录:AA 0D 02 20231115 62 00 3C
4.2 手机端配对优化
发现安卓手机经常连接失败,最终解决方案:
- 增加BLE广播间隔至200ms
- 实现双模蓝牙(4.0+2.1)
- 添加连接超时重置功能
实测连接成功率从67%提升到98%:
c复制void ble_adv_config() {
hci_le_set_adv_interval(320, 320); // 200ms
hci_set_ble_adv_mode(ADV_IND);
hci_set_ble_scan_rsp_data(scan_rsp_data, sizeof(scan_rsp_data));
}
5. 生产测试方案
5.1 自动化校准系统
开发了基于Python的测试工装:
- 机械臂自动加载标准砝码
- 通过USB转TTL读取设备输出
- 自动计算并写入校准系数
测试流程耗时从人工的3分钟缩短到20秒,且精度一致性更好。
5.2 老化测试发现的问题
连续72小时测试暴露了两个隐患:
- 电池连接器在200次插拔后接触不良 → 改用Pogo Pin
- 塑料外壳在高温高湿环境变形 → 增加硅胶密封圈
6. 实际应用反馈
用户最在意的三个功能点:
- 测量响应速度(我们优化到0.8秒内稳定)
- 多人识别准确率(通过动态阈值算法达到92%)
- 历史趋势图显示(采用压缩存储算法节省Flash)
有个有趣的发现:约30%的用户会同时称重随身物品,所以我们后来增加了"物品称重"模式,通过长按3秒激活。这个小改动使产品好评率提升了18%。
7. 关键问题排查记录
-
测量值跳变:
- 检查传感器固定螺丝是否松动
- 测量供电电压波动应<10mV
- 重新校准零点(需空载保持10秒)
-
蓝牙断连:
- 确认天线周围没有金属遮挡
- 更新蓝牙模块固件至v2.3+
- 检查PCB天线阻抗匹配(应50±5Ω)
-
耗电异常:
- 用电流表检测待机电流(应<20μA)
- 检查所有GPIO配置是否正确
- 确认没有外设漏电
这个项目给我的最大启示是:消费电子产品的稳定性比参数更重要。我们放弃了把精度做到±10g的想法,转而确保在各种家居环境下都能可靠工作。现在这个设计已经量产超过1万台,返修率控制在0.3%以下。
