ESP32水银倾斜传感器内置LED控制问题及代码适配需求
解决ESP32水银倾斜传感器控制LED常亮问题
问题背景
我将水银倾斜传感器连接到ESP32,期望传感器处于ON状态时内置LED点亮,OFF状态时LED熄灭。当前编写的ESPHome YAML配置能正确检测传感器的ON/OFF状态,但LED始终保持常亮。需要实现与以下Arduino代码功能完全等效的ESPHome配置:
参考Arduino代码
#include <Arduino.h> // 定义引脚 const int mercurySwitchPin = 4; const int ledPin = 13; void setup() { // 配置引脚 pinMode(mercurySwitchPin, INPUT_PULLUP); pinMode(ledPin, OUTPUT); } void loop() { int switchState = digitalRead(mercurySwitchPin); if (switchState == LOW) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } }
原ESPHome配置(存在LED常亮问题)
binary_sensor: - platform: gpio pin: number: GPIO4 mode: INPUT_PULLUP inverted: true name: "Mercury Switch" on_press: then: - logger.log: "Mercury Switch Turned On!" - output.turn_on: builtin_led on_release: then: - logger.log: "Mercury Switch Turned Off!" - output.turn_off: builtin_led output: - platform: gpio pin: GPIO13 id: builtin_led
问题分析
原配置中binary_sensor添加了inverted: true,虽能正确检测状态,但与Arduino代码的直接电平映射逻辑不一致;同时仅依赖on_press/on_release触发动作,缺少初始化时的状态同步,可能导致LED初始状态异常。
修正后的等效ESPHome配置
以下配置完全复刻Arduino代码的逻辑:传感器引脚读为LOW时点亮LED,读为HIGH时熄灭LED,同时添加启动时的状态初始化,避免LED初始状态异常。
binary_sensor: - platform: gpio pin: number: GPIO4 mode: INPUT_PULLUP # 不设置inverted,保持引脚电平与传感器状态直接对应:HIGH=传感器OFF,LOW=传感器ON name: "Mercury Switch" id: mercury_switch output: - platform: gpio pin: GPIO13 id: builtin_led automation: - alias: "LED跟随水银传感器状态" trigger: # 传感器状态变化时触发 - platform: state entity_id: binary_sensor.mercury_switch # 设备启动时初始化LED状态 - platform: homeassistant event: start - platform: esphome event: system_ready action: - if: condition: # 传感器引脚为LOW(传感器ON),对应binary_sensor状态为OFF - binary_sensor.is_off: mercury_switch then: - output.turn_on: builtin_led - logger.log: "水银传感器已触发 - LED点亮" else: - output.turn_off: builtin_led - logger.log: "水银传感器已断开 - LED熄灭"
关键说明
- 移除
binary_sensor的inverted: true,保持与Arduino代码一致的电平映射逻辑。 - 使用
automation监听传感器状态变化及设备启动事件,确保LED状态始终与传感器同步。 - 通过
binary_sensor.is_off判断传感器引脚是否为LOW(即传感器导通状态),对应点亮LED。
内容的提问来源于stack exchange,提问作者kilerin
相关产品推荐
相关产品推荐

