Offen/Geschlossen Reed Sensor. Feuert dauerhaft wenn offen

  • Hallo zusammen,


    ich habe gerade einen Schalte angeschlossen mit dem ich feststellen möchte ob ein Deckel offen oder geschlossen ist (der Sensor ist dieser hier https://www.amazon.de/gp/product/B07Z4NCWDD/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1 (Affiliate-Link))


    Nun habe ich ein Kabel an 3.3v angeschlossen und das andere an eine GPIO.


    Mein code sieht wie folgt aus


    Wenn ich den Deckel geschlossen habe wird, so wie ich es gern hätte, NUR "Is closed" ausgegeben. Ist der Deckel jedoch offen wird dauerhaft "Is closed" "Is opened" im wechsel ausgegeben.

    Woran kann das liegen? Ich habe auch schon andere GPIO ausprobiert, aber da verhält es sich genauso. Vielen dank schonmal im Vorraus!

  • Go to Best Answer
  • Schalte nicht gegen 3V3, sondern gegen GND!


    Erweitere die Zeile 10 so GPIO.setup(SENSOR_GPIO,GPIO.IN, pull_up_down=GPIO.PUD_UP), wenn Du keinen externen Pullup Widerstand verwendest.


    Siehe dazu auch:

    https://www.elektronik-kompend…/raspberry-pi/2006051.htm

    https://www.elektronik-kompend…/raspberry-pi/2110081.htm

  • Hallo,


    zu deinem Code gibts noch etwas zu sagen, falls du interesse daran hast.

    'as' wird benutzt um Module umzubenennen, du nennst GPIO in GPIO um.

    Warnungen sind nicht dazu da um sie zu ignorieren, man sollte hier eher die Ursache beheben. In diesem Fall sollte ein 'GPIO.cleanup()' vor Programmende die Lösung sein.


    In Python steht kein ausführbarer Code auf Modulebene (der Teil ohne Einrückungen). Zum steuern des Programmablaufs verwendet man eine Funktion, die üblicherweise 'main' heißt.


    Namen schreibt man klein_mit_unterstrich, Ausnahmen sind Konstanten, die schreibt man GANZ_GROSS und Klassen in CamelCase-Schreibweise.

    Die 'if'-Abfrage benötigt keine Klammer und üblicherweise wird immer mit vier Leerzeichen eingerückt.

    Wieso rufst du mit dem callback nicht gleich 'checkState' auf?

    Das Programm mit 'pass' am Leben zu halten wird so auch nicht gemacht. 'pass' nutzt man während man einen neuen Code schreibt um keine Fehler zu erhalten, wenn beispielsweise Funktionen definiert sind, aber Inahlt noch fehlt.

    Ungetestet:


    Was natürlich noch etwas cooler und einfacher ist, ist gpiozero. Damit kannst du dann sowas oder sowas ähnliches machen, ungetestet:


    Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

    Edited once, last by Dennis89: pull_up_down vergessen, Danke @hyle ().

  • Danke sehr. Das ergibt durchaus Sinn... leider erzeuge ich mit meiner schaltung derzeit einen Kurzschluss... ich verstehs einfach noch nicht. Werd das ganze erstmal kurz bei Seite legen.. frustriert ein wenig. Werd aber sicher noch dahinter kommen. Vielen Dank!


    Edit:


    Ich hatte noch diesen Beitrag hier gefunden:

    https://www.electroniclinic.co…g-and-python-programming/


    Da werden 2 Widerstände verwendet... aber im Python-code wird trotzdem noch ein PullUp Widerstand gesetzt... wieso muss man das machen wenn man doch Hardware-Widerstände verwendet?

    Edited once, last by BlaXun ().

  • wenn Du keinen externen Pullup Widerstand verwendest.

    auch mt internen Pullup kann es "feuern" besser ist ein nicht abschaltbarer (in der Programmierung vergessener) pullup Widerstand von 1k nach +3,3V.

    Da weiss dann der GPIO das offen ist wenn stabile 3,3V anliegen und 3,3V über 1k sind stabiler als eine offene Leitung.

    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)

  • auch mt internen Pullup kann es "feuern" besser ist ein nicht abschaltbarer (in der Programmierung vergessener) pullup Widerstand von 1k nach +3,3V.

    Da weiss dann der GPIO das offen ist wenn stabile 3,3V anliegen und 3,3V über 1k sind stabiler als eine offene Leitung.

    Auf die Gefahr hin mich komplett zu blamieren stelle ich diese Frage trotzdem da mir scheinbar absolut das Verständnis für Elektronik fehlt:


    Wird der Strom nicht von der 3.3v "gezogen"? Ich verstehe die Formulierung "pullup Widerstand von 1k nach +3,3V" nicht. Wenn ich den 3.3 mit irgendwas verbinde, dann fließt da doch dauerhaft strom drin, und der rest geht dann in GND, oder? Also ein geschlossener Kreislauf. Der Widerstand vermindert nun die 3.3v auf "weniger"? Oh mann... hätt ich bloß damals in Physik besser aufgepasst... hab sogar schon Phsyikbücher zur 8ten Klasse bestellt...aber selbst da blick ich einfach nicht durch... das ist so frustrierend

  • Hui, freundlich hier. Wenn ich schon sage dass ich mich hier offen blamieren möchte um mein Wissen zu erweitern, zugebe dass ich mir Bücher hole und mir dann so einen Scheiß anhören darf dann merk ich wieder was andere Menschen kacke sein können. Doch, natürlich kann ich eine Suchmaschine bedienen, aber das ist nicht das Problem... meine Auffassungsgabe was das Thema Elektronik angeht scheint das Problem zu sein. Danke aber für die "Hilfe". Sorry, aber sowas ist doch absolut unnötig! Wieso? Denkst du du hilfst mit sowas? Tust du nicht. Das ist hier schon unangenehm genug, dann noch als Volltrottel hingestellt zu werden ist absolut nicht das richtige.

  • BlaXun

    Selected a post as the best answer.
  • Hier mal ein Beispiel, wie man ohne die Gefahr eines Kurzschlusses so etwas anschliesst:

    Dann brauchts auch keinen softwareseitigen Pullup / Pulldown.

    P.S. Hier gings schon mal rauer zu, also bitte nicht so dünnhäutig. :auslachen::baeh2:

    Ah, cool. So werd ich es später mal ausprobieren. Würde auch lieber "richtige" (sichtbare) Widerstände verwenden... sonst nimmt das, spätestens nach einem neu Verkabeln, ein unschönes Ende

  • Hui, freundlich hier. Wenn ich schon sage dass ich mich hier offen blamieren möchte um mein Wissen zu erweitern, zugebe dass ich mir Bücher hole und mir dann so einen Scheiß anhören darf dann merk ich wieder was andere Menschen kacke sein können. Doch, natürlich kann ich eine Suchmaschine bedienen, aber das ist nicht das Problem... meine Auffassungsgabe was das Thema Elektronik angeht scheint das Problem zu sein. Danke aber für die "Hilfe". Sorry, aber sowas ist doch absolut unnötig! Wieso? Denkst du du hilfst mit sowas? Tust du nicht. Das ist hier schon unangenehm genug, dann noch als Volltrottel hingestellt zu werden ist absolut nicht das richtige.

    Das mag deine Einschätzung sein. hyle hatte Dir schon im 2. Beitrag den Link gezeigt, eine bessere Erklärung / Aufbereitung zu diesem Thema wirst Du vermutl. auch in deinem Physikbuch nicht finden.

  • Hier mal ein Beispiel, wie man ohne die Gefahr eines Kurzschlusses so etwas anschliesst

    Ich würde die Pullup-Variante bevorzugen, da sich diese (zumindest bei mir) als zuverlässiger herausgestellt hat.


    hyle hatte Dir schon im 2. Beitrag den Link gezeigt

    Wer nicht lesen will, tut mir nicht leid. Was ich schade finde ist die (Frei)Zeit, die man damit verschwendet, wenn Antworten ignoriert werden, die zum einen das Problem beheben und zum anderen das Hintergrundwissen fördern würden.

    An solchen Punkten ist meine Motivation in diesem Thread auf Low und da selten ein Pullup um die wieder hochzuziehen. :P

  • Wenn ich den 3.3 mit irgendwas verbinde, dann fließt da doch dauerhaft strom drin

    richtig und wenn da eine lange Leitung dran ist und jemand das Kabel beschädigt oder sich verlötet dann kann ein Kurzschluß entstehen und irgendwas Scaden nehmen, der PI, seine Ports oder seine Leiterbahnen die nicht für Kurzschlußströme berechnet sind. Es ist immer besser den Strom zu begrenzen, bei 3,3V mit 1k gibt 3,3mA was für den PI seine GPIO Ports unkritisch sind und gleichzeitig der offenen Leitung genug feste Anbindung liefert das sich nicht willkürliche Pegeländerungen einstellen, sonst wäre das ja ein Radio und würde Antenne spielen.

    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)

  • Da wir nicht wissen, ob der Reed an der Position "geschlossen" oder "offen" ist, kann man nur raten.

    Mit dem raten bin ich voll bei Dir, aber ob Öffner oder Schließer ist hier egal, da beides abgefragt wird und man ggf. nur die Logik der print() im Skript umkehren müsste. ;)


    Aber ich wäre ja auch für eine stromsparende Variante.

    Strom sparen ist eine gute Sache, eine stabile Funktionalität ist m.M.n. allerdings auch je nach Bereich wichtig. :angel: Hier geht es (nur?) um einen Deckel, könnte aber genausogut ein zu überwachendes Fenster mit allen erdenklichen Folgen sein.

  • Ich habe mich nun nochmal an das Problem begeben und habe folgende Schaltung umgesetzt


    Das ganze funktioniert auch mit folgendem Code soweit "gut" ...also wie erwartet (ja, ist nicht optimal, aber ist auch nur zum schnellen debuggen gedacht)


    Wenn ich das Ganze hier jedoch in meinem eigentlichen Code einbinde dann wird dauerhaft beides im Wechsel ("Is closed"/"Is opened") ausgegeben... woran kann das liegen? Irgendwelche Schwankungen in der Elektronik? Ich dachte da würde der Widerstand helfen.


    Danke im Vorraus


    Edit:


    Okay, habs gefixt.

    Ich hatte im :__init__ folgende Zeilen:


    Code
        GPIO.setup(self.gardenLidGPIO,GPIO.IN)
        GPIO.add_event_detect(self.gardenLidGPIO, GPIO.BOTH, callback=self.onLidStateDidChange)
        self.gardenLidIsOpen = GPIO.input(self.gardenLidGPIO)

    Damit wollte ich den initialen Status abrufen.


    Nun habe ich es wie folgt abgeändert

    Code
        GPIO.setup(self.gardenLidGPIO,GPIO.IN)
        GPIO.add_event_detect(self.gardenLidGPIO, GPIO.BOTH, callback=self.onLidStateDidChange)
        self.gardenLidIsOpen = True if GPIO.input(self.gardenLidGPIO) == 1 else False


    So klappt es... aber ich verstehe nicht wieso. Der Wert wird doch nur einmalig zugewiesen... oder befeuert das add_event_detect irgendwie implizit jede Variable die per GPIO.input auf die besagte GPIO verweist?

    Edited once, last by BlaXun ().

  • Habe eine bouncetime von 100 eingefügt und es klappt nun.

    Widerstand beträgt 10k, Kabel sind bis zu einem Meter lang.


    Kompletter Quelltext:



    Kleiner Zusatz:

    Ist mein erstes echtes Hobby-Projekt mit Python, daher sieht der Quelltext auch nach "Historisch gewachsen" aus

  • Ich habe mich nun nochmal an das Problem begeben und habe folgende Schaltung umgesetzt

    und pullup nicht verstanden, deine Umsetzung ist pulldown und kann immer noch Kurzschlüsse mit unbegrenztem Strom fabrizieren.

    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)

  • BlaXun Zum Code sage ich mal besser nichts, aber ich würde Dir nochmals einen der beiden Links aus meinem Beitrag #2 empfehlen zu lesen und versuchen das zu verstehen. So schwer ist das im Grunde nicht: https://www.elektronik-kompend…/raspberry-pi/2006051.htm


    Ein anderer Link mit wichtigen Informationen, dei man kennen sollte, wenn man mit den GPIO spielt, ist dieser: https://www.elektronik-kompend…/raspberry-pi/2006031.htm