====== Projekt: LED mit Python ====== [[projekt:python_projekt_gpio| ☚ zurück]] // In diesem Projekt wird das bisherige LED-Programm neu strukturiert und in mehrere Dateien aufgeteilt. Dabei wird die Hardware-Ansteuerung von der eigentlichen Programmlogik getrennt. Ziel ist es, mehrere LEDs gezielt und übersichtlich über die Konsole steuern zu können. // ===== Programmstruktur ===== **Aktiviere die Python-Environment** Die Programmierung erfolgt nun immer mit der gewählten Umgebung! source ~/devel/projects/course_env/bin/activate Die Aufteilung in mehrere Dateien sorgt für eine klare Trennung zwischen Programmlogik und Hardware-Ansteuerung. Dadurch bleibt der Code übersichtlich und besser nachvollziehbar. Folgende Programmstruktur wird verwendet. * ''gpio_led'' – Projektordner im Verzeichnis ''~/devel/projects/'' * ''src'' – Ordner für den Quellcode (engl. source) * ''core'' – Unterordner in ''src'' gpio_led/ └── src ├── core │ ├── hardware.py │ └── __init__.py └── ledcontrol.py Lege alle Verzeichnisse so an, wie oben dargestellt. Alle Dateien – bis auf ''%%__init__.py%%'' – kommen später dazu. Die ''%%__init__.py%%'' muss lediglich vorhanden sein, damit Python dieses Verzeichnis als Modulverzeichnis erkennt. Dies kann mit dem folgenden Befehl erledigt werden: cd ~/devel/projects/gpio_led/src/core touch __init__.py **Bevor weitergearbeitet werden kann, sollte die Programmstruktur überprüft werden.** {{ :raspberry_pi:led_structure.png?600 |}} ===== Hardware ===== Der Aufbau und die verwendete Hardware wurden im vorherigen [[projekt:python_projekt_gpio|GPIO-Projekt]] beschrieben. Im Kurs wird die Hardware als //Modul-Breakout// zur Verfügung gestellt, sodass die Verdrahtung auf ein Minimum reduziert wird und der Raspberry Pi keinen Schaden nehmen kann. ===== Quellcode (Sourcecode) ===== Der **Sourcecode** besteht aus zwei Dateien: das eigentliche Programm **%%ledcontrol.py%%** sowie die Dateien im Hintergrund (im Verzeichnis **%%core%%**), die für die Programmlogik und die Hardware-Ansteuerung benötigt werden. Im Kurs wird das Programm ausführlich erklärt. Diese Dateien enthalten noch keinen Header – dies sollte geändert werden. === hardware.py === import RPi.GPIO as GPIO # ----------------------------- # API-Funktionen GPIO LED Ampel # ----------------------------- # ADJUST AREA START PIN_R = 17 PIN_Y = 27 PIN_G = 22 # ADJUST AREA END GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(PIN_R, GPIO.OUT) GPIO.setup(PIN_Y, GPIO.OUT) GPIO.setup(PIN_G, GPIO.OUT) def setLED(pin, value): if value == 1: GPIO.output(pin, GPIO.HIGH) else: GPIO.output(pin, GPIO.LOW) def setYellowLED(value): setLED(PIN_Y, value) def setRedLED(value): setLED(PIN_R, value) def setGreenLED(value): setLED(PIN_G, value) def status(): r = GPIO.input(PIN_R) g = GPIO.input(PIN_G) y = GPIO.input(PIN_Y) return r, g, y def cleanup(): GPIO.cleanup() === ledcontrol.py === #!/usr/bin/env python3 from core import hardware def main(): print("This is LED CONTROL ('x' beendet)") try: while True: cmd = input("[R]ed [Y]ellow [G]reen [x] Exit > ").strip().lower() if cmd in ("r", "y", "g"): mode = input("[1] ON [0] OFF > ").strip() value = 1 if mode == "1" else 0 if cmd == "r": hardware.setRedLED(value) elif cmd == "y": hardware.setYellowLED(value) elif cmd == "g": hardware.setGreenLED(value) elif cmd == "x": break except KeyboardInterrupt: pass finally: print("\rGood Bye :-)") hardware.cleanup() # optional if __name__ == "__main__": main() ==== Testen des Programms ==== Bevor mit dem Projekt weitergearbeitet wird, muss überprüft werden, ob das LED-Programm korrekt gestartet werden kann. Dazu müssen folgende Voraussetzungen erfüllt sein: * die Python-Environment ist aktiviert, * die Programmstruktur wurde korrekt angelegt, * der Abschnitt **„Pakete & Bibliotheken installieren“** wurde vollständig gelesen und umgesetzt. Anschließend wird in den Quellcode-Ordner gewechselt und das Programm gestartet: cd ~/devel/projects/gpio_led/src ./ledcontrol.py Bei erfolgreichem Start erscheint die Eingabeaufforderung von ''ledcontrol.py'': [R]ed [Y]ellow [G]reen [x] Exit > === Verhalten bei Eingaben testen === - LED wählen (R/Y/G) - nun (1/0) entweder anschalten oder ausschalten - x beendet das Programm Wenn das Verhalten wie beschrieben ist, läuft das Programm korrekt und die Einrichtung war erfolgreich. Falls beim Start des Programms die Fehlermeldung ModuleNotFoundError: No module named 'RPi.GPIO' erscheint, wurde der Abschnitt **„Pakete & Bibliotheken installieren“** vermutlich nicht vollständig beachtet. Bitte diesen Abschnitt erneut sorgfältig durchgehen.