資料介紹
描述
該項(xiàng)目將向您展示如何使用超聲波傳感器計(jì)算距離。它將分為三個(gè)部分:
- 編程超聲波傳感器 + 將其顯示到串行監(jiān)視器上
- 如何在 LCD 上顯示距離
- 將中斷與超聲波傳感器結(jié)合使用
編程超聲波傳感器 + 將其顯示到串行監(jiān)視器上:
在本節(jié)結(jié)束時(shí),您的項(xiàng)目應(yīng)如下所示:
如您所見,當(dāng)我移動(dòng)手時(shí),距離會(huì)發(fā)生變化。當(dāng)我將手移開時(shí),距離也會(huì)發(fā)生變化——它會(huì)增加。當(dāng)我將手移近傳感器時(shí),距離會(huì)縮短。您可能已經(jīng)注意到,有時(shí)距離是一個(gè) 3 位數(shù)。這是因?yàn)槲业氖蛛x傳感器太近了。發(fā)送的聲波迅速反彈,供傳感器讀取。
示意圖:
?
?
連接到 Gnd 的電線是傳感器上的“Gnd”腳,連接到引腳號(hào)的電線。9,是“回聲”腿,連接到引腳號(hào)的電線。10 是“Trig”腳,連接到 5v 的電線是“Vcc”腳。
編碼:
首先,將其添加到代碼的開頭。
// defines pins numbers
const int trigPin = 9;
const int echoPin = 10;
其次,我們需要定義變量。
long duration;
int distance;
在void setup()函數(shù)中,我們需要聲明每個(gè)引腳的輸入/輸出。我們還需要啟動(dòng)串行通信。
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
}
現(xiàn)在,對(duì)于void loop()函數(shù),添加以下內(nèi)容:
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
此代碼清除 trigPin。然后,要將引腳設(shè)置為高電平 10 微秒,請(qǐng)?zhí)砑樱?/font>
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
接下來(lái),編寫以下內(nèi)容:
duration = pulseIn(echoPin, HIGH);
此行讀取 echoPin,以微秒為單位返回聲波傳播時(shí)間。
最后,要計(jì)算距離并將其打印到您的串行監(jiān)視器上,請(qǐng)將其寫入您的代碼。
distance = duration * 0.034 / 2;
Serial.print("Distance: ");
Serial.println(distance);
delay(10);
您的代碼應(yīng)類似于以下內(nèi)容:
// 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);
}
如果您的代碼有效,那就太好了。但如果沒有,那么您可能需要檢查以下內(nèi)容:
- 電路接線是否正確。
- 你是否有相同的串口和串口連接(9600)。
- 如果您的超聲波傳感器工作正常。
如何在 LCD 上顯示距離
現(xiàn)在,我們不再將距離顯示在串行監(jiān)視器上,而是將其顯示在 LCD 上。最后,您的項(xiàng)目應(yīng)如下所示:
示意圖:
?
?
編碼:
現(xiàn)在,將其添加到代碼的開頭。
#include <LiquidCrystal.h> // includes the LiquidCrystal Library
LiquidCrystal lcd(
要顯示 2 種不同類型的距離,請(qǐng)將“ int distance”更改為以下內(nèi)容:
int distanceCm, distanceInch;
這意味著 LCD 將以厘米和英寸為單位顯示距離。接下來(lái),在void setup()函數(shù)中添加:
lcd.begin(16,2);
另外,刪除serial.begin()函數(shù),因?yàn)槲覀儾恍枰c CPU 通信。現(xiàn)在,要計(jì)算以英寸為單位的距離,我們需要添加以下代碼。
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);
在此代碼中,光標(biāo)設(shè)置為 LCD 上的第 0 行、第 0 列。然后,將顯示“距離:”一詞,在其旁邊,LCD 上將打印以厘米為單位的距離。與以英寸為單位的距離相同,但將向下一行。您的代碼應(yīng)如下所示:
#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 接線是否正確。
將中斷與超聲波傳感器結(jié)合使用:
在項(xiàng)目的這一部分中,您將使用中斷來(lái)控制傳感器何時(shí)測(cè)量距離。它應(yīng)該是這樣的:
您可能已經(jīng)注意到,當(dāng)我按下按鈕時(shí),LCD 上的距離會(huì)發(fā)生變化。這是因?yàn)槌暡▊鞲衅鲀H在按下按鈕時(shí)檢查距離。
示意圖:
?
我將按鈕連接到 Arduino 板上的 2 號(hào)引腳,因?yàn)樗?3 號(hào)引腳是唯一可以使用 interrupt() 函數(shù)的引腳。
更新(08/08/2018):Interrupt()函數(shù)實(shí)際上可用于引腳 18、19、20 和 21 以及引腳 2 和 3。感謝 Walter Stroebel 指出這一點(diǎn)。
編碼:
首先,我們需要說(shuō)明按鈕所連接的引腳,因此將其添加到代碼的開頭。
const int buttonPin = 2;
然后,要添加interrupt()函數(shù),請(qǐng)將此行添加到void setup()函數(shù)中。
attachInterrupt(digitalPinToInterrupt(buttonPin), pin_ISR, FALLING);
我們現(xiàn)在要做的就是從void loop()函數(shù)中獲取所有內(nèi)容并將其添加到另一個(gè)函數(shù)中,這個(gè)函數(shù)稱為pin_ISR() 。最后,您的代碼應(yīng)如下所示:
#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 發(fā)表評(píng)論,將當(dāng)前代碼改進(jìn)為以下內(nèi)容:
#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.
這段代碼更好,因?yàn)樗桃馕吨袛鄬⒏玫毓ぷ鞑⑶铱梢酝瑫r(shí)使用更多。
如果您的代碼不起作用,請(qǐng)檢查以下內(nèi)容:
- 如果您已正確連接 LCD、按鈕和傳感器。
- 如果你的代碼寫對(duì)了。
希望你玩得開心。祝未來(lái)的項(xiàng)目好運(yùn)!
- 基于計(jì)算距離超聲波傳感器工作的護(hù)眼器
- 使用超聲波傳感器和Surilli GSM計(jì)算距離
- 使用超聲波傳感器的距離測(cè)量
- 基于超聲波傳感器的測(cè)距系統(tǒng) 2次下載
- 超聲波傳感器測(cè)量距離開源分享
- 使用超聲波傳感器進(jìn)行距離測(cè)量
- 使用超聲波傳感器和Arduino進(jìn)行LED距離測(cè)量
- 使用超聲波傳感器HC SR04和Arduino Uno制作超聲波距離傳感器
- 超聲波測(cè)量與接近傳感器產(chǎn)品手冊(cè)下載 1次下載
- 超聲波距離傳感器技術(shù)原理與應(yīng)用 24次下載
- 具有IO-Link的超聲波距離傳感器參考設(shè)計(jì) 20次下載
- 【超聲波傳感器】超聲波傳感器使用問(wèn)題詳解! 23次下載
- 位差超聲波傳感器在智能玩具機(jī)器人中的應(yīng)用 70次下載
- 在線測(cè)量酵母濃度的超聲波傳感器
- 在線測(cè)量酵母濃度的超聲波傳感器
- 超聲波傳感器如何接線_超聲波傳感器測(cè)距 1.6w次閱讀
- 超聲波傳感器構(gòu)成的超聲波加濕器電路 7637次閱讀
- 超聲波傳感器的優(yōu)勢(shì)有哪些 4176次閱讀
- 超聲波傳感器的應(yīng)用 1673次閱讀
- 超聲波傳感器的使用注意事項(xiàng)說(shuō)明 2905次閱讀
- dfrobotSRF02超聲波傳感器介紹 1593次閱讀
- 超聲波液位傳感器的組成及工作原理 1.8w次閱讀
- 超聲波傳感器與紅外線傳感器對(duì)比誰(shuí)更好 1.1w次閱讀
- 超聲波傳感器內(nèi)部結(jié)構(gòu)及特點(diǎn) 1.7w次閱讀
- 超聲波液位傳感器在油罐液位測(cè)量的原理是什么樣的 5834次閱讀
- 超聲波傳感器的四個(gè)創(chuàng)新應(yīng)用 2918次閱讀
- 超聲波傳感器及工作原理解析 9648次閱讀
- 超聲波傳感器液位測(cè)量方法介紹 9654次閱讀
- 超聲波傳感器工作原理及主要性能指標(biāo) 3w次閱讀
- 超聲波傳感器的原理及應(yīng)用 1.1w次閱讀
下載排行
本周
- 1XL4015+LM358恒壓恒流電路圖
- 0.38 MB | 137次下載 | 1 積分
- 2elmo直線電機(jī)驅(qū)動(dòng)調(diào)試細(xì)則
- 4.76 MB | 9次下載 | 6 積分
- 3ADL-GPIB IEEE 488命令集函數(shù)參考手冊(cè)
- 0.67 MB | 2次下載 | 5 積分
- 4儀表培訓(xùn)課件
- 1.82 MB | 2次下載 | 1 積分
- 5DTSD1352導(dǎo)軌式多功能電能表安裝使用說(shuō)明書 V2.15
- 1.19 MB | 1次下載 | 免費(fèi)
- 6BQ79616-Q1和BQ75614-Q1 GUI用戶指南
- 4.51MB | 1次下載 | 免費(fèi)
- 7INA226EVM用戶指南
- 4.7MB | 1次下載 | 免費(fèi)
- 8INA226EVM修訂版A模型用戶指南和軟件教程
- 2.28MB | 1次下載 | 免費(fèi)
本月
- 1XL4015+LM358恒壓恒流電路圖
- 0.38 MB | 137次下載 | 1 積分
- 2新概念模擬電路第四冊(cè)信號(hào)處理電路電子書免費(fèi)下載
- 10.69 MB | 60次下載 | 免費(fèi)
- 3800VA純正弦波逆變器的參考設(shè)計(jì)
- 2.96MB | 32次下載 | 免費(fèi)
- 4純電動(dòng)汽?的主要部件及?作原理
- 5.76 MB | 15次下載 | 5 積分
- 5新概念模擬電路(電子版全集)
- 29.33 MB | 13次下載 | 免費(fèi)
- 6GP328和GP88S對(duì)講機(jī)的維修實(shí)列資料合集免費(fèi)下載
- 0.03 MB | 10次下載 | 10 積分
- 7Type-C VL160數(shù)據(jù)手冊(cè)
- 0.92 MB | 10次下載 | 3 積分
- 8elmo直線電機(jī)驅(qū)動(dòng)調(diào)試細(xì)則
- 4.76 MB | 9次下載 | 6 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935115次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
- 1.48MB | 420061次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233084次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191366次下載 | 10 積分
- 5十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183329次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73805次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65985次下載 | 10 積分
評(píng)論
查看更多