An meinem Programm hat mich die Abfrage des Tasters durch eine Endlosschleife gestört.
Darum habe ich mich mal durch die Hilfeseiten geklickt und auch ein wenig im Netz gesucht.
Dabei ist folgendes heraus gekommen:
Programm zur Auswertung der RPi.GPIOs mittels Interrupt
Hinweis: Das Programm geht davon aus, dass die übergebene Variable abgeholt wird bevor der Taster erneut betätigt wird.
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import time
tst1 = 15 # GPIO-Eingang des IO "Tasters"
GPIO.setmode(GPIO.BCM)
GPIO.setup(tst1, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
# GPIO.IN: definiere tst1 als Eingang
# pull_up_down = GPIO.PUD_DOWN:
# Eingang wird über SoC auf "Null" gezogen
# ein Pulldown-Widerstand wird somit überflüssig
def tst_callback(channel): # definiere Callback-Funktion für Tasterdruck
global tst_td, tst_dt
if channel == 0:
tst_td = 0 # Zeitdauer des Tastendrucks
tst_dt = False # neue Daten vorhanden?
return()
if GPIO.input(tst1): # Taster gedrückt?
tst_td = time.time()
else: # Übergebe Wert an globale Variable
tst_td = time.time() - tst_td
tst_dt = True
# definieren des Events
GPIO.add_event_detect(tst1, GPIO.BOTH, callback = tst_callback, bouncetime = 50)
# GPIO.BOTH: reagiert sowohl auf ansteigende als auch auf abfallende Flanken
# callback = tst_callback: legt die aufzurufende Funktion fest
# bouncetime = 50: verhindert, dass auf ein prellen reagiert wird
tst_callback(0) # einmaliger Aufruf zum Setzen der globalen Variablen
try:
while True: # starte Endlosschleife
if tst_dt: # neue Daten vorhanden?
print(tst_td) # Ausgabe der Länge des Tastendrucks
tst_dt = False # Zurücksetzen der Variablen
time.sleep(0.1) # Verzögerung der Schleife
except KeyboardInterrupt: pass # Warten auf <ctrl> + c
finally: GPIO.cleanup() # Rücksetzen der IO
import RPi.GPIO as GPIO
import time
tst1 = 15 # GPIO-Eingang des IO "Tasters"
GPIO.setmode(GPIO.BCM)
GPIO.setup(tst1, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)
# GPIO.IN: definiere tst1 als Eingang
# pull_up_down = GPIO.PUD_DOWN:
# Eingang wird über SoC auf "Null" gezogen
# ein Pulldown-Widerstand wird somit überflüssig
def tst_callback(channel): # definiere Callback-Funktion für Tasterdruck
global tst_td, tst_dt
if channel == 0:
tst_td = 0 # Zeitdauer des Tastendrucks
tst_dt = False # neue Daten vorhanden?
return()
if GPIO.input(tst1): # Taster gedrückt?
tst_td = time.time()
else: # Übergebe Wert an globale Variable
tst_td = time.time() - tst_td
tst_dt = True
# definieren des Events
GPIO.add_event_detect(tst1, GPIO.BOTH, callback = tst_callback, bouncetime = 50)
# GPIO.BOTH: reagiert sowohl auf ansteigende als auch auf abfallende Flanken
# callback = tst_callback: legt die aufzurufende Funktion fest
# bouncetime = 50: verhindert, dass auf ein prellen reagiert wird
tst_callback(0) # einmaliger Aufruf zum Setzen der globalen Variablen
try:
while True: # starte Endlosschleife
if tst_dt: # neue Daten vorhanden?
print(tst_td) # Ausgabe der Länge des Tastendrucks
tst_dt = False # Zurücksetzen der Variablen
time.sleep(0.1) # Verzögerung der Schleife
except KeyboardInterrupt: pass # Warten auf <ctrl> + c
finally: GPIO.cleanup() # Rücksetzen der IO
Keine Kommentare:
Kommentar veröffentlichen