阅读提示本文记录我用ESP8266和一个小舵机给猫主子DIY自动喂食器的全过程。成本极低、零基础友好更关键的是——猫很满意。 开篇我加班猫也跟我一起“加班”去年下半年项目赶进度我几乎天天加班到十点。某天深夜回家打开门年糕我的猫蹲在空碗旁边用一种“你知道我等了多久吗”的眼神看着我。然后它走到水碗边喝了一口水又回头看看空碗再看看我。那一刻我挺难受的。我也试过出门前多放点猫粮但年糕的问题是——它会一口气吃完然后吐。医生说“少食多餐”但我的工作时间没法满足这个要求。也考虑过买自动喂食器。去电商平台一看带摄像头和Wi-Fi的三百多块起步不带Wi-Fi的定时款也得一百多。而且用户评价里有人说卡粮有人说被猫拆了有人说断电后时间重置……我看着手上那块吃灰的ESP8266开发板冒出一个念头要不我自己做一个于是有了下面这个故事。一、我要做什么样的喂食器先说清楚我的目标不是什么高大上的产品就解决三个问题定时出粮每天早晚各一次每次出一份约15g这样年糕就不会一次性吃撑。手动补粮我下班回家如果觉得它今天表现好可以按一下按钮或者手机点一下额外奖励一顿。别卡粮这个最关键做不好的话猫会饿肚子。至于远程视频、语音逗猫、App数据分析……这些功能固然酷但对我来说不是必需品。先把基础功能做稳比什么都重要。一句话总结一个能定时出粮、不卡粮、猫喜欢的喂食器。二、硬件准备我尽量用家里现成的东西不够的再买。组件来源价格ESP8266 NodeMCU吃灰库存0元SG90舵机之前做别的东西剩下的0元5V 2A充电头USB线旧手机充电器0元塑料瓶1.5L喝完的矿泉水瓶0元纸盒快递纸箱0元杜邦线若干库存0元热熔胶枪之前买的0元是的全部成本为0元。即使你什么都没有买齐这些材料也花不了多少钱——ESP8266约15元SG90舵机约5元其他东西都能找到替代品。我没有用3D打印机因为不是每个人都有。我用的是纸盒热熔胶丑是丑了点但管用。三、工作原理一句话版舵机上面装一个“十字形”的拨片放在瓶口下方。舵机转一下 → 拨片跟着转 → 猫粮从瓶口掉下来一份 → 舵机复位 → 停止出粮。就这么简单。四、制作过程全记录4.1 粮仓一个矿泉水瓶把一个1.5L矿泉水瓶底部切掉倒扣过来。瓶口朝下作为出粮口。为什么要用透明瓶子因为能一眼看到还剩多少猫粮不用每次都打开看。4.2 出粮机构纸板舵机这是最核心的部分。我做了一个简易滚筒用硬纸板剪一个圆片直径略大于瓶口在圆片上开一个“槽”大概占圆片的1/4把舵机的摇臂固定在圆片中心舵机不转的时候圆片的实心部分堵住瓶口猫粮掉不下来舵机转90°槽口对准瓶口猫粮掉下来一份舵机再转回来又堵住了第一次测试失败。纸板太软猫粮的重量把纸板压弯了舵机转不动。而且纸板边缘不光滑猫粮卡在缝隙里。第二次改进换成塑料瓶盖硬质塑料片。我把一个矿泉水瓶盖切掉一半粘在舵机摇臂上然后在瓶盖上开槽。塑料材质更硬猫粮不会卡。第三次测试成功了。4.3 电路连接超简单ESP8266引脚舵机信号线 → D4GPIO2舵机VCC → 5VVin舵机GND → GND就三根线不需要其他外设。4.4 供电直接插USB充电头5V供电。舵机和ESP8266共用USB电源。实测SG90舵机工作在5V时待机电流约5mA动作时约200mA。一个普通USB充电头完全够用。五、代码复制即可用以下是Arduino代码功能包括定时出粮每天7:00、12:00、19:00各出一次手动出粮按一下ESP8266上的Flash按键GPIO0立刻出一份防卡粮保护舵机每次动作后记录时间连续动作超过5次会暂停10分钟#include ESP8266WiFi.h #include Servo.h #include TimeLib.h #include NtpClientLib.h Servo feederServo; // WiFi配置 const char* ssid 你的WiFi; const char* password 你的密码; // 时间配置 int8_t timeZone 8; // 北京时间 // 舵机引脚 #define SERVO_PIN 2 // D4 // 手动出粮按键ESP8266的Flash按键 #define MANUAL_BTN 0 // D3 // 参数 int feedAngle 90; // 每次旋转角度 int feedCount 0; // 已出粮次数 unsigned long lastFeedTime 0; // NTP时间同步 NTPClient ntpClient(ntpUDP, pool.ntp.org, 60 * 60 * 8, 60000); void setup() { Serial.begin(115200); // 连接WiFi WiFi.begin(ssid, password); while (WiFi.status() ! WL_CONNECTED) { delay(500); Serial.print(.); } Serial.println(WiFi Connected); // 初始化NTP ntpClient.begin(); ntpClient.update(); // 舵机初始化 feederServo.attach(SERVO_PIN); feederServo.write(0); // 初始位置关闭 // 按键 pinMode(MANUAL_BTN, INPUT_PULLUP); // 启动提示 Serial.println(Cat Feeder Started); } void loop() { ntpClient.update(); time_t now ntpClient.getEpochTime(); struct tm *tm_info localtime(now); int hour tm_info-tm_hour; int minute tm_info-tm_min; // 1. 定时出粮7:00、12:00、19:00 if (minute 0) { if (hour 7 || hour 12 || hour 19) { if ((now - lastFeedTime) 60) { // 防止重复触发 feed(); lastFeedTime now; } } } // 2. 手动出粮按Flash按键 if (digitalRead(MANUAL_BTN) LOW) { delay(50); if (digitalRead(MANUAL_BTN) LOW) { feed(); while (digitalRead(MANUAL_BTN) LOW) delay(10); } } delay(1000); } void feed() { // 防卡粮保护如果最近10分钟内出粮超过5次暂停 if (feedCount 5) { Serial.println(Too many feeds, wait 10 minutes); delay(600000); // 暂停10分钟 feedCount 0; return; } Serial.println(Feeding...); // 舵机转90°出粮 feederServo.write(feedAngle); delay(300); // 等待猫粮落下 // 舵机复位 feederServo.write(0); delay(300); feedCount; Serial.print(Feed count: ); Serial.println(feedCount); }第一次测试出粮看到猫粮“哗啦”掉下来的时候年糕吓了一跳但很快跑过来吃光了。六、调试中的问题问题1出粮量不稳定第一次测试有时出5g有时出20g完全看猫粮颗粒的形状和运气。解决在瓶口加了一个“限流片”——一块硬纸片中间剪一个洞洞的大小刚好让一粒猫粮通过。这样每次只有落在洞口附近的几粒会被拨出来出粮量稳定在12-18g之间。问题2纸盒被猫拆了年糕对“会出粮的盒子”产生了极大兴趣。第三天回家发现纸盒已经被抓烂了露出里面的舵机。解决换了一个塑料收纳盒超市10块钱买的盖子钻孔穿电源线底部固定舵机。猫再也抓不坏了而且防水防潮。问题3断电后时间重置有一次家里跳闸喂食器断电了。重新通电后NTP会自动同步时间所以不需要加电池维持时钟。七、实际使用效果用了一个月大致情况定时出粮每天3次年糕的体重稳定在4.2kg没有继续胖也没有吐过。手动出粮按键在盒子上我回家随手按一下就当跟它互动。卡粮次数总共出现过2次卡粮一次是猫粮颗粒太大换了一款小颗粒猫粮后解决一次是限流片移位了用热熔胶固定后解决。年糕的适应过程很有意思第1-2天听到舵机声音就跑过来吃得很开心第3-5天开始守株待兔提前坐在喂食器前面等第2周学会了用爪子拍盒子试图人工触发当然没用因为按键在内侧现在每天早上7点年糕会准时蹲在喂食器前面等比闹钟还准。八、可以怎么升级如果你也想做还可以加上这些功能余量监测在粮仓内壁贴一个红外对射传感器猫粮低于某个位置时微信提醒“该加粮了”远程手动出粮接入Blynk或巴法云手机上一键出粮加班时也能远程投喂监控摄像头旧手机装一个IP摄像头App看看猫有没有好好吃饭饮食记录每次出粮时在云端记录时间戳形成饮食日志九、成本与时间项目花费时间一个周末下午约4小时金钱0元全部用库存如果重新买ESP8266(15)舵机(5)塑料盒(10)30元对比成品喂食器100-300元不等功能更多的甚至更贵。DIY版本的满足核心需求定时手动出粮而且坏了可以自己修。十、一个观察年糕不会说话但它的行为告诉我它喜欢这个喂食器。每次听到舵机转动的声音它会竖起耳朵小跑到喂食器前面。吃完之后会舔舔嘴然后去窗台上晒太阳。对我来说每天给猫定时定量喂食看着它健康地长肉、不吐不拉比省下两百块钱更有意义。