zuerst einmal, ich habe mir das alles selber beigebracht, also entschuldigt, wenn die Lösungen etwas Unkonventionell oder sowieso total unpassend oder unnötig komplex oder was auch immer sind, ich kenne leider niemanden, der Python ordentlich beherrscht und fand leider viel zu lange, dass es unnötig sei, ein Buch zu Python zu bestellen. Inzwischen ist eines unterwegs, es kommt leider nicht innert nützlicher frist an. Saudumm? richtig!
Also wenn ihr übrige Zeit habt, könnt ihr mich gerne in Formsachen korrigieren oder auf einfachere Lösungen hinweisen usw. Was auch immer ihr für Tipps habt, sie sind herzlich wilkommen!
Also, meine situation ist folgendermassen: Ich habe für ein projekt in der Schule eine Uhr mit Binäranzeige gebaut. Hierbei verwende ich ein Raspberry Pi und steuere über die GPIO pins eine LEDmatrix mit jeweils sechs LEDs für sekunden und minuten und fünf LEDs für die Anzeige der Stunden an. Die auswertung und umwandlung der Zeit sowie die Steuerung der GPIO Pins erfolgt über ein Pythonscript:
Code: Alles auswählen
import RPi.GPIO as gpio #importiert die Befehle zu den GPIO Pins
from time import strftime as t #importiert die benötigten Befehle zum abfragen der Uhrzeit
from subprocess import Popen as popen #importiert den Befehl zum öffnen anderer Skripte
gpio.setmode(gpio.BOARD) #Wählt die Nummerierun der GPIO Pins
ColumnList = [7,8,10,12,11,13] #Liste der Benötigten Pins zur Steuerung der einzelnen Ledspalten
RowList = [15,16,18,19] #Liste der Benötigten Pins zur Steuerung der einzelnen Ledreihen
InputList= [21,22,24] #Liste der Benötigten Pins für die abfrage der Knöpfe
gpio.setup(RowList, gpio.OUT, initial = 1) #Setzt die Pins für die Steuerung der Ledreihen auf, 1=Aus
gpio.setup(ColumnList, gpio.OUT, initial = 0) #Setzt die Pins für die Steuerung der Ledspalten auf, 1=Ein
gpio.setup(InputList, gpio.IN, pull_up_down = gpio.PUD_DOWN) #Setzt die Pins für die Abfrage der Knöpfe auf
allways = 1 #Die Standardzustände der Variablen werden eingestellt
OutputMode = 0 #OutputMode bestimmt, was ausgegeben werden soll: 24 bei drücken des Knopfs auf Pin 24 -> die Zeitanzeige ein/aus
#geplant sind noch: 34 bei langem drücken von knopf auf Pin24-> Zeit einstellen mit 21(+1), 22(nächste Zeiteinheit) 24(-1)
#32 bei Langem drücken von Knopf auf Pin22-> Wecker einstellen mit 21(+1), 22(nächste Zeiteinheit) 24(-1)
def button_input(InpuList): #Hier werte ich die Inputs der drei Knöpfe aus.
for pin in InputList
gpio.add_event_detect(pin, gpio.RISING)
if gpio.event_detected(pin): #Wenn eine positive Signalflanke erkannt wird...
if OutputMode == pin:
output = 0
else if OutputMode == 0:
output = pin
return output
while allways == 1:
OutputMode = button_input(InputList)
if OutputMode == 24: #Wenn die Zeit angezeigt werden soll
inverted_bhr = format(63 - int(t("%H")), "06b") #Fragt die aktuelle Systemzeit ab und wandelt sie
inverted_bmin = format(63 - int(t("%M")), "06b") #in die nötige form
inverted_bsec = format(63 - int(t("%S")), "06b") #h = Stunden, m = Minuten, s = Sekunden
#Da die Ausgänge für die richtige ausgabe nicht auf eins, sondern auf null gestellt werden müssen,
#werden die binären Einsen und Nullen invertiert
#bsp: s = 51 = 110011: 63 - 51 = 12 = 001100
#format() wandelt die Zahl in eine binäre zahl mit 6 stellen um
#Pro stelle eine LED
Row13 = '000' + inverted_bhr[1] #Teilt die zahlen in zwei 4-stellige Teile -> je zwei Ledlinien für Studen, Minuten, und Sekunden
Row11 = inverted_bhr[2:6]
Row12 = '00' + inverted_bmin[0:2]
Row10 = inverted_bmin[2:6]
Row8 = '00' + inverted_bsec[0:2]
Row7 = inverted_bsec[2:6]
for Column in ColumnList: #Jede Splate wird nun nacheinander abgearbeitet
gpio.output(Column, 1)
StrColumn = str(Column)
zRow = 'Row' + StrColumn #Sorgt dafür, dass der momentanen Spalte die richtige Reihe zugeordnet wird
rRow = eval(zRow)
gpio.output(15, eval(rRow[0])) #gibt die Outputs für die LEDreihen aus
gpio.output(16, eval(rRow[1])) #Da ich eine Ledmatrix verwende, kann immer nur eine Ledspalte engesteuert werden.
gpio.output(18, eval(rRow[2]))
gpio.output(19, eval(rRow[3]))
gpio.output(RowList, 1) #Schaltet alle Outputs wieder zurück
gpio.output(ColumnList, 0)
if OutputMode == 0: #Sobald der Taster aus ist, wird die Schleife beendet und die Outputs zurückgesetzt
gpio.output(RowList, 1)
gpio.output(ColumnList, 0)
Soweit funktioniert das Script.
Nun zum Problem: Die Outputs werden zu langsam ausgegeben, das heisst, die Anzeige Flackert. würde es helfen, wenn ich diesen Programmteil
Code: Alles auswählen
gpio.output(15, eval(rRow[0])) #gibt die Outputs für die LEDreihen aus
gpio.output(16, eval(rRow[1]))
gpio.output(18, eval(rRow[2]))
gpio.output(19, eval(rRow[3]))
gpio.output(RowList, 1) #Schaltet alle Outputs wieder zurück
gpio.output(ColumnList, 0)
Ein Weiteres Problem ist, dass ich gerne zwischen einem Langen und einem Kurzen drücken der Taster unterscheiden würde, ohne dass das Programm für eine kurze zeit unterbrochen wird. Wie könnte man das Bewerkstellingen?