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)
4 LED´s sollen Flackern. Klappt bisher nur mit einer.
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
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
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.4 LED´s sollen Flackern (Kerze), mit Einer klappt es soweit, aber wie kann ich es so schreiben das alle 4 das gleiche tun?
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
@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..
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()