Programm stoppt nach einigen Programmdurchläufen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
leafboy
User
Beiträge: 20
Registriert: Freitag 26. Januar 2018, 18:12

Hallo Sirius3.

Recht herzlichen Dank für deine Unterstützung. Es hilft mir wirklich sehr durch deine Kommentare tiefer in Python einzudringen. Obwohl ich noch sagen muss ich kratze derzeit nur an der Oberfläche. Dein script werde ich mir in den nächsten Tagen in Ruhe durchsehen und versuchen deine Gedankengänge nachzuvollziehen.

Deine Anregung zur Groß-/Kleinschreibung macht natürlich Sinn und ich werde versuchen mir das auch anzugewöhnen. Vorrallem als Anfänger, damit ich mich auch besser orientieren kann. Die Lektion mit den Warnungen habe ich nun verstanden und werde das grundsätzlich in meine scripte einbauen. Dazu muss ich aber auch noch etwas Theorie pauken und testen. Als IDE verwende ich hauptsächlich Eric da dachte ich wird das automatisch korrekt eingerückt. Werde mir aber die vier Leerzeichen angewöhnen. Würdest du eine andere IDE empfehlen? Das mit dem "-False" ist ein Tippfehler. Komischerweise hat das die IDE nicht angzeigt.

Wie schon geschrieben werde ich mir das script diese Woche noch genauer ansehen und mich nochmals melden. Vielen Dank für die Nachsicht meiner "dummen" Fragen und deine tolle Unterstützung.

leafboy
leafboy
User
Beiträge: 20
Registriert: Freitag 26. Januar 2018, 18:12

Hallo Sirius3.

Gestern habe ich mir dein script kurz durchstudiert. Bin aber noch nicht dazugekommen es in der Anwendung zu testen. Dabei sind mir deine "state" Anweisungen aufgefallen. Ich habe in der Python Dokumentation gesucht konnte das aber nicht finden. Wie muss ich diese verstehen und auf was beziehen sich die Nummern zB: "state & 4":

Codeauszug:

Code: Alles auswählen

 print("Entfernung: %s" % entfernung)
            if entfernung <= 9:
                # Alle LED aus
                state = 0
            elif entfernung <= 13:
                # Stop LED ein
                state = 1
            elif entfernung <= 20:
                # Achtung LED ein            
                state = 6
            elif entfernung <= 30:
                # Ok LED ein            
                state = 4
            gpio.output(OK, state & 4 != 0)
            gpio.output(ACHTUNG, state & 2 != 0)
            gpio.output(STOP, state & 1 != 0)
Könnest du mir das bitte noch etwas erklären oder eine Link angeben wo ich das nachlesen kann.

Vielen Dank
Leafboy
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@leafboy: state & 4 ist eine bitweise logische Verknüpfung, Bit 1 entspricht LED1, Bit 2 LED2, usw. state = 6 heißt also (6 = 4 + 2 oder 6 = 4 | 2) LED2 und LED3 sind angeschaltet. Das machen Leute gerne, die hardwarenah Programmieren, da dort manchmal jedes Bit zählt.

Besser wäre es wohl mit Listen oder Sets zu arbeiten:

Code: Alles auswählen

            if entfernung <= 9:
                # Alle LED aus
                state = set()
            elif entfernung <= 13:
                # Stop LED ein
                state = {STOP}
            elif entfernung <= 20:
                # Achtung LED ein            
                state = {ACHTUNG, OK}
            elif entfernung <= 30:
                # Ok LED ein            
                state = {OK}
            else:
                # Alle LED aus
                state = {}
            gpio.output(OK, OK in state)
            gpio.output(ACHTUNG, ACHTUNG in state)
            gpio.output(STOP, STOP in state)
PS: der else-Zweig hat bei mir noch gefehlt. Kommentar bei 20 stimmt mit Code nicht überein, ich habe mal Deinen Code übernommen.
leafboy
User
Beiträge: 20
Registriert: Freitag 26. Januar 2018, 18:12

Hallo Sirius3.

Gestern habe ich es doch noch geschafft das script auf mein Testsystem zu übertragen und zu testen. Super - es läuft wie von mir gewünscht. Nach ca. 7000 Messungen habe ich dann abgebrochen. Am Wochenende werde ich das script in meine reale Anlage übertragen. Das sollte aber kein Problem sein. Ich werde die Abstände noch etwas anpassen, da die kleinen Entfernungen für das Testen etwas handlicher sind, und die Kommentare noch ergänzen bzw. korrigieren wo notwendig. Ich möchte das Projekt auch sauber dokumentiert haben.

Nachdem alles auf der normalen Anwendung läuft werde ich mich nochmals melden. Jetzt schon vielen Dank für dein Unterstüzung.

lg
Leafboy
leafboy
User
Beiträge: 20
Registriert: Freitag 26. Januar 2018, 18:12

Hallo Sirius3.

Kurz meine versprochene Rückmeldung. Das System läuft ganz gut. Was mir aber aufgefallen ist, zum Unterschied vom Testsystem, ist, dass es öfters Fehlmessungen gibt. Der einzige Unterschied ist der Spannungsteiler für den Sensor. Im Testsystem habe ich 10K zu 10k und in der Garage habe ich 330 zu 470 Ohm. Da gibt es leider auch einige unterschiedliche Angaben dazu. Das Problem habe ich soweit gelöst, dass ich den Stop-Bereich etwas vergrößert habe und somit immer eine Messung bekomme. Trotzdem werde ich bei Gelegenheit den Spannungsteiler auf 10k umbauen und dann ja sehen, ob das etwas bring..

Nochmals vielen Dank für dein tolle Unterstützung

leafboy
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich sage es ja ungerne zum dritten mal, aber .... pigpio. Der Spannungsteiler sollte in dieser Beziehung keinerlei Aenderung bringen, dazu ist der Eingang viel zu hochohmig.

Das Problem liegt wesentlich wahrscheinlicher daran, dass deine wait_for_edges nicht wirklich funktionieren wie gewuenscht. Das Linux-OS des PI garantiert dir nicht, dass sleeps oder eben ein solcher wait (der im Hintergrund einem sleep aehnlich ist) zuverlaessig dann zurueck kehren, wenn du das dir wuenschst. Sondern beliebig viel spaeter. Dadurch verschieben sich natuerlich die Zeitpunkte, und das fuehrt dann zu Fehlmessungen.

Gluecklicherweise gibt es Abhilfe, denn pigpio geht *ganz* anders vor bei der Erfassung von GPIO-Events. Statt sich auf den launischen Scheduler des OS zu verlassen, wird ein DMA-Kanal programmiert, der die GPIOs mit einer entsprechend hohen Abtastrate einfach in den Speicher sampelt. Und aus diesem Buffer generiert pigpio dann auch noch spaeter Ereignisse, wenn dein Code endlich drankommt, mit praezisen Zeitstempeln.

Aber hey, das ist nur meine Standardantwort auf alles - mit Ahnung hat das nix zu tun :roll:
Antworten