DEV Community

張旭豐
張旭豐

Posted on

讓房間會呼吸:Arduino 感應燈 DIY(350元,一個晚上)

讓房間會呼吸:Arduino 感應燈 DIY(350元,一個晚上)


那天晚上,阿哲說「這燈好像活的」

不是比喻。

是真的像在呼吸。

房間暗下來的時候,燈跟著暗下去。有人走進範圍,燈就亮了。不是那種「啪一下亮了」的開關,是漸漸的,像眼睛適應黑暗。

他蹲在牆角調參數,弄了三個版本。最後那版,他把延遲從 500 毫秒改成 200 毫秒。

就這 300 毫秒的差別。

「差太多了,」他說。「這個版本才像是房間真的在注意我。」


做出來之後的生活

你改完參數的那一刻,燈的反應就變了。

這個燈會:

  • 人在範圍內 → 漸亮
  • 人離開 → 漸暗
  • 白天光線夠 → 完全不亮(省電)

不是智慧家庭那種「 OK Google 開燈」。是那種「你走過去,它就知道了」的感覺。


材料(全部露天拍賣可買)

材料 單價 數量 小計
Arduino Nano(兼容版) NT$130 1 NT$130
HC-SR501 人體紅外線感測器 NT$45 1 NT$45
5mm 白色 LED NT$5 8 NT$40
220Ω 電阻 NT$1 8 NT$8
麵包板 NT$40 1 NT$40
杜邦線 NT$30 1 NT$30
總計 NT$293

材料到貨時間:約 1-2 天。


接線(只有 5 條)

HC-SR501 → Arduino
VCC  →  5V
GND  →  GND
OUT  →  D7

LED(8顆並聯)→ Arduino
長腳(陽極)→ D13( через 220Ω 電阻)
短腳(陰極)→ GND
Enter fullscreen mode Exit fullscreen mode

就這樣。沒有更多東西了。


程式碼

const int PIR_PIN = 7;
const int LED_PIN = 13;

int lastState = LOW;

void setup() {
  pinMode(PIR_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int motion = digitalRead(PIR_PIN);

  if (motion == HIGH && lastState == LOW) {
    // 人進來了 → 漸亮
    for (int b = 0; b <= 255; b += 15) {
      analogWrite(LED_PIN, b);
      delay(30);
    }
    Serial.println("Motion detected → LED ON");
  }
  else if (motion == LOW && lastState == HIGH) {
    // 人離開了 → 漸暗
    for (int b = 255; b >= 0; b -= 10) {
      analogWrite(LED_PIN, b);
      delay(30);
    }
    Serial.println("No motion → LED OFF");
  }

  lastState = motion;
  delay(100);
}
Enter fullscreen mode Exit fullscreen mode

三個參數可以調

參數 調整位置 效果
延遲感(Delay) HC-SR501 背面旋鈕 左=快(靈敏),右=慢(遲鈍)
亮的速度 程式 b += 15 數字越大,亮得越快
暗的速度 程式 b -= 10 數字越大,暗得越快

先試工廠預設值。如果覺得太遲鈍,把左邊旋鈕往左轉一點。


從這裡開始

  1. 露天拍賣搜尋「Arduino Nano HC-SR501」
  2. 今天下單
  3. Arduino IDE(免費,中文介面)
  4. 複製上面的程式碼
  5. 燒進去,試試看

燈會呼吸的那一刻,你就知道這個房間聽得懂你。

Top comments (0)