news 2026/9/14 14:01:54

30分钟搞定:ESPHome光照传感器实现智能照明自动关灯

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
30分钟搞定:ESPHome光照传感器实现智能照明自动关灯

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: 1s

frequency: 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: 5s

numeric_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 柔和模式"会在时间漂移时半夜乱触发。

三个值得继续做的方向

  1. 亮度跟环境走,而不是开关二选一。action里的固定brightness换成模板表达式,例如按光照度反比映射亮度:环境越暗,灯补光越足。ESPHome 的模板引擎支持在自动化里直接引用id: ambient_light的读数算数。
  2. 加人体感应做"人在灯亮"。BH1750 管昼夜,PIR 模块管有人没人,两个传感器喂给同一条 automation 的条件链,实现"天黑 + 有人"才全亮、"天黑 + 没人"只留 5% 夜灯。
  3. 接入 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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 14:01:34

PHP TDD完整实践:从PHPUnit配置到CI集成与踩坑指南

说实话,我干了十几年 PHP,早年也是"先写完功能再说"那一派的。线上改一行代码、手一抖把>写成>,结果整站订单金额全错这种事,摊上一次就够你记一辈子。后来我认真把 TDD(Test-Driven Development&…

作者头像 李华
网站建设 2026/9/14 14:01:17

SpringBoot非遗文化数字化管理系统架构与实践

1. 非遗文化数字化管理的时代背景 非遗文化作为人类文明的活态基因库,正面临着前所未有的传承危机。根据联合国教科文组织统计,全球平均每两周就有一种传统技艺消失。在我国,近五年已有超过200项传统技艺因传承人老龄化面临失传风险。这种背景…

作者头像 李华
网站建设 2026/9/14 14:00:20

Transformer用于锂离子电池RUL预测的工程实践指南

简介:本资源是一套基于PyTorch实现的Transformer架构锂离子电池剩余使用寿命(RUL)预测模型,面向新能源、智能运维及电池健康管理领域的研究人员与工程实践者,解决高精度、数据驱动型RUL预测建模难题。压缩包共16个文件…

作者头像 李华
网站建设 2026/9/14 14:00:09

Windows下MD5校验的三种实用方法对比

1. Windows环境下MD5校验的三种实战方案 作为开发者和系统管理员,我们经常需要验证文件的完整性。上周我接手一个项目时,客户发来的压缩包在传输过程中出现了损坏,导致解压后关键数据丢失。这种场景下,MD5校验就成了我们的"文…

作者头像 李华
网站建设 2026/9/14 13:59:44

基于YOLO26的高空抛物智能检测系统设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 13:59:43

Docker 端口占用,Codex 跑排障:Key 用 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华