資料介紹
描述
該項目將向您展示如何使用超聲波傳感器計算距離。它將分為三個部分:
- 編程超聲波傳感器 + 將其顯示到串行監視器上
- 如何在 LCD 上顯示距離
- 將中斷與超聲波傳感器結合使用
編程超聲波傳感器 + 將其顯示到串行監視器上:
在本節結束時,您的項目應如下所示:
如您所見,當我移動手時,距離會發生變化。當我將手移開時,距離也會發生變化——它會增加。當我將手移近傳感器時,距離會縮短。您可能已經注意到,有時距離是一個 3 位數。這是因為我的手離傳感器太近了。發送的聲波迅速反彈,供傳感器讀取。
示意圖:
?

?
連接到 Gnd 的電線是傳感器上的“Gnd”腳,連接到引腳號的電線。9,是“回聲”腿,連接到引腳號的電線。10 是“Trig”腳,連接到 5v 的電線是“Vcc”腳。
編碼:
首先,將其添加到代碼的開頭。
// defines pins numbers
const int trigPin = 9;
const int echoPin = 10;
其次,我們需要定義變量。
long duration;
int distance;
在void setup()函數中,我們需要聲明每個引腳的輸入/輸出。我們還需要啟動串行通信。
void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600); // Starts the serial communication
}
現在,對于void loop()函數,添加以下內容:
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
此代碼清除 trigPin。然后,要將引腳設置為高電平 10 微秒,請添加:
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
接下來,編寫以下內容:
duration = pulseIn(echoPin, HIGH);
此行讀取 echoPin,以微秒為單位返回聲波傳播時間。
最后,要計算距離并將其打印到您的串行監視器上,請將其寫入您的代碼。
distance = duration * 0.034 / 2;
Serial.print("Distance: ");
Serial.println(distance);
delay(10);
您的代碼應類似于以下內容:
// defines pins numbers
const int trigPin = 9;
const int echoPin = 10;
// defines variables
long duration;
int distance;
void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600); // Starts the serial communication
}
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);
// Calculating the distance
distance = duration * 0.034 / 2;
// Prints the distance on the Serial Monitor
Serial.print("Distance: ");
Serial.println(distance);
delay(10);
}
如果您的代碼有效,那就太好了。但如果沒有,那么您可能需要檢查以下內容:
- 電路接線是否正確。
- 你是否有相同的串口和串口連接(9600)。
- 如果您的超聲波傳感器工作正常。
如何在 LCD 上顯示距離
現在,我們不再將距離顯示在串行監視器上,而是將其顯示在 LCD 上。最后,您的項目應如下所示:
示意圖:

?
?
編碼:
現在,將其添加到代碼的開頭。
#include <LiquidCrystal.h> // includes the LiquidCrystal Library
LiquidCrystal lcd(
要顯示 2 種不同類型的距離,請將“ int distance”更改為以下內容:
int distanceCm, distanceInch;
這意味著 LCD 將以厘米和英寸為單位顯示距離。接下來,在void setup()函數中添加:
lcd.begin(16,2);
另外,刪除serial.begin()函數,因為我們不需要與 CPU 通信。現在,要計算以英寸為單位的距離,我們需要添加以下代碼。
distanceInch = duration * 0.0113 / 2; /*remember to change the 'distance' variable
into distanceCm*/
添加此代碼以將距離打印到 LCD 上。
lcd.setCursor(0,0);
lcd.print("Distance: ");
lcd.print(distanceCm);
lcd.print("cm ");
delay(10);
lcd.setCursor(0,1);
lcd.print("Distance: ");
lcd.print(distanceInch);
lcd.print("inch ");
delay(10);
在此代碼中,光標設置為 LCD 上的第 0 行、第 0 列。然后,將顯示“距離:”一詞,在其旁邊,LCD 上將打印以厘米為單位的距離。與以英寸為單位的距離相同,但將向下一行。您的代碼應如下所示:
#include
LiquidCrystal lcd(1,3,4,5,6,7);
// defines pins numbers
const int trigPin = 9;
const int echoPin = 10;
// defines variables
long duration;
int distanceCm, distanceInch;
void setup() {
lcd.begin(16,2);
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);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distanceCm = duration * 0.034 / 2;
distanceInch = duration * 0.0113 / 2;
lcd.setCursor(0,0);
lcd.print("Distance: ");
lcd.print(distanceCm);
lcd.print("cm ");
delay(10);
lcd.setCursor(0,1);
lcd.print("Distance: ");
lcd.print(distanceInch);
lcd.print("inch ");
delay(10);
}
。
- 檢查您的代碼是否正確。
- 檢查您的電路和 LCD 接線是否正確。
將中斷與超聲波傳感器結合使用:
在項目的這一部分中,您將使用中斷來控制傳感器何時測量距離。它應該是這樣的:
您可能已經注意到,當我按下按鈕時,LCD 上的距離會發生變化。這是因為超聲波傳感器僅在按下按鈕時檢查距離。
示意圖:
?

我將按鈕連接到 Arduino 板上的 2 號引腳,因為它和 3 號引腳是唯一可以使用 interrupt() 函數的引腳。
更新(08/08/2018):Interrupt()函數實際上可用于引腳 18、19、20 和 21 以及引腳 2 和 3。感謝 Walter Stroebel 指出這一點。
編碼:
首先,我們需要說明按鈕所連接的引腳,因此將其添加到代碼的開頭。
const int buttonPin = 2;
然后,要添加interrupt()函數,請將此行添加到void setup()函數中。
attachInterrupt(digitalPinToInterrupt(buttonPin), pin_ISR, FALLING);
我們現在要做的就是從void loop()函數中獲取所有內容并將其添加到另一個函數中,這個函數稱為pin_ISR() 。最后,您的代碼應如下所示:
#include
LiquidCrystal lcd(1,3,4,5,6,7);
// defines pins numbers
const int trigPin = 9;
const int echoPin = 10;
const int buttonPin = 2;
// defines variables
long duration;
int distanceCm, distanceInch;
void setup() {
lcd.begin(16,2);
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
pinMode(buttonPin, INPUT);
attachInterrupt(digitalPinToInterrupt(buttonPin), pin_ISR, FALLING);
}
void loop() {
}
void pin_ISR(){
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distanceCm = duration * 0.034 / 2;
distanceInch = duration * 0.0113 / 2;
lcd.setCursor(0,0);
lcd.print("Distance: ");
lcd.print(distanceCm);
lcd.print("cm ");
delay(10);
lcd.setCursor(0,1);
lcd.print("Distance: ");
lcd.print(distanceInch);
lcd.print("inch ");
delay(10);
}
更新(08/08/2018)Walter Stroebel 發表評論,將當前代碼改進為以下內容:
#include
LiquidCrystal lcd(1,3,4,5,6,7);
// defines pins numbers
volatile bool buttonPressed = false;
const int trigPin = 9;
const int echoPin = 10;
const int buttonPin = 2;
// defines variables
long duration;
int distanceCm, distanceInch;
void setup() {
lcd.begin(16,2);
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
pinMode(buttonPin, INPUT);
attachInterrupt(digitalPinToInterrupt(buttonPin), pin_ISR, FALLING);
}
void loop() {
if (buttonPressed) {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distanceCm = duration * 0.034 / 2;
distanceInch = duration * 0.0113 / 2;
lcd.setCursor(0,0);
lcd.print("Distance: ");
lcd.print(distanceCm);
lcd.print("cm ");
delay(10);
lcd.setCursor(0,1);
lcd.print("Distance: ");
lcd.print(distanceInch);
lcd.print("inch ");
delay(10);
buttonPressed = false;
}
}
void pin_ISR(){
buttonPressed = true;
}
// I would like to thank Walter Stroebel for suggesting this code.
這段代碼更好,因為它更短意味著中斷將更好地工作并且可以同時使用更多。
如果您的代碼不起作用,請檢查以下內容:
- 如果您已正確連接 LCD、按鈕和傳感器。
- 如果你的代碼寫對了。
希望你玩得開心。祝未來的項目好運!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
- FS系列超声波流量传感器产品说明书0次下载
- 基于计算距离超声波传感器工作的护眼器0次下载
- 使用超声波传感器和Surilli GSM计算距离0次下载
- 使用超声波传感器的距离测量2次下载
- 基于超声波传感器的测距系统2次下载
- 超声波传感器测量距离开源分享1次下载
- 使用超声波传感器进行距离测量0次下载
- 使用超声波传感器和Arduino进行LED距离测量0次下载
- 使用超声波传感器HC SR04和Arduino Uno制作超声波距离传感器1次下载
- 超声波距离传感器技术原理与应用24次下载
- 具有IO-Link的超声波距离传感器参考设计20次下载
- 【超声波传感器】超声波传感器使用问题详解!23次下载
- 位差超声波传感器在智能玩具机器人中的应用70次下载
- 在线测量酵母浓度的超声波传感器31次下载
- 在线测量酵母浓度的超声波传感器24次下载
- 超声波传感器如何接线_超声波传感器测距18059次阅读
- 超声波传感器构成的超声波加湿器电路8513次阅读
- 超声波传感器的优势有哪些4471次阅读
- 超声波传感器的应用2035次阅读
- 超声波传感器的使用注意事项说明3213次阅读
- dfrobotSRF02超声波传感器介绍1855次阅读
- 超声波液位传感器的组成及工作原理19476次阅读
- 超声波传感器与红外线传感器对比谁更好12313次阅读
- 超声波传感器内部结构及特点18323次阅读
- 超声波液位传感器在油罐液位测量的原理是什么样的6176次阅读
- 超声波传感器的四个创新应用3157次阅读
- 超声波传感器及工作原理解析9967次阅读
- 超声波传感器液位测量方法介绍10002次阅读
- 超声波传感器工作原理及主要性能指标31580次阅读
- 超声波传感器的原理及应用11619次阅读
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論