1. 项目概述:STM32智能喂食器的设计初衷
养宠家庭最头疼的问题莫过于出差或旅行时的喂食难题。传统机械式喂食器只能固定时间投放固定量饲料,无法感知食盆余量,更谈不上智能调节。这个基于STM32F103C8T6的智能喂食器项目,正是为解决这些痛点而生。
整套系统通过HX711称重传感器实时监测食槽余量,配合TFT彩屏和语音模块实现人机交互。核心功能包括:定时定量投喂、余量不足预警、手动紧急投喂、喂食数据统计等。最实用的是其自适应调节能力——当检测到余量不足计划投喂量时,系统会立即语音提醒主人补充饲料,避免宠物挨饿。
2. 硬件架构深度解析
2.1 主控选型与外围电路设计
选择STM32F103C8T6作为主控主要基于三点考量:首先,72MHz主频足够处理称重传感器数据滤波和舵机PWM控制;其次,内置64KB Flash可存储喂食计划参数;最后,丰富的外设接口(12位ADC、定时器等)完美匹配各类传感器需求。
电源部分采用AMS1117-3.3V稳压芯片,将5V输入转换为单片机工作电压。特别要注意的是,舵机驱动需单独供电,避免电机启动时的电压波动导致单片机复位。实测中发现,若共用电源,HX711称重数据会出现明显跳变。
2.2 关键传感器选型与调校
HX711称重模块选用5kg量程版本,分辨率为24位ADC。安装时需注意:
- 称重平台必须水平固定,四角悬空
- 导线采用屏蔽线防止电磁干扰
- 上电后执行去皮操作(tare),此时平台上不得放置任何物品
校准步骤:
c复制// 示例校准代码
float calibration_factor = -7050.0; // 初始值
hx711_set_scale(calibration_factor);
hx711_tare(); // 重置为零
// 放置已知重量砝码(如500g)
long reading = hx711_get_units(10);
calibration_factor = reading / 0.5; // 计算新校准系数
hx711_set_scale(calibration_factor);
2.3 执行机构驱动方案
选用SG90舵机控制饲料仓门开关,其180°转动范围通过TIM3_CH1输出PWM驱动。关键参数:
- 周期20ms(50Hz)
- 0.5ms脉宽对应0°
- 2.5ms脉宽对应180°
为避免频繁开关导致堵转,程序中设置了动作间隔保护:
c复制void servo_control(uint8_t angle) {
static uint32_t last_time = 0;
if(HAL_GetTick() - last_time < 1000) return; // 1秒间隔保护
// 计算并输出PWM
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, angle_to_pulse(angle));
last_time = HAL_GetTick();
}
3. 软件系统实现细节
3.1 喂食逻辑状态机设计
系统采用状态机模式管理喂食流程,主要状态包括:
- IDLE:待机状态,显示当前数据
- SETTING:参数设置状态
- FEEDING:投喂执行状态
- ALARM:异常报警状态
状态转换触发条件:
mermaid复制stateDiagram-v2
[*] --> IDLE
IDLE --> SETTING: K1按下
SETTING --> IDLE: 3秒无操作
IDLE --> FEEDING: 定时到达/K4按下
FEEDING --> ALARM: 余量不足
FEEDING --> IDLE: 投喂完成
ALARM --> IDLE: 确认报警
3.2 关键算法实现
自适应滤波算法:针对称重传感器数据波动问题,采用移动平均+限幅滤波组合算法:
c复制#define FILTER_LEN 10
float weight_filter(float new_val) {
static float buffer[FILTER_LEN] = {0};
static uint8_t index = 0;
static float last_valid = 0;
// 限幅滤波:变化超过100g视为干扰
if(fabs(new_val - last_valid) > 0.1) {
return last_valid;
}
buffer[index++] = new_val;
if(index >= FILTER_LEN) index = 0;
// 移动平均
float sum = 0;
for(int i=0; i<FILTER_LEN; i++) {
sum += buffer[i];
}
last_valid = sum / FILTER_LEN;
return last_valid;
}
Flash参数存储:使用STM32内部Flash最后一页(Page 127)存储喂食计划:
c复制#define FLASH_PAGE_ADDR 0x0801FC00
void save_settings(void) {
HAL_FLASH_Unlock();
FLASH_Erase_Sector(FLASH_SECTOR_11, VOLTAGE_RANGE_3);
uint32_t *p = (uint32_t*)&settings;
for(int i=0; i<sizeof(settings)/4; i++) {
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_PAGE_ADDR+i*4, p[i]);
}
HAL_FLASH_Lock();
}
4. 人机交互设计要点
4.1 TFT液晶显示布局优化
1.44寸屏幕空间有限,信息排布遵循"F型"视觉动线:
code复制+-------------------+
| 当前时间 12:30:45 |
| 下次喂食 13:00:00 |
|-------------------|
| 计划量: 0.25kg |
| 剩余量: 0.18kg |
| 本次投喂: 0.25kg |
|-------------------|
| 总喂食: 3.75kg |
| 喂食次数: 15 |
+-------------------+
采用状态色标提高可读性:
- 正常状态:蓝色字体
- 设置状态:闪烁红色
- 报警状态:黄色背景
4.2 语音提示系统设计
JR6001语音模块通过UART通信,预存了8条提示音:
code复制0x01: "小伙伴们开饭了"
0x02: "食物已不足,请准备食物"
0x03: "喂食结束,达到预定量"
...
播放控制采用非阻塞方式,避免影响主流程:
c复制void play_voice(uint8_t id) {
static uint8_t last_id = 0;
if(last_id == id) return;
uint8_t cmd[] = {0xAA, 0x07, 0x02, id, 0x00, 0x00, 0x00, 0x00};
HAL_UART_Transmit(&huart2, cmd, sizeof(cmd), 100);
last_id = id;
}
5. 常见问题与解决方案
5.1 称重数据异常排查
现象:数值无规律跳变
- 检查HX711的DT和SCK是否接入正确GPIO
- 测量AVDD电压是否稳定(建议3.3V±0.1V)
- 尝试缩短传感器与主板距离(建议<30cm)
现象:读数始终为零
- 确认传感器量程是否超限(最大5kg)
- 检查应变片是否脱胶
- 重新执行去皮操作hx711_tare()
5.2 舵机动作异常处理
现象:不响应控制信号
- 用示波器检测PWM输出波形
- 检查电源是否足够(SG90工作电流≥200mA)
- 确认TIM3_CH1已正确映射到对应引脚
现象:转动角度不准确
- 重新校准0°和180°对应的脉宽值
- 检查机械结构是否有卡阻
- 增加舵机供电电容(推荐100μF)
5.3 低功耗优化技巧
对于电池供电场景,可采取以下措施:
- 关闭未用外设时钟:
c复制__HAL_RCC_TIM1_CLK_DISABLE();
__HAL_RCC_ADC1_CLK_DISABLE();
- 喂食间隔期间进入STOP模式:
c复制HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
- 液晶背光动态调节:喂食时100%亮度,待机时30%亮度
6. 项目进阶方向
6.1 物联网功能扩展
通过ESP-01S WiFi模块接入云平台:
- 微信小程序远程修改喂食计划
- 推送余量不足提醒到手机
- 生成喂食数据统计图表
AT指令示例:
c复制void wifi_send_data(float weight) {
char cmd[64];
sprintf(cmd, "AT+CIPSEND=%d\r\n", strlen(data));
HAL_UART_Transmit(&huart1, (uint8_t*)cmd, strlen(cmd), 1000);
sprintf(data, "{\"weight\":%.2f}", weight);
HAL_UART_Transmit(&huart1, (uint8_t*)data, strlen(data), 1000);
}
6.2 多宠物识别方案
升级版可增加RFID识别模块:
- 为每只宠物配置电子标签
- 根据个体需求定制喂食计划
- 记录各宠物的进食习惯
RC522读卡器接线示例:
code复制SDA -> PB12
SCK -> PB13
MOSI -> PB15
MISO -> PB14
IRQ -> 不接
GND -> GND
RST -> PB0
3.3V -> 3.3V
6.3 机械结构优化建议
- 防潮设计:饲料仓添加硅胶干燥剂槽
- 防卡料设计:出料口采用斜面+震动电机
- 模块化设计:快拆式称重平台便于清洁
实际制作中发现,出料口最佳倾角为45°,直径不小于5cm可避免各类饲料堵塞。仓体推荐使用食品级ABS材料,通过3D打印实现个性化造型。
