Abfrage GPIO in TKinter

  • Hallo Forum,
    ich möchte gern einen GPIO Pin auf low schalten und per Schleife abfragen und das Ergebnis in der GUI als Text ausgeben.

    Die Ausgabe macht keinen Sinn, also der Text wird nicht eingefügt, und ändert sich nicht. Hätte jemand eine Idee was ich machen könnte.

    Gruß

    Frank

  • das wäre dann so:

    Code
    def toggle():
      if (GPIO.input(27) == GPIO.LOW):
          MYLabel1Text.set("Schalter ist aus")
      else:
          MYLabel1Text.set("Schalter ist an")
    MyLabel1Text = StringVar()
    MyLabel1Text.set("Schalter ist aus")
    MyLabel1 = Label(master, textvariable=MyLabelText).pack()
    MyLabel1.grid(row=4, column=1)

    geht aber auch nicht

    Einmal editiert, zuletzt von firstfacility (21. Dezember 2014 um 15:09)

  • ist mein Label-Widget
    und die Verbindung ist da, ich poste nicht den gesamten Code es geht nur um das Label. Zur Erklärung ich bekomme keinen Fehler, sondern er zeigt mir das Ergebnis nicht an. Sonst wäre ich schon weiter.

    siehe auch hier:
    Label

    Wenn ich hier text"bla bla bla" eintrage ist alles ok.

  • Wäre es nicht möglich einen Interrupt für den GPIO zu nutzen?
    Dadurch würde die callback Anweisung in einem Thread laufen und bei Statusänderung des GPIO die callback ausführen worin dann der Text für TKinter geändert wird :huh:

    Ein Beispiel, zwar nicht mit TKinter aber vllt trotzdem nützlich, mit ausführlicher Erklärung findest du > hier <

    Und afaik müsste das dann wie folgt aussehen:
    (du hattest auch Tk() usw vergessen, das ist aber auch wichtig)

  • das läuft mit ein paar kleinen Änderungen

    Hm, schade dass du nicht bereit bist diese "kleinen Änderungen" mitzuteilen... :neutral:
    Dann tu ich das eben für alle dies interessieren könnte:

    [code=php]from Tkinter import *
    import RPi.GPIO as GPIO
    import sys

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(27, GPIO.IN, pull_up_down = GPIO.PUD_UP)

    master = Tk()

    def Interrupt_event(pin):
    global MyLabel1
    if GPIO.input(27): # if 27 == 1
    print("Rising edge detected on %s"%pin)
    MyLabel1["text"] = "Schalter ist aus"
    else: # if 27 != 1
    print("Falling edge detected on %s"%pin)
    MyLabel1["text"] = "Schalter ist an"

    GPIO.add_event_detect(27, GPIO.BOTH, callback=Interrupt_event)

    MyLabel1 = Label(master, text="GPIO 27")
    MyLabel1.grid(row=4, column=1)
    MyLabel1.pack()

    master.mainloop()[/php]

    ..ich hab hier auch GPIO.PUD_DOWN auf GPIO.PUD_UP geändert damit der GPIO 27 auf GND gezogen werden kann, und nicht wie zuvor auf 3V3. Das ist schonender für den GPIO

  • Siehe Beitrag #8 :)

    Code
    print("Rising edge detected on "+pin)

    war falsch. Stattdessen muss man

    Code
    print("Rising edge detected on %s"%pin)

    nutzen.

  • argh, habe ich nur einmal geändert. Leider übersehen.

    Ich würde gern noch mal auf das Thema Interrupt zurückkommen. Ein Taster soll einen Motor stoppen und hierzu habe ich folgende alternativen:

    Code
    def callback2():
        while (GPIO.input(10)):
            delay = 10
            steps = 200
            backwards(int(delay) / 1000.0, int(steps))
        else:
            print "Stopp"

    oder mit Interrupt

    Code
    def Interrupt_event2():
        if (GPIO.input(10)):
            delay = 10
            steps = 200
            backwards(int(delay) / 1000.0, int(steps))
        else:
            print "Stop"
    
    
    GPIO.add_event_detect(10, GPIO.RISING, callback = Interrupt_event2, bouncetime = 200)

    Bei beiden alternativen habe ich eine Verzögerung von ca. 1 Sek, ich bin davon ausgegangen das es per Interrupt schnellere Reaktionszeiten. Kann man das beschleunigen ?

    Gruß

    Frank

Jetzt mitmachen!

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