超音波測距傳感器是由超音波發射器、接收器和控制電路所組成。當它被觸發的時候,會發射一連串 40 kHz 的聲波並且從離它最近的物體接收回音。

以下的電路示意與程式碼,示範情境為:以序列埠監控視窗檢視所量測之距離資訊。

聲波公式: 音速=331.5 m/s + 0.6*攝氏溫度。 此程式將上述聲波速度隨溫度而變的公式寫進來,只要改變 temperature 常數,波速也會隨之變化。 在沒有溫度量測的傳感器之前,我們先將 temperature 常數設為 20。 在 ping() 函數中,pulseIn() 傳回的是音波往返的時間 tUs,單位為微秒,除以 1000000 即變成以秒為單位,除以 2 即是單程傳遞時間 t,將其乘以波速 v 即得單程行進距離,也就是超音波模組與障礙物之距離。

電路示意圖

HC-SR04 Circuit

傳感器規格

範例程式

#define echoPin 2
#define trigPin 3

float temper;

void setup() {
Serial.begin(9600);
pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);
delay(3000);
}

void loop() {
temper = 20;
float cm = ping(temper);
Serial.print("Temperature: ");
Serial.print(temper);
Serial.print("C , Distance: ");
Serial.print(cm);
Serial.println(" CM");
delay(800);

}

// 聲波公式: 音速=331.5 m/s + 0.6*攝氏溫度
// 此程式將上述聲波速度隨溫度而變的公式寫進來, 只要改變 temperature 常數, 波速也會隨之變化.
// 在 ping() 函數中, pulseIn() 傳回的是音波往返的時間 tUs, 單位為微秒, 除以 1000000 即變成以秒為單位, 除以 2 即是單程傳遞時間 t,
// 將其乘以波速 v 即得單程行進距離, 也就是超音波模組與障礙物之距離.
float ping(float temperature) { //send 10us pulse to HC-SR04 trigger pin
float v = 331.5 + 0.6*temperature;
digitalWrite(trigPin, HIGH);
delayMicroseconds(10); // sustain at least 10us HIGH pulse
digitalWrite(trigPin, LOW);
unsigned long tUs=pulseIn(echoPin, HIGH); //return micro seconds
float t=tUs/1000.0/1000.0/2; //turn us to s of single way
float d=t*v; //single way distance (meter)
return d*100; //turn m to cm
}

執行結果

HC-SR04 Serial Print

思考練習

請串接溫度濕度傳感器獲取溫度後,修改程式碼,使溫度濕度傳感器所獲取溫度數值帶入原來的程式計算距離。