Problem mit Tasterschaltung

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hi,

    Zwei voneinander getrennte Taster sind an zwei verschiedenen GPIO Eingängen angeschlossen und mit zwei 10kOhm PullDown Widerständen versehen.

    Die Taster sollen jeweils einen GPIO Ausgang per try: Abfrage schalten.

    Problem: Betätige ich einen der Taster, verhält sich die Schaltung so, als wäre der zweite auch getastet und beide (eigentlich voneinander unabhängigen GPIO OUT) reagieren.
    Und zusätzlich würde mich mal interessieren: wie kann ich realisieren dass ein Tastendruck nur einmal anstatt zweimal ausgewertet wird?

    Hier mein Code: (der zweite Code ist genauso aufgebaut nur mit anderen GPIO Ein- und Ausgängen natürlich.


  • Hallo Cheat.008,

    aus Deinem Programm-Code folgt, dass GPIO13 als Eingang geschaltet ist, GPIO15 als Ausgang.

    Wenn Du Deine Schaltung noch posten könntest, könnte man Dir sicher schnell weiterhelfen.

    Entweder hast Du den zweiten GPIO-Eingang vergessen - oder GPIO15 soll ein Eingang für den zweiten Taster sein.

    Wie hättest Du es denn gern haben wollen?

    Wenn die Schaltung denn steht, dann kann man sicherlich auch das Programm Deinen Vorstellungen anpassen.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Hallo Andreas,

    um den Thread nicht verwirrend zu machen habe ich meinen letzten Post nochmal gelöscht, ich bin zu folgenden neuen Erkenntnissen gekommen:
    Ich habe beide Tasterskripte nun -der übersichtlichkeit halber- zu einem Zusammengefasst. Dabei hat sich auch das Problem gelöst, dass zwei Eingänge aufeinmal reagieren.

    Hab das allerdings nicht hinbekommen, dass beide Taster (GPIO.IN) abgefragt werden. In meinem Skript kann ich immer nur GPIO.IN 18 abfragen und GPIO.IN 13 garnicht.

    Meine Frage zunächst wäre mal, wie man zwei try: Abfragen zusammenfassen kann? Wo liegt der Fehler in meinem Skript?

    EDIT: Zur Schaltung: Mein Vorhaben ist eigentlich ganz simpel: 2 Taster, welche über einen seperaten GPIO Eingang jeweils einen Verbraucher (Pflanzenleuchte, Wasserpumpe) -über Optokoppler an GPIO Ausgängen angeschlossen- in Abhangigkeit der Zeit schalten sollen (sleep).
    Die 3.3V von den Ausgängen sind am A1 des Optokoppler angeschlossen und an A2 der 0,0V von Pin6.

  • Hallo Cheat.008,

    das Problem ist meines Erachtens Folgendes:
    1. Die zweite while-Schleife wird im Normalfall nie erreicht - Du brauchst also EINE while-Schleife, in der beide Aktionen abgefragt werden
    2. Du nutzt hier mit dem Befehl

    Code
    GPIO.wait_for_edge(18, GPIO.FALLING)


    eine Programmier-Technik, die Blocking genannt wird. Das heisst, Dein Programm wartet solange, bis denn da mal was passiert.

    Die andere Technik, die Dein Problem löst, nennt sich Polling (Stichwort für die Suchmaschine). Hier wird eines von mehreren Ereignissen erkannt - Stichwort für die Suche: ODER-Verknüpfung). Je nach erkanntem Ereignis wird die vorgesehene Aktion aufgerufen.

    Die Funktion, die "Polling" unterstützt lautet:

    Code
    pin_status18 := GPIO.input(18)

    Der Code insgesamt müsste dann so funktionieren

    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (11. September 2014 um 09:28)

  • Hallo Andreas,

    genau das ist es was ich bisher gesucht, nur leider nicht gefunden hab. Danke für den Tipp mit dem "Polling".

  • Hallo nochmal,

    ich testete das Skript mit dem Polling leider bekam ich ständig Syntax Error in Zeile:

    Code
    pin_status18 := GPIO.input(18)

    markiert wurde der Doppelpunkt. Warum?

    Grüße
    Markus

  • Entferne ich den Doppelpunkt, bekomm ich einen invalid-syntax Fehler in Zeile

    Code
    if pin_status18 = 0:

    wobei das Gleichheitszeichen markiert ist.

  • das ist auch gut so, denn der Syntax ist falsch :-/

    mit if wird eine Bedingung abgefragt und es soll auf Gleichheit geprüft werden.
    Das = ist allerdings schon für die Zuweisung belegt...

    daher --> zwei = hintereinander:

    Code
    if pin_status18 == 0:

    für ALLE Bedingungen anwenden!

  • Ok, danke für die Infos :)

    Gibt es eine Möglichkeit nach dem Abfragen des Eingangs nach 0 bzw 1, dass die darauf folgende Aktion nur einmal ausgeführt wird?
    Quasi wenn der GPIO.IN auf 0 abgefragt wird, eine Aktion ausgeführt wird und der Eingang wieder wartet bis er erneut 0 ist?

    Grüße
    Markus

  • So mein Skript sieht nun folgendermaßen aus und funktioniert soweit.

    Die Frage ist jedoch immer noch, wie realisiert man, dass nach einer erfüllten Bedingung (GPIO = HIGH) die Anweisung nur einmalig ausgeführt wird?

    Danke für eure Hilfe

    Gruß
    Markus

  • 'return' outside function

    wo genau muss man return positionieren?
    wo ist der Unterschied zwischen return und break?

  • Ich setzte manchmal eine while Schleife nach abgefragtem Tastendruck.
    Somit wird solange gewartet, bis die Taste wieder losgelassen wird.

    Code
    while True:
        try:
            pin_status11 = GPIO.input(11)
            if pin_status11 == GPIO.HIGH:
                print (time.asctime(), "Text")
                while GPIO.input(11): time.sleep(.1)


    Solange GPIO.input(11) also "True" ist, wird eine kleine Pause gemacht um dem Prozessor eine kleine Pause zu gönnen.
    Einen Vergleich wie "GPIO is True" oder "GPIO == True" kann man an dieser Stelle weglassen.

    Die Probleme mit "=", "==" und "is" hatte ich anfangs auch.
    Hab grad den Link gefunden, wo mir der User Framp das mal erklärt hatte.

    /edit: Denkfehler korrigiert.

    ...and write down with pencil&paper...
    Where can i download "pencil&paper" ?

    Einmal editiert, zuletzt von LieberScholli (22. September 2014 um 17:08)


  • Ich setzte manchmal eine while Schleife nach abgefragtem Tastendruck.
    Somit wird solange gewartet, bis die Taste wieder losgelassen wird.

    und wenn die Taste klebt und nie wieder auf geht ? steht das Programm.......

    Ich würde ja jedes gesetzte GPIO Tasten bit in ein Byte reinschreiben und wenn die Abfrage Aktion diese Taste ausgewertet und reagiert hat wieder löschen.
    Solange das Bit aber gesetzt ist würde ich diese Abfrage umgehen, warum mehrfach abfragen ?
    Wenn dieses Bit nach einer gewissen Zeit nie zurückgesetzt wurde weil die Taste hängt -> in die Fehlerroutine springen.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (22. September 2014 um 17:17)

  • Danke LieberScholli für die Infos und vorallem den Link, sehr informativ :)

    zu meinem Vorhaben:

    Eine Abfrage an GPIO.input(11) soll bei HIGH zunächst mal testweise einen Text ausgeben (später natürlich eine andere Funktion, aber hier egal). Diese Textausgabe darf jedoch nur einmal ausgeführt werden und es soll solange gewartet werden bis der Status von GPIO.input(11) HIGH wieder auf LOW wechselt um dann bei erneutem HIGH Pegel die Textausgabe erneut auszuführen.

    Der Status HIGH ist in der Zeitdauer undefiniert in meiner zukünftigen Schaltung, also mit time.sleep eher weniger geeignet zu pausieren.


    Ich hoffe es ist einigermaßen verständlich formuliert. Stehe ehrlich gesagt etwas auf dem Schlauch...

    Hier nochmal das derzeitige Skript:

  • Okay Jar, das Argument lass ich durchgehen, auch wenn dann allerdings die Funktion des Gerätes sowieso eingeschränkt wäre.
    Deshalb "schrub" :D ich ja auch "manchmal" ;)

    Zu dem Problem mit dem "kleben" würde mir ein Zähler spontan einfallen.
    Ich würde aber erstmal beim Grundproblem bleiben, bevor ich eventuelle Gerätestörungen mit einplane und abfange.

    /edit:
    Okay, die Prozessorauslastung würde ja nur solange ausgereizt werden, solange der Taster gedrückt ist. Also kann man das "time.sleep(.1)" auch durch ein "pass" ersetzen.

    ...and write down with pencil&paper...
    Where can i download "pencil&paper" ?

    Einmal editiert, zuletzt von LieberScholli (22. September 2014 um 17:22)


  • Okay Jar, das Argument lass ich durchgehen, auch wenn dann allerdings die Funktion des Gerätes sowieso eingeschränkt wäre.

    na ja bevor ich die laufende Uhr wegwerfe weil eine StellTaste hängt kann ich mich doch freuen wenn sie die Zeit immer weiter aktualisiert anzeigt, doof wäre es nur weil die Taste hängt die Zeit im Display nicht mehr aktualisiert wird !;)

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Na, eine selbst gebaute Schaltung wirft man ja nicht weg, nur weil eine Taste klemmt. (höhö, gerade Du...:D )
    Außerdem kann ja mit dem Keyboardinterrupt das Programm sauber gestoppt werden.

    Da ich tatsächlich selber gerade an einer Uhr arbeite, werde ich diesen Aspekt aber auf jeden Fall mit einfließen lassen. Möchte ja einen Störungsfreien Betrieb sicherstellen. Da sind eingebaute Fehlerabfragen wirklich äußerst nützlich. Danke für die Idee :thumbs1:

    ...and write down with pencil&paper...
    Where can i download "pencil&paper" ?


  • Na, eine selbst gebaute Schaltung wirft man ja nicht weg, nur weil eine Taste klemmt. (höhö, gerade Du...:D )

    jeden Mist repariere ich aber nicht ;)


    Da ich tatsächlich selber gerade an einer Uhr arbeite, werde ich diesen Aspekt aber auf jeden Fall mit einfließen lassen. Möchte ja einen Störungsfreien Betrieb sicherstellen. Da sind eingebaute Fehlerabfragen wirklich äußerst nützlich. Danke für die Idee :thumbs1:

    ja als ehemaliger QS Ing. in der Prüfgeräteentwicklung betrachte ich immer alle Fehlermöglichkeiten (oder bemühe mich drum) :D

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!