ESPHome 加一只光照传感器:客厅灯自己开自己关,只要一份 YAML
2026/9/14 12:18:43 网站建设 项目流程

ESPHome 加一只光照传感器:客厅灯自己开自己关,只要一份 YAML

【免费下载链接】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 光照传感器和灯泡"聊上话",灯光就能自己开关,还能渐变。

效果速览

烧录完通电,你会发现:

  • 屋里变暗、光照读数跌破 300 勒克斯,灯自动亮到八成
  • 阳光进来、读数升到 500 勒克斯以上,灯缓缓变暗、自己熄灭
  • 开和关都带 1 秒渐变,不会"啪"地一下刺眼
  • 日志里每 5 秒报一行光照读数,你能看见它"看到"了什么
  • 全程不连云端,断网的时候灯照样工作

为什么是这套

维度这套方案Arduino 裸写 + 云平台
成本ESP32 板子加一个光照传感器,二三十块MCU、屏幕、云服务,硬件加账号费用
上手难度写一份 YAML 就能跑,不用编程自己写 C++,还得再写云端对接
本地化局域网内闭环,断网照常工作云端当中间人,数据出门外

选它的理由很实在:光照传感器驱动 里 BH1750 已经现成,灯那边直接用 灯光模块 的基类。

动手搭建

准备清单

  1. [必需] ESP32 开发板,NodeMCU-32S 这类都行
  2. [必需] BH1750 I2C 光照传感器模块,背面带焊好的排针
  3. [必需] 白色 LED 灯珠(或灯带)加一颗 220 欧姆限流电阻
  4. [可选] 几根杜邦线和一块面包板,方便反复调整
  5. [可选] 4.7K 上拉电阻,模块板载了就省掉

先接线,避开坑

I2C 就是两根线的"对讲机":SDA 传数据、SCL 传时钟,传感器接上就能用。

  • SDA → GPIO21SCL → GPIO22,这两根是和传感器说话的线
  • GPIO4 → LED 灯珠正极(串一个 220 欧姆电阻),负极接 GND
  • ⚠️ 传感器VCC 必须接 3.3V,别插到 5V 上,几秒就烧
  • ⚠️ 大功率灯别直接挂 GPIO,中间加个 MOS 管,不然引脚扛不住

把配置写下来

在工作目录建smart_light.yaml

esphome: name: smart-light esp32: board: nodemcu-32s wifi: ssid: !secret wifi_ssid # WiFi 名称和密码放 secrets.yaml password: !secret wifi_password i2c: sda: GPIO21 scl: GPIO22 scan: true # 上电扫总线,看传感器在不在 logger: sensor: - platform: bh1750 name: "室内光照度" id: ambient_light update_interval: 5s # 每 5 秒报一次光照 output: - platform: ledc id: led_output pin: GPIO4 frequency: 1kHz # PWM 频率,1kHz 以上基本不闪 light: - platform: monochromatic name: "智能主灯" id: main_light output: led_output default_transition_length: 1s # 开灭都带 1 秒渐变

参数速查:

参数建议值注意什么
update_interval5s太快费电,太慢反应迟钝
frequency1kHzPWM 调光频率,1kHz 以上看不出闪
default_transition_length0.5~1s渐隐时间,超过 2 秒会觉得拖沓
scantrue首烧时用它确认传感器连上了没

单色灯实现在 monochromatic 驱动,PWM 输出来自 ledc 驱动。想换引脚,改 i2c 和 output 里的两处就行。

烧录验证

esphome run smart_light.yaml # 编译加烧录,结尾应看到 "Upload done" esphome logs smart_light.yaml # 预期每 5 秒出现一行光照读数

日志里要是看到I2C Error,说明传感器没应答,回到上一步重查 VCC 和 GND,别接反了。日志里能看到读数,说明已经通了;也可以直接在浏览器里的 ESPHome dashboard 点两下完成同样的事。

让它更聪明

让它变聪明有两招。

第一招是迟滞:开灯和关灯的阈值别用同一个数,读数在阈值附近抖动时它才不轻易动手。思路是写两条 numeric_state 自动化,一条below: 300负责开、另一条above: 500负责关,各配一个for等几秒再执行。这和空调温度设个"死区"是一个道理,差值越大越稳。

第二招是定时:晚上九点自动切夜间模式。

automation: - trigger: - platform: time at: "21:00:00" condition: - light.is_on: id: main_light - platform: state id: ambient_light below: 400 action: - light.turn_on: id: main_light brightness: 0.4 transition_length: 2s

结构一看就懂:两个条件(灯亮着、读数低于 400)都满足,才把亮度降到 0.4 并用 2 秒过渡。把时间换成"你到家"、再加个人体感应条件,玩法就更多了。

踩坑速查

  • 症状:读数一直是 0。原因:传感器在 I2C 总线上没应答,多半是 VCC/GND 接反或虚焊。解法:留着scan: true,首烧时在日志里确认扫到0x23
  • 症状:灯发暗地闪。原因:PWM 频率太低,和灯珠共振。解法frequency改到 1kHz 以上;还闪就换个 channel 试试
  • 症状:一会儿开一会儿关,来回折腾。原因:开关用了同一个阈值,读数正好在它附近飘。解法:按上一节做成双阈值,开和关的数别相同

还能玩什么

  • 接个 PIR 人体感应,做出"人来灯亮、人走灯灭":PIR 人体传感器
  • 把白灯换成 RGBW 灯带,加调色温:RGB 灯
  • 加个 HTTP 请求,把光照读数推到自家服务器:http 请求

一套配置、二三十块的硬件,以后出门忘关灯,灯会自己灭——那份省心,就是自动化最实在的样子。

【免费下载链接】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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询