如何花 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^2max_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: 30target里那个 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),仅供参考