30分钟搞定: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光照传感器加一个 BH1750 模块,配一根可 PWM 调光的灯带。整个过程没写一行 C++ 代码,只写了一份 YAML 配置文件。现在灯会在天黑到 300lux 以下时自己亮起,早上天亮到 500lux 以上时自己熄灭——自动关灯这件事从此和我不再相关。
这套方案的核心就三件事:读光照、控灯光、跑自动化。下面按我实际动手的顺序讲。
你需要准备什么 💡
| 物料 | 型号/规格 | 备注 |
|---|---|---|
| 主控板 | ESP32(NodeMCU-32S) | ESP8266 也能跑,但 PWM 通道少 |
| 光照传感器 | BH1750 模块(I2C 接口) | 测量范围 1~65535 lx,足够家用 |
| 灯光 | 白色 LED 灯带 + 恒流驱动 | 灯珠需支持 PWM 调光 |
| 外围 | 4.7kΩ 上拉电阻 ×2 | 部分 BH1750 模块板载,先确认 |
| 线材 | 杜邦线若干 | 建议线长不超过 20cm |
接线就四根线:VCC 接 3.3V(接 5V 会直接烧模块)、GND 接 GND、SDA 接 GPIO21、SCL 接 GPIO22。BH1750 的 I2C 地址固定为 0x23,ESPHome 的 bh1750 组件内置的就是这个地址,不用额外配置。
两个提醒:BH1750 的 VCC 必须走 3.3V,模块上那个 5V 稳压器是给板载逻辑用的,别被它骗了;GPIO 驱动的电流很弱,灯带供电要独立走 5V,只让 ESP32 出 PWM 信号。
一个配置文件搞定三件事 🔧
ESPHome 的思路是:所有硬件能力都写成配置项,编译时生成固件。一个smart_light.yaml就包含完整的读光照→控灯光→跑自动化链路。
第一件事:读光照。sensor 段挂上 bh1750 平台:
esphome: name: smart-light esp32: board: nodemcu-32s i2c: sda: GPIO21 scl: GPIO22 sensor: - platform: bh1750 name: "室内光照度" id: ambient_light update_interval: 5s filters: - sliding_window_moving_average: window_size: 5注意两点:update_interval我设 5s(组件默认 60s,对开灯场景太迟钝);sliding_window_moving_average用 5 次采样取平均,滤掉窗帘晃动、路人遮挡造成的毛刺值。单位自动是 lx,精度默认 1 位小数,不用自己标。
第二件事:控灯光。灯带走 ESP32 的 LEDC 硬件 PWM 输出,再套一个 monochromatic 单色灯平台:
output: - platform: ledc id: led_output pin: GPIO4 frequency: 1kHz channel: 0 light: - platform: monochromatic name: "智能主灯" output: led_output default_transition_length: 1sfrequency: 1kHz是 ledc 组件的默认值,显式写出来是为了提醒你:频率低于几百 Hz 时肉眼可见闪烁,1kHz 起步基本无感。default_transition_length: 1s让开关灯有个渐变,直接硬切太生硬。
第三件事:跑自动化。这里是 ESPHome 自动化真正值钱的地方——触发器、条件、动作都写在设备本地,断网也能工作,这点和依赖 Home Assistant 的自动化完全不同:
automation: - alias: "天黑自动开灯" trigger: - platform: numeric_state id: ambient_light below: 300 for: 1m action: - light.turn_on: id: main_light - alias: "天亮自动关灯" trigger: - platform: numeric_state id: ambient_light above: 500 for: 2m action: - light.turn_off: id: main_light - alias: "晚间柔和模式" trigger: - platform: time at: "21:00:00" condition: - light.is_on: id: main_light action: - light.turn_on: id: main_light brightness: 0.4 transition_length: 5snumeric_state是 sensor 组件注册的触发器,for: 1m表示"低于 300lx 持续一分钟才触发"——这个延时参数非常关键,它直接决定了阈值敢不敢定得激进。
踩坑速查:我翻车过的四个地方 ⚡
坑一:esphome logs里 BH1750 报 I2C 通信失败。90% 的概率是 I2C 总线上没上拉电阻,或者 SDA/SCL 接反了。ESP32 的 GPIO21/22 内部上拉强度很弱,长走线或负载重时必须外挂 4.7kΩ 电阻。上电前拿万用表测一下 VCC 对 GND,确认不是 5V。
坑二:阈值定不准,灯在临界值附近反复开关。我的处理:开灯阈值 300lx、关灯阈值 500lx,两个阈值之间留出 200lx 的迟滞带。再加for延时兜底。具体数值别抄我的——把 BH1750 放在灯旁边,傍晚和深夜各记录一次esphome logs里的读数,取你房间实际的"体感分界线"再各留 20% 余量。阈值定偏的后果是:冬天下午 4 点太阳一偏,灯天天误开。
坑三:灯带 PWM 调到最低时不灭,留一条灰线。先查是不是接了brightness_scale上限;再查驱动板是否自带恒流最小值。硬件保底电流改不了,软件上就把自动化里的最低亮度设到 0.1 以上,别追求绝对的 0。
坑四:ESP8266 用户发现 ledc 用不了。ledc 输出组件依赖 ESP32,ESP8266 上换pwm输出平台,配置写法一致,只是调光精度和可用频率低一些。
另外提一句time触发器:它需要设备有可靠的时间源(NTP),配置里加个time平台指向 NTP 即可,否则"21:00 柔和模式"会在时间漂移时半夜乱触发。
三个值得继续做的方向
- 亮度跟环境走,而不是开关二选一。把
action里的固定brightness换成模板表达式,例如按光照度反比映射亮度:环境越暗,灯补光越足。ESPHome 的模板引擎支持在自动化里直接引用id: ambient_light的读数算数。 - 加人体感应做"人在灯亮"。BH1750 管昼夜,PIR 模块管有人没人,两个传感器喂给同一条 automation 的条件链,实现"天黑 + 有人"才全亮、"天黑 + 没人"只留 5% 夜灯。
- 接入 Home Assistant 做联动。ESPHome 编译后自动注册到 HA,光照度实体可以在 HA 里画趋势图,还能反过来用它控制这盏灯的优先级——本地自动化兜底,云端联动增强,互不依赖。
一份配置、一块三元的传感器,灯光从此有了自己的主意。
【免费下载链接】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),仅供参考