1. 项目概述
这个基于51单片机的智能宠物喂食系统,是我去年为家里两只猫主子折腾出来的小发明。养过宠物的朋友都知道,出差或旅游时最担心的就是毛孩子吃饭问题。市面上的自动喂食器要么太贵,要么功能单一,于是决定自己动手做一个集成了蓝牙控制、称重检测和语音提醒的全功能设备。
整套系统核心由STC89C52单片机驱动,包含称重传感器、HC-05蓝牙模块、语音播报模块和机械传动结构。最让我自豪的是实现了手机APP远程操控和余粮监测功能,现在哪怕出差一周,也能随时查看食盆状态,定时定量投喂,再也不用麻烦邻居上门帮忙了。
2. 核心功能解析
2.1 系统架构设计
整个喂食器采用模块化设计,主要包含五个功能单元:
- 主控单元:STC89C52RC单片机,负责协调各模块工作
- 称重检测:HX711模块+5kg量程称重传感器
- 无线通信:HC-05蓝牙4.0模块
- 语音交互:JQ8900-16P语音芯片
- 机械执行:28BYJ-48步进电机+3D打印螺旋送料机构
各模块通过PCB板集中连接,采用12V/2A电源适配器供电,实测待机功耗仅1.2W。系统框架如下图所示(注:实际制作时建议用洞洞板或自制PCB):
code复制[主控电路]
│
├─[称重模块]─食盆
├─[蓝牙模块]─手机APP
├─[语音模块]─扬声器
└─[电机驱动]─送料机构
2.2 关键技术实现
2.2.1 精准称重方案
选用HX711搭配铝合金悬臂梁传感器,量程5kg,精度可达0.1g。在实际调试中发现三个关键点:
- 传感器安装:必须用螺丝刚性固定传感器底座,任何松动都会导致称重漂移。我在底座加了橡胶垫减震,漂移问题减少80%
- 软件滤波:采用滑动平均滤波算法,采样20次取中值。核心代码如下:
c复制long Get_Weight() {
long sum = 0;
long buf[20];
for(int i=0; i<20; i++){
buf[i] = HX711_Read();
delay(5);
}
// 排序取中值
BubbleSort(buf, 20);
return buf[10];
}
- 温度补偿:传感器灵敏度会随温度变化,我在不同环境温度下做了标定,建立了补偿系数表
2.2.2 蓝牙控制实现
HC-05模块配置成从机模式,通过串口与单片机通信。手机端用MIT App Inventor开发了简易控制APP,支持以下功能:
- 手动立即投喂
- 设置定时喂食计划
- 实时显示余粮重量
- 低粮预警提醒(阈值可调)
通信协议采用自定义简协议:
code复制# 设置定时
T,08:00,50g\n
# 手动喂食
M,20g\n
# 查询状态
S?\n
重要提示:蓝牙模块天线要远离电机和电源线,实测间隔5cm以上可避免通信中断。我的第一个版本就因为干扰问题导致控制失灵。
3. 硬件搭建详解
3.1 元器件选型清单
| 部件 | 型号 | 参数 | 单价 |
|---|---|---|---|
| 主控芯片 | STC89C52RC | 8K Flash/512RAM | 5.8元 |
| 称重模块 | HX711+传感器 | 5kg/0.1g | 22元 |
| 蓝牙模块 | HC-05 | 4.0/10米 | 18.5元 |
| 语音芯片 | JQ8900-16P | 支持MP3 | 15元 |
| 步进电机 | 28BYJ-48 | 5V/64步 | 8.9元 |
| 电机驱动 | ULN2003 | 达林顿阵列 | 2.3元 |
| 其他 | PCB/结构件等 | - | 约30元 |
总成本控制在120元以内,仅为市面同类产品价格的1/5。
3.2 机械结构设计
喂食机构采用螺旋送料方案,用SolidWorks设计了3D打印部件:
- 料仓:直径15cm,高25cm,可装2kg干粮
- 送料螺杆:螺距3cm,转速10rpm时出料量约5g/s
- 挡板机构:防止宠物扒粮,开合角度60°
制作时特别注意:
- 料仓内壁要打磨光滑,避免粮食卡住
- 出料口加装硅胶刮片,确保出料量精确
- 整体结构要做密封处理,防潮防虫
4. 软件系统实现
4.1 主程序逻辑
系统采用状态机设计模式,主要工作流程:
c复制void main() {
Init_All(); // 初始化各模块
while(1) {
Check_Bluetooth(); // 处理蓝牙指令
Check_Schedule(); // 检查定时任务
Check_Weight(); // 监测余粮
Feed_If_Needed(); // 执行喂食
}
}
4.2 关键算法实现
4.2.1 自适应喂食控制
根据宠物体型动态调整单次投喂量:
c复制void Adjust_Feed_Amount(float weight) {
// 体重-食量对照表 (kg:g)
float ratio[5][2] = {{2,15},{5,30},{10,50},{20,80},{30,120}};
for(int i=0; i<5; i++) {
if(weight <= ratio[i][0]) {
target_amount = ratio[i][1];
break;
}
}
}
4.2.2 语音提示系统
预录了6段提示语音:
- "开饭时间到啦"
- "粮食不足请添加"
- "正在出粮请等待"
- "喂食已完成"
- "蓝牙已连接"
- "设备启动中"
触发逻辑:
c复制void Play_Voice(int id) {
UART_Send(0x7E);
UART_Send(0x03);
UART_Send(id);
UART_Send(0xEF);
}
5. 调试与优化
5.1 常见问题排查
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 称重数值跳动 | 电源干扰 | 给HX711单独稳压供电 |
| 蓝牙连接不稳定 | 天线方向不对 | 调整模块朝向手机 |
| 出料量不准 | 螺杆间隙大 | 在螺纹处缠PTFE胶带 |
| 语音卡顿 | 供电不足 | 换用1A以上电源 |
5.2 实测性能数据
经过两周连续测试:
- 称重误差:±0.5g(静态)/±2g(宠物进食时)
- 单次出粮误差:±1g(10g以下) / ±3g(50g以上)
- 蓝牙控制响应时间:平均280ms
- 待机电流:100mA(不含电机工作)
6. 升级改进方向
目前系统还有三个可优化点:
- 增加WIFI模块:替换蓝牙实现远程控制
- 加入摄像头:通过OpenMV实现宠物识别
- 开发iOS版APP:现有APP仅支持Android
最近正在尝试用ESP8266改造,已经实现了微信小程序控制。有个意外发现:当加入喂食拍照功能后,系统居然能自动识别两只猫的进食频率,后续准备加入个体化喂食策略。
