用 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 文件,通断、定时、联动全交给设备自己执行,手机面板上随手可关。
原理一句话:YAML 是怎么变成引脚电平的
ESPHome 的工作方式很直白:把你写的 YAML 编译成固件,烧进 ESP32。配置里每写一行pin: GPIO2,固件里就多一条绑定——"这个开关打开时,把 GPIO2 拉高"。
继电器模块在中间扮演"以小控大"的中间人:它的 IN 端收到高电平就吸合,内部 COM 和 NO 两个触点导通,阀线圈这才真正通电。整条链路就四步:
YAML 里的一个名字 → 引脚电平 → 继电器吸合 → 阀动作
理解了这个,后面所有配置都是在这条链上加条件。
接线图与端子对应关系:5 根线全对上
以 ESP32 开发板 + 单路继电器模块为例,杜邦线按下面这张图接:
ESP32 继电器模块 电磁阀 GPIO2 ─────► IN 5V ─────► VCC GND ─────► GND COM ─────► 电源 +(12V 或 24V,看铭牌) NO ─────► 线圈 + 电源 − ──► 线圈 −[图片占位:此处放接线实物图]
⚠️ 先别急着通电:芯片引脚只有 3.3V/5V、几十毫安的驱动能力,12V/24V 的阀线圈绝不能直接接 GPIO,必须经过继电器。线圈该用多大电压、多大电流,以你手边阀体铭牌为准。
第二个易错点是 COM / NO / NC 三个端子。COM 是公共端,接电源正极;NO(常开触点)平时断开、继电器吸合后才闭合。接错到 NC 会出现"下发关阀命令,阀反而打开"的反直觉现象——这不是玄学,是常闭触点的正常逻辑。
把配置写对:一份能直接编译的 YAML
新建solenoid_valve.yaml,照抄下面这份,把 WiFi 两处换成你自己的即可:
esphome: name: solenoid-valve esp32: board: nodemcu-32s wifi: ssid: YOUR_WIFI_SSID password: YOUR_WIFI_PASSWORD api: ota: switch: - platform: gpio name: "Water Valve" pin: GPIO2 id: water_valve inverted: false restore_mode: RESTORE_DEFAULT_OFFinverted: true表示"高电平 = 关",如果你的继电器模块逻辑相反就改它;restore_mode决定断电重启后恢复上次的开关状态,默认关。api:留空即开启,Home Assistant 会自动发现这个开关。
两个阀共存时加互锁(interlock:保证两个阀不会同时通电):
- platform: gpio name: "Gas Valve" pin: GPIO4 id: gas_valve interlock: - water_valve interlock_wait_time: 500msinterlock_wait_time是两个阀状态互斥的判断窗口,500ms 足够滤掉手抖。开关组件的完整字段可在 esphome/components/switch/init.py 里查到。
再加一个反馈:很多阀自带位置微动开关,接一根线回 ESP32,就能在面板上看到"阀真的开了":
binary_sensor: - platform: gpio name: "Valve Feedback" pin: number: GPIO14 mode: INPUT_PULLUP inverted: true device_class: running on_press: - switch.turn_off: water_valveon_press指信号从无到有的瞬间触发。这里故意让它触发一次强制关阀——万一阀卡住回弹、反馈却显示"还开着",这条线就是你的兜底。反馈触发器细节见 esphome/components/binary_sensor/。
编译烧录只需两条命令:
pip install esphome esphome run solenoid_valve.yaml玩法一:阳台滴灌,按土壤湿度自动开关
土壤湿度传感器(两针探头,信号脚接 GPIO34——这是 ESP32 的模拟输入脚)接上后,配置追加:
sensor: - platform: adc name: "Soil Moisture" pin: GPIO34 id: soil_moisture threshold: below: 0.3 on_below: - script.execute: water_timer script: - id: water_timer then: - switch.turn_on: water_valve - delay: 30s - switch.turn_off: water_valvethreshold(阈值触发器)的意思是"读数跨过这条线才动作":低于 0.3V 时执行water_timer脚本——开阀、等 30 秒、关阀,一次灌溉 30 秒。脚本默认 single 模式,正在灌溉时重复触发会被忽略,不会把阀门来回折腾。
0.3 这个数先别照抄:在面板里看着传感器读数,干土和湿土各记一个值,取中间偏干的位置填回去。adc 平台的取值原理可参考 esphome/components/sensor/。
玩法二:燃气泄漏,关阀 + 手机推送
燃气报警模块的干触点(不带电的开关信号,报警时闭合)接一个空闲 GPIO:
binary_sensor: - platform: gpio name: "Gas Leak Alarm" pin: number: GPIO12 mode: INPUT_PULLUP inverted: true device_class: gas on_press: - switch.turn_off: gas_valve - homeassistant.service: service: notify.mobile_app_my_phone data: message: "燃气报警,已自动关阀"报警一来,先关阀再推送,顺序不能反。notify.mobile_app_my_phone是 Home Assistant 里你配的推送服务,按自己环境改服务名。
⚠️ 涉及燃气的自动化请在专业指导下测试,并保留手动关阀通道——任何自动化都不应成为唯一的那道保险。
阀不动时的三步排查法
- 听继电器。面板上开开关,模块上应有一声"咔哒"和指示灯亮。没有咔哒,先查 IN/VCC/GND 三根线,十有八九是 5V 和 GND 接反了。
- 量电压。继电器吸合后,用万用表量 COM-NO 之间应等于电源电压;再对照线圈两端电压是否和铭牌一致。电压不对,换电源而不是换阀。
- 查极性。现象是"开变关、关变开",把
inverted改成true再烧一次即可;日志用esphome logs solenoid_valve.yaml看,编译期报错基本都出在 pin 写错名字上。
GPIO 开关的实现逻辑(含互锁)在 esphome/components/gpio/switch/,想确认某个字段的行为时值得翻一眼。
下一步往哪走
跑通单阀之后,自然的延伸是把"开多久、什么时候开"从脚本里挪到 Home Assistant 的定时器和场景里,ESPHome 只管执行;再往后,多个阀、多路 RS485 计量表接进来,这套接线方式原样复用。先把一个阀的反馈回路做稳,比一次接八个阀更有价值。
【免费下载链接】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),仅供参考