Hallo Pfiffikus,
ich habe es jetzt umgesetzt.
Funktioniert im Moment auf 4 mm genau. Bei 1000 Messungen ohne Fehler. Bei meinem Messaufbau wohlgemerkt.
Code:
#-----------------------------#
# Author: Pfiffikus und Dennis#
#-----------------------------#
import time
import RPi.GPIO as GPIO
import sys
import string
#GPIO PINs deklariren
GPIOTrigger = int(sys.argv[1])
GPIOEcho = int(sys.argv[2])
#Wie oft soll gemessen werden
Counter = int(sys.argv[3])
#set GPIO PINS
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIOTrigger, GPIO.OUT)
GPIO.setup(GPIOEcho, GPIO.IN)
#set trigger to false
GPIO.output(GPIOTrigger, False)
#Warnings ausschalten um fehlerhafte Logausgaben zu vermeiden
GPIO.setwarnings(False)
# Wait 100ms damit die erste Messung korrekt durchgefuehrt wird
time.sleep(0.1)
#--------------------------------------------#
#--------------Entfernung messen-------------#
#--------------------------------------------#
def MeasureDistance(GPIOTrigger, GPIOEcho):
# set trigger to high
GPIO.output(GPIOTrigger, True)
# set trigger after 100msec to low, mit laengerer Wartezeit als 10mikrosec ist die Genauigkeit hoeher
time.sleep(0.1)
GPIO.output(GPIOTrigger, False)
# store initial start time
StartTime = time.time()
# Endzeit festlegen
EndTime = StartTime + 1
# store start time
while ((GPIO.input(GPIOEcho) == 0) & (StartTime < EndTime)):
StartTime = time.time()
# store stop time - aber vordefinieren
StopTime = time.time()
while ((GPIO.input(GPIOEcho) == 1) & (StartTime < EndTime)):
StopTime = time.time()
# Wenn keine Antwort vom Sensor empfangen wird, wird 0 mm ausgegeben
if StopTime - StartTime < 0.0001:
StopTime = StartTime
# calculate distance
TimeElapsed = StopTime - StartTime
Distance = (TimeElapsed * 343000) / 2
return Distance
#--------------------------------------------#
#----------Mittelwert ermitteln--------------#
#--------------------------------------------#
def GetAverage(lDistance):
#Listenlaenge ermittteln
lengthList = len(lDistance)
#Wandle List of Strings in List of Ints um
lDistance = map(int, lDistance)
#Min und Max Werte der Liste ermitteln
MIN = min(lDistance)
MAX = max(lDistance) + 1 # Es muss einer addiert werden damit die Schleife noch einmal durchlaufen wird, wenn viele Werte gleich dem MAX Wert sind
#Variablen deklarieren
RANGE = 4 #In welchem Bereich soll gesucht werden Default=6mm, es muss eine gerade Zahl sein!!!!
i = 0 #Schleifenwert
average = 0 #Durchschnittswert
treffer = 0 #aktuelle Treffer
maxtreffer = 0 #bisherigen max Treffer
maxSensor = 3000 #Der Sensor kann bis max 3000mm messen
#Wenn der MAX Wert in der Liste groesser als die Reichweite ist, wird 3000mm als maximum angenommen
if MAX > maxSensor:
MAX = maxSensor
if MIN != 0:
i = MIN - 1
#Alle Werte von MIN bis MAX pruefen
while i < MAX:
#Alle Werte der Liste durchlaufen und ueberpruefen, wenn Wert in dem Bereich von +- 3mm liegt wird gezaehlt
a = 0 #Listenanfang muss wieder zu 0 gesetzt werden, da es erneut durchlaufen wird
treffer = 0
while a < lengthList:
if (lDistance[a] > i-(RANGE/2)) and (lDistance[a] < i+(RANGE/2)):
treffer=treffer+1
a=a+1
#Wenn die aktuell gezaehlten Werte groesser sind als die alten werden diese gespeichert
if treffer > maxtreffer:
maxtreffer = treffer
average = i
#Wenn alle Werte innerhalb von 6mm liegen, wird die Schleife verlassen, sonst wird bis zum max Wert weiter geprueft
if maxtreffer == lengthList:
break
i=i+1
return average
#------------------------------------------------#
#-------------Start Program----------------------#
#------------------------------------------------#
#Leere Liste erschaffen
lDistance = []
#Schleife zum messen der Entfernung, wird so oft durchlaufen wie in Counter uebergeben wurde
while Counter > 0:
#Entferung messen
Millimeter = MeasureDistance(GPIOTrigger, GPIOEcho)
#Entferung zur Liste addieren
lDistance.append("%0.0f" % (Millimeter)) #ohne mm
#lDistance.append("%0.0f mm" % (Millimeter))#mit mm
#dekrementiere Zaehler
Counter = Counter - 1
iDistance = GetAverage(lDistance)
# #Mittelwert als Integer ausgeben on mm Angabex
print iDistance
#Outputs wieder auf undefinierten Zustand setzen
GPIO.cleanup()
Noch genauer hätte man es, wenn man aus den 20 gemessenen Werten alle Werte die innerhalb dieses Bereichs liegen den Mittelwert bildet und diesen ausgibt.
pi@raspberrypiTEICH ~ $ sudo python test_HCSR04_2.py 18 17 20
[166, 165, 166, 165, 165, 165, 165, 166, 165, 165, 165, 166, 166, 166, 166, 166, 165, 165, 165, 165]
Treffer in einem Range von 2mm = 12
165pi@raspberrypiTEICH ~ $ sudo python test_HCSR04_2.py 18 17 20
[165, 165, 165, 165, 165, 165, 166, 166, 165, 166, 165, 166, 165, 166, 165, 165, 165, 165, 166, 166]
Treffer in einem Range von 2mm = 13
165pi@raspberrypiTEICH ~ $ sudo python test_HCSR04_2.py 18 17 20
[165, 165, 165, 166, 165, 166, 166, 166, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, 165]
Treffer in einem Range von 2mm = 16
165pi@raspberrypiTEICH ~ $ sudo python test_HCSR04_2.py 18 17 20
[165, 166, 165, 166, 165, 166, 166, 165, 165, 166, 166, 166, 166, 166, 165, 166, 165, 165, 165, 165]
Treffer in einem Range von 2mm = 10
165pi@raspberrypiTEICH ~ $ sudo python test_HCSR04_2.py 18 17 20
[165, 165, 165, 166, 165, 165, 165, 166, 165, 166, 165, 166, 166, 165, 165, 165, 166, 166, 165, 165]
Treffer in einem Range von 2mm = 13
165pi@raspberrypiTEICH ~ $ sudo python test_HCSR04_2.py 18 17 20
[166, 165, 165, 165, 166, 166, 165, 166, 165, 165, 166, 166, 166, 166, 165, 166, 165, 164, 165, 165]
Treffer in einem Range von 2mm = 10
165pi@raspberrypiTEICH ~ $ sudo python test_HCSR04_2.py 18 17 20
[165, 165, 165, 165, 165, 166, 165, 165, 166, 165, 165, 166, 165, 165, 166, 165, 166, 165, 165, 166]
Treffer in einem Range von 2mm = 14
165usw.