燈亮了,桌面就夠亮嗎?阿明博士用 BH1750 看見照度差異
內容整理:台灣智能感測科技|導讀角色:阿明博士
同一盞燈,照在桌中央和角落,感受可能完全不同。這一篇,阿明博士把 BH1750 接上 ESP32-S3,量量工作面實際收到多少光,再搭配 SHT20 的溫濕度,做一個簡單的工作區環境觀察站。
BH1750 可搭配 ESP32-S3 與 ESPHome 量測工作面照度,並和 SHT20 共用 I²C 接線。固定位置與方向後,就能比較開燈、日光和窗簾對桌面亮度的影響。
- 比較桌面不同位置與時段的照度
- 溫度、濕度與照度放在同一頁查看
- 為之後的照明調整建立觀察基礎
燈有亮,和桌面收到多少光,是兩回事
BH1750 提供照度資料,常用的單位是 lux(勒克斯)。在這個案例裡,我們先把感測器放在工作面附近,固定方向與高度,再比較開燈、關燈、拉窗簾或不同時段的變化。
它適合用在工作桌、展示櫃或小型空間的觀察。不要一邊移動感測器,一邊比較數值;也不要把不同角度的手機讀值直接當成同一個標準。
和 SHT20 共用接線,增加一顆也不複雜
SHT20 和 BH1750 都使用 I²C,可以共用 GPIO8 的 SDA 與 GPIO9 的 SCL。它們各有自己的位址,主板能分別找到它們。這一課的 BH1750 使用 0x23;如果模組的 ADDR 設定不同,可能會看到 0x5C,對應修改設定即可。
本課接線以 Adafruit BH1750 模組為參考,VIN 使用 3.3V。換成別款模組時,先核對電源與端子排列,不要只因外觀相似就沿用位置。
先找到有意義的變化,再決定要不要控制燈具
範例每 5 秒讀一次照度,也會顯示資料是否持續更新。你可以先記錄平常舒服的工作環境,再看看哪些時段會變暗、哪些角落受不到光。這會比一開始就替所有空間訂同一個門檻,更貼近實際用途。
這一課先把量測做好。日後若想自動開關燈,還要考慮延遲、手動操作與感測器故障時怎麼處理,避免有人走過造成短暫陰影,燈就跟著切換。
種植物,也能直接拿這個數字來看嗎?
lux 和植物常用的光合作用光量指標不同。BH1750 不提供光譜、色溫或顯色性;若目的是評估種植燈,應選符合用途的感測器,不能替所有光源套同一個換算係數。
先準備這些材料
| 材料 | 準備重點 |
|---|---|
| ESP32-S3 N16R8 | 主板、資料 USB 線、2.4GHz Wi-Fi |
| SHT20 I²C 模組 | 商品 6129,使用 3.3V 供電 |
| BH1750 | 本文採 Adafruit 參考模組,以 3.3V 接到 VIN |
主板請確認為 WROOM-1-N16R8,範例使用 16MB Flash 與 Octal PSRAM。接線先斷電,表格中的 GPIO 是腳位名稱,不是排針從上往下數的位置。
照著圖,把線一條條接好
依名稱逐條對照接線

| 感測器接腳 | ESP32-S3/電源 | 核對事項 |
|---|---|---|
| SHT20 VCC | 主板 3V3 | 本課限 3.3V I²C 模組,先核對實物 |
| SHT20 GND | 主板 GND | 所有訊號參考共地 |
| SHT20 SDA | GPIO8 | 上拉至 3.3V |
| SHT20 SCL | GPIO9 | 100kHz;先用短線 |
| BH1750 VIN/GND | 3V3/GND | 參考 Adafruit 模組 |
| BH1750 SDA/SCL | GPIO8/GPIO9 | ADDR 低時 0x23 |
所有模組都要與主板共地。若使用外接電源,不要把外接 5V 和 USB 5V 直接並接,也不要把獨立 3.3V 穩壓器的輸出接到主板 3V3 輸出。先量好電壓,再接入訊號線。
把設定放進主板
- 下載整個 examples 資料夾,保留 components;把 secrets.yaml.example 複製成 secrets.yaml,填入自己的 Wi-Fi 與密碼。
- 依照Windows 燒錄指南安裝 ESPHome 2026.10.1,選擇本課 YAML,先檢查設定、再編譯與 USB 燒錄。
- 在 USB 日誌或路由器裝置清單找到主板 IP,瀏覽器輸入該 IP,再用 secrets 裡的網頁帳密登入。
以下命令在 examples 資料夾執行,COM5 請換成自己的埠號。USB 接頭、日誌與後續 OTA 更新的操作,都整理在共用指南。
..\.venv\Scripts\python.exe -m esphome config 04-light.yaml
..\.venv\Scripts\python.exe -m esphome compile 04-light.yaml
..\.venv\Scripts\python.exe -m esphome upload 04-light.yaml --device COM5
下載完整範例(含 04-light.yaml) · 下載完整範例(含 secrets.yaml.example)
完整 YAML:點此展開
esphome:
name: course-04-light
friendly_name: "BH1750 環境光監測"
min_version: 2026.10.1
compile_process_limit: 1
esp32:
board: esp32-s3-devkitc-1
flash_size: 16MB
framework:
type: esp-idf
psram:
mode: octal
speed: 80MHz
logger:
hardware_uart: USB_SERIAL_JTAG
level: DEBUG
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
power_save_mode: none
reboot_timeout: 0s
ota:
- platform: esphome
password: !secret ota_password
web_server:
port: 80
version: 3
local: true
auth:
type: digest
username: !secret web_username
password: !secret web_password
i2c:
id: sensor_bus
sda: GPIO8
scl: GPIO9
scan: true
frequency: 100kHz
external_components:
- source:
type: local
path: components
components: [sht20_local]
sensor:
- platform: sht20_local
id: sht20_driver
address: 0x40
update_interval: 10s
temperature:
id: sht_temperature
name: "SHT20 Temperature"
on_value:
then:
- lambda: |-
id(last_sht_ms) = millis();
id(sht_seen) = true;
humidity:
id: sht_humidity
name: "SHT20 Humidity"
on_value:
then:
- lambda: |-
id(last_rh_ms) = millis();
id(rh_seen) = true;
- platform: bh1750
id: light_level
name: "BH1750 Illuminance"
address: 0x23
update_interval: 5s
on_value:
then:
- lambda: |-
id(last_light_ms) = millis();
id(light_seen) = true;
globals:
- id: last_sht_ms
type: uint32_t
restore_value: false
initial_value: '0'
- id: sht_seen
type: bool
restore_value: false
initial_value: 'false'
- id: last_rh_ms
type: uint32_t
restore_value: false
initial_value: '0'
- id: rh_seen
type: bool
restore_value: false
initial_value: 'false'
- id: last_light_ms
type: uint32_t
restore_value: false
initial_value: '0'
- id: light_seen
type: bool
restore_value: false
initial_value: 'false'
binary_sensor:
- platform: template
name: "SHT20 Temperature Fresh"
lambda: |-
return id(sht_seen) && (uint32_t)(millis() - id(last_sht_ms)) < 35000;
- platform: template
name: "SHT20 Humidity Fresh"
lambda: |-
return id(rh_seen) && (uint32_t)(millis() - id(last_rh_ms)) < 35000;
- platform: template
name: "BH1750 Data Fresh"
lambda: |-
return id(light_seen) && (uint32_t)(millis() - id(last_light_ms)) < 20000;
接好後,先試這幾件事
先從正常顯示開始,再試一次拔除、恢復或更換環境條件。這些小步驟有助於確認你看到的資料,確實來自現在的接線與位置。
| 測試項目 | 應觀察的結果 |
|---|---|
| I²C 掃描 | 同時看到 0x40 與 0x23,或依實物修改為 0x5C |
| 遮住與移開感測器 | 照度方向合理變化;不要求回到完全相同數字 |
| 拔除 BH1750 | 20 秒後新鮮度失效,SHT20 仍可持續更新 |
| 不同安裝位置 | 記錄方向與高度,不能混合不同位置的數據作精度判斷 |
遇到問題時,從這裡開始找
先查供電和共地,再核對端子名稱與訊號方向。I²C 裝置可看掃描位址;PMS5003T 走 UART,不會出現在 I²C 清單。接著確認設定的型號與最後一次更新時間,最後才檢查網頁或後端。資料停住時,不要先把它當成環境一直沒變。
材料與延伸閱讀
ESP32-S3 N16R8 主板 · SHT20 I²C 模組。依實際用途選擇所需感測器即可。
想看原廠文件與元件說明
常見問題
這個照度數字可以直接當成植物的 PPFD 嗎?
不行。lux 和植物常用的 PPFD 衡量方式不同,BH1750 也不提供光譜。若用途是評估植物燈,應改選符合量測目的的感測器。

發佈留言
很抱歉,必須登入網站才能發佈留言。