3 """Ein Modul für die Verwendung des Eingabe-Ausgabe-Moduls für den Raspberry
6 Es besteht aus der Hauptklasse EAModul, die für die Ansteuerung vorgesehen
7 ist. Hierfür existieren verschiedene Demos, die von der Kommandozeile aus
8 aufgerufen werden können:
12 Mit Hilfe der Klasse DimmbaresEAModul können die LEDs auf dem Board gedimmt
15 Das folgende Beispiel zeigt eine mögliche Verwendung:
17 >>> from eapi.hw import EAModul
20 Nun können wir ein paar LEDs anschalten
22 >>> ea.schalte_led(EAModul.LED_ROT, 1)
23 >>> ea.schalte_led(EAModul.LED_GELB, 1)
24 >>> ea.schalte_led(EAModul.LED_GRUEN, 1)
26 und wieder ausschalten
28 >>> ea.schalte_led(EAModul.LED_ROT, 0)
29 >>> ea.schalte_led(EAModul.LED_GELB, 0)
30 >>> ea.schalte_led(EAModul.LED_GRUEN, 0)
32 Der Wert des Tasters kann auch abgefragt werden.
34 >>> taster0_gedrueckt = ea.taster_gedrueckt(0)
35 >>> taster1_gedrueckt = ea.taster_gedrueckt(1)
37 Zum Schluss fahren wir das Modul wieder herunter:
41 Schaue in die Dokumentation der anderen Methoden, um weitere
42 Quelltextbeispiele zu finden.
48 import RPi.GPIO
as GPIO
54 """Die Klasse EAModul hilft bei der Ansteuerung eines Eingabe-Ausgabe-Moduls
55 für den Raspberry Pi. Es besteht aus drei LED und zwei Tastern."""
61 def __init__(self, pin_taster0=29, pin_taster1=31,
62 pin_led_rot=33, pin_led_gelb=35, pin_led_gruen=37):
64 Das Modul wird mit den gegebenen Pins konfiguriert.
66 Pins der LEDs werden als Ausgänge und Pins der Taster als Eingänge
67 konfiguriert. Wenn keine PINS angegeben werden, werden die PINs
68 oberhalb des GND Pins links unten verwendet.
70 >>> from eapi.hw import EAModul
72 Wenn keine Werte angegeben werden, werden die Standard-Pins verwendet.
77 Bei einer abweichenden Verdrahtung können die Pins angegeben werden.
79 >>> ea2 = EAModul(29, 31, 33, 35, 37)
81 Um den Quelltext übersichtlicher zu gestalten, können die Pins
82 direkt bezeichnet werden.
84 >>> ea2 = EAModul(pin_taster0=29, pin_taster1=31, pin_led_rot=33,
85 ... pin_led_gelb=35, pin_led_gruen=37)
88 GPIO.setmode(GPIO.BOARD)
90 self.
_taster = [pin_taster0, pin_taster1]
91 GPIO.setup(self.
_taster, GPIO.IN)
93 self.
_leds = [pin_led_rot, pin_led_gelb, pin_led_gruen]
94 GPIO.setup(self.
_leds, GPIO.OUT)
103 """Registriert eine Methode, die ausgeführt wird, sobald die
104 entsprechende LED ihren Wert ändert.
106 Die Methode wird über alle Veränderungen an der LED informiert. Dazu
107 wird die übergebene Methode aufgerufen.
109 >>> from eapi.hw import EAModul
111 >>> def update_rote_led(neuer_wert):
112 ... print("update: Status der roten LED hat sich geändert.")
113 ... print("Neuer Wert:", neuer_wert)
116 >>> ea.led_event_registrieren(EAModul.LED_ROT, update_rote_led)
118 Nun wird die Update-Methode aufgerufen, sobald sich der Wert der LED
121 >>> ea.schalte_led(EAModul.LED_ROT, 1)
122 update: Status der roten LED hat sich geändert.
125 >>> ea.schalte_led(EAModul.LED_ROT, 0)
126 update: Status der roten LED hat sich geändert.
133 def _notify_leds(self, led_farbe, neuer_wert):
134 """Alle registrierten Beobachter werden über eine Änderung
142 Liest den Wert des Tasters mit der gegebenen Nummer aus und gibt den
143 Wert zurück. Eine einfache Verwendung könnte wie folgt aussehen:
145 >>> from eapi.hw import EAModul
148 >>> ea_modul = EAModul()
149 >>> while not ea_modul.taster_gedrueckt(1):
150 ... ea_modul.schalte_led(EAModul.LED_ROT, 1)
152 ... ea_modul.schalte_led(EAModul.LED_ROT, 0)
153 >>> ea_modul.cleanup()
155 if 0 <= num < len(self.
_taster):
156 if GPIO.input(self.
_taster[num]):
162 "Falsche Tasternummer. Muss zwischen 0 und {ln} liegen.".format(
165 ''' TODO testen und Kommentar entfernen
166 def toggle_led(self, led_farbe):
167 """Wechselt den Zustand der angegebenen LED von an nach aus - oder umgekehrt.
169 Schaltet die LED aus, wenn sie an war, oder an, wenn sie aus war.
171 >>> from eapi.hw import EAModul
173 >>> ea.schalte_led(EAModul.LED_ROT, 1)
175 Nun ist die rote LED an.
177 >>> ea.toggle_led(EAModul.LED_ROT)
179 Nun ist die LED wieder aus.
181 >>> ea.toggle_led(EAModul.LED_ROT)
183 Nun ist sie wieder an.
185 # TODO noch nicht getestet.
186 alter_wert = GPIO.input(self._leds[led_farbe])
187 self.schalte_led(led_farbe, 1 - alter_wert)
191 """Schalte die LED mit der gegebenen Nummer ein (1) oder aus (0).
193 Der Wert für led_farbe ist LED_ROT, LED_GELB oder LED_GRUEN.
195 Eine einfache Verwendung könnte wie folgt aussehen:
197 >>> from eapi.hw import EAModul
199 >>> ea_modul = EAModul()
200 >>> ea_modul.schalte_led(EAModul.LED_ROT, 1)
201 >>> ea_modul.schalte_led(EAModul.LED_GELB, 0)
202 >>> ea_modul.schalte_led(EAModul.LED_GRUEN, 1)
203 >>> ea_modul.cleanup()
206 if 0 <= led_farbe < len(self.
_leds):
207 if an_aus == 1
or an_aus == 0:
208 GPIO.output(self.
_leds[led_farbe], an_aus)
211 raise ValueError(
"Wert für an_aus muss 0 oder 1 sein.")
213 raise ValueError(
"Falsche LED-Farbe.")
216 """Schalte alle drei LEDs zu gleichen Zeit an oder aus.
218 >>> from eapi.hw import EAModul
220 >>> ea_modul = EAModul()
221 >>> ea_modul.schalte_leds(True, False, True)
222 >>> ea_modul.cleanup()"""
229 """Registriere eine Methode, die bei Betätigung eines Tasters
232 Die übergebene Methode muss ein Argument haben und wird mit der
233 Pin-Nur des Tasters aufgerufen, sobald der Taster gedrückt
234 wird. Eine einfache Verwendung könnte wie folgt aussehen:
236 >>> def taster0_gedrueckt(pin):
237 ... print("Taster 0 wurde gedrückt.")
239 >>> ea_modul = EAModul()
240 >>> ea_modul.taster_event_registrieren(0, taster0_gedrueckt)
241 >>> ea_modul.cleanup()
247 if taster_nr < 0
or taster_nr >= len(self.
_taster):
248 raise ValueError(
"Falsche Taster Nummer." + taster_nr)
250 GPIO.add_event_detect(self.
_taster[taster_nr], GPIO.RISING,
251 callback=methode, bouncetime=200)
254 """Setzt alle Pins des Pi wieder in den Ausgangszustand.
256 >>> from eapi.hw import EAModul
264 """Ein Erweiterung der Klasse EAModul, die dimmbare LEDs unterstüzt.
266 Im Unterschied zum EAModul können über die Klasse DimmbaresEAModul die LEDs
267 mit Hilfe von PWM in der Helligkeit reguliert werden. Hierbei wurde die
268 Methode schalte_led so angepasst, dass sie nun auch Werte zwischen 0.0 und
271 >>> from eapi.hw import DimmbaresEAModul
272 >>> ea = DimmbaresEAModul()
274 Nach dem Erstellen eines Moduls, können die LEDs auch mit Werten zwischen
275 0.0 und 1.0 geschaltet werden. Sie leuchten dann weniger hell.
277 >>> ea.schalte_led(EAModul.LED_ROT, 0.5)
278 >>> ea.schalte_led(EAModul.LED_GELB, 0.8)
279 >>> ea.schalte_led(EAModul.LED_GRUEN, 0.2)
282 def __init__(self, pin_taster0=29, pin_taster1=31,
283 pin_led_rot=33, pin_led_gelb=35, pin_led_gruen=37):
285 Die PINs des Moduls werden konfiguriert.
287 Pins der LED werden als Ausgänge, und Pins der Taster als Eingänge
288 konfiguriert. Wenn keine PINS angegeben werden, werden die PINs
289 oberhalb des GND Pins links unten verwendet.
291 >>> from eapi.hw import DimmbaresEAModul
293 >>> ea = DimmbaresEAModul()
296 super().
__init__(pin_taster0, pin_taster1,
297 pin_led_rot, pin_led_gelb, pin_led_gruen)
302 GPIO.PWM(pin_led_rot, 50),
303 GPIO.PWM(pin_led_gelb, 50),
304 GPIO.PWM(pin_led_gruen, 50)
310 """Schalte die LED mit der gegebenen Nummer ein (1) oder aus (0).
312 Der Wert für led_farbe ist LED_ROT, LED_GELB oder LED_GRUEN.
314 Wenn für helligkeit eine Kommazahl zwischen 0 und 1 angegeben
315 wird, lässt sich die LED dimmen: ein Wert von 0.5 lässt die
316 LED nur mit halber Kraft leuchten.
318 Eine einfache Verwendung könnte wie folgt aussehen:
320 >>> from eapi.hw import DimmbaresEAModul
322 >>> ea_modul = DimmbaresEAModul()
323 >>> ea_modul.schalte_led(EAModul.LED_ROT, 1)
324 >>> ea_modul.schalte_led(EAModul.LED_GELB, 0)
325 >>> ea_modul.schalte_led(EAModul.LED_GRUEN, 0.5)
326 >>> ea_modul.cleanup()
329 if 0 <= led_farbe < len(self.
_leds):
330 if 0 <= helligkeit <= 1:
332 pwm = self.
__pwms[led_farbe]
333 pwm.ChangeDutyCycle(helligkeit*100)
337 raise ValueError(
"Wert für Helligkeit muss zwischen 0 und 1 liegen.")
339 raise ValueError(
"Falsche LED-Farbe.")
342 def demo_led_taster():
344 Ein einfaches Demoprogramm, um die LED und Taster auf dem Board zu prüfen.
350 Die rote und grüne LED blinken abwechselnd. Gleichzeitig kann über
351 den einen Taster die gelbe LED an- und ausgeschaltet werden. Der
352 andere Taster beendet das Programm, wenn er länger gedrückt wird.
359 def __taster0_gedrueckt(pin):
361 __ea_modul.schalte_led(EAModul.LED_GELB, __ea_modul.taster_gedrueckt(0))
363 __ea_modul.taster_event_registrieren(0, __taster0_gedrueckt)
366 while not __ea_modul.taster_gedrueckt(1):
367 __ea_modul.schalte_led(EAModul.LED_ROT, 1)
369 __ea_modul.schalte_led(EAModul.LED_ROT, 0)
372 __ea_modul.schalte_led(EAModul.LED_GRUEN, 1)
374 __ea_modul.schalte_led(EAModul.LED_GRUEN, 0)
377 except KeyboardInterrupt:
384 """Demoprogramm, um die Dimmen-Funktionalität zu prüfen."""
389 "Alle LEDs werden 0.0 auf 1.0 gedimmt und dann von 1.0 auf 0.0 (Enter)")
392 dim_ea_modul.schalte_led(EAModul.LED_ROT, i / 100)
393 dim_ea_modul.schalte_led(EAModul.LED_GELB, i / 100)
394 dim_ea_modul.schalte_led(EAModul.LED_GRUEN, i / 100)
397 dim_ea_modul.schalte_led(EAModul.LED_ROT, 1 - i / 100)
398 dim_ea_modul.schalte_led(EAModul.LED_GELB, 1 - i / 100)
399 dim_ea_modul.schalte_led(EAModul.LED_GRUEN, 1 - i / 100)
402 dim_ea_modul.cleanup()
406 """Hauptprogramm, das beim Starten des Moduls ausgeführt wird.
408 Hierüber können verschiedene Demoprogramme gestartet werden.
417 command = input(
"Befehl angeben: demo_led_taster demo_dimmen: ")
418 if command ==
"demo_dimmen":
421 elif command ==
"demo_led_taster":
426 if __name__ ==
"__main__":
def led_event_registrieren
def taster_event_registrieren