牟曉東
汽車的倒車?yán)走_(dá)系統(tǒng)能夠根據(jù)車尾與障礙物的間距進(jìn)行聲音報(bào)警,間距值越小,蜂鳴器的“滴滴”嘯叫頻率越高。類似的,我們可以借助于Arduino開發(fā)板來制作一個(gè)小型“超聲波警示燈”系統(tǒng),利用超聲波傳感器來檢測和顯示與障礙物的間距,并且能夠根據(jù)不同的間距值來控制不同顏色的LED發(fā)光:距離遠(yuǎn),非常安全,亮綠燈;距離減小,處于警示區(qū)間范圍,亮黃燈;距離接近于警示臨界點(diǎn),比較危險(xiǎn),亮紅燈。
實(shí)驗(yàn)器材:Arduino UNO主板一個(gè),HC-SR04超聲波傳感器一個(gè),綠色、黃色和紅色LED燈各一支,面包板一塊,各種顏色的杜邦線若干。
首先,將Arduino的5V電源正極和GND通過杜邦線連接至面包板;HC-SR04超聲波傳感器有四個(gè)引腳,其中的VCC和GND分別插接至面包板的正極和負(fù)極,Trig信號(hào)發(fā)射引腳和Echo信號(hào)接收引腳分別插接至Arduino的2號(hào)和3號(hào)數(shù)字引腳;綠色、黃色和紅色LED的長腿(正極)通過面包板分別連接至Arduino的4號(hào)、7號(hào)和8號(hào)數(shù)字引腳,短腿(負(fù)極)與GND連接;最后,通過數(shù)據(jù)線將Arduino與計(jì)算機(jī)USB接口連接(如圖1)。
在Arduino IDE中首先進(jìn)行變量的定義,與超聲波傳感器相關(guān)的語句包括“int TrigPin = 2;”“int EchoPin = 3;”和“float distance;”,前兩個(gè)分別聲明它的信號(hào)發(fā)射與接收引腳為2號(hào)和3號(hào)數(shù)字引腳,定義的浮點(diǎn)型變量distancd是用來存儲(chǔ)超聲波傳感器所測量的間距值;接著再定義三個(gè)整形變量:“int GreenLED = 4;”“int YellowLED = 7;”和“int RedLED =8;”,分別對應(yīng)綠色、黃色和紅色LED的三個(gè)數(shù)字引腳(4號(hào)、7號(hào)和8號(hào))。
在setup()函數(shù)中,先通過語句“Serial.begin(9600);”來設(shè)置串口監(jiān)視器的波特率,目的是實(shí)時(shí)顯示出超聲波傳感器所監(jiān)測的間距數(shù)據(jù);然后是五個(gè)pinMode()引腳模式設(shè)置語句,除超聲波傳感器的EchoPin設(shè)置為INPUT輸入模式外,將它的TrigPin和三個(gè)LED燈(GreenLED、YellowLED、RedLED)均設(shè)置為OUTPUT輸出模式(如圖2)。
在loop()函數(shù)中,首先要控制超聲波傳感器的發(fā)射端進(jìn)行信號(hào)的觸發(fā),即使用“低-高-低”的短時(shí)間脈沖:語句“digitalWrite(TrigPin, LOW);”和“delayMicroseconds(20);”的作用是控制發(fā)射端保持20微秒的低電平;然后通過語句“digitalWrite(TrigPin,HIGH);”和“delayMicroseconds(20);”,控制發(fā)射端再保持20微秒的高電平(即觸發(fā)一個(gè)20微秒的高脈沖);最后的語句“digitalWrite(TrigPin, LOW);”是控制發(fā)射端再次處于低電平狀態(tài)。
接著,為存儲(chǔ)間距值的變量distance進(jìn)行賦值:“distance=pulseIn(EchoPin,HIGH) * 340/2/
10000;”,計(jì)算方法是借助pulseIn()來實(shí)現(xiàn)——此時(shí)要特別注意它的單位是“微秒”(空氣中的聲速值按340米/秒計(jì)),有“米與厘米”和“秒與微秒”間的單位換算(相當(dāng)于“除以10000”);而且超聲波傳感器所監(jiān)測的間距值是“超聲波從發(fā)射端發(fā)出、向前運(yùn)動(dòng)并碰到障礙物后、再返回至接收端”的往返值(要“除以2”),因此在表達(dá)式中要對“pulseIn(EchoPin, HIGH)”的值再進(jìn)行“*340/2/10000”的計(jì)算。然后,在串口監(jiān)視器中輸出一行提示信息,語句為“Serial.print("與障礙物間的距離為:"); ”;接著再通過“Serial.print(distance); ”和“Serial.print(“cm”); ”兩行語句,將distance變量和單位(“厘米”)在同一行顯示輸出;而后面的語句“Serial.println(); ”,作用是輸出一個(gè)“換行”(相當(dāng)于“回車”操作)。
接下來要構(gòu)建一個(gè)“if…else if…else…”三分支選擇結(jié)構(gòu),對變量distance的值進(jìn)行區(qū)間范圍判斷:如果距離大于30厘米(“distance >= 30.00”),執(zhí)行語句“digitalWrite(GreenLED,HIGH);”,控制綠色LED燈發(fā)光;如果距離在15厘米和30厘米之間(“distance < 30.00 and distance >= 15.00”),則執(zhí)行語句“digitalWrite(YellowLED,HIGH);”,控制黃色LED燈發(fā)光;否則的話——相當(dāng)于距離小于15厘米(“distance < 15.00”),則執(zhí)行語句“digitalWrite(RedLED,HIGH);”,控制紅色LED燈發(fā)光。
最后,添加一個(gè)“delay(500); ”語句,作用是控制每次循環(huán)均延遲500毫秒;而三個(gè)digitalWrite()語句則是向三個(gè)LED連接引腳寫入低電平,作用是關(guān)閉所有的LED燈,從而為下一次循環(huán)的正確響應(yīng)做好初始化準(zhǔn)備(如圖3)。