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 正是解决这类问题的项目:你只需要写一个 YAML 配置文件,它就能编译出固件刷进 ESP32/ESP8266 开发板,让你用 Home Assistant 或它自带的网页面板远程开关电磁阀。本文就用一块 ESP32 加一个继电器模块,把一个 5V/12V 直流电磁阀接到 Home Assistant 里,全程不写一行代码。
一页速览:材料、耗时和最终效果
| 项目 | 说明 |
|---|---|
| 开发板 | ESP32(以 NodeMCU-32S 为例),ESP8266 同理 |
| 继电器模块 | SRD-05VDC-SL-C 这类 5V 小继电器板,几块钱一个 |
| 电磁阀 | 12V 或 5V 直流单阀,阀体上会标电压 |
| 其他 | 杜邦线若干、与电磁阀匹配的电源适配器、一台电脑 |
| 耗时 | 熟悉流程约 1 小时,第一次建议留 2 小时 |
最终效果:Home Assistant 里出现一个开关实体,点一下继电器吸合、电磁阀开启;再加几行配置就能实现"开 10 秒自动关"、"漏水报警时强制关阀"这类逻辑。
先搞懂原理:ESPHome 是怎么驱动电磁阀的
电磁阀的线圈通电就开、断电就关,而单片机引脚只能输出 3.3V/5V 的弱电平,驱动不了继电器线圈,更直接驱动不了 12V 电磁阀。所以中间要加一个继电器模块:ESP32 的 GPIO 接到继电器板的 IN 脚控制吸合,继电器触点(COM/NO)去串接电磁阀的电源回路。
ESPHome 侧对应的是switch组件的gpio平台,一行pin: GPIO2就声明了一个受控引脚;它的底层实现在 esphome/components/gpio/switch/gpio_switch.cpp,组件行为(恢复模式、互锁等)在 esphome/components/switch/init.py。
安装 ESPHome 和烧录第一份配置
在电脑上用 pip 安装命令行工具(建议 Python 3.9+):
pip install esphome装好后esphome命令可用,它负责校验配置、编译固件、刷写设备一条龙。
新建solenoid-valve.yaml,内容如下:
esphome: name: solenoid-valve esp32: board: nodemcu-32s wifi: ssid: "你的WiFi名" password: "你的WiFi密码" api: ota: switch: - platform: gpio name: "Water Valve" pin: GPIO2 id: water_valve restore_mode: RESTORE_DEFAULT_OFF这段配置做了四件事:声明 ESP32 板型、连你家 WiFi、开启 Home Assistant API 和 OTA 空中升级、用 GPIO2 创建一个名叫 Water Valve 的开关。把 WiFi 两项改成自己的;restore_mode: RESTORE_DEFAULT_OFF表示掉电重启后默认关阀,对水路设备来说是个安全习惯。
把开发板的 USB 口连上电脑,运行:
esphome run solenoid-valve.yaml命令会依次校验配置、编译固件、自动刷入设备,全程看日志滚动即可。刷完设备会重启并连上 WiFi,在 Home Assistant 里添加 ESPHome 设备(输入设备提示的 IP 和密钥),就能看到 Water Valve 这个开关了。此时如果继电器还没接线,点开关只会看到 ESP32 的 GPIO2 电平翻转,可以先用串口日志确认输出。
接线图怎么看:COM、NO 和共地
继电器模块接线按下面的对应关系来:
ESP32 引脚 继电器模块 继电器负载侧 电磁阀 GPIO2 ---- IN 5V ---- VCC GND ---- GND COM ---- 电源正极 NO ---- 电磁阀正极 GND <------------------- GND(电源负极、电磁阀负极)三个要点:
- 负载回路走的是你的电源适配器,不是 ESP32 的 5V 脚。12V 电磁阀配 12V 电源,线圈电流大,走 ESP32 会直接把开发板供电拉崩。
- 电源的 GND 必须和 ESP32 的 GND 接在一起(共地),否则控制信号电平没有参考,继电器会乱吸合或不吸合。
- 只用 NO(常开)触点:继电器不通电时 NO 断开、阀关,通电吸合后 NO 与 COM 导通、阀开。
进阶玩法:定时关阀、互锁和报警切断
接线完成、手动开关正常后,往下加配置即可,改完重新esphome run一次就生效。
开阀 10 秒自动关,适合浇花、冲洗这类场景:
script: - id: water_10s mode: restart then: - switch.turn_on: water_valve - delay: 10s - switch.turn_off: water_valvemode: restart表示重复触发时从头计时,连点两次等于重新开阀 10 秒,而不是叠加执行。
互锁:如果同一台设备上既有水阀又有气阀,可以禁止两个同时开:
switch: - platform: gpio name: "Gas Valve" pin: GPIO4 id: gas_valve interlock: [water_valve] interlock_wait_time: 500msinterlock引用另一个开关的 id,开启 gas_valve 时若 water_valve 还开着,会等它关闭(等待上限 500ms)后才放行,避免两个回路同时导通。
报警强制关阀:在阀体旁接一个常开型的泄漏/故障报警触点(比如水浸传感器、压力开关),把它读成二进制传感器:
binary_sensor: - platform: gpio name: "Leak Alarm" device_class: moisture pin: number: GPIO14 mode: input inverted: true on_press: - switch.turn_off: water_valveinverted: true是因为常开触点"报警前是断开、报警时闭合",取反后报警对应状态变为 1;on_press触发时立刻关阀。device_class可以换成gas、window等,Home Assistant 会据此显示正确图标。更多设备类型和动作写法见 esphome/components/binary_sensor/init.py。
排坑清单
- 点开关继电器不动作:十有八九是
inverted的问题。市售继电器模块的 IN 脚普遍是低电平有效(拉低才吸合),在 switch 里加inverted: true即可。 - ESP32 的 GPIO2 不推荐:部分开发板上 GPIO2 上电瞬间被拉高,可能出现"还没连网阀就开了"。换 GPIO4、GPIO5 之类普通 IO 更稳妥。
- 12V 阀配 5V 电源:阀会嗡嗡响但打不开,或干脆不动作,先看阀体铭牌电压再配电源。
- 继电器"咔哒"但阀不开:检查 NO 和 COM 是否接反、负载回路是否共地、电源功率是否够(电磁阀启动电流通常是稳态的 2~3 倍)。
- 改了配置不生效:ESPHome 改的是 YAML,必须重新
esphome run编译烧录,不是保存即生效。 - 碰 220V 阀:交流高压阀请用电磁接触器或固态继电器隔离,接线时断电操作,本文的继电器小模块只适合低压直流场景。
延伸方向
- 把
sensor组件的 ADC 平台接一个土壤湿度传感器,用numeric_state自动化实现湿度低于阈值自动开阀,水阀从手动变成闭环灌溉。 - ESPHome 还有专门的 valve 组件,带开度百分比和"关闭"状态,适合两通阀、百叶窗这类需要"停在中间位置"的机构,可以对比 switch 的纯开关模型。
- 在配置里加一个
web_server组件,不依赖 Home Assistant 也能用浏览器直接开关阀,适合没有 HA 的纯 DIY 场景。 - 熟悉单阀之后,可以研究
switch组件的template平台,把多个 GPIO 组合成一个带逻辑的虚拟开关,而不只是在硬件层互锁。
【免费下载链接】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),仅供参考