用 Arduino + 超聲波感測器打造互動燈光裝置 🔊💡
前言
想做出「手一靠近燈就亮」的魔術效果嗎?其實只要幾百塊錢的零件,就能用 Arduino + 超聲波感測器做出超酷的互動燈光裝置!
今天就來分享如何從零打造這套系統,適合新手入門,也適合拿来做為互動藝術專案的基础。
原理說明
超聲波感測器怎麼測距離?
HC-SR04 超聲波感測器運作原理很直覺:
- 發射超聲波:模組發射一個 40kHz 的超聲波脈衝
- 等待反射:超聲波碰到障礙物後反彈回來
- 計算時間:模組測量超聲波來回的飛行時間
-
轉換距離:使用公式
距離 = 時間 × 聲速 / 2(除以二是因為要算單程)
聲速大約是 340 m/s,所以在室溫下公式可以簡化為:
距離(cm) = 時間(μs) / 58
LED 亮度控制
Arduino 控制 LED 亮度的方式是 PWM(脈寬調變)。簡單來說:
- 把數位訊號「開開關關」,以極快速度切換
- 調整「開」的比例,就能控制平均電壓
- 進而控制 LED 的亮度(0 = 全暗,255 = 最亮)
硬體清單
| 零件 | 數量 | 備註 |
|---|---|---|
| Arduino Uno | 1 | 也可以用 Nano 或 Mega |
| HC-SR04 超聲波感測器 | 1 | 測量範圍 2cm - 400cm |
| RGB LED 或 單色 LED | 1-3 | 這裡用 RGB LED 做示範 |
| 220Ω 電阻 | 3 | 限流用 |
| 麵包板 + 跳線 | 若干 | 組裝用 |
電路接線圖
Arduino HC-SR04
------- -------
5V ───► VCC
GND ───► GND
Pin 7 ───► TRIG
Pin 6 ───► ECHO
(透過 1kΩ 電阻分壓保護 Arduino)
Arduino RGB LED (共陽極)
------- ---------------
Pin 9 ───► R (透過 220Ω)
Pin 10 ───► G (透過 220Ω)
Pin 11 ───► B (透過 220Ω)
5V ───► 共陽腳 (最長的腳)
⚠️ 注意:HC-SR04 的 ECHO 腳會輸出 5V 訊號,直接接到 Arduino 5V 針腳可能會有風險。建議加上 1kΩ + 2kΩ 電阻做分壓,或使用 5V 容忍的 Arduino 板(如 Due)。
程式碼
// 互動燈光裝置 - 超聲波感測器控制 RGB LED
// 作者:你的名字 | 發布於 DEV Community
const int TRIG_PIN = 7; // 超聲波發射腳
const int ECHO_PIN = 6; // 超聲波接收腳
const int LED_R = 9; // RGB LED 紅色腳
const int LED_G = 10; // RGB LED 綠色腳
const int LED_B = 11; // RGB LED 藍色腳
// 距離閾值設定(單位:公分)
const int MIN_DISTANCE = 5; // 最近距離(燈最亮)
const int MAX_DISTANCE = 50; // 最遠距離(燈全暗)
void setup() {
Serial.begin(9600);
// 設定超聲波腳位
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// 設定 LED 腳位
pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_B, OUTPUT);
}
void loop() {
// 測量距離
int distance = measureDistance();
// 根據距離計算亮度 (0-255)
int brightness = map(distance, MIN_DISTANCE, MAX_DISTANCE, 255, 0);
brightness = constrain(brightness, 0, 255);
// 根據距離變換顏色
// 近距離:藍色 → 中距離:綠色 → 遠距離:紅色
int r, g, b;
if (distance < 15) {
// 近距離:藍色系
r = 0;
g = 0;
b = brightness;
} else if (distance < 30) {
// 中距離:綠色系
r = 0;
g = brightness;
b = 0;
} else {
// 遠距離:紅色系
r = brightness;
g = 0;
b = 0;
}
// 設定 LED 顏色(PWM 控制)
analogWrite(LED_R, r);
analogWrite(LED_G, g);
analogWrite(LED_B, b);
// 偵錯輸出(可註解掉)
Serial.print("距離: ");
Serial.print(distance);
Serial.print(" cm | 亮度: ");
Serial.println(brightness);
delay(50); // 稍微延遲,避免偵測太頻繁
}
// 測量距離函式(回傳單位:公分)
int measureDistance() {
// 發射超聲波短脈衝
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// 讀取 Echo 腳的高電位持續時間
long duration = pulseIn(ECHO_PIN, HIGH, 30000); // 30ms 超時保護
// 處理超時情況(距離太遠)
if (duration == 0) {
return MAX_DISTANCE;
}
// 計算距離:duration(μs) / 58 ≈ 距離(cm)
int distance = duration / 58;
// 限制範圍
if (distance < MIN_DISTANCE) distance = MIN_DISTANCE;
if (distance > MAX_DISTANCE) distance = MAX_DISTANCE;
return distance;
}
進階玩法
完成基本款之後,可以嘗試這些升級:
- 多燈矩陣:用 MAX7219 驅動 8x8 LED 矩陣,做出更複雜的圖案
- 手勢控制:改用 APDS-9960 感測器,辨識左右滑動手勢
- 聲光互動:加上聲音感測器,距離控制顏色、聲音控制閃爍頻率
- Wi-Fi 遙控:加上 ESP8266,變成物聯網裝置,用手機控制
- 燈帶升級:用 WS2812B 可編程 LED 燈帶,效果更夢幻
零件推薦
想動手做但還沒買零件?這裡推薦幾個靠譜的商城:
🌏 國際商城
| 商城 | 特色 | 適合 |
|---|---|---|
| DFRobot | 中文界面、品項齊全、Arduino 官方合作 | 新手友善 |
| Seeed Studio | Grove 系統、易於擴展 | 进阶学习 |
| AliExpress | 價格最低、選擇最多 | 預算有限 |
| Amazon | 速度快、品管穩定 | 急單需求 |
🇹🇼 台灣本地
| 商城 | 特色 | 適合 |
|---|---|---|
| Robot Knight 機器人意識 | 現貨当天出、在地客服 | 急單 |
| 物聯小屋 | 教學資源豐富、論壇活躍 | 自學者 |
| PChome 線上商城 | 速度快、可超商取貨 | 方便 |
💡 省錢小技巧:同一個零件在 AliExpress 和台灣商城可能差 3-5 倍價錢!不趕時間的話,建議在 AliExpress 一次買齊所有零件,省下的錢可以多做幾個專案。
常見問題
Q:超聲波感測器不穩定怎麼辦?
A:可以取多次測量的平均值,或是在感測器前方加一個遮光罩減少干擾。
Q:LED 閃爍怎麼回事?
A:檢查供電是否充足,LED 直接接 Arduino 可能電流不夠。建議外接電源或加電容穩壓。
Q:可以控制 NeoPixel 燈帶嗎?
A:當然可以!只要安裝 Adafruit NeoPixel 函式庫,把 analogWrite() 換成 strip.setPixelColor() 即可。
結語
用 Arduino + 超聲波感測器做互動裝置,是許多互動設計師、藝術家的入門起點。原理不難,但創意無限——可以做成:
- 🎵 跟著音樂節奏變化的牆面燈
- 🚪 有人經過就亮起的走廊燈
- 🪴 靠近植物就變換顏色的智能盆栽燈
你的下一步是什麼? 留言分享你的專案點子吧!
如果你覺得這篇文章有幫助,歡迎轉發、留言交流。也歡迎追蹤我,會持續分享更多 IoT、互動裝置的製作教學!
標籤: #Arduino #超聲波感測器 #互動設計 #IoT #Maker #嵌入式系統 #LED #DIY
本文提及的商品連結為聯盟行銷連結,透過這些連結購買,我可能會獲得少量佣金,但不影響你的購物價格。這筆費用會支持我繼續創作更多免費教學內容,感謝支持!
Top comments (0)