Sonntag, 17. August 2014

Eventgesteuerte Abfrage der RPi.GPIO

Endlich komme ich wieder dazu mich meinem Projekt zu widmen.
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

Keine Kommentare:

Kommentar veröffentlichen