猫咪自动喂食器硬件编程项目方案
💡 划重点
- 主控采用 ESP32,原生支持 Wi-Fi 与蓝牙,适合 MQTT 远程控制与日志上报。
- 执行层采用 28BYJ-48 步进电机驱动螺旋出粮机构,搭配 MG996R 舵机实现防卡粮挡板联动。
- 定时任务基于 NTP 时间校准,ESP32 断电重启后自动同步时间,确保喂食计划不漂移。
- 接入 MQTT 服务器后,用户可通过手机 App 远程手动放粮、查询余粮与喂食记录。
- 整机物料成本控制在 90 元以内,结构件采用亚克力板与 3D 打印组合,适合 DIY 复刻。
需求洞察
目标用户为上班族、经常出差或短期外出的养猫家庭。核心痛点是猫咪进食时间不规律,主人无法准点回家放粮,导致猫咪饥一顿饱一顿,或一次性投喂过多造成肥胖、消化不良。传统重力喂食器容易出现卡粮、出粮量不均、无法远程干预等问题。该项目利用 ESP32 的低成本联网能力,结合步进电机精准控制出粮量,通过 MQTT 协议让用户随时查看设备状态并远程手动喂食,同时支持本地定时自动出粮,既解决刚性需求,又具备良好的扩展性与可玩性,适合作为嵌入式联网项目的练手作品。
方案设计
感知层:使用 HX711 称重传感器模块检测粮桶余量,通过 ADC 采集重量数据,用于余粮不足告警;同时监测步进电机转动圈数,换算为出粮克数,实现定量喂食。
控制层:ESP32 作为主控,负责定时调度、电机驱动逻辑、舵机联动逻辑、MQTT 客户端通信。定时任务通过 NTP 获取标准时间,在设定时刻触发喂食流程。本地还保留一组 RTC 备用,防止网络不可用时定时失效。
执行层:步进电机通过 ULN2003 驱动板驱动 28BYJ-48 电机,带动螺旋叶片旋转将猫粮推出出粮口;舵机控制挡板开合,出粮时挡板打开,结束后关闭防止猫粮继续漏出。
日志/联网层:ESP32 连接家庭 Wi-Fi,通过 MQTT 协议连接公共 Broker(如 EMQX 或 Mosquitto),发布主题包括cat_feeder/status(在线状态、余粮、电量)、cat_feeder/feed_log(每次喂食时间与克数),订阅主题cat_feeder/cmd用于接收远程手动喂食指令。支持离线缓存最近 20 条喂食记录,联网后补报。
物料清单
| 物料名称 | 数量 | 用途 | 估算单价(元) | 合计(元) |
|---|---|---|---|---|
| ESP32 DevKitC 开发板 | 1 | 主控芯片 | 28 | 28 |
| 28BYJ-48 步进电机 + ULN2003 驱动板 | 1 | 驱动螺旋出粮 | 12 | 12 |
| MG996R 舵机 | 1 | 控制出粮挡板 | 15 | 15 |
| HX711 称重模块 + 1kg 压力传感器 | 1 | 余粮检测 | 10 | 10 |
| 亚克力板(150×150×3mm) | 1 | 外壳结构 | 8 | 8 |
| 3D 打印螺旋叶片与出粮漏斗 | 1 | 出粮机构 | 6 | 6 |
| 杜邦线若干、面包板 | 1套 | 接线调试 | 5 | 5 |
| 5V 2A 电源适配器 | 1 | 供电 | 5 | 5 |
| 猫咪试吃粮(调试用) | 1份 | 功能验证 | 2 | 2 |
| 合计 | 91 |
若将 HX711 模块替换为红外对射传感器(约 3 元),总成本可降至 84 元。若不购买 3D 打印件,用纸板手工制作螺旋机构,成本可再降 4 元。
接线与结构
| 模块 | 接线说明 |
|---|---|
| 步进电机 IN1-IN4 | GPIO25 → IN1,GPIO26 → IN2,GPIO27 → IN3,GPIO14 → IN4 |
| 舵机信号线 | GPIO13 → PWM 信号线,VCC 接 5V,GND 接 GND |
| HX711 | DT → GPIO33,SCK → GPIO32,VCC 接 3.3V,GND 接 GND |
| MQTT Wi-Fi | ESP32 板载 Wi-Fi,天线位置远离电机驱动线 |
原定 GPIO 分配无需改动。HX711 的 DT 与 SCK 选用 GPIO33 与 GPIO32,避开 I2C 与 SPI 常用引脚,降低信号干扰。舵机与步进电机分时供电,避免同时启动造成电压跌落复位。
结构上,亚克力板切割成底座与侧板,底座安装步进电机,电机轴穿过亚克力板连接螺旋叶片,叶片上方安装漏斗形储粮仓,出粮口下方设置舵机控制的挡板。整体高度控制在 25cm 以内,防止猫咪翻倒。
核心代码
以下是 PlatformIO Arduino 骨架代码(可编译),使用 PubSubClient 与 AccelStepper 库。
#include <WiFi.h>
#include <PubSubClient.h>
#include <AccelStepper.h>
#include <ESP32Servo.h>
const char* ssid = "YOUR_WIFI";
const char* password = "YOUR_PASS";
const char* mqtt_server = "broker.emqx.io";
WiFiClient espClient;
Servo servo;
const int servoPin = 13;
bool feeding = false;
unsigned long lastFeedTime = 0;
void connectMQTT() {
while (!client.connected()) {
if (client.connect("CatFeederESP32")) {
client.subscribe("cat_feeder/cmd");
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
String msg;
for (int i = 0; i < length; i++) msg += (char)payload[i];
if (msg == "feed") {
feeding = true;
}
}
void feedOnce() {
servo.write(90); // 打开挡板
stepper.move(2048); // 转一圈约出粮 5g
while (stepper.distanceToGo() != 0) {
stepper.run();
}
delay(200);
servo.write(0); // 关闭挡板
feeding = false;
client.publish("cat_feeder/feed_log", "fed now");
}
void setup() {
Serial.begin(115200);
stepper.setSpeed(600);
servo.attach(servoPin);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
client.setCallback(callback);
}
void loop() {
if (!client.connected()) connectMQTT();
client.loop();
if (feeding) feedOnce();
}
实际使用中,可在 loop() 内增加时间判断逻辑,如if (hour == 8 && minute == 0)触发定时喂食。
调试步骤
- 烧录代码后,打开串口监视器,确认 ESP32 成功连接 Wi-Fi 与 MQTT Broker。
- 单独测试步进电机空转,逐步增大转速,观察是否丢步;若发抖或啸叫,检查 ULN2003 供电是否不足,或引脚接触不良。
- 安装螺旋叶片与储粮仓,放入少量猫粮,手动触发喂食,测量实际出粮克数,调整步进电机圈数(如从 1 圈改为 1.5 圈)。
- 测试舵机挡板动作,确保出粮时完全打开,结束后完全封闭。若舵机抖动,确认舵机供电独立,避免与步进电机共用电源。
- 设置手机 MQTT 调试工具(如 MQTT X),发送
feed指令,验证远程手动喂食与日志上报。 - 连续运行 72 小时,检查定时任务是否准时执行,观察余粮读数是否稳定,排除 HX711 温漂导致的误报。