Arduino初學者,學習如何使用超聲波模組。

親子 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 線及基本電子實驗配件


一、所需材料

開始之前,請準備以下材料:

  1. Arduino Uno R3 開發板 — 執行程式及控制 LED。
  2. HC-SR04 超聲波感應器 — 發出超聲波並接收物件反射回來的訊號。
  3. LED 發光二極管 — 顯示距離判斷結果。
  4. 220Ω 電阻 — 限制 LED 電流。
  5. 麵包板及杜邦線 — 方便進行無焊接接線。
  6. USB 線及電腦 — 用來連接 Arduino、上載程式及查看測量數據。

產品連結:

接線前請注意: Arduino Uno R3 的數碼輸出使用 5V 邏輯。本文的接線及程式以一般 HC-SR04 模組和 Arduino Uno R3 為例;使用其他型號的感應器時,請先確認其工作電壓及接線要求。

二、HC-SR04 如何測量距離?

HC-SR04 是常見的超聲波測距模組,前方有兩個圓形換能器,分別用於發射及接收超聲波。

它的基本運作原理如下:

  1. Arduino 向感應器的 Trigger(Trig)腳輸出一個短暫的觸發訊號。
  2. 感應器發出超聲波。
  3. 超聲波遇到物件後反射回來。
  4. 感應器透過 Echo 腳輸出回波訊號,Arduino 計算回波的持續時間。
  5. 程式根據聲音傳播速度,估算感應器與物件之間的距離。

由於測量的是超聲波來回傳播所需的時間,因此計算距離時需要除以 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,不會把無效讀數直接當成實際距離。

五、如何測試專案?

完成接線及上載程式後,可以按照以下步驟測試:

  1. 在 Arduino IDE 開啟 Serial Monitor。
  2. 將鮑率設定為 9600 baud。
  3. 將一件平整的物件放在 HC-SR04 前方,先保持約 20 cm 距離。
  4. 觀察 Serial Monitor 顯示的距離數值,以及 LED 是否亮起。
  5. 慢慢將物件移近感應器。
  6. 當測量距離少於 10 cm 時,LED 應該熄滅。
  7. 再將物件移遠至 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 產品分類:

瀏覽 Arduino、感應器及 STEM DIY 配件

新昌電腦有限公司 Sun Cheong Computer Company Limited
深水埗鴨寮街 246 號地下
專注電子零件、Arduino、感應器及技術應用。

返回部落格