After present

報告之後

詳細程式與註解

 #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秒以上。