====== 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.