親子 STEM DIY (第3課):用 Arduino 製作超聲波距離感應器|HC-SR04 測距教學 (2026)
分享
想讓 Arduino 自動感應物件距離?今次我們會使用 Arduino Uno R3 配合 HC-SR04 超聲波感應器,製作一個簡單的距離測量裝置,並利用 LED 顯示距離是否達到指定範圍。
這個 DIY 專案適合初學者認識超聲波測距、數碼輸入與輸出,以及 Arduino 程式中的條件判斷。完成後,你可以透過 Serial Monitor 即時查看測量距離,並觀察 LED 如何隨著物件遠近而改變狀態。
課程重點
- 認識 HC-SR04 超聲波感應器的基本原理
- 學習使用 Arduino 輸出觸發訊號及讀取回波
- 透過程式計算物件距離
- 使用
if條件判斷控制 LED - 了解感應器測距的限制及實際應用
適合對象: Arduino 初學者、親子 STEM DIY、學生及 Maker
預計時間: 約 30–45 分鐘,視乎年齡及經驗而定
難度: 入門
所需工具: 電腦、USB 線及基本電子實驗配件
一、所需材料
開始之前,請準備以下材料:
- Arduino Uno R3 開發板 — 執行程式及控制 LED。
- HC-SR04 超聲波感應器 — 發出超聲波並接收物件反射回來的訊號。
- LED 發光二極管 — 顯示距離判斷結果。
- 220Ω 電阻 — 限制 LED 電流。
- 麵包板及杜邦線 — 方便進行無焊接接線。
- USB 線及電腦 — 用來連接 Arduino、上載程式及查看測量數據。
產品連結:
接線前請注意: Arduino Uno R3 的數碼輸出使用 5V 邏輯。本文的接線及程式以一般 HC-SR04 模組和 Arduino Uno R3 為例;使用其他型號的感應器時,請先確認其工作電壓及接線要求。
二、HC-SR04 如何測量距離?
HC-SR04 是常見的超聲波測距模組,前方有兩個圓形換能器,分別用於發射及接收超聲波。
它的基本運作原理如下:
- Arduino 向感應器的 Trigger(Trig)腳輸出一個短暫的觸發訊號。
- 感應器發出超聲波。
- 超聲波遇到物件後反射回來。
- 感應器透過 Echo 腳輸出回波訊號,Arduino 計算回波的持續時間。
- 程式根據聲音傳播速度,估算感應器與物件之間的距離。
由於測量的是超聲波來回傳播所需的時間,因此計算距離時需要除以 2。
距離計算公式:
距離(cm)= 回波時間(μs) × 0.0343 ÷ 2
其中,0.0343 是約 20°C 空氣中聲音的傳播速度,單位為 cm/μs。實際測量結果會受到溫度、物件表面、角度及環境等因素影響。
三、Arduino 接線方法

本教學會使用 D9 控制 Trig、D10 讀取 Echo,以及 D13 控制外置 LED。
HC-SR04 接線表
| HC-SR04 腳位 | Arduino Uno R3 |
|---|---|
| VCC | 5V |
| GND | GND |
| Trig | D9 |
| Echo | D10 |
LED 接線表
| LED/元件 | 接駁位置 |
|---|---|
| Arduino D13 | 接駁 220Ω 電阻 |
| 220Ω 電阻另一端 | LED 正極(長腳) |
| LED 負極(短腳) | GND |
這是一般的正電位控制接法:D13 輸出 HIGH 時,LED 亮起;D13 輸出 LOW 時,LED 熄滅。
接線提示:
- LED 長腳通常是正極,短腳通常是負極。
- 220Ω 電阻應串聯在 LED 電路中,以限制電流。
- 所有元件的 GND 必須與 Arduino 的 GND 共地。
- 接線前先拔除 USB 電源,完成檢查後才重新連接。
四、完整 Arduino 程式碼
將以下程式複製到 Arduino IDE,選擇正確的開發板及連接埠,再上載至 Arduino Uno R3。
const int trigPin = 9;
const int echoPin = 10;
const int ledPin = 13;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop() {
long duration;
float distance;
// 發送超聲波觸發訊號
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// 讀取 Echo 高電位持續時間
// 最多等待 30,000 微秒,避免無限期等待
duration = pulseIn(echoPin, HIGH, 30000UL);
if (duration == 0) {
// 沒有收到有效回波
Serial.println("No echo - please check sensor or target.");
// 無有效測量結果時,關閉 LED
digitalWrite(ledPin, LOW);
} else {
// 計算距離,單位為 cm
distance = duration * 0.0343 / 2;
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// 距離少於 10 cm 時,LED 熄滅
if (distance < 10) {
digitalWrite(ledPin, LOW);
} else {
// 距離達到 10 cm 或以上時,LED 亮起
digitalWrite(ledPin, HIGH);
}
}
delay(200);
}
程式碼重點解說
1. 設定感應器及 LED 腳位
const int trigPin = 9;
const int echoPin = 10;
const int ledPin = 13;
程式指定 D9 作為超聲波觸發輸出、D10 作為回波輸入,而 D13 則用來控制 LED。
2. 發送觸發訊號
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
Arduino 先將 Trig 設為 LOW,再輸出約 10 微秒的 HIGH 脈衝,通知感應器開始測距。
3. 讀取回波時間
duration = pulseIn(echoPin, HIGH, 30000UL);
pulseIn() 會測量 Echo 訊號維持 HIGH 的時間。這裡設定 30,000 微秒的等待上限,若沒有收到有效回波,函數便會回傳 0。
4. 計算距離
distance = duration * 0.0343 / 2;
程式使用回波時間及聲音傳播速度估算距離,並除以 2,因為超聲波需要先傳到物件,再反射回感應器。
5. 根據距離控制 LED
if (distance < 10) {
digitalWrite(ledPin, LOW);
} else {
digitalWrite(ledPin, HIGH);
}
在本文指定的 LED 接線方式下:
- 距離少於 10 cm: D13 輸出 LOW,LED 熄滅。
- 距離達到 10 cm 或以上: D13 輸出 HIGH,LED 亮起。
這裡的 10 cm 是我們自行設定的示範門檻,並不是 HC-SR04 固定的判斷值。
另外,當程式沒有收到有效回波時,會另外顯示提示訊息並關閉 LED,不會把無效讀數直接當成實際距離。
五、如何測試專案?
完成接線及上載程式後,可以按照以下步驟測試:
- 在 Arduino IDE 開啟 Serial Monitor。
- 將鮑率設定為 9600 baud。
- 將一件平整的物件放在 HC-SR04 前方,先保持約 20 cm 距離。
- 觀察 Serial Monitor 顯示的距離數值,以及 LED 是否亮起。
- 慢慢將物件移近感應器。
- 當測量距離少於 10 cm 時,LED 應該熄滅。
- 再將物件移遠至 10 cm 或以上,LED 應該重新亮起。
預期測試結果
| 測量情況 | Serial Monitor | LED 狀態 |
|---|---|---|
| 物件距離約 20 cm | 顯示約 20 cm(實際讀數會有差異) | 亮起 |
| 物件距離約 12 cm | 顯示約 12 cm(實際讀數會有差異) | 亮起 |
| 物件距離約 8 cm | 顯示約 8 cm(實際讀數會有差異) | 熄滅 |
| 沒有收到有效回波 | 顯示 No echo 提示 | 熄滅 |
實際數值會因為物件材質、角度、環境及感應器本身的差異而有所不同,因此不應要求每次讀數都完全一致。
六、常見問題及排解方法
1. Serial Monitor 沒有顯示任何數值,怎麼辦?
請確認以下事項:
- Arduino IDE 已選擇正確的開發板及連接埠。
- Serial Monitor 的鮑率設定為 9600。
- 程式已成功上載至 Arduino。
- USB 線可正常傳輸資料,而不只是供電。
2. 一直顯示 No echo,怎麼辦?
請檢查 HC-SR04 的 VCC、GND、Trig 及 Echo 接線是否正確。測試時,將一件平整的物件放在感應器前方,並確保物件沒有太過傾斜。
若仍然沒有回波,可以檢查杜邦線接觸是否良好,以及感應器是否正常運作。
3. LED 的亮滅狀態與預期相反,怎麼辦?
請先檢查 LED 的接線方式。本文採用一般正電位控制接法:D13 HIGH 時 LED 亮起,D13 LOW 時 LED 熄滅。
如果你採用不同的電路接法,LED 的亮滅邏輯可能會相反,需要相應調整程式。
4. 為甚麼測量距離會不停跳動?
超聲波可能受到物件表面、反射角度、周圍障礙物及環境溫度影響。建議使用平整物件進行測試,避免物件傾斜,並保持感應器固定。
如需要更穩定的結果,可以進一步學習多次取樣及平均值計算。
5. HC-SR04 可以測量任何物件嗎?
不能保證所有物件都能得到穩定讀數。柔軟、吸音、不規則或傾斜的表面可能令回波較弱或反射方向改變,影響測量結果。
6. 為甚麼距離少於 10 cm 時,LED 反而熄滅?
這是程式刻意設定的效果。當距離少於 10 cm,程式會令 D13 輸出 LOW;按照本文的 LED 接線方式,LOW 代表 LED 熄滅。
當距離達到 10 cm 或以上時,D13 輸出 HIGH,LED 便會亮起。
7. 沒有收到回波,是否代表物件就在 10 cm 以內?
不是。沒有收到有效回波,可能是物件表面或角度不適合反射超聲波、接線不良,或感應器未能正常測量。
因此,本教學會將沒有回波的情況獨立處理,並在 Serial Monitor 顯示提示訊息,而不是直接當作有效距離。
8. 這個專案可以用來製作自動泊車提示器嗎?
這個專案可以作為學習原型,示範如何透過距離感應控制輸出。不過,單一 HC-SR04 及簡單 Arduino 程式並不等同可靠的汽車泊車安全系統。如要用於實際泊車或其他安全相關用途,必須另外考慮感應器限制、故障處理及系統可靠性。
七、延伸 STEM DIY 挑戰
完成基本專案後,可以嘗試以下改良:
挑戰 A:改變觸發距離
將程式中的 10 改為 15 或 20,觀察 LED 的反應距離如何改變。
挑戰 B:加入蜂鳴器
加入合適的蜂鳴器,當物件進入指定距離時發出提示聲。開始前先確認蜂鳴器類型及接線要求。
挑戰 C:顯示距離
加入 LCD 或 OLED 顯示屏,讓測量距離直接顯示在螢幕上。
挑戰 D:改善測量穩定性
嘗試連續測量多次,再計算平均值,減少個別讀數波動對結果的影響。
這些延伸練習可以幫助學生理解感應器、條件判斷、數據處理及電子輸出的關係。
八、總結
今次我們使用 Arduino Uno R3 及 HC-SR04 超聲波感應器,完成了一個簡單的距離測量專案。透過這個實驗,你可以學習如何發送觸發訊號、讀取回波時間、計算距離,以及根據測量結果控制 LED。
更重要的是,這個專案展示了感應器數據如何轉化為實際的控制行為,也是進一步學習自動化、機械人及 STEM DIY 的良好起點。
如果你正在尋找 Arduino 開發板、超聲波感應器或其他 STEM DIY 配件,可以瀏覽新昌電腦的 Arduino 產品分類:
新昌電腦有限公司 Sun Cheong Computer Company Limited
深水埗鴨寮街 246 號地下
專注電子零件、Arduino、感應器及技術應用。