GPIO Lichtschalter erkennt nur fallende Flanke

  • Hallo!

    Bin neu im Forum, hab mit dem Raspberry noch nicht so viel Erfahrung, Python etwas mehr. :)

    Ich würde gerne eine Lichtsteuerung mit mehreren Zero's realisieren. Dafür nehme ich WIZ Smart Lampen und verbinde sie mit meinem Pi, den ich als Hotspot konfiguriert habe.

    Mit der "pywizlight" lib kann ich die auch schon ansteuern. Jeder Raum soll dann einen Zero bekommen, an dem die Lichtschalter angeschlossen werden. (Die Lichtschalter funktionieren aber nur als GPIO Button)

    Nun zu meinem Problem. Ich verwende einen handelsüblichen Lichtschalter mit einer Feder, also ein Push-Button quasi.

    Der Schalter funktioniert so: Wenn man drückt, fließt Strom und wenn man in loslässt, fließt kein Strom.

    Wenn ich dann mit der RPi.GPIO den Button einrichte mit:

    "GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)"

    und dann

    "GPIO.add_event_detect(BUTTON_PIN, GPIO.FALLING,

    callback=button_pressed_callback,

    bouncetime=50)"

    Mit diesem Setting wird die Callback-Funktion aufgerufen, wenn ich den Button drücke. Wenn ich dann im GPIO.add_event_detect anstatt FALLING, RISING eingebe, ändert sich jedoch nichts. Also es wird immer noch erst dann die Callback-Funktion aufgerufen wenn ich den Button drücke. Ich würde aber gerne wissen, wann ich ihn loslasse. Es hilft auch nicht im GPIO.setupt DOWN anstatt UP zu verwenden. Immer der gleiche Effekt.. Habs auch schon mit einem anderen Schalter probiert.

    Was mach ich da den falsch?

    Vielen Dank!

    Liebe Grüße, Maki :)


    Der Code als Anhang falls es jemanden interessiert

  • Wenn du zweimal draufdrückst, erkennt er dann zweimal den Taastendruck aber nie, wann du loslässt?

    Dann muss es ein Programmfehler sein, denn wenn er zweimal das Drücken erkennt, muss zwischendurch ja beim Loslassen der Pegel wieder gewechselt haben.

    Pullup in Pulldown zu ändern, macht ja nur Sinn, wenn auch deine Schaltung entsprechend geändert wird. Kannst du mal zeichnen, wie deine Schaltung überhaupt aussieht.

    Was ist der Sinn der Sache? So lange du den Finger auf dem Schalter hast, soll das Licht an sein und beim Loslassen wieder aus gehen?

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Danke für deine schnelle Antwort!

    Also die Schaltung sieht relativ unspektakulär aus, ich will ja nur mal den Schalter ausprobieren also eine Seite vom Schalter geht zum GPIO18 und die andere Seite zu Ground. (Über ein Steckbrett)

    Ja ich kann während das Programm läuft immer wieder auf den Knopf drücken und er erkennt es "fast" immer wenn ich drücke aber das loslassen erkennt er nicht.

    Ich habs mal mit einem Erweitetungsboard für den PI versucht und da hats funktioniert. Da hab ich aber auch GPIO Zero verwendet und das erkennt meinen Schalter gar nicht.

    Der Sinn davon ist, dass ich gerne eine Dimmfunktion einbauen würde. Also wenn ich lange drücke soll er dimmen wenn ich kurz drücke und gleich wieder loslasse soll er nur ein oder ausschalten.

    Danke! :)

  • "fast" immer - ist ja auch nicht ganz das, was du willst...

    Also, bei der Schaltung musst du pullup verwenden. Pulldown bringt da nichts.

    Ich wüsste nicht, warum er das Loslassen nicht erkennen sollte.

    Frag doch mal den Zustand des Pins in einer Schleife ab und schau, ob er sich verändert, wenn du draufdrückst, denn das sollte er ja.

    Vielleicht sind für den großen Schalter die internen Pullups zu groß - die haben so 30-50 K, wenn ich das richitg in Erinnerung habe. Du könntest mal externe Pullups probieren - 10 K nimmt man da meist.

    Das ist ein ganz gewöhnlicher Unterputz-Taster? Und es hängt sonst nichts dran?

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Ja ich hab zuerst die Pullups verwendet und aus Verzweiflung dann alles mal probiert was mir so in den Sinn gekommen ist :D


    Das übersteigt glaub ich etwas mein Einsteigerwissen, was genau ist mit externen Pullups gemeint? Und wie ich da Werte einstell weiß ich leider auch nicht.

    Ja das ist ein normaler Unterputz-Taster vom Baumarkt. Aber im Grunde macht der ja auch nichts anderes als ein aus oder?

    Hab auch einen Mikro-push-schalter verwendet - gleiches Ergebnis. Nur mit dem Zusatzboard hats funktioniert.

    Ich lad mal Fotos von meinen Schaltern und dem Zusatzboard hoch.

  • Externer Pullup heißt nur, dass du von einem 3,3-V-Pin über einen echten Widerstand (10 K) Spannung auf deinen GPIO gibst. Somit ist dort die Spannung erst mal 3,3 Volt.

    Der Schalter sitzt zwischen dem GPIO und GND. Drückst du drauf, wird der GPIO mit GND verbunden und die Spannung sinkt auf 0 V, was das Programm als fallende Flanke erkennen soll.

    Lässt du den Taster los, wird die Verbindung zu GND getrennt und es kommen wieder die 3,3 V über den Widerstand zum Tragen und die Spannung am GPIO steigt wieder auf 3,3 V - das sollte das Programm als steigende Flanke erkennen.

    Klemm mal direkt den GPIO auf GND, ob das Schleifen-Programm dann reagiert.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Hab leider keine Widerstände da, nur 220 für eine led..

    Wenn ich ihn direkt auf Ground gebe reagiert mein Programm richtig.

    Ich hab auch mal getestet ob die Schalter funktionieren, also eine LED mit 3,3V, Widerstand und auf Ground und den Schalter dazwischen geschaltet. Und die LED geht nur an sobald ich auf den Schalter drücke also sollte er funktionieren..

  • Das ist komisch. Wüsste nicht, warum das nich gehen soll.

    Kabelbruch oder so? Schließ mal alles an und statt den Schalter zu drücken, überbrückst du ihn an den Kabelenden, die in ihn hineinlaufen.

    Hast du ein Multimeter - dann miss mal den Widerstand des Schalters, wenn er offen und wenn er gedrückt ist.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Also, es geht mit keinem anderen Kabel/Schalter/Taster - nur wenn du den GPIO direkt mit einem Kabel auf GND brückst, dann geht es.

    Und mit dieser seltsamen Platine geht es auch? Meinst du, wenn du einen von den drei Tastern auf der Platine benutzt, geht es oder mit deinem Lichtschalter über die Anschlüsse der Platine?

    Das ist rätselhaft. Versuchs doch mal mit 5 von deinen kleinen Widerständen in Reihe als Pullup (wenn du so viele hast - auch mehr, aber nicht weniger als 5) - das sind zwar nur 1100 Ohm, aber das geht prinzipiell auch. Wenn das funktionieren sollte, kannst du dir ja mal einen 10-K-Widerstand besorgen.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Also ich hab jetzt neue Widerstände besorgt, 6k und 4k und 2k und immer höher rauf gegangen, aber kein Unterschied.

    Interessant war allerdings, als ich direkt mit den Kabeln an meinem Lichtschalter den Schalter am Zusatzbord überbrückt habe. Dann hats einwandfrei funktioniert. Weiß allerdings nicht was mir das sagt was ich falsch mache..

  • So habs jetzt hinbekommen, ohne Widerstand und einfach den Schalter zwischenschalten, da dürft mir am Anfang irgendwo was ein Fehler unterlaufen sein. Also die ganze Aufregung umsonst, aber vielen Dank für die schnelle Hilfe!

    Die GPIO's hab ich mal gewechselt, deshalb stimmt dass mit dem Skript nicht mehr.

    LG

Jetzt mitmachen!

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