Raspberry GPIO - for Schleife Abbrechen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
juri6570
User
Beiträge: 1
Registriert: Montag 16. Juli 2018, 20:45

Guten Abend, ich hoffe ich finde hier eine Lösung zu meinem kleinen Problem.
Es geht explizit um eine LED-Ansteuerung über Python. In einem Textdokument befinden sich verschiedene Vektoren, welche die Frequenz, Zeit und zu aktivierende LEDs enthalten.
In einer GUI werden über einen Start Button ein .txt Dokument eingelesen und Verabreitet. Dieses enthält Vektoren.

Ein Beispiel:
['5', '10', '1, '1', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0']
['15', '20', '0, '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1']
['4', '12.5', '0, '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0', '0', '0', '1']
Dieser Vektor sagt aus: Leuchte 5 Sekunden lang, mit einer Frequenz von 10Hz . Aktiviere für diese Einstellungen die ersten 3 von 24 LEDs.
Leuchte danach 15 Sekunden lang, mit einer Frequenz von 20Hz . Aktiviere für diese Einstellungen die LEDs 22,23,24.
Leuchte danach 4 Sekunden lang, mit einer Frequenz von 12.5Hz . Aktiviere für diese Einstellungen die LEDs 9,15,24.

Das Textdokument mit dem Code wird eingelesen und ausgeführt.

Das ist der Code:

Code: Alles auswählen

        def start2():
            import RPi.GPIO as GPIO
            import time
            from time import sleep
            current_selection = Liste2.curselection()
            name = Liste2.get(current_selection)
            file = open('/home/pi/Designprojekt/GUI/Config1//' + name, 'r')
            reader = file.read()
            s = re.findall(r"[-+]?\d*\.\d+|\d+", reader)
            b = len(s)
            c = b / 26
            for i in range(0, int(c)):
                v1 = []
                for i in s:
                    v1.append(float(i))
                del s[0:26]
                v2 = (4, 14, 17, 15, 27, 18, 22, 23, 10, 24, 9, 25, 11, 8, 7, 5, 6, 12, 13, 16, 19, 20, 26, 21) #Dies sind die Raspberry GPIO Channel, welche genutzt werden
                d = np.array(v1[3:26])
                searchval = 1
                i = np.where(d == searchval)[0]
                chan_list = []
                for x in i:
                    chan_list.append(v2[x])
                leuchten = chan_list
                t_run = v1[0]
                f = v1[1]
                periods = int(t_run * f)
                m = 1
                n = 1
                zeit = 1 / (2 * f)
                GPIO.setmode(GPIO.BCM)
                GPIO.setup(chan_list, GPIO.OUT, initial=0)
                try:
                    if f >= 100:
                        GPIO.output(leuchten, 1)
                        time.sleep(t_run)
                    else:
                        for n in range(periods):
                            GPIO.output(leuchten, 1)
                            time.sleep(zeit)
                            GPIO.output(leuchten, 0)
                            time.sleep(zeit)
                except KeyboardInterrupt:
                    pass
                GPIO.cleanup()
Allgemein betrachtet funktioniert alles perfekt. Problem: Ich möchte nun diese schleife zwischendrin abbrechen können. Beispielsweise, habe ich in der GUI einen Button angelegt (Stop) dieser ist jedoch nicht anklickbar, wenn die Schleife läuft. Nun habe ich mit Threading versucht Abhilfe zu schaffen. Der Button ist anklickbar aber ich kann den Thread nicht beenden..
Gibt es hierzu eine schnelle, einfache Lösung?

Ich hoffe ich konnte mein Problem verdeutlichen.
Vielen lieben Dank schonmal!

Liebe Grüßßßee!
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@juri6570: ich kann nicht verstehen, was Du da gemacht hast und ich bezweifle, dass Du selbst es verstehst. Wenn ein Programm nur durch Glück funktioniert, ist das keine gute Grundlage.

Importe stehen alle am Anfang der Datei und nicht in irgendwelchen Funktionen versteckt. »start2« ist ein schlechter Variablenname, denn da wird nichts gestartet und die 2 ist eine beliebige Zahl, die nichts aussagt. Alles was eine Funktion braucht, sollte sie über ihre Argumente bekommen, Liste2 kommt aus dem Nichts. »current_selection« wird nirgends benutzt. »reader« liest nichts, sondern ist ein String. Einbuchstabige Variablennamen sind schlecht, weil sie nichts aussagen. Warum wird bei Zahlen ohne Punkt das Vorzeichen ignoriert? Warum benutzt Du nicht numpy zum Laden der Datei? Das »i« der for-Schleife wird nirgends benutzt. Warum konvertierst Du alles aus s in Zahlen, wenn Du nur die ersten 26 benutzt? v2 ist eine Konstante und sollte außerhalb der Funktion z.B. als LED_PINS definiert werden. Du solltest Dich entscheiden wirklich numpy einzusetzen oder alles ohne machen. Warum erzeugst Du eine Liste chan_list, wenn Du sie gleich danach in »leuchten« umbenennst? »m« und »n« wird nicht benutzt.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ergänzend: Das Dateiformat ist komisch und scheint so als hätte da jemand die Zeichenkettendarstellung von Python-Listen in eine Datei geschrieben. Dafür sind die nicht geeignet. Es gibt Formate wie CSV oder JSON wo es auch Module in der Standardbibliothek für gibt.

Wenn man unbedingt Python-Grunddatentypen verwenden will, dann sollte man die Werte da nicht mit regulären rauskratzen sondern `ast.literal_eval()` zum parsen verwenden. Nächste Frage ist dann warum da Zeichenketten in der Liste sind, wo das doch eigentlich alles Zahlen sind. Und statt der 0en und 1en währen Wahrheitswerte sinnvoller.

Ungünstig ist auch das die 2D-Struktur der Daten beim einlesen platt gemacht wird. Statt also eine Schleife über die Zeilendaten zu schreiben, sind da diese komischen Längenberechnungen und das Löschen von 26 Werten aus der flachen Liste pro Schleifendurchlauf, was ziemlich schräg ist. Und leicht übersehen/missverstanden werden kann.

Die Datei wird geöffnet, aber nicht wieder geschlossen. Schau Dir dazu mal die ``with``-Anweisung an. `file` ist der Name des eingebauten Dateidatentyps, den sollte man nicht an andere Werte binden.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten