1. 项目概述
这个基于单片机的智能宠物喂食器项目,是我在指导毕业设计时遇到的一个典型物联网应用案例。它完美融合了嵌入式开发、传感器技术和自动控制原理,解决了现代养宠人士最头疼的问题——定时定量喂养宠物。
传统的机械式喂食器只能实现简单的定时功能,而这个智能版本通过加入重量检测、远程控制、异常报警等功能,让宠物喂养变得更加科学和人性化。我在实际测试中发现,这套系统不仅能确保宠物按时进食,还能通过数据分析发现宠物的饮食异常,及时提醒主人关注宠物健康。
2. 系统设计与核心功能
2.1 整体架构设计
整个系统采用模块化设计思路,主要由以下几个核心部分组成:
- 主控模块:采用STM32F103C8T6单片机作为主控芯片
- 称重模块:使用HX711 ADC芯片配合称重传感器
- 显示模块:1.44寸TFT彩色液晶屏
- 通信模块:ESP8266 WiFi模块
- 执行机构:28BYJ-48步进电机配合螺旋送料机构
- 电源模块:12V/2A适配器配合LM2596降压电路
这种架构设计最大的优势在于各模块功能明确,便于调试和后期功能扩展。我在实际开发中发现,将称重和通信功能独立出来,能有效避免主控芯片资源占用过多导致的系统卡顿问题。
2.2 核心功能实现
2.2.1 智能定时喂食
系统支持最多设置6个定时喂食时间点,每个时间点可以独立设置投放量。这是通过以下技术方案实现的:
- 使用STM32内置的RTC实时时钟模块保持精确计时
- 通过按键或手机APP设置喂食计划
- 到达预定时间后,主控芯片控制步进电机旋转特定圈数
这里有个关键细节:步进电机每转一圈对应的饲料投放量需要事先校准。我的经验是,先让电机旋转10圈,称量出料重量,然后计算出单圈出料量,将这个参数固化到程序中。
2.2.2 精确称重功能
称重模块采用HX711芯片,它具有24位高精度ADC,分辨率为1/8,000,000。实际接线时需要注意:
- HX711的DT引脚接单片机PB12
- SCK引脚接PB13
- 称重传感器的E+、E-接HX711的E+、E-
- A+、A-接HX711的A+、A-
在软件实现上,需要特别注意以下几点:
- 上电后需要等待1秒让HX711稳定
- 每次读取前需要先校准零点
- 采用滑动平均滤波算法处理数据
我常用的滤波算法实现如下:
c复制#define FILTER_LEN 10
uint32_t weight_filter(uint32_t new_val) {
static uint32_t filter_buf[FILTER_LEN] = {0};
static uint8_t filter_idx = 0;
uint32_t sum = 0;
filter_buf[filter_idx++] = new_val;
if(filter_idx >= FILTER_LEN) filter_idx = 0;
for(uint8_t i=0; i<FILTER_LEN; i++) {
sum += filter_buf[i];
}
return sum/FILTER_LEN;
}
2.2.3 远程监控功能
通过ESP8266模块实现WiFi连接,可以采用两种通信方案:
- MQTT协议:连接阿里云IoT平台
- TCP直连:直接与手机APP通信
我推荐使用MQTT方案,因为它更稳定且支持断线重连。具体实现步骤如下:
- 配置ESP8266为Station模式
- 连接路由器WiFi
- 建立与MQTT服务器的连接
- 订阅相关主题(如控制指令主题)
- 定时发布状态信息(如剩余饲料量)
注意:在实际部署时,一定要处理好网络异常情况。我的经验是加入看门狗机制,当网络断开超过5分钟时自动重启WiFi模块。
3. 硬件设计与选型
3.1 主控芯片选型
经过对比STM32F103C8T6、ATmega328P和STC89C52三款常见单片机,最终选择STM32F103C8T6,主要基于以下考虑:
| 参数 | STM32F103C8T6 | ATmega328P | STC89C52 |
|---|---|---|---|
| 主频 | 72MHz | 16MHz | 12MHz |
| Flash | 64KB | 32KB | 8KB |
| RAM | 20KB | 2KB | 256B |
| 外设 | 丰富 | 一般 | 较少 |
| 价格 | 中等 | 较低 | 最低 |
虽然STM32价格稍高,但其强大的性能和丰富的外设资源,能够轻松应对多任务处理需求,特别是需要同时处理称重数据、电机控制和网络通信的场景。
3.2 称重模块实现
称重系统由以下几个关键部件组成:
- 称重传感器:选用5kg量程的悬臂梁式传感器
- HX711 ADC芯片:24位高精度模数转换
- 机械结构:定制铝合金支架
在实际安装时,我总结出几个重要经验:
- 传感器必须水平安装,任何倾斜都会影响测量精度
- 导线连接处要做好应力消除,避免长期使用导致断线
- 传感器周围要有防尘设计,避免饲料粉末进入
称重系统的校准流程如下:
- 空载状态下,记录ADC原始值作为零点
- 放置500g标准砝码,记录ADC值
- 计算比例系数:系数 = 500/(测量值-零点值)
- 将系数存入Flash,每次上电读取
3.3 送料机构设计
送料机构采用螺旋推进式设计,主要部件包括:
- 28BYJ-48步进电机:带减速箱,扭矩足够
- 螺旋轴:3D打印的ABS螺旋杆
- 料斗:食品级PP塑料,容量5L
这个设计最大的挑战是防止饲料堵塞。通过多次实验,我发现以下参数组合效果最佳:
- 螺旋杆螺距:25mm
- 螺旋杆直径:30mm
- 出料口尺寸:40×40mm
- 电机转速:15rpm
重要提示:一定要在料斗内壁做抛光处理,这样可以有效减少饲料残留和结块现象。
4. 软件系统实现
4.1 主程序流程
系统软件采用前后台架构,主程序流程图如下:
- 系统初始化(外设、变量、RTC等)
- 加载存储的喂食计划
- 连接WiFi网络
- 进入主循环:
- 处理按键输入
- 更新显示屏
- 检查定时任务
- 处理网络数据
- 监测系统状态
我特别加入了低功耗设计,当系统空闲时,CPU会自动进入睡眠模式,有事件发生时通过外部中断唤醒。这可以将待机功耗从120mA降到15mA左右。
4.2 关键算法实现
4.2.1 喂食量控制算法
步进电机控制采用开环控制方式,通过以下公式计算所需步数:
code复制步数 = (目标重量 / 单圈出料量) * 电机每圈步数
其中:
- 单圈出料量通过实验测得(如2g/圈)
- 28BYJ-48电机每圈需要2048步(64步×32减速比)
实际代码实现:
c复制void feed(uint32_t weight) {
uint32_t steps;
float circles = weight / 2.0; // 假设每圈出料2g
steps = (uint32_t)(circles * 2048);
stepper_run(steps, CW); // 顺时针旋转指定步数
}
4.2.2 异常检测机制
系统实现了以下异常检测功能:
- 饲料不足报警:当重量传感器检测到剩余量低于200g时触发
- 电机堵转检测:通过监测电流变化判断
- 网络异常处理:定时ping服务器检测连接状态
这些异常都会通过以下方式通知用户:
- 本地蜂鸣器报警
- LCD显示错误代码
- 手机APP推送通知
4.3 用户界面设计
系统提供两种操作界面:
-
本地界面:
- 4个按键:上、下、确定、返回
- 1.44寸TFT显示屏
- 菜单结构:
- 主界面
- 喂食计划设置
- 手动喂食
- 系统设置
-
手机APP界面:
- 采用MQTT协议通信
- 功能包括:
- 实时状态显示
- 远程喂食控制
- 喂食记录查询
- 异常报警接收
在UI设计上,我遵循了"三击原则"——任何功能最多通过三次点击即可完成操作。这对提升用户体验非常重要。
5. 系统调试与优化
5.1 常见问题排查
在开发过程中,我遇到了以下几个典型问题及解决方案:
-
称重数据跳动大
- 原因:电源干扰
- 解决:在HX711的电源端增加10μF电容
-
WiFi频繁断开
- 原因:ESP8266供电不足
- 解决:改用独立3.3V LDO供电
-
步进电机丢步
- 原因:驱动电流不足
- 解决:调整ULN2003驱动电路的限流电阻
-
饲料结块堵塞
- 原因:湿气导致
- 解决:在料斗内放置食品级干燥剂
5.2 性能优化技巧
通过以下几个优化措施,系统稳定性和响应速度得到显著提升:
-
关键数据备份:
- 喂食计划保存在STM32的Flash中
- 采用"写前擦除+校验"机制确保数据安全
-
看门狗应用:
- 启用独立看门狗(IWDG),超时时间1s
- 在关键循环中添加喂狗操作
-
内存优化:
- 使用内存池管理动态内存
- 将不常用数据放入外部Flash
-
通信优化:
- MQTT采用QoS1级别
- 重要数据加入重传机制
6. 项目扩展方向
这个基础版本完成后,还可以考虑以下几个扩展方向:
- 加入摄像头模块:实现宠物识别,针对不同宠物投放不同饲料
- 增加语音交互:通过语音指令控制喂食
- 水质监测功能:集成pH值、温度等传感器,全面监控宠物饮水情况
- AI饮食分析:通过长期数据积累,分析宠物饮食习惯变化
在实际教学中,我建议学生先完成基础功能,再选择1-2个扩展方向进行深入研究。这样既能保证项目完整性,又能体现个人特色。