Besondere Eingaben sofortige Ereignisse ausführen

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hey Leute,

    ich bin auf der Suche, danach, wie ich folgendes am besten Lösen kann.

    Ich habe ein paar Taster (3-5 Stück) welche ich Abfragen möchte,

    wenn ich diese in Dauerschleife abfragen lasse frist dies ja enorm Systemkapazitäten oder war da nicht irgendwas? Gibt es eine Möglichkeit, etwas Systemtechnisch zu lösen, dass sparsamer ist oder macht das bei 3-5 Tastern nicht sonderlich was aus? Ich sollte noch dazu sagen, dass ich die Taster nicht alle in einem Programm abfragen Möchte, es werden also mindestens 2 - 3 "Programme" ablaufen.

    Als Sprache bevorzuge ich Python.


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

    Einmal editiert, zuletzt von RaspiDo (21. September 2015 um 16:04)

  • Besondere Eingaben sofortige Ereignisse ausführen? Schau mal ob du hier fündig wirst!

  • Danke für den Tipp,

    Ich hab mir das mal angesehen und ein wenig getestet. Erst hat auch alles Funktioniert nur nachdem ich i2c und 1-Wire freigegeben hatte. Also es war noch nich aktiviert. Reagiert er nicht mehr auf mein veränderten Code, den "Originalcode" nimmt er und reagiert auch schön, nur nicht auf meinen. Ich weiß irgendwie nur nicht, was da so gerade schief gelaufen ist.

    Der Originalcode:
    Signal über gpio auslesen und weiterverarbeiten


    Hier mein Code:

    Kurz zur Erklärung, den Code habe ich ein wenig angepasst, dass er beim auslösen des Interrupts erst prüft, ist ein anderer Zustand gegeben, wenn ja soll er die Befehle danach ausführen, sonst nicht. Also es soll zur Kontrolle eines Tasters dienen, der nicht bei jeder Betätigung eine Aktion auslösen soll, hier eine E-Mail senden.

    Der zu kontrollierende Zustand ist Taster2 und der Interrupt ist Taster1.


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

    Einmal editiert, zuletzt von RaspiDo (21. September 2015 um 21:02)

    • Offizieller Beitrag

    652 Beiträge und noch nicht die code tags endeckt? ;) was macht das Taster2 in der Interrupt funktion von Taster1? alles was in ner Funktion an Varibalen gebaucht wird,sollte dieser auch übergeben werden. Das script würde ich auch per subprocess, anstelle von os.ystem aufrufen, und dann auch per absolutem Pfad.

    Edit: jetzt hab das mit dem taster gelesen....verstanden aber noch nicht ;)

  • Taster1 ist ein "Sabotagekontakt" also ein Mikroschalter, der reagiert sobald man den Deckel öffnet. Und man möchte ja auch berechtigt sein, den Deckel zu öffnen ohne gleich eine Meldung los zu senden. Dafür ist der Taster2, ich weiß ich könnte mit Taster2 auch einfach Taster1 überbrücken. Aber ich möchte auch Protokollieren, wann Taster2 betätigt wird um die "Sperre" zu umgehen.

    Ich hoffe es ist nun ein wenig verständlicher.

    Aber wie gesagt zu Beginn funktionierte das ganze soweit, erst nach aktivieren von 1-Wire, RS232 und i2c Bus tat sich nichts mehr.

    Aber ich werd morgen was testen, also dass erst im externen Script überprüft wird, in welchem Zustand Taster 2 sich befindet. Und ich hatte dieses ausgelagert um verschiedene Teilbereiche etwas einfacher zu Strukturieren. Das einbinden von "Bausteinen" habe ich selbst noch nich gemacht und daher weiß ich auch nich genau wie das geht. Weil z.B. bei PHP kann ich ja auch einfach per Include zusätzlichen Funktionen einbinden und die Datei, die eingebunden werden muss, brauch kein bestimmtes Aussehen vorweisen.

    Aber ich könnte natürlich ein relativen Pfad nutzen, bislang hatte ich es noch nicht gemacht, da alle Dateien sich in einem PFad befinden.


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

  • Auch ganz normal mit *.py Speichern oder irgendwie anders?

    Und aufrufen der Funktionen einfach, als wäre Sie im "Hauptscript" oder muss ich da was beachten? Sry der dummen Fragen wegen.


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

  • Naja so wie du das Script modifiziert hast wird das aber nichts - du solltest erst versuchen das ganze zu verstehen ;)

    Was I2C oder PHP hiermit zu tun hat versteh ich absolut nicht und ignoriere es daher.


    Also noch mal das Original Script:

    Spoiler anzeigen

    [code=php]
    #!/usr/bin/python
    import RPi.GPIO as GPIO
    import time

    Taster1 = 25
    Taster2 = 27

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(Taster1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup(Taster2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

    def interrupt_event(pin):
    zeit = time.strftime("%d.%m.%Y %H:%M:%S")
    if GPIO.input(pin) == GPIO.HIGH:
    print "{} Rising edge detected on {}".format(zeit, pin)
    else:
    print "{} Falling edge detected on {}".format(zeit, pin)
    if pin == Taster1:
    print "{} Spezial Taster {}".format(zeit, pin)

    def main():
    GPIO.add_event_detect(Taster1, GPIO.BOTH, callback=interrupt_event, bouncetime=200)
    GPIO.add_event_detect(Taster2, GPIO.BOTH, callback=interrupt_event, bouncetime=200)
    #keep script running
    while True:
    time.sleep(1)

    if __name__ == '__main__':
    try:
    main()
    except (KeyboardInterrupt, SystemExit):
    print "\nQuit\n"
    GPIO.cleanup()
    [/php]

    Das einzige was das Script macht ist:
    - Sobald einer der Taster (egal welcher) gedrückt wird, wird "...Rising edge detected..." ausgegeben. Wenn man den Taster wieder los lässt wird "...Falling edge detected..." ausgegeben.
    - Sobald man Taster1 drückt wird zusätzlich auch noch "...Spezial Taster..." ausgegeben.

    Dieses Script verursacht so gut wie garkeine CPU Auslastung, reagiert trotzdem ziemlich schnell - durch die bouncetime aber nur mind. alle 200mS (entsprellt)

    Was Du nun aber möchtest ist:
    - Taster1 darf nicht reagieren wenn Taster2 zuvor betätigt wurde.

    Da es sich um einen Taster aber nicht Schalter handelt(?) muss man sich also den vorherigen Zustand merken.

    Das tut man am einfachsten über eine globale Variable. Dazu gesagt ist diese Methode die ich hier nun zeige absolut unschön und mache ich nur um es nicht unnötig zu verkomplizieren! Am Ende dieses Beitrags findest du aber im Spoiler wie es stattdessen aussehen sollte!

    Uns interessiert aber auch nur das drücken des Tasters, nicht das los lassen, also brauchen wir nicht GPIO.BOTH sondern nur GPIO.RISING
    Also Script soweit schon mal modifizieren:

    [code=php]
    #!/usr/bin/python
    import RPi.GPIO as GPIO
    import time

    Taster1 = 25
    Taster2 = 27

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(Taster1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup(Taster2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

    Taster2_state = None

    def interrupt_event(pin):
    global Taster2_state
    zeit = time.strftime("%d.%m.%Y %H:%M:%S")
    if GPIO.input(Taster2) == GPIO.HIGH:
    if Taster2_state == True:
    Taster2_state = False
    else:
    Taster2_state = True
    print "{} Spezial: {}".format(zeit, Taster2_state)

    if GPIO.input(Taster1) == GPIO.HIGH:
    print "{} Rising edge detected on {}".format(zeit, pin)
    elif GPIO.input(Taster1) == GPIO.LOW:
    print "{} Falling edge detected on {}".format(zeit, pin)


    def main():
    GPIO.add_event_detect(Taster1, GPIO.BOTH, callback=interrupt_event, bouncetime=200)
    GPIO.add_event_detect(Taster2, GPIO.RISING, callback=interrupt_event, bouncetime=200)
    #keep script running
    while True:
    time.sleep(1)

    if __name__ == '__main__':
    try:
    main()
    except (KeyboardInterrupt, SystemExit):
    print "\nQuit\n"
    GPIO.cleanup()
    [/php]

    Nun macht das Script aber noch nichts ausser den Zustand von Taster2 zu hinterlegen bzw zu ändern und anzuzeigen... Man muss das Script also auch noch dahingegend modifizieren das Taster1 nur dann beachtet wird wenn Taster2_state auf False steht:

    [code=php]
    #!/usr/bin/python
    import RPi.GPIO as GPIO
    import time

    Taster1 = 25
    Taster2 = 27

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(Taster1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup(Taster2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

    Taster2_state = None

    def interrupt_event(pin):
    global Taster2_state
    zeit = time.strftime("%d.%m.%Y %H:%M:%S")
    if GPIO.input(Taster2) == GPIO.HIGH:
    if Taster2_state == True:
    Taster2_state = False
    else:
    Taster2_state = True
    print "{} Spezial: {}".format(zeit, Taster2_state)

    if Taster2_state == False:
    if GPIO.input(Taster1) == GPIO.HIGH:
    print "{} Rising edge detected on {}".format(zeit, pin)
    elif GPIO.input(Taster1) == GPIO.LOW:
    print "{} Falling edge detected on {}".format(zeit, pin)


    def main():
    GPIO.add_event_detect(Taster1, GPIO.BOTH, callback=interrupt_event, bouncetime=200)
    GPIO.add_event_detect(Taster2, GPIO.RISING, callback=interrupt_event, bouncetime=200)
    #keep script running
    while True:
    time.sleep(1)

    if __name__ == '__main__':
    try:
    main()
    except (KeyboardInterrupt, SystemExit):
    print "\nQuit\n"
    GPIO.cleanup()
    [/php]

    Bei Fragen bitte gezielt fragen und wenn du etwas postest dann bitte in CODE- oder PHP- Blocks!


    Spoiler anzeigen


    [code=php]
    #!/usr/bin/python
    import RPi.GPIO as GPIO
    import time

    Taster1 = 25
    Taster2 = 27

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(Taster1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup(Taster2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

    #Dictionary docu: http://www.tutorialspoint.com/python/python_dictionary.htm
    dictionary = {}
    dictionary['Taster2_state'] = None

    def interrupt_event(pin):
    zeit = time.strftime("%d.%m.%Y %H:%M:%S")
    if GPIO.input(Taster2) == GPIO.HIGH:
    if dictionary['Taster2_state'] == True:
    dictionary['Taster2_state'] = False
    else:
    dictionary['Taster2_state'] = True
    print "{} Spezial: {}".format(zeit, dictionary['Taster2_state'])

    if dictionary['Taster2_state'] == False:
    if GPIO.input(Taster1) == GPIO.HIGH:
    print "{} Rising edge detected on {}".format(zeit, pin)
    elif GPIO.input(Taster1) == GPIO.LOW:
    print "{} Falling edge detected on {}".format(zeit, pin)


    def main():
    GPIO.add_event_detect(Taster1, GPIO.BOTH, callback=interrupt_event, bouncetime=200)
    GPIO.add_event_detect(Taster2, GPIO.RISING, callback=interrupt_event, bouncetime=200)
    #keep script running
    while True:
    time.sleep(1)

    if __name__ == '__main__':
    try:
    main()
    except (KeyboardInterrupt, SystemExit):
    print "\nQuit\n"
    GPIO.cleanup()
    [/php]

  • Werde ich in Zukunft machen, also Code - Block zusammen fassen.

    Und Sry, dass ich erst jetzt damit komme, aber Taster 2 ist ein Schalter. Hab das vorhin mir noch mal zu Gemüte geführt und es ist mir leider erst gerade aufgefallen.

    Ich hoffe das ist jetzt im Detail kein Problem. Werde mir morgen den Code noch mal zuführen und genauer begucken und gucken ob ich es selbst hin bekommen würde, also das korrigieren.


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

  • Mit einem Schalter ist es sogar noch einfacher da man in diesem Fall dann keinen Interrupt für Taster2 benötigen würde. Da kann man dann ganz einfach den aktuellen Schaltzustand abfragen, der ja permanent ist sobald man den Schalter umlegt.

    [code=php]
    #!/usr/bin/python
    import RPi.GPIO as GPIO
    import time

    Taster1 = 25
    Taster2 = 27

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(Taster1, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
    GPIO.setup(Taster2, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

    def interrupt_event(pin):
    zeit = time.strftime("%d.%m.%Y %H:%M:%S")

    if GPIO.input(Taster2) == GPIO.LOW:
    if GPIO.input(Taster1) == GPIO.HIGH:
    print "{} Rising edge detected on {}".format(zeit, pin)
    elif GPIO.input(Taster1) == GPIO.LOW:
    print "{} Falling edge detected on {}".format(zeit, pin)


    def main():
    GPIO.add_event_detect(Taster1, GPIO.BOTH, callback=interrupt_event, bouncetime=200)
    #keep script running
    while True:
    time.sleep(1)

    if __name__ == '__main__':
    try:
    main()
    except (KeyboardInterrupt, SystemExit):
    print "\nQuit\n"
    GPIO.cleanup()
    [/php]

  • Werde es Hardwaremäßig morgen mal genauer Testen. Schaff es heute nicht mehr. Gebe morgen kurz Rückmeldung ob alles geklappt hat.


    Aber trotzdem soweit schon 1.000 und 1 Danke.


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

  • Hey, da bin ich wieder.

    meigrafd: Habe den letzten Code gerade von dir eingefügt, angepasst und getestet. Nur leider passierte nichts. Also egal ob ich Taster2 (der Schalter) ein bzw. ausgeschalten habe. Es kam kein Ereignis auf dem Bildschirm zu sehen, dass etwas passiert ist.

    Und das andere was mir gerade aufgefallen ist, ist dass egal ob ich Taster öffne oder schließe, er zeigt beide male folgendes an:

    Code
    22.09.2015 15:35:16 Rising edge detected on 21
    22.09.2015 15:35:18 Rising edge detected on 21

    Dachte diese Information gebe ich auch noch mal weiter.

    Michael

    Nachtrag:
    Ich habe es einfach mal auf doof versucht und musste festellen, dass irgendetwas nicht so läuft wie es soll.

    Also wenn ich über die Pythonkonsole den Pin 21 abfrage bekomme ich egal wie ich schalte immer nur ein HIGH also 1 raus.
    Wenn ich hingegen einfach per WiringPi abfrage bekomme ich den Zustand raus. Also ob HIGH (1) oder LOW (0) ist. Wie kann das sein? Ich habe ein Hardwareseitigen Pulldown Widerstand von 10 K dran.

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

    Einmal editiert, zuletzt von RaspiDo (22. September 2015 um 15:58)

  • Wenn du ihn angepasst hast, also verändert, dann poste bitte deinen aktuellen Code wie du ihn gerade verwendest. Ich hab keine Glaskugeln mehr...

  • Also hier die Veränderung des "Basiscodes":

    Also ich habe lediglich die Pin "Nummer" geändert, sowie den Pulldown, da ich das ja schon Hardwaremäßig gemacht habe. Sonst hab ich erstmal noch nichts gemacht.

    Als ich aber merkte, dass er nie Falling Meldung ausgab, habe ich es wie gesagt auf die Blöde Tour gemacht und einfach über die Pythonkonsole das nötige zum Einlesen eines Pins rein geholt und selbst dort gab er jedes mal ein HIGH aus. Egal wie der Schalter bzw. Taster sich gerade befunden hat. Erst als ich es über die wiringPi getestet habe zeigte er, je nach Schalterstellung den Zustand an.


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

  • Das ist nicht "der letzte Code" von mir.. meine letzten Codes stehen am Ende von Beitrag#8 sowie Beitrag#10. Was du hier aber nun gepostet hast steht am Anfang von Beitrag#8, das ist aber nur das Original Script aus dem anderen Thread, als Gedächnisstütze, tatsächlich verwendet werden sollte das aber nicht da dieser ja für Dein Anliegen hier nicht zutrifft *ächz*.

    Dann erklär mir mal bitte an welche Pin# du deinen Taster und an welchen Pin# du den Schalter angeschlossen hast. Beachte: GPIO# ist etwas anderes als Pin#.

    Die Scripts funktionieren bei mir, also kann es nur an 2 Dingen liegen:
    - Taster/Schalter an falsche Pins.
    - Falsche Pull-Down Verkabelung.

  • Ich weiß, dass es nicht der "optimierte" Code ist, aber das Problem, was zur Zeit größer ist, dass er selbst bei der einfachen Tasterabfrage keine Reaktion erfolgt.

    Aber wie gesagt, ich habe über die Pythonkonsole einfache Abfrage gemacht und bei beiden Stellungen kam als Anzeige eine 1.

    Also es wird kein Unterschiedlicher Zustand angezeigt, obwohl der Schalter / Taster betätigt wird.

    Im wiringPi hingegen wird es bemerkt.

    Und dein Programm nutzt doch die GPIO Bezeichnung oder habe ich da was falsch verstanden?

    Ich habe an GPIO 20 (Pin 38) den Schalter angeschlossen und an GPIO 21 (Pin 40) den Taster.

    Angeschlossen mit Widerständen (10k) habe ich wie folgt gemacht:

    raspberry-circuit-3.jpg


    Michael

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

  • Ja du hast den Widerstand zwischen Vcc und GPIO und ich zwischen GND und GPIO.

    Und In der Theorie ist es eigentlich egal ob ich ein Pull Up oder Pull Down mache. Oder?

    Wie gesagt, unter WiringPi merkt es ja schließlich. Also kann es doch an sich dadran nicht liegen zumindest soweit ich das denke oder?


    Michael

    PS: Und Sry, ich hab mit StarTrek / StarWars nichts wirklich am Hut. Sry noch mal.

    Der Raspberry Pi ist schon ein schönes Spielzeug mit dem man einiges anfangen kann.

    :angel: :wallbash:

    Einmal editiert, zuletzt von RaspiDo (22. September 2015 um 20:48)

Jetzt mitmachen!

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