Hallo Hans,
hansemann hat geschrieben:
Super Dennis,
Zitat:
Ich könnte noch optimieren das nur drei aufeinander folgende Fehlermeldungen einen Alarm ausgeben. Im Moment ist es drei aus zehn ergeben einen Alarm
mach das bitte
Der andere falsche Alarm "Sensor TrommelfilterSensor liefert keinen sinnvollen Wert" ist auch wieder aufgetaucht, aber den eliminiere ich jetzt selber
Ansonsten sah es die Tage so aus:
07.05.2016 12:50:11 Sensor TrommelfilterSensor liefert keinen sinnvollen Wert!
07.05.2016 11:03:04 Der Pegelsensor der Filtersteuerung liefert keinen sinnvollen Wert!
06.05.2016 06:50:10 Sensor TrommelfilterSensor liefert keinen sinnvollen Wert!
05.05.2016 20:00:05 Der Pegelsensor der Filtersteuerung liefert keinen sinnvollen Wert!
Viele Grüße
Hans
P.S. Da jemend meinte, es gäbe Probleme mit dem Raspi, NEIN, der steuert den Trommelfilter bis jetzt einwandfrei, es geht nur um die Option, einen Alarm auf das Handy zu bekommen, wenn etwas im Argen ist
Ich denke dieses Thema ist hier besser aufgehoben.
Ich habe eben das Skript noch einmal überarbeitet. Jetzt funktioniert es so, dass es drei aufeinanderfolgende Fehlmessungen geben muss, damit ein Fehlalarm ausgegeben wird. Ob das allerdings die Fehlermeldungen minimiert, weiß ich nicht. Evtl. liegt dies ja auch am HCSR-04 selbst, dass dieser nach einem "Absturz" eine gewisse Zeit braucht, bevor wieder eine Messung durchgeführt wird.
Des Weiteren habe ich jetzt nur alle "korrekten" Werte in die Liste aufgenommen, die Ausgewertet werden sollen, Ist nur eine kleine Änderung die den Ablauf etwas verbessert. Sollte aber keine Großen Auswirkungen haben.
Ich könnte natürlich eine Wartezeit einbauen, aber dann habe ich ja genau das was ich nicht wollte. Den Job blockiert, falls mal an einem Stecker kein Sensor angeschlossen oder defekt ist.
Hier erst einmal der geänderte Code:
Code:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#-----------------------------#
# 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
length_input = len(sys.argv)
if length_input > 3:
Counter = int(sys.argv[3])
else:
Counter = 20
#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 = []
errorcounter = 0
#Schleife zum messen der Entfernung, wird so oft durchlaufen wie in Counter uebergeben wurde
while Counter > 0:
#Entferung messen
Millimeter = MeasureDistance(GPIOTrigger, GPIOEcho)
#Hier wird geprueft, ob der Sensor antwortet, falls nicht wird eine unoetig lange Abfrage unterbunden, damit der Job nicht blockiert wird
if Millimeter == 0:
errorcounter = errorcounter + 1
if errorcounter > 2:
lDistance = [0]
break
else:
errorcounter = 0
#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()
Der Bereich der geändert wurde
ROT markiert und Hinzugefügt
Blau#------------------------------------------------#
#-------------Start Program----------------------#
#------------------------------------------------#
#Leere Liste erschaffen
lDistance = []
errorcounter = 0
#Schleife zum messen der Entfernung, wird so oft durchlaufen wie in Counter uebergeben wurde
while Counter > 0:
#Entferung messen
Millimeter = MeasureDistance(GPIOTrigger, GPIOEcho)
#Hier wird geprueft, ob der Sensor antwortet, falls nicht wird eine unoetig lange Abfrage unterbunden, damit der Job nicht blockiert wird
if Millimeter == 0:
errorcounter = errorcounter + 1
if errorcounter > 2:
lDistance = [0]
break
else:
errorcounter = 0 #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()
@ Hans: Kannst du bitte einmal prüfen, ob die Änderung bei dir hilft, da ich immer noch kein Rasperry in der Konfiguration am Laufen habe