zu www.bildungsgueter.de zur Inhaltsübersicht des Kapitels

Frage 20

Blinklicht mit asynchronen Ereignissen


Aufgabentext:

Schreiben Sie dasselbe [d.h. das unter Frage 19 verlangte] Programm nochmals unter Verwendung von asynchronen Ereignissen:

Sowohl die Schnittstelle GPIOzero als auch die Schnittstelle RPi.GPIO stellen Funktionen bereit, mit denen ein vom Drucktaster kommendes Signal ohne Polling angenommen werden kann.

Programme für eine Schaltung, die die im Raspberry Pi vorhandenen Pull-Down-Widerstände verwendet

Die Schnittstelle GPIOzero sieht für die Lösung dieser Aufgabe die Funktion wait_for_press vor:

#!/usr/bin/env python3

from gpiozero import LED, Button
from time import sleep

def Hauptprogramm():
    button = Button(5, pull_up=False)   #  pin 29,
                                        #  pull-down-Beschaltung
    led = LED(6)                        #  pin  31
    print("Wie oft soll die LED blinken?")
    n = int(input())
    print("Starten Sie das Blinklicht, indem Sie den Taster drücken")

    #
    #  Warten, bis der Taster gedrückt wird:
    #
    button.wait_for_press()

    #
    #  Blinken
    #
    for i in range(0, n):
        led.on()
        sleep(0.5)
        led.off()
        sleep(0.5)

if __name__ == '__main__':
    Hauptprogramm()

Die Schnittstelle RPi.GPIO sieht für die Lösung dieser Aufgabe die Funktion wait_for_edge vor:

#!/usr/bin/env python3

import RPi.GPIO as GPIO
from time import sleep

LED  = 6    #  Broadcomm-Nummer für Pin 31
BTTN = 5    #  Broadcomm-Nummer für Pin 29

def Hauptprogramm():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(BTTN, GPIO.IN, pull_up_down = GPIO.PUD_DOWN)  #  Pin 29
    GPIO.setup(LED, GPIO.OUT)  #  Pin 31

    print("Wie oft soll die LED blinken?")
    n = int(input())
    print("Starten Sie das Blinklicht, indem Sie den Taster drücken")

    #
    #  Warten, bis der Taster gedrückt wird.
    #  Es wird gewartet, bis das Potential von 0 nach 1
    #  wechselt. Dieser Signalwechsel heißt
    #  "rising edge" (ansteigende Flanke)
    #
    GPIO.wait_for_edge(BTTN, GPIO.RISING)

    #
    #  Blinken
    #
    for i in range(0, n):
        GPIO.output(LED, GPIO.HIGH)
        sleep(0.5)
        GPIO.output(LED, GPIO.LOW)
        sleep(0.5)
    GPIO.cleanup()

if __name__ == '__main__':
    Hauptprogramm()

 

 


Programme für eine Schaltung, die ohne die im Raspberry Pi vorhandenen Pull-Down-Widerstände aufgebaut wird

Wenn für die Pull-Down-Schaltung nicht die im Raspberry Pi vorhandenen Widerstände verwendet werden, sondern geeignete Widerstände auf der Steckplatine aufgebaut werden, muss in den oben angegebenen Betriebsprogrammen jeweils nur die Anweisung geändert werden, die den Eingabekontaktstift des Drucktasters konfiguriert.

Wenn die Schnittstelle GPIOzero verwendet wird, ist bei der Konfiguration des Button für das Argument pull_up der Wert None anzugeben:

#!/usr/bin/env python3

#
#   Lösung für das Hauptproblem
#   Hier muss der Vorwiderstand auf der Steckplatine
#   platziert werden. De internen Pull-Down-Widerstände
#   des Raspberry werden nicht verwendet.
#

from gpiozero import LED, Button
from time import sleep

def Hauptprogramm():
    button = Button(5, pull_up=None)   #  pin 29,
                                          #  Beschaltung ohne internen Widerstand
    led = LED(6)                          #  pin  31
    print("Wie oft soll die LED blinken?")
    n = int(input())
    print("Starten Sie das Blinklicht, indem Sie den Taster drücken")

    #
    #  Warten, bis der Taster gedrückt wird:
    #
    button.wait_for_press()

    #
    #  Blinken
    #
    for i in range(0, n):
        led.on()
        sleep(0.5)
        led.off()
        sleep(0.5)

if __name__ == '__main__':
    Hauptprogramm()

Wenn die Schnittstelle RPi.GPIO verwendet wird, ist bei der Konfiguration des Button für das Argument pull_up_down der Wert GPIO.PUD_OFF anzugeben:

#!/usr/bin/env python3

import RPi.GPIO as GPIO
from time import sleep

LED  = 6    #  Broadcomm-Nummer für Pin 31
BTTN = 5    #  Broadcomm-Nummer für Pin 29

def Hauptprogramm():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(BTTN, GPIO.IN, pull_up_down = GPIO.PUD_OFF)  #  Pin 29
    GPIO.setup(LED, GPIO.OUT)  #  Pin 31

    print("Wie oft soll die LED blinken?")
    n = int(input())
    print("Starten Sie das Blinklicht, indem Sie den Taster drücken")

    #
    #  Warten, bis der Taster gedrückt wird.
    #  Es wird gewartet, bis das Potential von 0 nach 1
    #  wechselt. Dieser Signalwechsel heißt
    #  "rising edge" (ansteigende Flanke)
    #
    GPIO.wait_for_edge(BTTN, GPIO.RISING)

    #
    #  Blinken
    #
    for i in range(0, n):
        GPIO.output(LED, GPIO.HIGH)
        sleep(0.5)
        GPIO.output(LED, GPIO.LOW)
        sleep(0.5)
    GPIO.cleanup()

if __name__ == '__main__':
    Hauptprogramm()

zur Inhaltsübersicht des Kapitels