GPiO Abfragen und Script ausführen

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo Forum,

    nachdem mir schon mit meiner Schaltung erfolgreich geholfen worden ist, wende ich mich nun mit meinem code an euch, da ich nicht weiterkomme. Es geht darum, mit dem Signal meines Türöffners, ein Programm für die Webcam zu öffnen. Das Signal ist ursprünglich für eine blinkende LED gedacht. Ich füge einen kleinen Schaltplan an woraus ihr sehen könnt wie es geschaltet ist. Ursprünglich habe ich versucht über ein Shell Script den Gpio auszulesen, leider ohne Erfolg da das Blinksignal nicht ausgewertet werden konnte. Nun habe ich mich in python versucht, und die Abfrage von GPIO klappt nun gut, nur leider wird webif nicht ausgeführt .

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    import RPi.GPIO as GPIO
    GPIO.setwarnings(False)
    from time import sleep
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(25, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    import urllib2

    def my_callback(channel):
    if GPIO.input(channel):
    print("%s Input was HIGH"%channel)
    else:
    print("%s Input was LOW"%channel)
    def WebIf(command):
    try:
    sock=urllib2.urlopen('http://192.168.11.100/web/' + command)
    data=sock.read()
    except urllib2.URLError:
    pass
    except urllib2.HTTPError:
    pass
    except urllib2.httplib.BadStatusLine:
    pass
    else:
    sock.close()
    return(data)

    WebIf('remotecontrol?command=399')
    WebIf('remotecontrol?command=3')
    WebIf('remotecontrol?command=403')
    WebIf('remotecontrol?command=403')
    WebIf('remotecontrol?command=403')
    time.sleep(30)
    GPIO.add_event_detect(25, GPIO.BOTH, callback=my_callback, bouncetime=200)

    raw_input("Enter zum Beenden!\n")


    Der Teil "def WebIf(command):" wird nicht ausgeführt, hätte jemand einen Tipp was ich tun könnte ?

  • Bitte Beitrag bearbeiten und dein Script in CODE packen! (mit dazugehöriger Formatierung/Einrückung)


    Zu deinem Problem solltest du zudem etwas genauer beschreiben was du machst bzw machen möchtest, was an den GPIO angeschlossen ist und was bei welcher Gegebenheit passieren soll. Dein Schaltplan ist für mich nämlich nicht wirklich zu verstehen

  • Ok sorry ich hoffe nun ist es besser. Zur Funktion: Wenn jemand klingelt signalisiert das meine Doorline durch eine blinkende LED. Dieses Signal wird über ein Relais genutzt um GPIO 25 low oder high zu schalten. Also low Verbindung über pullup an GND bzw High durch umschalten an 3,3V. Der Port wird nun im ca. Sekundentackt umgeschaltet von low nach high. Dieses Signal frage ich nun mit dem Code ab. das geht auch schon ich bekomme als Ausgabe :
    25 Input was HIGH
    25 Input was LOW
    25 Input was LOW
    25 Input was HIGH
    25 Input was HIGH
    25 Input was LOW
    25 Input was LOW
    25 Input was LOW
    usw ca. 30 Sek. lang
    Ich möchte nun den ersten Schaltvorgang auf LOW nutzen um den Code ab :
    "def WebIf(command):" auszuführen.
    Weiterhin sollte der Port permanent überwacht werden, heißt der event sollte weiterlaufen.

    Gruß

    Frank

  • Du solltest das def WebIf(command): nicht innerhalb des anderen def's setzen sondern eigenständig - das könnte schon mal helfen ;)
    Wobei ich da nun auch etwas verwirrt bin wofür du die ganzen except hast oder wohin die WebIf() gehören... musste selber mal gucken ob ds nachfolgende richtig(er) wäre, jedenfall muss def WebIf seperat stehen

    Allgemein hast du aber auch ein bisschen Chaos was das entziffern des Codes erschwert.. ich versuch das mal zu entwirren

  • ich bekomme folgende Fehler:

    Enter zum Beenden!
    25 Input was LOW
    Traceback (most recent call last):
    File "klingel2.py", line 22, in my_callback
    time.sleep(30)
    NameError: global name 'time' is not defined
    25 Input was HIGH
    25 Input was LOW
    Traceback (most recent call last):
    File "klingel2.py", line 22, in my_callback
    time.sleep(30)
    usw

    Das ganze sollte nur einmal ausgeführt werden und zwar wenn erkannt wird das GIPO 25 LOW ist, dann sollte er 30 Sek schlafen und danach auf einen neunen LOW Zustand warten und Webif erneut ausführen.

  • Naja ich ging jetzt davon aus das der von dir verwendete Code so zumindest auch ginge, im nachhinein is klar das "time" nicht geht - aber es sollte für dich, um den rest zu testen, nicht weiter schwer sein die time Zeile auszukommentieren/löschen (bzw nur sleep(30) ohne time. zu nutzen) - oder?

Jetzt mitmachen!

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