Hallo liebe Forenmitglieder,
Sorry für den Titel, ich weiß nicht genau wie ich mein Problem in einem Satz sonst zusammenfassen soll.
Kurz zum Projekt: Ich habe 16 Schalter mit denen ich über 2 Schieberegister 16 LED bei Tastendruck individuell ein und ausschalten möchte.
Bisher hab ich zum Ausprobieren nur 3 Schalter angeschlossen.
Ich habe eine Menge Funktionen und Schleifen, die jeweils auf eine bestimmte Variable angewandt werden.
Z.B. muss ich folgende Funktion (Taster1) für alle anderen Taster umkopieren und die Indizes auf 2,3,4,5 usw. ändern, was insgesamt bei 16 Tastern sehr lang und unübersichtlich wird.
# Callback-Funktion SCHALTER 1
def Tasterfunktion1(channel):
global t1
# Counter auf 0 und 1 umschalten
if t1 == 1:
t1 = 0
else:
t1 = 1
print("TASTER1 " + str(t1))
# Callback-Funktion SCHALTER 2
def Tasterfunktion2(channel):
global t2
# Counter auf 0 und 1 umschalten
if t2 == 1:
t2 = 0
else:
t2 = 1
print("TASTER2 " + str(t2))
usw.
Display More
Ein anderes gutes Beispiel ist dieses hier:
#tasteränderung festhalten
taster1x = t1
taster2x = t2
taster3x = t3
while 1:
if t1 != taster1x or t2 != taster2x or t3 != taster3x:
GPIO.output(OE,1)
out = [t1,t2,t3,t1,t2,t3,t1,t2,t3,t1,t2,t3,t1,t2,t3,t1,t2]
ausgabe()
time.sleep(0.01)
GPIO.output(OE,0)
#tastenänderung rücksetzen
taster1x = t1
taster2x = t2
taster3x = t3
Display More
Die if - Bedingung wird hier durch die ganzen "or"'s sehr sehr lang. Auch alle alle ti und tasterix werden eine lange Liste abgeben.
Nachfolgend der gesamte bisherige Code. Dort lässt sich an einigen Stellen mein Problem finden.
Der Teil mit den Schieberegistern usw. ist jetzt nicht weiter für meine Fragestellung wichtig und darf ignoriert werden.
Mich interessiert nur, ob es einen Weg gibt, mit einer Art Schleife alle (obiges Beispiel) 16 t-Variablen mithilfe eines arrays oder so in einer einzelnen Schleife durchzählen zu lassen und auszuwerten.
#!/usr/bin/python
import RPi.GPIO as GPIO #GPIO definieren
import time,os # importieren von Bibliotheken
GPIO.setwarnings(False) # Keine Warnungen anzeigen
GPIO.cleanup() #GPIOs zurücksetzen
# Pinreferenz waehlen
GPIO.setmode(GPIO.BCM)
#Pinvariablen zuweisen
SER = 13
RCLK = 19
SRCLK = 26
OE = 21
#GPIO Setup LED
GPIO.setup(SER,GPIO.OUT) # Setze Pin 5 als Ausgang (SER) DATEN
GPIO.setup(RCLK,GPIO.OUT) # Setze Pin 6 als Ausgang (SCK) SCHIEBT WEITER
GPIO.setup(SRCLK,GPIO.OUT) # Setze Pin 26 als Ausgang (RCK) SCHIEBT IN SPEICHER
GPIO.setup(OE,GPIO.OUT) # Setze Pin 1 als BLANK - Wenn high, dann Ausgänge low
t=0.0001
#Tasterpositionen zuweisen (PT kurz für Position Taster BCM)
PT1 = 2
PT2 = 3
PT3 = 4
#GPIO Setup Taster als Input definieren und Pullup-Widerstand aktivieren
GPIO.setup(PT1, GPIO.IN, pull_up_down = GPIO.PUD_UP) #Taster1
GPIO.setup(PT2, GPIO.IN, pull_up_down = GPIO.PUD_UP) #Taster2
GPIO.setup(PT3, GPIO.IN, pull_up_down = GPIO.PUD_UP) #Taster2
#Tastervalues definieren, nullsetzen
t1 = 0
t2 = 0
t3 = 0
# Callback-Funktion SCHALTER 1
def Tasterfunktion1(channel):
global t1
# Counter auf 0 und 1 umschalten
if t1 == 1:
t1 = 0
else:
t1 = 1
print("TASTER1 " + str(t1))
# Callback-Funktion SCHALTER 2
def Tasterfunktion2(channel):
global t2
# Counter auf 0 und 1 umschalten
if t2 == 1:
t2 = 0
else:
t2 = 1
print("TASTER2 " + str(t2))
# Callback-Funktion SCHALTER 3
def Tasterfunktion3(channel):
global t3
# Counter auf 0 und 1 umschalten
if t3 == 1:
t3 = 0
else:
t3 = 1
print("TASTER3 " + str(t3))
# LED Funktionsdefinierung ab hier
def ausgabe():
for y in reversed(range(-1,len(out))):
GPIO.output(SER,out[y]) # eine 1 an den seriellen Input senden
time.sleep(t) # 100ms warten
GPIO.output(RCLK,1) # SCK-Pin auf High ziehen, damit das Register anfaengt die Bits um eine Stelle zu verschieben
time.sleep(t) # 100ms warten
GPIO.output(RCLK,0) # SCK_Pin wieder auf LOW ziehen
GPIO.output(SRCLK,1) # RCK auf HIGH setzen, damit das Register zur Ausgabe kopiert wird
time.sleep(t) # 100ms warten
GPIO.output(SRCLK,0) # RCK wieder auf LOW setzen
#Hier beginnt der eigentliche Ablauf
# Interrupt-Event hinzufuegen, fallende Flanke
GPIO.add_event_detect(PT1, GPIO.FALLING, callback = Tasterfunktion1, bouncetime = 500)
GPIO.add_event_detect(PT2, GPIO.FALLING, callback = Tasterfunktion2, bouncetime = 500)
GPIO.add_event_detect(PT3, GPIO.FALLING, callback = Tasterfunktion3, bouncetime = 500)
#LED Programm
#tasteränderung festhalten
taster1x = t1
taster2x = t2
taster3x = t3
while 1:
if t1 != taster1x or t2 != taster2x or t3 != taster3x:
GPIO.output(OE,1)
out = [t1,t2,t3,t1,t2,t3,t1,t2,t3,t1,t2,t3,t1,t2,t3,t1,t2]
ausgabe()
time.sleep(0.01)
GPIO.output(OE,0)
#tastenänderung rücksetzen
taster1x = t1
taster2x = t2
taster3x = t3
Display More
Wenn die Aufgabenstellung und das Problem unklar ist, gerne fragen, womöglich hab ichs ein bisschen verkorkst formuliert...
Ich hoffe jemand hat eine Idee.