親子STEM DIY:用Arduino製作光線感應指示燈|KY-018光敏電阻
分享
上一課我們利用PIR人體感應模組製作簡易人體感應警報器,今次再進一步,讓小朋友認識另一種常見的感測方式:感應環境光線。
今次使用 KY-018光敏電阻感測模組 配合 Arduino Uno R3, 製作一個簡單的「光線感應指示燈」。Arduino會讀取KY-018的光線感測數值,再按照程式設定的門檻控制LED亮起或熄滅。
今次的重點並不只是「做一盞燈」,而是讓小朋友由上一課的數碼輸入(Digital Input)進一步學習類比輸入(Analog Input),了解感測器可以將環境變化轉化成Arduino可以讀取的數值。

💡 今次要學懂甚麼?
這個小製作會帶小朋友認識以下幾個Arduino基本概念:
- 甚麼是光敏電阻(Photoresistor / LDR)
- 甚麼是類比輸入(Analog Input)
- 如何使用
analogRead()讀取感測器數值 - 如何利用Serial Monitor觀察感測器讀數
- 如何利用一個數值門檻控制LED
- 為甚麼同一個LED,接線方式不同時,LOW和HIGH的效果可以不同
簡單來說,今次的學習流程就是:
環境光線 → KY-018 → 類比數值 → Arduino程式判斷 → LED顯示結果
🧰 你需要準備甚麼材料?
| 材料 | 用途 |
|---|---|
| Arduino Uno R3 | 控制及讀取感測器數值 |
| KY-018光敏電阻感測模組 | 感應環境光線變化 |
| LED | 顯示光線感應結果 |
| 220Ω電阻 | 限制LED電流 |
| 麵包板(Breadboard) | 方便無焊接接線 |
| 杜邦線(Jumper Wires) | 連接Arduino、KY-018及LED |
| USB數據線 | 供電及上載Arduino程式 |
今次使用外置LED,因此需要配合220Ω限流電阻。LED不應直接接駁Arduino輸出腳位,串聯電阻可以限制LED電流。
整個製作不需要焊接,適合用麵包板進行親子DIY。
👨👩👧 建議年齡及製作時間
- 建議年齡:約8歲或以上,在家長陪同下進行
- 製作時間:約30–45分鐘,視乎小朋友年齡及Arduino經驗而定
- 難度:Arduino入門
- 是否需要焊接:不需要
💡 今次學習的新概念:類比輸入(Analog Input)
上一課使用PIR人體感應模組時,Arduino主要判斷輸入是HIGH還是LOW,可以簡單理解為「有沒有偵測到動作」。
光敏電阻則有所不同。
光敏電阻(Photoresistor / LDR)會隨著光照條件改變而改變其電阻特性。KY-018模組將光敏電阻配合電路,從S(Signal)腳輸出感測訊號,Arduino便可以使用類比輸入讀取一個數值。
與單純的HIGH / LOW相比,類比輸入可以讓我們看到一個範圍內的數值變化。
今次使用Arduino Uno的A0腳位讀取KY-018的訊號。
因此,小朋友可以由上一課的:
「有」或者「沒有」
進一步學習:
「現在讀到的是多少?」
這正是Arduino STEM學習中非常重要的一步。
🔌 接線方法
先按照以下方法連接KY-018:
| KY-018 | Arduino Uno |
|---|---|
| S / Signal | A0 |
| VCC | 5V |
| − / GND | GND |
然後按照實際接線方式連接外置LED及220Ω電阻。
今次的LED採用低電位控制(Active-Low)方式。在這種接法下,Arduino D13輸出LOW時LED亮起;輸出HIGH時LED熄滅。
| Arduino | 連接 |
|---|---|
| D13 | LED控制端(經220Ω電阻) |
| LED另一端 | 接正電源 |
由於LED的實際控制效果取決於接線方式,因此製作時不要只看LED的正負極,也要留意LED究竟是由HIGH還是LOW觸發。

實際接線示範:Arduino Uno配合KY-018、LED及220Ω電阻,在麵包板上完成光線感應測試。
🔎 為甚麼今次LED是「黑暗時發亮」?
這部分也是今次小朋友可以學到的一個重要概念。
我們使用的程式是:
if (lightLevel < 500) {
digitalWrite(ledPin, LOW);
} else {
digitalWrite(ledPin, HIGH);
}
而在今次實際LED接線方式下:
| Arduino D13 | LED狀態 |
|---|---|
| LOW | LED亮 |
| HIGH | LED熄 |
因此,當Arduino讀到的數值低於500時:
lightLevel < 500 → D13 LOW → LED亮
而當讀數為500或以上時:
lightLevel ≥ 500 → D13 HIGH → LED熄
所以在今次實際製作中,可以將它理解為一個簡單的光線感應指示燈:當感測數值達到程式設定的條件時,LED便會改變狀態。
要注意:LED的亮/熄方向與接線方式有關。如果將LED改用另一種接法,LOW和HIGH所代表的實際LED狀態亦可能相反。
💻 Arduino程式碼
以下就是今次使用的完整Arduino程式:
const int lightSensorPin = A0;
const int ledPin = 13;
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
int lightLevel = analogRead(lightSensorPin);
Serial.println(lightLevel);
if (lightLevel < 500) {
digitalWrite(ledPin, LOW);
} else {
digitalWrite(ledPin, HIGH);
}
delay(200);
}
程式逐行理解
1. 設定感測器腳位
const int lightSensorPin = A0;
告訴Arduino,我們會使用A0讀取KY-018的訊號。
2. 設定LED腳位
const int ledPin = 13;
LED控制腳位使用D13。
3. 設定LED為輸出
pinMode(ledPin, OUTPUT);
因為Arduino需要控制LED,所以D13設定為OUTPUT。
4. 啟動Serial Monitor通訊
Serial.begin(9600);
這樣我們便可以在Arduino IDE的Serial Monitor看到感測器讀數。
5. 讀取KY-018
int lightLevel = analogRead(lightSensorPin);
analogRead()會讀取A0的類比輸入,並將結果儲存在lightLevel。
6. 將數值顯示在Serial Monitor
Serial.println(lightLevel);
每次讀取後,Arduino都會將數值列印出來。
7. 使用500作為示範門檻
if (lightLevel < 500) {
digitalWrite(ledPin, LOW);
} else {
digitalWrite(ledPin, HIGH);
}
程式會比較目前讀數與500。
這裡的500並不是一個固定的「光暗標準」,而是一個方便入門示範的門檻值。
不同房間、燈光、感測器位置,以及不同KY-018模組,都可能令實際讀數有所不同。因此,真正有趣的地方是讓小朋友自己觀察Serial Monitor,再決定適合自己的門檻。
🧪 第一次測試:改變光線,觀察LED
- 確認KY-018的VCC、GND及S接線正確。
- 確認LED及220Ω電阻接線正確。
- 將Arduino Uno透過USB連接電腦。
- 將上述程式上載到Arduino。
- 開啟Arduino IDE的Serial Monitor。
- 將Serial Monitor速度設定為9600 baud。
- 先觀察正常室內光線下的讀數。
- 用手遮住KY-018的光敏電阻。
- 再用手機燈或電筒照向KY-018。
- 比較不同光線環境下的讀數及LED狀態。
🔍 為甚麼一定要看Serial Monitor?
如果只是看LED亮不亮,小朋友只能知道「結果變了」。
但如果同時打開Serial Monitor,就可以看到Arduino實際讀取到甚麼數值。
例如可以進行以下小實驗:
| 測試環境 | 記錄Arduino讀數 | LED狀態 |
|---|---|---|
| 正常室內光線 | 自行記錄 | 自行觀察 |
| 用手遮住感測器 | 自行記錄 | 自行觀察 |
| 手機燈/電筒照射 | 自行記錄 | 自行觀察 |
這個過程其實就是一個很簡單的STEM實驗:
觀察 → 測量 → 設定 → 測試 → 修改
而不是單純將一段程式碼複製到Arduino就完成。
🧠 光敏電阻是怎樣工作的?
光敏電阻(LDR / Photoresistor)是一種會因應光照條件改變電阻特性的感測元件。
KY-018將光敏電阻及相關電路整合在小型PCB上,並提供S(Signal)輸出,讓Arduino可以透過類比輸入讀取訊號變化。
因此,當環境光線發生變化時,KY-018的輸出訊號亦會改變,Arduino再將這個訊號轉換成程式可以處理的數值。
小朋友可以將整個過程想像成:
光線變化
↓
KY-018感測器輸出變化
↓
Arduino A0讀取數值
↓
程式比較數值
↓
LED改變狀態
🎯 STEM Challenge:自己找出適合的門檻
完成基本製作後,不要立即滿足於「LED會亮」。
可以讓小朋友進行一個小小的實驗:
- 記錄正常房間光線下的數值。
- 遮住KY-018,再記錄數值。
- 用手機燈照射KY-018,再記錄數值。
- 比較三組讀數。
- 嘗試將程式中的500改成其他數值。
- 重新上載程式。
- 再次測試LED的亮滅。
例如可以問小朋友:
- 「如果將500改成300,會發生甚麼?」
- 「如果改成700呢?」
- 「在房間開燈和關燈時,讀數有甚麼不同?」
- 「如果將感測器放近手機燈,讀數會不會改變?」
- 「如果換一個房間,原本的500還適合嗎?」
這樣便可以由「跟住教學做」進一步變成真正的測量、比較及實驗。
🚀 進階玩法
完成基本版本後,可以繼續改良這個小製作。
1. 製作真正的自動夜燈
可以根據實際測試所得的讀數,重新設定門檻,令LED在指定環境光線條件下自動亮起。
2. 加入PWM自動調光
下一步可以學習Arduino的PWM及analogWrite(),不只是控制LED「亮/熄」,而是控制LED的亮度。
3. 加入蜂鳴器
當光線達到某個條件時,同時啟動蜂鳴器,製作簡單的光線警報器。
4. 加入LCD顯示器
將KY-018的讀數直接顯示在LCD上,例如:
Light Level: 420
這樣小朋友便可以更直觀地看到感測器數值。
5. 與上一課PIR結合
更進一步,可以將今次的KY-018與上一課的PIR人體感應器結合,例如只有在「環境較暗」及「偵測到有人移動」兩個條件同時成立時才亮燈。
這已經開始接近真正的自動照明系統邏輯。
🧠 今次學到的Arduino知識
| 概念 | 今次學習內容 |
|---|---|
| Analog Input | 使用A0讀取KY-018 |
| analogRead() | 將感測器訊號讀取成數值 |
| Serial Monitor | 查看Arduino實際讀數 |
| if / else | 根據數值作出不同動作 |
| Threshold | 使用500作為示範判斷門檻 |
| Digital Output | 利用D13控制LED |
| Active-Low | 了解LOW可以代表LED亮,視乎接線方式 |
👨👩👧 家長提示
- 接線或重新插拔元件前,建議先拔除Arduino USB電源。
- 接線後先檢查VCC、GND及Signal是否接到正確腳位。
- 外置LED應配合限流電阻使用。
- 今次使用USB低壓供電,不涉及市電。
- 小朋友製作時建議由家長陪同。
- 麵包板、LED、電阻及杜邦線等小零件應遠離幼兒。
- 如LED沒有按照預期亮滅,先檢查LED正負極、D13接線及電阻位置,再檢查程式。
❓ FAQ 常見問題
Q1:一定要使用麵包板嗎?
不是。麵包板只是讓初學者可以不用焊接,方便快速修改及測試電路。對親子DIY來說,麵包板會比較容易操作。
Q2:為甚麼KY-018要接A0,而不是D2、D3等數碼腳位?
因為今次需要讀取光線感測器的數值,而不是單純判斷HIGH或LOW,所以使用Arduino的Analog Input,例如A0。
Q3:為甚麼今次是環境較暗時LED亮?
因為今次程式設定為當lightLevel < 500時,D13輸出LOW;而實際LED採用低電位控制方式,因此LOW會令LED亮起。
Q4:500是不是固定的光線標準?
不是。500只是今次示範使用的門檻值。實際讀數會受環境光線、感測器位置、燈光及模組本身等因素影響。建議先觀察Serial Monitor,再按實際測試結果調整。
Q5:如果我的LED亮滅方向跟文章不同,怎麼辦?
首先檢查LED的接線方式。LED是HIGH亮還是LOW亮,取決於實際電路接法。如果接法不同,即使使用相同的Arduino程式,LED的亮滅方向亦可能不同。
Q6:可以直接使用Arduino Uno板上的內置LED嗎?
可以作為簡單測試,但今次教學使用外置LED,是希望小朋友同時學習LED、限流電阻、麵包板及實際電路接線。
Q7:為甚麼Serial Monitor的數值一直變化?
因為感測器會持續感應周圍環境。房間燈光、手的位置、手機燈、窗外陽光等都可能令讀數改變。因此,感測器數值不一定會固定在同一個數字。
Q8:如果500在我的環境不合適,可以怎樣做?
可以。先記錄不同環境下的讀數,再將程式中的500修改成較適合你實際環境的門檻,重新上載程式測試。
🎥 實際測試效果
實際測試Arduino光線感應指示燈:改變環境光線,觀察KY-018讀數及LED亮滅變化。
📚 從PIR到KY-018:Arduino學習進一步
如果你有跟住上一課的Arduino人體感應警報器,今次的學習其實是一個自然的延伸。
| 上一課:PIR | 今次:KY-018 |
|---|---|
| 人體動作感應 | 環境光線感應 |
| Digital Input | Analog Input |
| HIGH / LOW | 數值讀取 |
| digitalRead() | analogRead() |
| 判斷有沒有動作 | 比較光線數值 |
由這兩個小製作,小朋友已經開始掌握Arduino很重要的一個基本概念:
感測器負責「感應」,Arduino負責「判斷」,輸出元件負責「顯示結果」。
🏠 小結:由「感應」開始學Arduino
今次使用KY-018光敏電阻模組及Arduino Uno,製作一個簡單的光線感應指示燈。
小朋友不只是學會接線及上載程式,更會開始理解:
環境變化 → 感測器 → 數值 → 程式判斷 → 輸出
而且透過Serial Monitor實際觀察數值,再自行修改500這個門檻,便可以由「跟住教學做」進一步變成真正的STEM實驗。
上一課我們學習PIR的Digital Input,今次開始接觸KY-018的Analog Input。下一步便可以進一步學習PWM、LED調光、超聲波距離感測器、LCD顯示,甚至Wi-Fi物聯網。
🛒 相關產品
如果你正在香港尋找Arduino、STEM及DIY電子零件,可以親身到新昌電腦位於深水埗鴨寮街的店舖選購及測試相關產品。
🔖 延伸學習
完成今次光線感應小製作後,可以繼續挑戰:
- Arduino PWM LED自動調光
- Arduino超聲波距離感測器
- Arduino溫度感測器
- Arduino LCD顯示器
- PIR + KY-018雙感測器自動燈
- ESP32 Wi-Fi智能感應燈
由一粒光敏電阻開始,小朋友已經可以一步一步建立自己的Arduino STEM作品。