1. 项目背景与核心价值
去年帮朋友改造宠物喂食器时,发现市面大多数产品存在三个痛点:定时精度差(机械结构卡粮)、远程控制延迟高(WiFi模块休眠机制不合理)、余粮监测形同虚设(仅靠时间推算)。这个项目正是为了解决这些实际问题而设计的混合架构方案。
系统采用STM32F103C8T6作为下位机主控,通过ESP8266与上位机(C# WinForm应用)通信,实现了0.5秒级喂食响应、±3g称重精度和可视化喂养记录。特别在电源管理上,通过分时唤醒策略使待机电流控制在12μA以下,两节18650电池可连续工作90天。
2. 硬件系统设计详解
2.1 核心器件选型对比
主控芯片对比测试数据:
| 型号 | 价格(元) | RAM | 定时器 | 低功耗模式 | 最终选择理由 |
|---|---|---|---|---|---|
| STM32F103C8T6 | 8.5 | 20KB | 4个 | 支持 | 性价比高,外设资源充足 |
| GD32F303CCT6 | 12.8 | 32KB | 6个 | 支持 | 成本超出预算 |
| STC8H1K08 | 3.2 | 1.25KB | 2个 | 不支持 | 资源不足,无法满足多任务需求 |
称重模块的实战教训:
最初选用常见的HX711+悬臂梁方案,实测发现两个致命缺陷:一是悬臂梁长期受压会产生形变(30天后误差达15g),二是HX711的采样速率导致喂食过程有2秒延迟。最终改用电阻应变片+24位ADC分立方案,通过四线制接法消除导线电阻影响,配合温度补偿算法将误差稳定在±3g内。
2.2 电源电路设计要点
低功耗实现的关键细节:
- 采用TPS62740降压芯片(效率93% @10μA负载)
- 电机驱动单独供电,与主电路用MOSFET隔离
- ESP8266固件修改:关闭DTIM信标,设置PSM模式
- 称重模块供电时序:仅在测量前200ms上电
实测电流数据:
| 工作模式 | 电流值 | 持续时间 |
|---|---|---|
| 深度睡眠 | 12μA | 23.5小时/天 |
| WiFi连接 | 80mA | 3秒/次 |
| 电机运转 | 450mA | 0.8秒/次 |
3. 下位机软件架构
3.1 实时任务调度设计
使用时间片轮询+中断的混合架构:
c复制void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
// 每15分钟唤醒执行
static uint8_t slot = 0;
switch(slot++ % 4){
case 0: check_food_level(); break; // 余粮检测
case 1: sync_ntp_time(); break; // 时间同步
case 2: send_status(); break; // 状态上报
case 3: self_test(); break; // 自检
}
}
喂食中断的防抖处理:
c复制void EXTI0_IRQHandler(void)
{
static uint32_t last = 0;
if(HAL_GetTick() - last > 1000){ // 1秒防抖
feed_now(); // 立即喂食
last = HAL_GetTick();
}
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
}
3.2 称重算法优化
动态去皮重算法流程:
- 上电后连续采样20次求基准值(空载)
- 每次测量前自动扣除基准值
- 滑动窗口滤波(窗口大小=8)
- 温度补偿公式:
code复制补偿值 = (当前温度 - 校准温度) × 0.03g/℃
实测误差对比:
| 算法版本 | 静态误差 | 动态误差(投食震动时) |
|---|---|---|
| 原始采样值 | ±8g | ±25g |
| 滑动窗口滤波 | ±5g | ±15g |
| 最终补偿算法 | ±3g | ±7g |
4. 上位机系统实现
4.1 通信协议设计
自定义的轻量级协议格式:
code复制[HEAD][LEN][CMD][DATA][CRC]
- HEAD: 0xAA 0x55(双字节唤醒)
- LEN: DATA长度(1字节)
- CMD: 指令码(喂食0x01/查询0x02等)
- DATA: JSON格式负载
- CRC: CCITT-16校验
关键优化点:
- 数据包最短15字节(含包头)
- 采用短连接策略(每次通信后断开)
- 重传机制:3次失败转存本地SD卡
4.2 喂养数据分析模块
使用DynamicDataDisplay库实现的曲线绘制:
csharp复制private void UpdateChart()
{
var now = DateTime.Now;
plotter.AddLineGraph(
dataContext.TemperatureSeries,
Colors.Red, 2, "温度(℃)");
// 智能预警算法
if(dataContext.FoodLevel < warningThreshold){
var ann = new CirclePointMarker {
Fill = Brushes.Orange,
Size = 10,
ToolTip = $"余粮不足预警:{dataContext.FoodLevel}g"
};
plotter.Children.Add(ann);
}
}
5. 系统测试与问题排查
5.1 电磁兼容性问题
初期遇到的电机干扰解决方案:
- 在电机两端并联1N4007+100μF电容组合
- 称重传感器信号线改用双绞屏蔽线
- PCB布局改进:
- 电机驱动回路面积缩小60%
- 模拟部分增加接地guard ring
5.2 典型故障速查表
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 称重值漂移 | 应变片受潮/温度补偿失效 | 用标准砝码校准,检查ADC基准电压 |
| WiFi频繁断开 | 路由器信道干扰 | 改用静态IP,固定5GHz信道 |
| 喂食量不准 | 步进电机失步 | 检查驱动电流,增加加速度斜坡 |
| 上位机数据显示滞后 | 数据库索引未优化 | 在feeding_records表建时间索引 |
6. 生产级优化建议
-
注塑外壳的防拆设计:
- 在螺丝孔内埋入霍尔传感器
- 非法开启触发系统锁定
- 必须通过上位机输入密码解锁
-
OTA升级方案:
mermaid复制sequenceDiagram 上位机->>下位机: 发送升级包(分片) 下位机->>上位机: 校验应答 loop 直到全部接收 上位机->>下位机: 下一分片 end 下位机->>上位机: 触发重启进入bootloader -
成本控制方案:
- 将STM32改为GD32(兼容pin to pin)
- 电阻应变片改用S型称重传感器(批量采购价<5元)
- 外壳采用公模二次加工
这个项目最让我意外的是称重模块的温度影响——实验室测试时一切正常,但实际安装在阳台后,早晚温差导致读数漂移达20g。后来通过DS18B20采集环境温度,建立补偿模型才解决问题。建议大家在设计类似系统时,一定要在真实环境中进行至少72小时的老化测试。
