ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

如何花 130 元做出 ESPHome 智能喂食器:从接线到定时精准喂食的完整指南

如何花 130 元做出 ESPHome 智能喂食器:从接线到定时精准喂食的完整指南

如何花 130 元做出 ESPHome 智能喂食器:从接线到定时精准喂食的完整指南

【免费下载链接】esphomeESPHome is a system to control your ESP32, ESP8266, BK72xx, RP2040 by simple yet powerful configuration files and control them remotely through Home Automation systems.项目地址: https://gitcode.com/GitHub_Trending/es/esphome

出差回来,凌晨四点被猫叫醒,粮碗见底,猫在门口叫了一整夜。市售智能喂食器动辄上千,出过几次故障后干脆罢餐。用 ESPHome 自己搭一台:能按克数精准送料,到点自动开饭,全部逻辑写在配置里,成本压在 130 元上下。

一页看懂这套方案

项目情况
总花费约 130 元(主控 30 + 驱动与电机 40 + 称重 30 + 电源 15 + 杂项)
要装的东西ESP32 开发板、A4988 步进驱动、NEMA17 电机、HX711 称重模块,外加一段送料螺旋
跑起来能做什么按克数精准送料(单次 30g,误差 ±2g)、SNTP 对时后到点自动喂、网页远程手动喂、称重记录每日食量
比买现成省多少市售款 800–1500 元、年耗材约 50 元;这套 <200 元、年电费不到 10 元,首投省下约 75% 以上,逻辑还能随便改

物料清单:必买、可替代、可选

先分清三档,别多花冤枉钱。

必买

物料参考规格参考价作用
ESP32 开发板DevKitC 系列约 30 元主控,跑整个喂食逻辑
A4988 步进驱动板5A 通用版约 10 元把 GPIO 脉冲放大成电机能吃的驱动信号
NEMA17 步进电机1.8°/步,配送料螺旋约 30 元转动螺旋把粮送进粮碗
12V 开关电源12V/2A约 15 元只给电机和驱动板供电
HX711 称重模块 + 悬臂梁称重传感器单通道约 30 元监测食盒剩余重量
USB 线、面包板、跳线—约 15 元烧录与接线

可替代

  • A4988 换 DRV8825:细分档位更多,驱动板接口兼容,直接换板即可。
  • ESP32 换 ESP8266:能跑,但 GPIO 少、双核调度不如 ESP32 从容,称重和送料同时跑时建议留 ESP32。
  • HX711 换「压力传感器 + ADC」:可行,但校准工作量翻倍,新手不建议。

可选

  • 100g 标准砝码:没有就用一瓶净含量标得准的矿泉水做校准点。
  • 微动开关:加在螺旋出口做复位限位,让每次送料起点一致。
  • 更大量程的称重传感器:喂大型犬(单次 150–200g)时 5kg 量程更合适。

硬件接线与常见错误

接线原则一句话:动力电和信号电分开走。下面四组 ❌→✅ 是烧板重灾区。

❌ 错误接法后果✅ 正确接法
电机 12V 直接接 ESP32 的 5V/VIN 引脚峰值电流超引脚能力,驱动板或 ESP32 直接烧电机只从 12V 电源端子取电,ESP32 和驱动板共地即可
HX711 从 ESP32 取电电流波动干扰称重,读数乱跳单独 5V 稳压给 HX711,DOUT/SCK 线尽量短,并与 STEP 信号线分开走
A4988 电流电位器没调电流偏大电机烫手,偏小丢步用万用表量驱动板两端,按电机额定值调到约 0.5A
STEP、DIR 长线贴着电机动力线走信号被干扰,出现随机丢步信号线走短线,跨过去时用 90° 交叉

信号线接法:A4988 的 STEP 接 GPIO26、DIR 接 GPIO27、使能 EN(低电平有效)接 GPIO14;HX711 的 DOUT 接 GPIO19、SCK 接 GPIO18;限位开关(如有)接 GPIO4,常闭型触发时接地。

关于 16 细分为什么开:200 步/圈的电机开 16 细分后每圈 3200 个微步,单步角从 1.8° 压到 0.056°,电机转得平滑、每次起步位置更一致,这是 ±2g 重复性的基础。换算公式照抄:

所需步数 = (目标角度 ÷ 360°) × 200 × 16

例如转 1/4 圈就是 (90 ÷ 360) × 200 × 16 = 800 步。

配置走通:从喂出第一口粮到完整系统

别一口气写完再编译。分四步走,每步结束你手里都有一个能跑的版本。

第一步:通电 + 定时喂一次(最小闭环)

定时喂食的前提是设备知道"现在 7 点"。ESPHome 用 SNTP 从时间服务器同步,配好timezone保证at:触发的是本地时间,源码在esphome/components/sntp/与esphome/components/time/__init__.py。

time: - platform: sntp timezone: Asia/Shanghai servers: - cn.pool.ntp.org - time.nist.gov automation: - alias: "早餐喂食" trigger: platform: time at: "07:00:00" then: - stepper.set_target: id: feed_stepper target: 1600 - alias: "工作日晚餐" trigger: platform: time cron: "0 19 * * MON-FRI" then: - stepper.set_target: id: feed_stepper target: 2000

要改的地方:timezone换成你的时区;两条 automation 的target数字后面校准过再定。

电机这边是 a4988 平台,配置在esphome/components/a4988/stepper.py。注意:ESPHome 的 a4988 组件没有step_distance、run_current这类参数,电流靠板载电位器调;使能引脚在 ESPHome 里叫sleep_pin。

stepper: - platform: a4988 id: feed_stepper step_pin: GPIO26 dir_pin: GPIO27 sleep_pin: GPIO14 # 低电平使能,接线方式见上一节 max_speed: 200.0 steps/s acceleration: 50.0 steps/s^2 deceleration: 50.0 steps/s^2

max_speed是脉冲频率上限,调高前先看电机跟不跟得上,跟不上会丢步,送料量就会偏少。

编译上传后,把早餐时间临时改成 2 分钟后,看螺旋是否转动、粮是否落入碗中。这一步通了,喂食器的骨架就成了。

第二步:加称重和校准

裸着喂的问题是"以为喂了 30g,实际可能 28g"。加上 HX711 后你能看见食盒里还剩多少,也能反过来校验每次送了多少。组件源码在esphome/components/hx711/sensor.py。

先看空载时日志里的原始读数,再放 100g 砝码看第二个读数,然后把这两个数填进下面的calibrate_linear:

sensor: - platform: hx711 name: "食盒重量" id: food_scale dout_pin: GPIO19 clk_pin: GPIO18 gain: 128 update_interval: 1s unit_of_measurement: g accuracy_decimals: 1 filters: - offset: -112345 # 空载原始读数取负,把零点对齐 - calibrate_linear: method: exact datapoints: - from: 0.0 to: 0.0 - from: 23456.0 to: 100.0 # 放 100g 砝码时的原始读数 - sliding_window_moving_average: window_size: 5 send_every: 1

要改的地方:offset和第二个from各填一次实测值就行,别抄别人的数。

校准三步:① 空载,记下原始读数;② 放上 100g 砝码,记下第二个原始读数;③ 把两个数按上面格式填进 filter。放砝码时读数应在 99.5–100.5g 之间稳定,放偏了重放。

低粮提醒用阈值触发,放在喂食记录小节统一写,这里先让称重跑起来。

第三步:加远程控制

人在外面时想手动喂一口,靠本地网页。web_server自带界面,给所有实体出控件,源码在esphome/components/web_server/__init__.py。再加一个手动按钮和一个克数输入框:

web_server: port: 80 auth: username: petfeeder password: 换个长一点的密码 button: - platform: template name: "手动喂食" on_press: - stepper.set_target: id: feed_stepper target: !lambda 'return id(feed_amount).state * 32.0;' number: - platform: template name: "单次喂食量" id: feed_amount unit_of_measurement: g min_value: 5 max_value: 200 step: 5 initial_value: 30

target里那个 32 就是"克数 × 步数/克"的换算系数,后面调参定下来再统一改这一处。

第四步:加记录与统计

记录今天喂了多少、上次几点喂的。三个实体加两条自动化,拼进前面按钮和定时任务的then:里即可:

globals: - id: daily_feed_g type: float restore_value: false initial_value: '0.0' sensor: - platform: template name: "今日喂食总量" id: daily_total_g lambda: 'return id(daily_feed_g);' unit_of_measurement: g accuracy_decimals: 1 update_interval: 10s text_sensor: - platform: template name: "最后喂食时间" id: last_feed_time lambda: "return now().strftime(\"%H:%M:%S\");" update_interval: 30s automation: - alias: "喂食后记录" trigger: platform: state id: daily_feed_g to: 0.0 then: - lambda: |- id(last_feed_time).publish_state(now().strftime("%H:%M:%S"));

daily_feed_g的自增逻辑放在每次喂食动作里:按钮on_press和两条定时then:的末尾都加上- lambda: 'id(daily_feed_g) += id(feed_amount).state;'(定时任务里换成对应的克数常量)。

低粮提醒顺手也写上:

- alias: "低粮提醒" trigger: platform: numeric_state id: food_scale below: 200 then: - lambda: ESPLOG("粮快吃完了,该补粮");

到这里四步走完:定时、精准、称重、远程、记录全部可用,配置总共不到 100 行。

调参方法 + 验收清单

先调"步数↔克数"系数:空碗称重,触发一次 1600 步的送料,再称重,两者相减除以 1600 就是克/步。实测约 1.0g/16 步,也就是 32 步/g。把这个系数写进按钮的 lambda 和定时任务的 target 计算里,之后所有喂食量都以克为单位思考,不用再换算角度。

验收时逐条勾,全过才算做对:

  • 电机空载转 10 次,每次落碗重量误差 ±2g 以内(约 30g 份的 6%)
  • 定时任务在设定时刻 1s 内触发,连续 3 天不漏餐
  • 100g 砝码放上去,读数稳定在 99.5–100.5g
  • 断电重启后,时间 1 分钟内同步正确
  • 手动喂食按钮 3s 内出粮,"今日喂食总量"同步 +30g

进阶玩法

  • 螺旋自清理:food_scale低于 50g 时再触发一次短行程,把螺旋里挂壁的余料抖进碗中,一条 numeric_state 自动化就能实现。
  • 接入 Home Assistant:加mqtt:后,喂食量、剩余重量都会进 HA 的历史曲线,出差时在手机上直接看"今天该喂没喂"。
  • 喂水联动:给饮水器挂同样的定时 automation,吃饭和喝水节奏对齐,逻辑复用同一套写法。

延伸阅读

  • 仓库里esphome/components/stepper/:stepper 组件的全部 action(set_target、set_speed 等)都在这,改喂速不用动驱动板。
  • 仓库里esphome/components/hx711/sensor.py:三种 gain(64/128/328)怎么选,看量程再定。
  • script/templates/下有几份起步用的 YAML 模板,抄结构比从零写快。

【免费下载链接】esphomeESPHome is a system to control your ESP32, ESP8266, BK72xx, RP2040 by simple yet powerful configuration files and control them remotely through Home Automation systems.项目地址: https://gitcode.com/GitHub_Trending/es/esphome

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进