Arduino光敏電阻測試,適合家長及小朋友一齊創作。

親子STEM DIY:用Arduino製作光線感應指示燈|KY-018光敏電阻

上一課我們利用PIR人體感應模組製作簡易人體感應警報器,今次再進一步,讓小朋友認識另一種常見的感測方式:感應環境光線。

今次使用 KY-018光敏電阻感測模組 配合 Arduino Uno R3, 製作一個簡單的「光線感應指示燈」。Arduino會讀取KY-018的光線感測數值,再按照程式設定的門檻控制LED亮起或熄滅。

今次的重點並不只是「做一盞燈」,而是讓小朋友由上一課的數碼輸入(Digital Input)進一步學習類比輸入(Analog Input),了解感測器可以將環境變化轉化成Arduino可以讀取的數值。


實際完成的Arduino光線感應指示燈:KY-018負責感應環境光線,Arduino根據讀取到的數值控制LED。

💡 今次要學懂甚麼?

這個小製作會帶小朋友認識以下幾個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

  1. 確認KY-018的VCC、GND及S接線正確。
  2. 確認LED及220Ω電阻接線正確。
  3. 將Arduino Uno透過USB連接電腦。
  4. 將上述程式上載到Arduino。
  5. 開啟Arduino IDE的Serial Monitor。
  6. 將Serial Monitor速度設定為9600 baud。
  7. 先觀察正常室內光線下的讀數。
  8. 用手遮住KY-018的光敏電阻。
  9. 再用手機燈或電筒照向KY-018。
  10. 比較不同光線環境下的讀數及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會亮」。

可以讓小朋友進行一個小小的實驗:

  1. 記錄正常房間光線下的數值。
  2. 遮住KY-018,再記錄數值。
  3. 用手機燈照射KY-018,再記錄數值。
  4. 比較三組讀數。
  5. 嘗試將程式中的500改成其他數值。
  6. 重新上載程式。
  7. 再次測試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作品。

返回部落格