猫咪自动喂食器硬件编程项目方案

💡 划重点

  • 主控采用 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 骨架代码(可编译),使用 PubSubClientAccelStepper 库。


#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)触发定时喂食。

调试步骤

  1. 烧录代码后,打开串口监视器,确认 ESP32 成功连接 Wi-Fi 与 MQTT Broker。
  2. 单独测试步进电机空转,逐步增大转速,观察是否丢步;若发抖或啸叫,检查 ULN2003 供电是否不足,或引脚接触不良。
  3. 安装螺旋叶片与储粮仓,放入少量猫粮,手动触发喂食,测量实际出粮克数,调整步进电机圈数(如从 1 圈改为 1.5 圈)。
  4. 测试舵机挡板动作,确保出粮时完全打开,结束后完全封闭。若舵机抖动,确认舵机供电独立,避免与步进电机共用电源。
  5. 设置手机 MQTT 调试工具(如 MQTT X),发送feed指令,验证远程手动喂食与日志上报。
  6. 连续运行 72 小时,检查定时任务是否准时执行,观察余粮读数是否稳定,排除 HX711 温漂导致的误报。

设计图

猫咪自动喂食器结构flow
1
感知输入(余粮称重/定时信号)
2
控制处理(ESP32 逻辑判断)
3
执行反馈(步进电机+舵机动作)
4
数据上报(MQTT 远程状态)