ich habe folgenden Code verfasst, welcher die Geschwindigkeit eines kleinen Wagens misst und in einem Fenster ausgibt. (Erste Lichtschranke getriggert, erste Zeit. Zweite Lichtschranke getriggert, zweite Zeit und dann verrechnet )
In dem ersten Code wird das GUI gebaut und auf ein Event (Lichtschranke 1 trigger) gewartet das die Messung startet.
Der zweite Code ist in einer anderen Datei gespeichert und führt die Nötige Rechnung aus.
Nun zum Problem:
Häufig, aber nicht immer tritt das Problem auf, dass das Programm immer den nachstehenden Teil aus Code 2 wiederholt und dann nicht nachvollziehbare Ergebnisse anzeigt, wobei ich eigentlich gedacht habe, dass er durch das "return" wieder in den Hauptcode zurückkehrt und wieder auf ein Event wartet.
Warum häufig? Weil die Ergebnisse temporär plausible sind und dann mal wieder nicht, nur ich finde den Fehler nicht.
Vielleicht ist es Euch ja möglich mir weiter zu helfen, bin auch über jeden Vorschlag sehr dankbar.
Gruß McLovin42
Problemstelle:
Code: Alles auswählen
else:
if time.time()-start_zeit >= TIMEOUT:
print ("Wait!")
time.sleep(0.5)
print ("Zeit wurde zurueckgesetzt.")
end_zeit= 0
ZEIT = 0
GESCHWINDIGKEIT = 0
return
1.
Code: Alles auswählen
try:
import Tkinter as tk
except ImportError:
import tkinter as tk
try:
import ttk
py3 = False
except ImportError:
import tkinter.ttk as ttk
py3 = True
import V_Messung_3_test as VM
import RPi.GPIO as GPIO
import time
from bluepy import btle
import Reading_BT
import lcddriver
#################################################
############### FENSTER ERSTELLEN ###############
#Ich erspare euch die vielen Zeilen
#################################################
####################SETUP########################
##GPIO SETUP
GPIO_START_PIN = 20
GPIO_END_PIN = 21
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_START_PIN, GPIO.IN)
##LCD SETUP
lcd = lcddriver.lcd()
lcd.lcd_display_string("v1: ", 1)
lcd.lcd_display_string("v2: ", 2)
##V_MESSUNG SETUP
DISTANZ = 0.1 #Meter
TIMEOUT = 5 #Sekunden
START_ZEIT = 0.0
##BT SETUP
p = btle.Peripheral('f4:e1:1e:15:95:89')
mydele = Reading_BT.MyDelegate(0)
wait_bt = 10.0
#Messung
def v_rampe(GPIO_START_PIN):
START_ZEIT = time.time()
##V_Messung
messwert = VM.v_mess(GPIO_END_PIN, DISTANZ, TIMEOUT, START_ZEIT)
# messwert = round(messwert, 3)
messwert = "%.3f" %messwert
v_1.set(messwert)
lcd.lcd_display_string("v1: "+str(messwert), 1)
##BT_Empfangen
messwert = ''
p.setDelegate(mydele)
if p.waitForNotifications(wait_bt):
messwert = mydele.myData
v_2.set(messwert)
lcd.lcd_display_string("v2: "+str(messwert), 2)
return
elif messwert == '':
print('dnf')
v_2.set('dnf')
lcd.lcd_display_string("v2: dnf", 2)
# time.sleep(3)
# v_2.set('')
return
GPIO.add_event_detect(GPIO_START_PIN, GPIO.RISING, v_rampe())
root.mainloop()
Code: Alles auswählen
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(GPIO_END_PIN, GPIO.IN)
#DISTANZ = 0.1 # (in m) Anpassen, falls notwendig
#TIMEOUT = 1 # sek
GESCHWINDIGKEIT = 0.0
#start_zeit = 0.0
end_zeit = 0.0
def v_mess(GPIO_END_PIN, DISTANZ, TIMEOUT, start_zeit):
# start_zeit = time.time()
while GPIO.input(GPIO_END_PIN) == 0 and time.time()-start_zeit < TIMEOUT:
time.sleep(0.001)
else:
if time.time()-start_zeit >= TIMEOUT:
print ("Wait!")
time.sleep(0.5)
print ("Zeit wurde zurueckgesetzt.")
end_zeit= 0
ZEIT = 0
GESCHWINDIGKEIT = 0
return
else:
end_zeit = time.time()
ZEIT = end_zeit - start_zeit
GESCHWINDIGKEIT = DISTANZ / ZEIT
print ("Geschwindigkeit: %.3f m/s") % GESCHWINDIGKEIT
start_zeit= 0
end_zeit= 0
time.sleep(0.5)
return GESCHWINDIGKEIT