4 LED´s sollen Flackern. Klappt bisher nur mit einer.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
christian84
User
Beiträge: 1
Registriert: Dienstag 18. Dezember 2018, 17:55

Hallo zusammen, ich bin der Christian und neu im Forum.
Ich hoffe es hat vielleicht mal einer kurz Zeit für mich.

Ich bin ehrlich, ich habe mein PI erst seit 2 Tagen, und versuche mich mit dem Einstieg in Python.

Ich habe mein erstes kleines Projekt begonnen:

Aufgabe:
Teil1:

4 LED´s sollen Flackern (Kerze), mit Einer klappt es soweit, aber wie kann ich es so schreiben das alle 4 das gleiche tun?
Weiter unten im 2ten Teil, wird es noch ein bisschen spezieller, da soll von 4 LED´s immer eine LED zufällig flackern (Teil1) für 4 Sekunden und nicht ausgehen. Also quasi Teil1 und Teil2 kompieniert.


GIOP der LED´s sind 17,18,22,27

Vielen Dank

Teil1:
# fackernde Kerze:

import RPi.GPIO as GPIO
import time
from random import randrange

GPIO.setmode(GPIO.BCM)

LED = 18
GPIO.setup(LED, GPIO.OUT)

# PWM einschalten
pwm = GPIO.PWM(LED, 200)
pwm.start(100)
time.sleep(5.0)

while True:
pwm.ChangeDutyCycle(randrange(0, 100))
time.sleep(randrange(1, 10) * 0.01)

####################################################################
Teil2:
####################################################################
#von 4 LEDs soll immer eine zufällig flackern

import RPi.GPIO as GPIO
import time # fuer sleep()
import random # fuer random()

# BCM-Bezeichnung der Pins verwenden
GPIO.setmode(GPIO.BCM)

LED = [17,27,22,18] # GPIOs fuer die LEDs
NumLED = len(LED) # Anzahl aktiver LEDs
Repeat = 1 # Muster wird Repeat mal wiederholt
Ontime = 1 # Leuchtdauer der LED

# GPIOs auf Ausgang setzen und LED ausschalten
for i in LED:
GPIO.setup(i, GPIO.OUT, initial=0)

# Zufaellig blinkern
while True:
for i in range(Repeat*NumLED):
j = random.randint(0,NumLED - 1)
GPIO.output(LED[j], True)
time.sleep(Ontime)
GPIO.output(LED[j], False)
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
4 LED´s sollen Flackern (Kerze), mit Einer klappt es soweit, aber wie kann ich es so schreiben das alle 4 das gleiche tun?
In dem du halt alle 4 LED instanzierst - aktuell machst du das ja nur mit einer, der an Pin 18 - und für alle in der Schleife `ChangeDutyCycle()` aufrufst. Also quasi Teile des Codes mal 4.

Wenn du aus einer Liste zufällig ein Element auswählen willst, dann kennt das `random` Modul dafür die Funktion `choice`.

Statt dem älteren, etwas angestaubten Modul `Rpi.GPIO` möchtest du lieber das neuere / bessere / schönere gpiozero Modul nutzen. Das hat auch eine schönere API.

Und deinen Code bitte nächstes Mal in Code-Tags setzen - dann ist er auch lesbbar, inkl. Einrückungen. Dazu im vollständigen Editor auf das `</>` Symbol klicken und deinen Python Code zwischen den Tags einfügen.

Gruß, noisefloor
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@christian84: noch ein paar Anmerkungen zum Code, die einfach Konventionen sind, dass Du Dir nicht falsches Verhalten angewöhnst, das Du Dir später wieder mühsam abgewöhnen mußt: Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 2. Variablen schreibt man generell nur mit Kleinbuchstaben, Konstanten nur mit Großbuchstaben.
In Teil 2 benutzt Du `i` innerhalb der for-Schleife gar nicht, und drumherum hast Du noch eine while-Schleife. Ob also die innere Schleife da steht, oder nicht, macht keinen Unterschied. Also kann sie auch weg. Zum Schluß sollte man cleanup aufrufen.

Alternativ zu randint kannst Du choice benutzen. Das wesentliche steht auch hier in der while-Schleife, das ganze Drumherum ist hauptsächlich dazu da, Variablen sauber in einer Funktion zu kapseln und per try-finally ein sauberes Aufräumen der gpio-Pins zu gewährleisten, und kommen so ähnlich in jedem Programm vor, das mit gpio arbeitet..

Code: Alles auswählen

import RPi.GPIO as gpio
import time
import random

LEDS = [17,27,22,18] # GPIOs fuer die LEDs
ONTIME = 1     # Leuchtdauer der LED

def main():
    gpio.setmode(gpio.BCM)
    # GPIOs auf Ausgang setzen und LED ausschalten
    gpio.setup(LEDS, gpio.OUT, initial=0)

    try:
        # Zufaellig blinkern
        while True:
            led = random.choice(LEDS)
            gpio.output(led, True)
            time.sleep(Ontime)
            gpio.output(led, False)
    except KeyboardInterrupt:
        pass
    finally:
        gpio.cleanup()
        
if __name__ == '__main__':
    main()
Antworten