DEV Community

張旭豐
張旭豐

Posted on

用超聲波測距 + Arduino 做互動距離警示裝置

用超聲波測距 + Arduino 做互動距離警示裝置

倒車、倒車、倒車——

「嗶、嗶、嗶──」

停車場裡,那熟悉的聲音響起。你盯著後視鏡,腳輕輕放上剎車,雷達偵測到障礙物的距離,發出急促的警告音。那一刻,你心裡想的可能是:「這東西怎麼這麼準?」

現在,你可以自己做出來


🔊 那一聲「嗶」,是怎麼來的?

HC-SR04 超聲波測距模組,會發射一束超聲波(頻率 40kHz,肉耳聽不見),然後等待它碰到障礙物反彈回來。晶片計下來回時間,乘上音速,就得到距離。

公式很簡單:

距離 = (來回時間 ÷ 2) × 音速
Enter fullscreen mode Exit fullscreen mode

⚠️ 小知識: 音速會隨溫度改變!冬天 0°C 時約 331 m/s,夏天 30°C 時約 349 m/s。一般室溫專案可以先抓 340 m/s,影響不大。


🧰 材料清單

材料 用途
Arduino Uno(或其他相容板) 主控大腦
HC-SR04 超聲波測距模組 發射+接收超聲波
主動式蜂鳴器(Active Buzzer) 發出警告聲
LED(紅色)× 1 危險警示燈
LED(綠色)× 1 安全距離燈
220Ω 電阻 × 2 保護 LED
麵包板 + 跳線 快速試驗電路

停車場倒車場景

📦 精選購買推薦(蝦皮搜尋關鍵字):

  • Arduino Uno R3 開發板
  • HC-SR04 超聲波測距模組
  • Arduino 蜂鳴器 模組
  • Arduino 入門套件 電子零件

🔌 電路接線圖

HC-SR04 超聲波模組

HC-SR04 Arduino
VCC 5V
GND GND
Trig Pin 9
Echo Pin 10
元件 Arduino
紅色 LED(+ 220Ω) Pin 7
綠色 LED(+ 220Ω) Pin 6
蜂鳴器(+) Pin 8
蜂鳴器(-) GND

Arduino 電路示意圖


💻 程式碼(分段落說明)

第一段:定義腳位與常數

// 超聲波模組
const int trigPin = 9;
const int echoPin = 10;

// LED 與蜂鳴器
const int redLED = 7;
const int greenLED = 6;
const int buzzer = 8;

// 安全距離門檻(單位:公分)
const int SAFE_DISTANCE = 30;
Enter fullscreen mode Exit fullscreen mode

第二段:初始化設定

void setup() {
  Serial.begin(9600);        // 開啟序列埠,方便除錯

  // 超聲波
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  // 輸出元件
  pinMode(redLED, OUTPUT);
  pinMode(greenLED, OUTPUT);
  pinMode(buzzer, OUTPUT);
}
Enter fullscreen mode Exit fullscreen mode

⚠️ 技術細節: Trigger 腳位需要給予 ≥10μs 的脈衝才能觸發測距。HC-SR04 最大回應頻率約 40Hz,也就是每秒最多測 40 次,不用測更快。

第三段:讀取距離

long readDistance() {
  // 發射超聲波
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);    // ≥10μs 脈衝
  digitalWrite(trigPin, LOW);

  // 接收回傳時間
  long duration = pulseIn(echoPin, HIGH);

  // 轉換為公分(音速 340 m/s)
  // duration 單位是微秒,除以 2 是來回,×0.034 是公分
  long distance = duration * 0.034 / 2;

  return distance;
}
Enter fullscreen mode Exit fullscreen mode

⚠️ 注意: HC-SR04 最小測距約 2cm,太近的障礙物會偵測不到。如果需要近距離偵測,要考慮其他方案。

第四段:主迴路——距離判斷+警示

void loop() {
  long distance = readDistance();
  Serial.print("距離:");
  Serial.print(distance);
  Serial.println(" cm");

  if (distance < SAFE_DISTANCE && distance > 2) {
    // 危險!亮紅燈 + 叫
    digitalWrite(redLED, HIGH);
    digitalWrite(greenLED, LOW);
    digitalWrite(buzzer, HIGH);
  } else {
    // 安全,亮綠燈
    digitalWrite(redLED, LOW);
    digitalWrite(greenLED, HIGH);
    digitalWrite(buzzer, LOW);
  }

  delay(25);  // 配合 40Hz,最大每秒測 40 次
}
Enter fullscreen mode Exit fullscreen mode

🎵 創意擴充:漸進式提示音

想要更像倒車雷達?試試這個:

void beepProgressive(long distance) {
  if (distance < SAFE_DISTANCE && distance > 2) {
    // 越近,頻率越快
    int interval = map(distance, 2, SAFE_DISTANCE, 50, 500);
    digitalWrite(buzzer, HIGH);
    delay(50);
    digitalWrite(buzzer, LOW);
    delay(interval);
  } else {
    digitalWrite(buzzer, LOW);
  }
}
Enter fullscreen mode Exit fullscreen mode

loop() 裡的 digitalWrite(buzzer, HIGH) 換成 beepProgressive(distance),就會聽到「嗶──嗶嗶──嗶嗶嗶」的漸進效果,停車技術再爛都能 hold 住。


🚗 結語

倒車雷達不是什麼高科技,但自己動手做出來的感覺,完全不同。

你寫的每一行程式、接的每一條線,都是在跟硬體說話。那一聲「嗶」,是你讓它學會的。

那一測,是你自己測出來的。


如果你做出來了,歡迎分享你的作品照或改裝創意!

想自己動手做?推薦從蝦皮搜尋 Arduino 入門套件 電子零件 開始,HC-SR04、蜂鳴器、LED 全部湊齊,點幾下就送到。

Top comments (0)