詳細程式與註解
#Project: Raspberry Pi as a Parking sensors
#--前置設定--
##import function
import RPi.GPIO as GPIO
import time
##指定使用在電路板上接腳的號碼。
GPIO.setmode(GPIO.BOARD)
##指定要使用的Pin腳。
echo_pin=22
trigger_pin=24
BUZZER_pin=26
LED1_pin=19 #GREEN
LED2_pin=21 #YELLOW
LED3_pin=23 #RED
##省略warning訊息維持畫面簡潔。
GPIO.setwarnings(False)
##指定Pin腳為輸入或輸出狀態。
GPIO.setup(trigger_pin, GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(echo_pin, GPIO.IN)
GPIO.setup(BUZZER_pin, GPIO.OUT)
###將已設為輸出的Pin腳指定為PWM,並將蜂鳴器發出的頻率設定為800Hz。
pwm_buzzer = GPIO.PWM(BUZZER_pin,800)
###啟動PWM並設定Duty cycle為0。
pwm_buzzer.start(0)
GPIO.setup(LED1_pin, GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(LED2_pin, GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(LED3_pin, GPIO.OUT,initial=GPIO.LOW)
##音速約為331+0.6T m/s,T為攝氏溫度,預設T=20
v=343
#--偵測距離--
def detection():
GPIO.output(trigger_pin, GPIO.HIGH)
##觸發輸入信號10us高電位信號。
time.sleep(0.00001)
GPIO.output(trigger_pin, GPIO.LOW)
pulse_start=0
##進行距離偵測
###當偵測到echo腳位為低電位,紀錄轉變為高電位經過的時間。
while GPIO.input(echo_pin)==0:
pulse_start=time.time()
###當偵測到echo腳位為高電位,紀錄轉變為低電位經過的時間。
while GPIO.input(echo_pin)==1:
pulse_end=time.time()
##將兩者相減得到經過的時間。
t=pulse_end-pulse_start
##將時間乘上音速並除以2即可得到距離。
d=(t*v)/2
##將距離單位公尺(m)轉換為公分(cm)。
return d*100
#--偵測三次取平均值以增加準確度--
##每次偵測之間隔時間為65ms
def detection_average():
d1=detection()
time.sleep(0.065)
d2=detection()
time.sleep(0.065)
d3=detection()
time.sleep(0.065)
##將三次值取平均。
distance = (d1+d2+d3)/3
return distance
#--警示判斷觸發LED及蜂鳴器--
def alarm(distance):
##當距離大於15公分,綠燈持續亮。
if distance>15:
warning=0
##PWM的Duty cycle為0,蜂鳴器不響。
pwm_buzzer.ChangeDutyCycle(0)
##紅色燈泡暗掉。
GPIO.output(LED3_pin, GPIO.LOW)
##綠色燈泡間隔0.6秒閃爍。
GPIO.output(LED1_pin, GPIO.HIGH)
time.sleep(0.6)
GPIO.output(LED1_pin, GPIO.LOW)
elif distance<=12 and distance>10:
warning=0
##PWM的Duty cycle為0,蜂鳴器不響。
pwm_buzzer.ChangeDutyCycle(0)
##紅色燈泡暗掉。
GPIO.output(LED3_pin, GPIO.LOW)
##蜂鳴器間隔0.3秒響。
pwm_buzzer.ChangeDutyCycle(50)
##黃色燈泡間隔0.3秒閃爍。
GPIO.output(LED2_pin, GPIO.HIGH)
time.sleep(0.3)
pwm_buzzer.ChangeDutyCycle(0)
GPIO.output(LED2_pin, GPIO.LOW)
elif distance<=10 and distance>2:
##紅色燈泡持續發光。
GPIO.output(LED3_pin, GPIO.HIGH)
##蜂鳴器持續響。
pwm_buzzer.ChangeDutyCycle(50)
#--主程式--
##迴圈是為了延長週期
try:
while True:
for i in xrange(0,4,1):
distance=detection_average()
alarm(distance)
print "Distance = %.1f cm\n" % distance
#--結束後將蜂鳴器停止,清掉GPIO設定。--
finally:
pwm_buzzer.stop()
GPIO.cleanup()
HC-SR04模組
超音波為40khz的方波。
其本身可以偵測的距離為2-450公分,所以在距離設定時要大於兩公分。
0.065秒的設定
根據台南市教育局科技教育網-超音波原理介紹HC-SR04模組的內容,
為了避免脈波訊號(Trig)與輸出訊號(Echo)互相干擾,須將時間間隔大於60毫秒,也就是0.06秒以上。