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.
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 srcgpio_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
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.
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()
#!/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()
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:
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 >
Wenn das Verhalten wie beschrieben ist, läuft das Programm korrekt und die Einrichtung war erfolgreich.
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.