超音波感測器介紹
可以產生聲音的機構有蜂鳴器與揚聲器(喇叭),兩者工作模式不同,特色不同。
蜂鳴器的工作平寬較窄,適合在特定頻率使用。
揚聲器的工作平寬較大,適合音樂與語音輸出。
MCU使用而言
蜂鳴器>>電磁、壓電效應。
揚聲器>>電磁效應。
蜂鳴器(Buzzer)是產生聲音的信號裝置,有機械型、機電型及壓電型。蜂鳴器的典型應用包括警笛、報警裝置、火災警報器、防空警報器、防盜器、定時器等。<參考維基百科>
本次使用的小型蜂鳴器都是電磁式蜂鳴器,主要依靠電流與磁鐵間的推斥或吸引來產生振動,發出聲音。 此類蜂鳴器一般分為自帶震盪源(自激式)或不帶震盪源(他激式)兩種。自激式的蜂鳴器時直接使用直流電即可發出固定聲音頻率;而他激式的蜂鳴器則需要提供聲音訊號才能發聲。
要能夠發出不同頻率的聲音,則必須注意選用他激式,選用時仍需要注意蜂鳴器上的工電壓。
測距電路<檔案位置>
配合以下測距程式使用之電路 超音波電路加上簡易直接輸出蜂鳴器電路
HC04測距使用序列監控窗
https://randomnerdtutorials.com/esp32-hc-sr04-ultrasonic-arduino/
const int trigPin = 5;
const int echoPin = 18;
//define sound speed in cm/uS
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701
long duration;
float distanceCm;
float distanceInch;
void setup() {
Serial.begin(115200); // Starts the serial communication
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
}
void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculate the distance
distanceCm = duration * SOUND_SPEED/2;
// Convert to inches
distanceInch = distanceCm * CM_TO_INCH;
// Prints the distance in the Serial Monitor
Serial.print("Distance (cm): ");
Serial.println(distanceCm);
Serial.print("Distance (inch): ");
Serial.println(distanceInch);
delay(1000);
}
汽車倒車雷達
#include <ESP32Servo.h>
int trigPin = 5; // 超音波感測器 Trig腳接 ESP32 pin 05
int echoPin = 18; //超音波感測器 Echo 腳接 ESP32 pin 18
int speakerpin = 17; //蜂鳴器 + 腳接 ESP32 pin 7
long duration, distanceCm ; //宣告計算距離時,需要用到的兩個實數
void setup() {
Serial.begin (115200); //設定序列埠監控視窗 (Serial Monitor) 和 ESP32資料傳輸速率為 15200 bps (Bits Per Second)
pinMode(trigPin, OUTPUT); //ESP32 對外啟動距離感測器Trig腳,射出超音波
pinMode(echoPin, INPUT); //超音波被障礙物反射後,Arduino讀取感測器Echo腳的時間差
pinMode(speakerpin, OUTPUT); //ESP32對蜂鳴器送出電壓,使其鳴叫
}
void loop()
{ //程式計算出距離值 cm
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
pinMode(echoPin, INPUT);
duration = pulseIn(echoPin, HIGH);
distanceCm = (duration/2) / 29.1;
Serial.print(distanceCm ); //印出距離值 cm 在序列埠監控顯示器 單位公分
Serial.println(" cm");
if (distanceCm <= 5) { //距離小於5公分,蜂鳴器一直叫
tone(speakerpin,1000); //輸出1000Hz 音調
delay (20);
}
if (distanceCm > 5 && distanceCm <= 15) { //距離介於5到15公分,蜂鳴器斷斷續續叫,每次0.1秒
tone(speakerpin,1000); //輸出1000Hz 音調
delay (100);
noTone(speakerpin); //靜音
delay (100);
}
if (distanceCm > 15 && distanceCm <= 30 ){ // 距離介於15到30公分,蜂鳴器斷斷續續叫,每次0.5秒
tone(speakerpin,1000); //輸出1000Hz 音調。
delay (500);
noTone(speakerpin); //靜音
delay (500);
}
delay(10);
}
超音波測距儀<整合七段顯示器使用,橘紅色標記>
利用 之前的七段顯示器電路與超音波測距電路顯示
要求如下
99~90cm >顯示> 9
89~80cm >顯示> 8
79~70cm >顯示> 7
69~60cm >顯示> 6
59~50cm >顯示> 5
49~40cm >顯示> 4
39~30cm >顯示> 3
29~20cm >顯示> 2
19~10cm >顯示> 1
10以下 >顯示> 0
const int trigPin = 5;
const int echoPin = 18;
//define sound speed in cm/uS
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701
int cm;
long duration;
float distanceCm;
float distanceInch;
//------------------------------
// p, g, f, e, d, c, b, a 七段顯示函數
char segpin[]={27,32,33,13,04,14,26,25};
// p,g,f,e,d,c,b,a 共陽極
byte seven_seg_digits[][8] = { { 1,1,0,0,0,0,0,0 }, // = 0
{ 1,1,1,1,1,0,0,1 }, // = 1
{ 1,0,1,0,0,1,0,0 }, // = 2
{ 1,0,1,1,0,0,0,0 }, // = 3
{ 1,0,0,1,1,0,0,1 }, // = 4
{ 1,0,0,1,0,0,1,0 }, // = 5
{ 1,0,0,0,0,0,1,1 }, // = 6
{ 1,1,1,1,1,0,0,0 }, // = 7
{ 1,0,0,0,0,0,0,0 }, // = 8
{ 1,0,0,1,1,0,0,0 } // = 9
};
// 在七段顯示器上顯示指定的一個數字
void sevenSegWrite(byte digit) {
for (byte seg = 0; seg <8; ++seg)
digitalWrite(segpin[seg], seven_seg_digits[digit][seg]);// 共陽極 // digitalWrite(segpin[seg], !seven_seg_digits[digit][seg]);// 共陰極
}
//--------------------------------
void setup() {
Serial.begin(115200); // Starts the serial communication
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
//------------------------------------------
for(int i=0;i<8;i++){
pinMode(segpin[i], OUTPUT);
digitalWrite(segpin[i], 0);
}
delay(2000);
//------------------------------------------------
}
void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculate the distance
distanceCm = duration * SOUND_SPEED/2;
// Convert to inches
distanceInch = distanceCm * CM_TO_INCH;
// Prints the distance in the Serial Monitor
Serial.print("Distance (cm): ");
Serial.println(distanceCm);
Serial.print("Distance (inch): ");
Serial.println(distanceInch);
//---------------------------------
cm=distanceCm/10;
sevenSegWrite(cm);
//-----------------------------------
delay(1000);
}
超音波測距儀<整合LCM1602使用I2C,橘紅色標記>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int trigPin = 5;
const int echoPin = 18;
//define sound speed in cm/uS
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701
long duration;
float distanceCm;
float distanceInch;
void setup() {
Serial.begin(115200); // Starts the serial communication
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
lcd.begin();
// Turn on the blacklight and print a message.
lcd.backlight();
}
void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculate the distance
distanceCm = duration * SOUND_SPEED/2;
// Convert to inches
distanceInch = distanceCm * CM_TO_INCH;
// Prints the distance in the Serial Monitor
Serial.print("Distance (cm): ");
Serial.println(distanceCm);
Serial.print("Distance (inch): ");
Serial.println(distanceInch);
lcd.setCursor(0,0);//設定游標
lcd.print("CM=");
lcd.setCursor(3,0);//設定游標
lcd.print(distanceCm);
delay(1000);
}