☛ 功能說明

使用 Arduino 開發板配合 HC-SR04 超聲波距離感測器測量物體距離 ( 單位:公分 ),以 Serial Monitor 視窗顯示距離,並控制一個 LED 閃爍速度,距離越近則 LED 閃爍速度越快。 超聲波感測器是由超聲波發射器、接收器和控制電路所組成。 當它被觸發的時候,會發射一連串 40 kHz 的聲波並且從離它最近的物體接收回音。 超聲波是人類耳朵無法聽見的聲音,因為它的頻率很高。

※注意事項:

HC-SR04 模組應先插好在電路板上再通電,避免產生高電平的誤動作,如果產生了重新通電就可以恢復了。

※HC-SR04模組工作原理:

⑴ 使用用 IO 觸發測距,給至少10μs 的高電平信號

⑵ 模組自動發送 8 個 40khz 的方波,自動檢測是否有信號返回

⑶ 有信號返回時通過 IO 輸出一高電平,高電平持續的時間就是超聲波從發射到返回的時間

⑷ 在攝氏零度之海平面音速約為 331.5 米/秒,每升高 1 攝氏度,音速就增加 0.607 米/秒,可以列出一個公式:

音速 c = 331.5 + 0.607 * t (其中 t 為攝氏溫度)。

攝氏 20 度下,音速公尺/秒 換算成公分/微秒:343.64 * 100 / 100000 = 0.034364 公分/微秒,亦即:音速每公分需要 29.1 微秒: 1 / 0.034364 = 29.1 微秒/釐米。 超音波發射的距離為來回,因此單程距離 = 時間差 / 2 再除以 29.1 微秒 / 公分,同樣的如果要換算成英吋,只要將 29.1 再乘以 2.54 即可。

⑸ 本產品使用方法簡單,一個控制口發一個 10μS 以上的高電平,就可以在接收口等待高電平輸出,一有輸出就可以開定時器計時,當此口變為低電平時就可以讀定時器的值,此時就為此次測距的時間,方可算出距離,如此不斷的週期測試,就可以達到你移動測量的值了。

⑹ 偵測距離:輸入 DC 5V 時、偵測距離 2cm~450cm,角度 15 度角。

☛ 使用材料

Arduino UNO R3 開發板 × 1、超聲波感測器模組 HC-SR04 × 1、電阻 220Ω × 1、LED× 1。

☛ 電路圖及麵包板接線圖

☛ 程式碼

const int trigPin=10;               //超音波測距的觸發腳連接數位接腳 10
const int echoPin=11;               //超音波測距的回應腳連接數位接腳 11
const int  ledPin =12;              //LED 連接數位接腳 12
int delayTime;                      //LED 閃爍延遲時間

void setup()
{
     pinMode(trigPin, OUTPUT);      //設定輸出輸入
     pinMode(echoPin, INPUT); 
     Serial.begin(9600);            //設定串列埠鮑率 9600bps
}

void loop()
{  
     float d = (sr04()/2)/29.1;     //測量距離
     delayTime=d*10;
     Serial.print(d,1);
     Serial.println("cm");
     ledFlushing();
}

unsigned long sr04()                //超音波測距函式
{ 
     delayMicroseconds(5);
     digitalWrite(trigPin, HIGH);   //送 10μs 脈波給 HC-SR04 觸發腳,並計算回應腳變成高電位的時間
     delayMicroseconds(10);  
     digitalWrite(trigPin, LOW);
     return pulseIn(echoPin, HIGH);
}

void ledFlushing()                  //LED 閃爍副程式
{
     digitalWrite(ledPin,HIGH);
     delay(delayTime);
     digitalWrite(ledPin,LOW);
     delay(delayTime);
}

 

☛ 練習

⑴ 設計 Arduino 程式,使用 Arduino 開發板配合 HC-SR04 超聲波距離感測器測量物體的距離 ( 單位:英吋 ),以 Serial Monitor 視窗顯示距離,並控制一個 LED 閃爍速度,距離越近,則 LED 閃爍速度越快。

const int trigPin=10;               //超音波測距的觸發腳連接數位接腳 10
const int echoPin=11;               //超音波測距的回應腳連接數位接腳 11
const int  ledPin =12;              //LED 連接數位接腳 12
int delayTime;                      //LED 閃爍延遲時間

void setup()
{
     pinMode(trigPin, OUTPUT);      //設定輸出輸入
     pinMode(echoPin, INPUT); 
     Serial.begin(9600);            //設定串列埠鮑率 9600bps
}

void loop()
{  
     float d = (sr04()/2)/(29.1*2.54); //測量距離 (英吋)
     delayTime=d*10;
     Serial.print(d,1);
     Serial.println("inch");
     ledFlushing();
}

unsigned long sr04()                //超音波測距函式
{ 
     delayMicroseconds(5);
     digitalWrite(trigPin, HIGH);   //送 10μs 脈波給 HC-SR04 觸發腳,並計算回應腳變成高電位的時間
     delayMicroseconds(10);  
     digitalWrite(trigPin, LOW);
     return pulseIn(echoPin, HIGH);
}

void ledFlushing()                  //LED 閃爍副程式
{
     digitalWrite(ledPin,HIGH);
     delay(delayTime);
     digitalWrite(ledPin,LOW);
     delay(delayTime);
}

 

⑵ 設計 Arduino 程式,使用 Arduino 開發板配合 HC-SR04 超聲波距離感測器測量物體的距離 ( 單位:公分 ),以 Serial Monitor 視窗顯示距離,並控制一個 LED 閃爍速度及一個蜂鳴器嗶聲,距離越近,則 LED 閃爍速度越快且蜂鳴器嗶聲越急促。

const int trigPin=11;            //超音波測距的 觸發腳
const int echoPin=12;            //超音波測距的 回應腳
const int  ledPin=10;            //LED 連接數位接腳 10
const int speaker=9;             //蜂鳴器連接數位接腳 9
int delayTime;

void setup()
{
     pinMode(trigPin, OUTPUT);   //設定輸出輸入
     pinMode(echoPin, INPUT); 
     Serial.begin(9600);         //開啟串例傳輸
}

void loop()
{  
     float d = (sr04()/2)/29.1;  //測距離
     delayTime=d*10;
     Serial.print(d,1);
     Serial.println("cm");
  ledFlushing();
}

  

unsigned long sr04()              //超音波測距函式
{ 
     delayMicroseconds(5);
     digitalWrite(trigPin, HIGH); //送 10μs 脈波給 HC-SR04 觸發腳,並計算回應腳變成高電位的時間
     delayMicroseconds(10);  
     digitalWrite(trigPin, LOW);
     return pulseIn(echoPin, HIGH);
}

void ledFlushing()                 //LED 閃爍及蜂鳴器副程式
{
     digitalWrite(ledPin,HIGH);
     tone(speaker,1000);           //輸出 1000Hz 音調
     delay(delayTime);
     digitalWrite(ledPin,LOW);
     noTone(speaker);              //靜音
     delay(delayTime);
}