Benutzer-Werkzeuge

Webseiten-Werkzeuge


project:python_led

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
project:python_led [2026/02/18 09:27] torsten.roehlproject:python_led [2026/02/20 09:56] (aktuell) torsten.roehl
Zeile 2: Zeile 2:
  
 [[projekt:python_projekt_gpio| ☚ zurück]] [[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 =====
 +
 +<note important>
 +**Aktiviere die Python-Environment**
 +
 +Die Programmierung erfolgt nun immer mit der gewählten Umgebung!
 +<code>
 +source ~/devel/projects/course_env/bin/activate
 +</code>
 +
 +</note>
 +
 +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''
 +
 +<code bash>
 +gpio_led/
 +└── src
 +    ├── core
 +    │   ├── hardware.py    
 +    │   └── __init__.py
 +    └── ledcontrol.py
 +</code>
 +
 +
 +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:
 +
 +<code bash>
 +cd ~/devel/projects/gpio_led/src/core
 +touch __init__.py
 +</code>
 +
 +<note tip>**Bevor weitergearbeitet werden kann, sollte die Programmstruktur überprüft werden.**
 +{{ :raspberry_pi:led_structure.png?600 |}}
 +</note>
 +
 +
 +
 +
 +===== Hardware =====
 +
 +<note>
 +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.
 +</note>
 +===== 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 ===
 +
 +<code python 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()
 +
 +</code>
 +
 +
 +=== ledcontrol.py ===
 +
 +<code python 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()
 +                 
 +</code>
 +
 +
 +==== 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:
 +
 +<code bash>
 +cd ~/devel/projects/gpio_led/src
 +./ledcontrol.py
 +</code>
 +
 +Bei erfolgreichem Start erscheint die Eingabeaufforderung von ''ledcontrol.py'':
 +
 +<code>[R]ed  [Y]ellow  [G]reen  [x] Exit > </code>
 +
 +=== 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.
 +
 +
 +<note tip>
 +Falls beim Start des Programms die Fehlermeldung
 +
 +<color #ff7f27>ModuleNotFoundError: No module named 'RPi.GPIO'</color>
 +
 +erscheint, wurde der Abschnitt **„Pakete & Bibliotheken installieren“** vermutlich nicht vollständig beachtet. Bitte diesen Abschnitt erneut sorgfältig durchgehen.
 +</note>
 +
 +
  
project/python_led.1771406834.txt.gz · Zuletzt geändert: von torsten.roehl