GUI-Skript Distanzmessung | Wer findet den Bug?

  • Hallo,
    ich habe ein Script zur kontinuierlichen Distanzmessung geschrieben, leider bleibt dieses nach 10-30s hängen und ich kann mir einfach nicht erklären wieso.

    Sensor: HC-SR04

    Wenn es sich aufhängt und ich das Skript mit Strg-C beende bekomme ich den folgenden Fehler:
    line 69, in update_label
    TypeError: float argument required, not NoneType

    Ich verstehe nur nicht wie da was anderes als ein float ankommen kann?!

    Hier mein Skript:
    [code=php]
    #Bibliotheken einbinden
    import RPi.GPIO as GPIO
    import time
    import Tkinter as tk

    #GPIO Modus (BOARD / BCM)
    GPIO.setmode(GPIO.BCM)
    GPIO.setwarnings(False)

    #GPIO Pins zuweisen
    GPIO_TRIGGER = 20
    GPIO_ECHO = 21

    #Inizialisiere Variablen
    werte = [0.] * 100 # Gibt an ueber wie viele Werte gemittelt wird (std:100)

    #Richtung der GPIO-Pins festlegen (IN / OUT)
    GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
    GPIO.setup(GPIO_ECHO, GPIO.IN)


    def distanz():
    # setze Trigger auf HIGH
    GPIO.output(GPIO_TRIGGER, True)

    # setze Trigger nach 0.01ms aus LOW
    time.sleep(0.00001)
    GPIO.output(GPIO_TRIGGER, False)

    StartZeit = time.time()
    StopZeit = time.time()

    # speichere Startzeit
    while GPIO.input(GPIO_ECHO) == 0:
    StartZeit = time.time()

    # speichere Ankunftszeit
    while GPIO.input(GPIO_ECHO) == 1:
    StopZeit = time.time()

    # Zeit Differenz zwischen Start und Ankunft
    TimeElapsed = StopZeit - StartZeit
    # mit der Schallgeschwindigkeit (34300 cm/s) multiplizieren
    # und durch 2 teilen, da hin und zurueck
    distanz = (TimeElapsed * 34300) / 2

    return distanz

    # Auswertung der Messung
    def abstand():
    try:
    t = 0
    while t < (len(werte)):
    aktwert = distanz()
    if aktwert >= 0. and aktwert <= 350.: # Nur Werte zwischen 0 und 350cm verwerten
    werte[t] = aktwert # Wert in Ringspeicher schreiben
    t += 1
    abstand = sum(werte) / len(werte) # Mittelwert des Ringspeichers bilden
    return abstand

    # Beim Abbruch durch STRG+C resetten
    except KeyboardInterrupt:
    print("Messung vom User gestoppt")
    GPIO.cleanup()

    # Update Label
    def update_label():
    label.configure(text='Distance: %.1f %s' % (abstand(), 'cm')) # Bsp.: "126.3 cm"
    root.after(10, update_label) # Nach 10ms erneut updaten

    root = tk.Tk()
    root.wm_title("Distance Measurement")

    # Create Label
    label = tk.Label(root, text="", font=("Helvetica", 24))
    label.pack()
    update_label()
    root.mainloop()
    [/php]


    Vielen Dank im voraus! :thumbs1:

  • Soso, kommt mir irgendwie bekannt vor :fies:

    Lies dazu mal bitte ab folgendem Beitrag: HC-SR04 Ultraschallmessung. Skript bleibt sporadisch hängen, Messung schlägt fehl...
    (in #10 im EDID das Script solltest du aber bevorzugen)

  • Wenn der except block durchlaufen wurde endet die Funktion. Und was gibt sie dann zurück?
    Sicherlich keinen float Wert.

  • aaah, okay d.h. der Fehler entsteht durch das abbrechen via Strg-C ......jetzt kann ich mir gar nicht mehr erklären wie es zum hängen bleiben kommt, bestimmt so ein blöder kleiner Anfängerfehler

    Einmal editiert, zuletzt von Aspire (8. Februar 2015 um 18:07)

  • Wenn du in einer Anweisung ein return verwendest dann setz das try um den Aufruf der Anweisung:

    Spoiler anzeigen

    [code=php]
    # Auswertung der Messung
    def abstand():
    t = 0
    while t < (len(werte)):
    aktwert = distanz()
    if aktwert >= 0. and aktwert <= 350.: # Nur Werte zwischen 0 und 350cm verwerten
    werte[t] = aktwert # Wert in Ringspeicher schreiben
    t += 1
    abstand = sum(werte) / len(werte) # Mittelwert des Ringspeichers bilden
    return abstand

    try:
    distance = abstand()
    except KeyboardInterrupt:
    print("Messung vom User gestoppt")
    [/php]

    Besser wäre aber wenn du ein "Fehler auslöst", da dein Script ja auch noch aus mehr Zeilen besteht


    Aber wie gesagt solltest du dir erwähnte Beiträge mal durchlesen ;)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!