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.
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()
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()