玄關感應燈、樓梯自動照明這種需求,其實不用買現成的智慧燈具,一顆PIR感應模組加繼電器就能自己做,成本差很多而且更有成就感。
模組上的兩顆旋鈕在幹嘛
HC-SR501板子上有兩顆可調電位器,一顆調靈敏度(感應距離,大約3-7公尺可調),另一顆調延遲時間(偵測到人之後訊號維持高電位多久,幾秒到幾分鐘都能調)。板子背後還有一個跳線帽可以切換觸發模式:「不可重複觸發」代表延遲時間內即使一直有人也不會重新計時,「可重複觸發」則是只要偵測到動作就會不斷延長計時,居家用建議切到可重複觸發,不然人在房間裡不動一下燈就熄了。
接電路控制燈具
- PIR模組輸出的是數位訊號(高/低電位),不能直接拿去控制110V的燈具,一定要透過繼電器模組做電氣隔離
- 邏輯很簡單:PIR輸出高電位→觸發繼電器→繼電器接通燈具電源,程式碼幾乎不用寫控制演算法,單純讀PIR腳位狀態去控制繼電器腳位就好
- 延遲時間如果覺得旋鈕調不夠精準,也可以把延遲判斷交給Arduino程式碼處理(millis()計時),旋鈕直接轉到最短,精準度會比類比旋鈕好抓
小提醒:PIR感應的是「紅外線熱源的變化」,所以完全靜止的人有可能感應不到(這也是為什麼有些感應燈你站著不動一下子就熄了),裝在走道這種會持續移動的場景效果最好。
材料清單(BOM)
| 品項 | 數量 | 備註 |
|---|---|---|
| Arduino UNO R3 開發板 | 1 | 本篇教學使用的開發板 |
| HC-SR501 人體感應模組 | 1 | |
| 一路5V繼電器模組 | 1 | |
| 燈具(燈泡+燈座) | 1 | 依現場需求自備,市電配線請注意安全 |
腳位接線對照表
| 開發板腳位 | 模組腳位 | 說明 |
|---|---|---|
| 5V | HC-SR501 VCC | 感應器供電 |
| GND | HC-SR501 GND | 共地 |
| D2 | HC-SR501 OUT | 感應輸出訊號 |
| 5V | 繼電器 VCC | 繼電器供電 |
| GND | 繼電器 GND | 共地 |
| D8 | 繼電器 IN | 繼電器觸發訊號 |
繼電器COM/NO端子接燈具的市電迴路,務必先斷電再配線,不熟悉市電配線建議請專業電工協助,對照前面AC-DC隔離電源那篇文章提到的安全原則。
📷 〔照片預留位:請在這裡插入實際接線/組裝照片〕
完整程式碼
// HC-SR501人體感應自動燈(用millis()自己計時延遲,精準度比板子上的旋鈕更好抓)
#define PIR_PIN 2
#define RELAY_PIN 8
const unsigned long ON_DURATION = 10000; // 偵測到人後燈亮持續時間(毫秒),可自行調整
unsigned long lastMotionTime = 0;
bool lightOn = false;
void setup() {
pinMode(PIR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW); // 開機先確保燈是關的
Serial.begin(9600);
}
void loop() {
int motion = digitalRead(PIR_PIN);
if (motion == HIGH) {
lastMotionTime = millis();
if (!lightOn) {
digitalWrite(RELAY_PIN, HIGH);
lightOn = true;
Serial.println("偵測到人,燈亮");
}
}
if (lightOn && (millis() - lastMotionTime > ON_DURATION)) {
digitalWrite(RELAY_PIN, LOW);
lightOn = false;
Serial.println("超過設定時間沒有動作,燈熄");
}
}
