mehrere LEDs + pushbutton

FrankR31

Cadet 4th Year
Registriert
Nov. 2005
Beiträge
71
Hallo :)

Ich habe eine Frage bezüglich einer Schaltung, die mehrere LEDs nach Druck eines push buttons zufällig auflinken lassen soll.
Als Anhang habe ich ein Bild der aktuellen Schaltung sowie die fritzing Datei (als rar gepackt) beigefügt. Die Schaltung sowie der folgende Code funktionieren, erfüllen aber nicht die Anforderungen. Da ich ein Neueinsteiger bin, sind mir die Feinheiten der python Programmierung noch nicht geläufig, ich hoffe daher auf Nachsicht. Ich verwende einen Raspi 4 Mod. B mit 2GB.

Die Schaltung:

821848


Der Code:
Python:
import RPi.GPIO as GPIO
import time
import random

# random seed und Variable
random.seed()
ledresult = 1

# Raspberry Pi LED Struktur
GPIO.setmode(GPIO.BCM)
YELLOW_LED0 = 17
YELLOW_LED1 = 18
YELLOW_LED2 = 27
GREEN_LED0 = 22
GREEN_LED1 = 23
GREEN_LED2 = 24
RED_LED0 = 25
RED_LED1 = 4
RED_LED2 = 12

GPIO.setup(YELLOW_LED0, GPIO.OUT)
GPIO.setup(YELLOW_LED1, GPIO.OUT)
GPIO.setup(YELLOW_LED2, GPIO.OUT)
GPIO.setup(GREEN_LED0, GPIO.OUT)
GPIO.setup(GREEN_LED1, GPIO.OUT)
GPIO.setup(GREEN_LED2, GPIO.OUT)
GPIO.setup(RED_LED0, GPIO.OUT)
GPIO.setup(RED_LED1, GPIO.OUT)
GPIO.setup(RED_LED2, GPIO.OUT)
 
# Hauptprogramm
try:
    while True:
        ledresult = random.randint(1,10)
        if ledresult == 1:
            GPIO.output(YELLOW_LED0, False)
            GPIO.output(YELLOW_LED1, False)
            GPIO.output(YELLOW_LED2, False)
            GPIO.output(GREEN_LED0, False)
            GPIO.output(GREEN_LED1, False)
            GPIO.output(GREEN_LED2, False)
            GPIO.output(RED_LED0, False)
            GPIO.output(RED_LED1, False)
            GPIO.output(RED_LED2, False)   
        if ledresult == 2:
            GPIO.output(YELLOW_LED0, True)
            GPIO.output(YELLOW_LED1, False)
            GPIO.output(YELLOW_LED2, False)
            GPIO.output(GREEN_LED0, False)
            GPIO.output(GREEN_LED1, False)
            GPIO.output(GREEN_LED2, False)
            GPIO.output(RED_LED0, False)
            GPIO.output(RED_LED1, False)
            GPIO.output(RED_LED2, False)
        if ledresult == 3:
            GPIO.output(YELLOW_LED0, False)
            GPIO.output(YELLOW_LED1, True)
            GPIO.output(YELLOW_LED2, False)
            GPIO.output(GREEN_LED0, False)
            GPIO.output(GREEN_LED1, False)
            GPIO.output(GREEN_LED2, False)
            GPIO.output(RED_LED0, False)
            GPIO.output(RED_LED1, False)
            GPIO.output(RED_LED2, False)
        if ledresult == 4:
            GPIO.output(YELLOW_LED0, False)
            GPIO.output(YELLOW_LED1, False)
            GPIO.output(YELLOW_LED2, True)
            GPIO.output(GREEN_LED0, False)
            GPIO.output(GREEN_LED1, False)
            GPIO.output(GREEN_LED2, False)
            GPIO.output(RED_LED0, False)
            GPIO.output(RED_LED1, False)
            GPIO.output(RED_LED2, False)
        if ledresult == 5:
            GPIO.output(YELLOW_LED0, False)
            GPIO.output(YELLOW_LED1, False)
            GPIO.output(YELLOW_LED2, False)
            GPIO.output(GREEN_LED0, True)
            GPIO.output(GREEN_LED1, False)
            GPIO.output(GREEN_LED2, False)
            GPIO.output(RED_LED0, False)
            GPIO.output(RED_LED1, False)
            GPIO.output(RED_LED2, False)
        if ledresult == 6:
            GPIO.output(YELLOW_LED0, False)
            GPIO.output(YELLOW_LED1, False)
            GPIO.output(YELLOW_LED2, False)
            GPIO.output(GREEN_LED0, False)
            GPIO.output(GREEN_LED1, True)
            GPIO.output(GREEN_LED2, False)
            GPIO.output(RED_LED0, False)
            GPIO.output(RED_LED1, False)
            GPIO.output(RED_LED2, False)
        if ledresult == 7:
            GPIO.output(YELLOW_LED0, False)
            GPIO.output(YELLOW_LED1, False)
            GPIO.output(YELLOW_LED2, False)
            GPIO.output(GREEN_LED0, False)
            GPIO.output(GREEN_LED1, False)
            GPIO.output(GREEN_LED2, True)
            GPIO.output(RED_LED0, False)
            GPIO.output(RED_LED1, False)
            GPIO.output(RED_LED2, False)   
        if ledresult == 8:
            GPIO.output(YELLOW_LED0, False)
            GPIO.output(YELLOW_LED1, False)
            GPIO.output(YELLOW_LED2, False)
            GPIO.output(GREEN_LED0, False)
            GPIO.output(GREEN_LED1, False)
            GPIO.output(GREEN_LED2, False)
            GPIO.output(RED_LED0, True)
            GPIO.output(RED_LED1, False)
            GPIO.output(RED_LED2, False)   
        if ledresult == 9:
            GPIO.output(YELLOW_LED0, False)
            GPIO.output(YELLOW_LED1, False)
            GPIO.output(YELLOW_LED2, False)
            GPIO.output(GREEN_LED0, False)
            GPIO.output(GREEN_LED1, False)
            GPIO.output(GREEN_LED2, False)
            GPIO.output(RED_LED0, False)
            GPIO.output(RED_LED1, True)
            GPIO.output(RED_LED2, False)                           
        if ledresult == 10:
            GPIO.output(YELLOW_LED0, False)
            GPIO.output(YELLOW_LED1, False)
            GPIO.output(YELLOW_LED2, False)
            GPIO.output(GREEN_LED0, False)
            GPIO.output(GREEN_LED1, False)
            GPIO.output(GREEN_LED2, False)
            GPIO.output(RED_LED0, False)
            GPIO.output(RED_LED1, False)
            GPIO.output(RED_LED2, True)                                     
        time.sleep(0.1)
 
except KeyboardInterrupt:
    print("Programm beendet")
    GPIO.cleanup()

Der Code wird wahrscheinlich alles andere als optimal sein, und der push button fehlt noch. Die Schaltung und der Code sollen folgendes bewerkstelligen:

  1. Alle gesteckten LEDs sind beim Einschalten des Raspi ausgeschaltet
  2. nach Druck des push buttons werden alle 9 LED per Zufall ein- und ausgeschaltet
  3. dabei keine sofortige Wiederholung der selben LED (also z.B. nicht LED0 zweimal direkt hintereinander)
  4. das Programm läuft für eine vorher bestimmte Zeit ab, z.B. 10 Sekunden
  5. der Ablauf soll vom Start des Programms bis zum Ende langsamer werden, d.h. der Zeitabstand zwischen dem Ein- und Ausschalten der LEDs wird länger
  6. nach Ablauf des Programms bleibt die letzte LED für einige Sekunden einschaltet
  7. Programmende, nach dem die letzte LED ausgeschaltet ist
  8. Programmneustart nach Drücken des push buttons

Ich hoffe, das war so weit verständlich. Mir ist nicht ganz klar, wie und wo ich den push button bei der beigefügten Schaltung einbauen soll, und ob ein zusätzlicher Widerstand dafür notwendig ist. Ebenfalls bräuchte ich Hilfe beim Anpassen des Codes, um den obigen Ablauf zu gewährleisten.

Über Eure Hilfe würde ich mich sehr freuen!
 

Anhänge

  • 9LED Versuch.rar
    35,1 KB · Aufrufe: 327
Nun, du hast ja noch GPIOs frei. Da musst du dir einen aussuchen, der sich als digitalen Input (D-IN) eignet und diesen dann in deinem Programmcode als solchen setzen.

Für den Taster solltest du einen 50k Widerstand benutzen, mit dem du den D-IN mit der 3.3V Spannungsversorgung verbindest (3V3). Dass nennt man Pull-Up. Der Schalter wird nun zwischen dem D-IN und Ground geschaltet, so das bei einer Betätigung das Potential am D-IN auf Ground gezogen wird. In diesem Fall muss eine Auslösung bei abfallender Taktflanke in den Programmcode übernommen werden.
Ist der Taster nicht betätigt = D-IN High
Ist der Schalter Betätigt = D-IN Low

3V3°-----[50K]-------°D-IN°---- \_ ----°GND


Auf gar keinen Fall mit 5V in die GPIOs rein, die sind nur 3.3V tolerant.

Bei Python bin ich leider raus :D
 
Zuletzt bearbeitet:
Nicht mit 5V? Also wäre die Schaltung oben schon falsch? Dann da ist mit 5V aufgebaut, nicht mit 3.3V. Funktioniert allerdings, wenn ich das Programm starte leuchten die LEDs nacheinander.
 
FrankR31 schrieb:
Nicht mit 5V? Also wäre die Schaltung oben schon falsch? Dann da ist mit 5V aufgebaut, nicht mit 3.3V. Funktioniert allerdings, wenn ich das Programm starte leuchten die LEDs nacheinander.
Die LEDs werde gerade mit 3,3V aus den GPIOs betrieben, das reicht um sie leuchten zu lassen. Man sollte nur nicht mit den 5V als Logikpotential für die GPIOs arbeiten. Dafür ist 3V3 vorgesehen, das ist die Spannungsversorgung für GPIO/IO.
Wollte nur drauf hinweisen, bevor du mit dem Schalter 5V in einen GPIO feuerst und so deinen SOC grillst.
 
Ich weiß nicht, ob ich das mit der "aktuellen" fritzing Version so erstellen kann. Da fehlen ja etliche neuere Teile, z.B. musste ich den cobbler erstmal von einer externen Quelle. Ich habe hier einfach mal die Anzeige unter "Schaltplan" exportiert.

821871
 
pedder59, tue mir einen Gefallen und lasse es einfach sein. Auf "Hilfe" dieser Art kann ich gut verzichten. Ich schrieb bereits, das ich Anfänger bin. Und ich schrieb eben auch, dass fritzing noch die Version von 2016 ist. Ich habe erst vor ca. 2 Wochen angefangen mit dem Raspi zu experimentieren.
 
  • Gefällt mir
Reaktionen: Kanibal, Myron und scooter010
Ne aber bei diesn Frizz-Bildchen geht jede Übersicht verloren.
Kann kein ernsthafter Elektroniker was mit anfangen.
 
Jeder ernsthafte Elektroniker hätte auf Anhieb erkannt, was die Schaltung tun soll und wäre auch dahin gekommen, mit dem obersten frizzing den Schaltplan im Kopf zu eruieren. Also: Python bin ich leider raus, meinen Pi hatte ich damals mit C Programmiert. Ich empfehle, ein oder zwei Tutorials aus dem Web zu probieren, da wird das Einschalten von LED sowie das Abfragen von Button zu Hauf erläutert. Hier könnte man erst helfen, wenn man selbst schaut, ob alle Pins richtig belegt sind, die Initialisierung korrekt durchgeführt wurde usw. Das machen aber Tutorials ganz gut. Ich würde es daheim Mal nachstellen für dich, aber mein Pi wurde vom Bastelrechner zum DNS Filter umgebaut.

Wie gesagt: Tutorials helfen für Einstiegsprojekte sehr viel und gut.
 
Fritzing ist hässlich und ein ernsthafter elektroniker versteht sie trotzdem.

Den push button kannst du direkt an den GPIO hängen und internal pull up nehmen.
 
  • Gefällt mir
Reaktionen: pedder59
Der Code sieht mittlerweile so aus:

Python:
import RPi.GPIO as GPIO
import time              # für sleep()
import random            # für random()

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

GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP) #Push Button an GPIO16

LED = [17,18,27,22,23,24,25,4,12] # GPIOs für die LEDs
NumLED = len(LED)   # Anzahl aktiver LEDs
Repeat = 5          # Muster wird Repeat mal wiederholt
Ontime = 0.1        # Leuchtdauer der LED

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

try:
# Zufälliges Blinken
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)

except KeyboardInterrupt:
    print("Programm beendet")
    GPIO.cleanup()

Ich habe jetzt den Taster auf GPIO 16 (Zeile 8), aber wie muss ich den Code schreiben, um den folgenden Code (ab Zeile 10 bzw. 15) durch Tastendruck auszulösen?
 
Zuletzt bearbeitet:
Zurück
Oben