ich bin blutiger Anfänger und möchte meine Script für die Füllstandsmessung verfeinern. Es treten immer wieder mal Ausreiser auf, die ich herausfiltern möchte.
Ich speichere den letzten Weg ab und lese ihn beim nächsten Start wieder ein und definiere den zulässigen Wertebereit mit wegmin und wegmax.
Daraufhin habe ich eine if Schleife aufgebaut wo gut und schlecht entschieden wird. Das funktioniert alles.
Code: Alles auswählen
if distance > wegmin and distance < wegmax:
print("Messwert: %1.1f" % distance)
print("gut")
sum = sum + values[i]
time.sleep(0.05)
else:
print("Messwert: %1.1f" % distance)
print("Fehler")
time.sleep(0.05)
Wie realisiert man die Wünsche?
Code: Alles auswählen
#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import datetime
import sys
import os
import ftplib
import fhem
fh = fhem.Fhem("192.168.1.30")
temp = fh.get_dev_reading("OWX_28_FF2BA3821502", "temperature")
temperatur = float(temp)
print temperatur
wegalt = fh.get_dev_reading("Zisterne_Inhalt","messstrecke")
old = float(wegalt)
print old
wegmax = (old) + 10
print wegmax
wegmin = (old) - 10
print wegmin
now = time.ctime()
parsed = time.strptime(now)
zeit = time.strftime("%Y-%m-%d_%H:%M:%S", parsed)
# GPIOs fuer den US-Sensor
TRIG = 26
ECHO = 19
# Dauer Trigger-Impuls
PULSE = 0.00001
# Anzahl Messwerte fuer Mittelwertbildung
BURST = 10
# Schallgeschwindigkeit/2
SPEED_2 = 331.5
#Abstand Sensor
SENSORABSTAND = 11.5
#Wasserhoehe
WASSERHOEHE = 203
# BCM GPIO-Referenen verwenden (anstelle der Pin-Nummern)
# und GPIO-Eingang definieren
GPIO.setmode(GPIO.BCM)
GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
GPIO.remove_event_detect(ECHO)
GPIO.output(TRIG, False)
time.sleep(1) # Setup-Zeit fuer Sensor
stopp = 0 # Variableninit
start = 0
distance = 0
def pulse(): # Funktion zum Starten der Messung
global start
global stopp
global distance
GPIO.output(TRIG, True) # Triggerimpuls erzeugen
time.sleep(PULSE)
GPIO.output(TRIG, False)
stopp = 0 # Werte auf 0 setzen
start = 0
distance = 0 # und Event starten
def measure(x): # Callback-Funktion fuer ECHO
global start
global stopp
global distance
if GPIO.input(ECHO) == 1: # steigende Flanke, Startzeit speichern
start = time.time()
else: # fallende Flanke, Endezeit speichern
stopp = time.time()
delta = stopp - start # Zeitdifferenz und Entfernung berechnen
distance = delta * (SPEED_2 + 0.5814 * temperatur) / 0.02
def measure_range(): # Bildet Mittelwert von BURST Messungen
values = []
sum = 0
for i in range(0, BURST):
pulse() # Messung starten
time.sleep(0.040) # Warten, bis Messung zuende
values.append(distance) # Wert im Array speichern und aufsummieren
if distance > wegmin and distance < wegmax:
print("Messwert: %1.1f" % distance)
print("gut")
sum = sum + values[i]
time.sleep(0.05)
else:
print("Messwert: %1.1f" % distance)
print("Fehler")
time.sleep(0.05)
return sum/BURST; # Mittelwert zurueckgeben
GPIO.add_event_detect(ECHO, GPIO.BOTH, callback=measure)
Dist = measure_range()
inhalt = 10000 - (Dist - SENSORABSTAND) * 10000 / WASSERHOEHE
inhaltger = round (inhalt, -1)
print zeit,("Inhalt = %.0f l" % inhaltger)
distanceRet = ("%.0f" % inhaltger)
os.system('perl /opt/fhem/fhem.pl 7072 "setreading Zisterne_Inhalt wasserpegel '+str(distanceRet)+'"')
messstrecke = ("%.0f" % distance)
os.system('perl /opt/fhem/fhem.pl 7072 "setreading Zisterne_Inhalt messstrecke '+str(messstrecke)+'"')
time.sleep(5)
GPIO.cleanup()
print("Bye!")