Taster GPIO - Ereignisbasierte abfrage

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
iotueli
User
Beiträge: 1
Registriert: Samstag 24. Dezember 2022, 16:15

Hallo zusammen,

ich beschäftige mich seit kurzem mit Python.
Aktuell versuche ich eine Fotobox zu erstellen, jedoch habe ich aktuell folgendes Problem.

Ich habe eine Funktion, die mithilfe eines Tasters (GPIO Input) angesteuert werden soll.
Wird der Taster gedrückt (Status 1) soll die Funktion ausgelöst werden, sobald ich den Taster nochmals drücke, soll die Funktion erneut ausgeführt werden.

Ich habe folgenden Code geschrieben, jedoch habe ich das Problem, dass der Taster nur reagiert beim Starten der Applikation (weil ich keine kontinuierliche Abfrage des Tasters durchführe).
Natürlich habe ich schon viele verschiedene Optionen versucht, leider habe ich aber nie das gewünschte Ergebnis erhalten.

Somit meine Frage, wie kann ich ereignisbasiert eine Funktion abrufen, ohne dass das Script beendet wird?

Hier eine abgespeckte Version meines Codes:

Code: Alles auswählen

import RPi.GPIO as GPIO
import time

switchPhoto = 36

GPIO.setmode(GPIO.BOARD)

GPIO.setup(switchPhoto, GPIO.IN)

switchPhotoStatus = GPIO.input(switchPhoto)

print(switchPhotoStatus)


def createSnapshot ():
    """ Function doc """
    if switchPhotoStatus == 1:
            return print("Funktion wird angesteuert")

#Dieser Funktionsaufruf soll bei Wertänderung des switchPhotoStatus auf 1 ausgelöst werden
createSnapshot()
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

ich würde anstatt RPi.GPIO gpiozero benutzen. Schau dir mal die Doku an, da hat es auch viele gute Beispiele drin.
Mit „when_pressed“ kannst du dann eine Funktion zuweisen. (Einfach nach Button in der Doku suchen)
Damit sich das Programm nicht automatisch beendet, schau dir mal „signal.pause()“ an.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

So bin nicht mehr am Handy.
Die Doku:
https://gpiozero.readthedocs.io/en/stab ... tml#button

Daraus wird dann sowas wie

Code: Alles auswählen

from signal import pause

from gpiozero import Button

SWITCH_PIN = 36


def make_something():
    print("Taster wurde gedrückt")


def main():
    button = Button(SWITCH_PIN)
    button.when_pressed = make_something
    pause()


if __name__ == "__main__":
    main()
Die Parameter von 'Button' gegebenfalls wie in der Doku beschrieben anpassen.

'as' ist zum umbenennen da. Du nennst GPIO ind GPIO um. Besser/richtiger wäre from RPi import GPIO.
Auf Modulebene darf kein ausführbarer Code stehen. Dort stehen nur Klassen, Funktionen und Konstanten. Konstanten schreibt man GANZ_GROSS, Klassen in PascalCase-Schreibweise und den Rest klein_mit_unterstrich. Alles, bist auf die Pinnummer, gehört bei dir in die 'main'-Funktion, daraus wird das Programm gesteuert.
Wenn du etwas mit 'return' zurück gibst, dann solltest du das beim Funktionsaufruf auch an einen Namen binden. In deinem Fall würde ich das 'return' weglassen, denn nach 'print' kehrt das Programm eh wieder an den Funktionsaufruf zurück.

Ich würde schauen, dass du gleich bei 'gpiozero' bleibst, das erleichtert meiner Meinung nach einiges.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten