selfmade "Wassersensor" - Problem mit (GPIO.add_event_detect)

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Guten Tag liebe RPi-Freunde,

    zur weiteren Realisierung meines derzeitigen Projekts soll ein Wassersensor in Form einer simplen Widerstandsschaltung eingesetzt werden, wie in diesem Schema hier.

    in meinem Python-Testskript frage ich nach steigender Flanke per (GPIO.add_event_detect) am GPIO Pin 11 ab und möchte testweise an diesem bei HIGH-Level eine LED an GPIO Pin 13 zu/abschalten.

    Problem bzw. Auffälligkeit ist, dass bei geöffnetem "Wassersensor" -also geöffneten Drähten am GPIO Input zufällig ein Spannungswert von ca. -10mV anliegt und die LED nicht abschaltet.
    Ich habe bereits mit der Bouncetime gespielt +/- und auch den Pulldownwiderstand sowie den Strombegrenzungswiderstand vor dem Input geändert, ohne Verbesserung.
    Ich dachte hierbei ans Entprellen der Drähte (Wassersensor).

    Liegt hier ein simpler Softwarefehler vor? :s

    Hier mein Testcode:

    Einmal editiert, zuletzt von opc241 (11. Januar 2015 um 17:23)

  • selfmade "Wassersensor" - Problem mit (GPIO.add_event_detect)? Schau mal ob du hier fündig wirst!

  • Nun ja, die Funtkion ``Wassersenso`` (übrignes werden in Python Funktionsnamen klein geschrieben) wird ja nur aufgerufen, wenn der Pin 11 den Wert ``1`` hat. Zum ``elif`` kommt es wahrscheinlich gar nicht mehr. Test es mal mit einem ``print``

    Du könntest eine zweite Funktion schreiben und diese mit ``GPIO.add_event_detect`` und ``GPIO.FALLING`` aufrufen. In dieser schaltest du die LED wieder ab.

  • Erstelle ich eine zweite Abfrage für den Pin 11 also folgendermaßen:

    bekomme ich folgende Fehlermeldung zurück:

    Code
    Traceback (most recent call last):
      File "/root/wassersensor.py", line 22, in <module>
        GPIO.add_event_detect(11, GPIO.FALLING, callback = wasser_aus, bouncetime = 100)
    RuntimeError: Conflicting edge detection already enabled for this GPIO channel


    Muss man, bzw. kann man die zwei Abfragen in 1 Zeile kombinieren? :s

    Einmal editiert, zuletzt von opc241 (11. Januar 2015 um 17:53)

  • Code
    Traceback (most recent call last):
      File "/root/wassersensor.py", line 22, in <module>
        GPIO.add_event_detect(11, GPIO.FALLING, callback = wasser_aus, bouncetime = 100)
    RuntimeError: Conflicting edge detection already enabled for this GPIO channel

    Logisch, war blöd von mir.

    Es nimmt mich nur wunder:

    Code
    def wasser_ein(callback):
        if GPIO.input(11) == 1:
            print 'LED ein'
            GPIO.output(13, 1)       
    
    
        elif GPIO.input(11) == 0:
            print 'LED aus'
            GPIO.output(13, 0)

    Edit:
    If you wanted more than one callback function:
    GPIO.add_event_callback(channel, my_callback_one)
    http://sourceforge.net/p/raspberry-gpio-python/wiki/Inputs/


  • Problem bzw. Auffälligkeit ist, dass bei geöffnetem "Wassersensor" -also geöffneten Drähten am GPIO Input zufällig ein Spannungswert von ca. -10mV anliegt und die LED nicht abschaltet.
    Ich habe bereits mit der Bouncetime gespielt +/- und auch den Pulldownwiderstand sowie den Strombegrenzungswiderstand vor dem Input geändert, ohne Verbesserung.
    Ich dachte hierbei ans Entprellen der Drähte (Wassersensor).

    Hm, ich versuche mal, deine etwas missverständliche Formulierung zu deuten:

    "geöffneter Wassersensor" ?? Heisst das nun, dass der Widerstand abgeklemmt ist oder dass der Widerstand "trockenfällt" ?

    Im Ersten Fall (keine Verbindung des GPIO Eingangs mit dem Widerstand nach Vcc) stellt sich am GPIO Pin eine Spannung ein, die aufgrund des hohen Widerstandes nach Masse + Chip-interne Beschaltung etwas undefiniert sein wird (eine negative Spannung würde ich da allerdings nicht erwarten, evtl. Messfehler - Spannungsmesser falsch gepolt?).

    Im Zweiten Fall (Widerstand ist weiterhin angeklemmt, trocknet langsam ab) steigt der Gesamtwiderstand des ganzen Konstrukts (35kOhm parallel zu Wasserfilmwiderstand). Das ist bei digitalen Schaltungen sehr schlecht, da sich nun die Spannung am GPIO Pin der Logigschwelle (irgendwo bei 2,7-3.3V) nur langsam annähert. Das führt zu unsicherer Pegelbestimmung und ist vermutlich das, was dein "Prellen der Drähte" auslöst.

    Normalerweise schaltet man einen kleinen "Schmitt-Trigger" vor den GPIO Pin. Der hat eine Hysterese und verhindert solche undefinierten Zwischenzustände...

    Ich halte die gesamte dargestellte Schaltung für wenig brauchbar: Die Drähte am "Wasserwiderstand" sind meist nur verzinnt, mit der Zeit wird sich eine dünne Schicht auf dem Zinn bilden (Passivierung), die hochohmig ist.. Damit wird die Funktion der Schaltung immer unsicherer... bist zum totalversagen.

    Besser ist es, du nimmst 2 Elektroden (Kohle oder versilbert oder vergoldet), die in das Wasser reichen, in Reihe mit diesem Widerstand von 35kOhm.

    Kohle (Bleistiftminen - die richtigen!) geht zum probieren. Silber kann ebenfalls mit der Flüssigkeit reagieren, Gold ist am besten.

    Ein weiteres Problem wird Kalk sein, der sich an den Elektroden ansetzt... aber das ist eine andere Geschichte...

  • bootsmann: Danke für den Link :)

    Ich könnte somit also ein event-detect setzen, in dem ich nach RISING abfrage und dann zwei callbacks aufrufe in denen ich pin11 abfrage und je nach Wert die LED schalte... somit fehlt mir aber wieder die Möglichkeit, auf eine fallende Flanke abzufragen. Denn die Abfrage nach dem Zustand von pin11 würde somit nur bei steigender Flanke (RISING) durch die zwei callbacks abgefragt werden, seh ich das richtig?

    Gruß und schönen Abend noch

    opc

  • Hallo zusammen,

    ehrlich gesagt fällt es mir schwer, das Problem als solches zu verstehen.

    Ich habe eine unterbrochene Leitung, die einen unendlich hohen Widerstand besitzt, da Luft unter normalen Bedingungen als Nichtleiter zu betrachten ist.

    Füllt ein Medium wie Wasser den Bereich der unterbrochenen Leitung, dann liegt eine gewisse Leitfähigkeit vor. Sollten Bedenken bestehen, dass das zu detektierende Wasser elektrisch zu schwach leitet, um detektiert werden zu können, dann helfen ein paar Salzkristalle in der Nähe der Leitungsunterbrechung für eine hinreichend gute elektrische Leitung, wenn denn da Wasser vorbeifließt/tropft.

    Für mich persönlich reduziert sich das Problem auf das Abfragen eines Schalters. Der leitet im geöffneten Zustand gar nicht - im geschlossenen Zustand recht gut.

    Ich würde vergoldete Stifte an eine Litze löten, mit Schrumpfschlauch die Lötstelle abdichten, zwischen die Lötstifte irgendwelche nicht hygroskopischen Salze legen. Kommt Wasser zwischen die beiden Goldstifte, dann "schließt der Schalter". Die vergoldeten Stifte sind Bestandteil von Steckerleisten, die man einzeln herausziehen kann. Gold hat den Vorteil, dass es nach irdischen Maßstäben nicht so schnell wegoxidiert.

    Die einzige Herausforderung besteht in der Schaltung: Sich zu entscheiden, ob ein Pull-Up- oder ein Pull-Down-Widerstand eingesetzt werden soll und entsprechendes Anpassen des "Schalter"-Programms.


    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.

  • opc241

    Versuch es sonst mal zu Testzwecken so:

  • Anfangs testete ich es mit einer while-Schleife bereits. Damit funktionierte es exakt so wie es sollte, da dabei bedingungslos permanent der Wert eines GPIO Eingangs abgefragt wird.
    Dann informierte man mich (was logisch ist) über die hohe CPU-Auslastung hierbei. Deshalb versuche ich dies per Interrupts zu lösen.

    An die anderen: Vorhaben ist der simple, nicht komplexe Testaufbau oder viel mehr Nachbau wenn man so will eines Wasserdetektors wie es bereits fertige Module von Kemo gibt. Sucht einfach mal "kemo water switch" in der e-bucht ;)

    Die Variante des Einsatzes eines -dem GPIO Eingang- vorgeschaltetem Schmitt-Trigger ist eine Hardwarelösung die mir definierte Eingangsspannugen liefern kann. Mein Problem ist viel weniger die Hardware im einzelnen Detail der Umsetzung, sondern zunächst mal mein Python-Skript zu optimieren.

    Andreas: Danke für deinen Post: ich werde es versuchen die Abfrage zu invertieren und einen Pullupwiderstand einsetzten.
    Welchen Wideratandswert schlägst du vor?


    Bootsmann hat das schon richtig interpretiert.
    Mit dem Multimeter messe ich 3,25V (HIGH) und 0V (LOW) und eben manchmal ~-10mv, trotz gesetztem 100kOhm Pulldown.
    Dieses Phänomen taucht nur auf wenn ich ein event_detect setze... hierbei das Problem dass ich derzeit noch nicht weiß wie man an einem GPIO Pin nach steigender und parallel fallender Flanke abfragen kann.

    Übrigens spielt es keine Rolle ob ich die Drähte ins Wasser halte oder direkt miteinander verbinde.

    Ich hoffe ich konnte mich einigermaßen verständlich ausdrücken. Ich kann gerade keine Codes testen da ich nicht am RPi bin.

    Danke für eure Hilfe

    Einmal editiert, zuletzt von opc241 (11. Januar 2015 um 23:04)

  • Hallo OPC,

    Pullup / Pulldown-Widerstände sind normalerweise 10k.

    Was Du noch beachten solltest: Der Raspberry Pi erkennt Pegel unterhalb 0,8 V als LOW, Pegel ober 1,3 V als HIGH. Werte dazwischen sind nicht definiert - und beruhen auf falsch dimensionierte Pullup/Pulldown-Widerstände, mangelhafte Isolierung der Leitungen, Störeinflüsse, ...

    Somit sind Deine gemessenen 10 mV LOW und haben keinerlei Relevanz.

    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.

    Einmal editiert, zuletzt von Andreas (12. Januar 2015 um 00:15)

  • Hallo Kollegen,

    bevor sich hier jemand total verrennt.

    Es geht meines Erachtens nicht um das Detektieren steigender oder fallender Flanken. Es geht um Pegeländerungen, die hervorgerufen werden, sobald eine Leitung durch eine elektrisch leitende Flüssigkeit geschlossen wird, und ein entsprechnd programmierter Pin diese Pegeländerung erkennt.

    Wenn das Auswerteprogramm hinreichend träge ist - und vermutlich ist Python das von Natur aus - dann bekomme ich wahrscheinlich die Mikrosekunde, in der sich eine fallende oder sinkende Flanke beobachten ließe, überhaupt nicht mit.

    Dagegen ist es total trivial, analog einer Taster-Abfrage eine Pegeländerung
    - "Taster gedrückt - Taste nicht gedrückt"
    - Wasser drin - alles trocken
    festzustellen. Hierbei interessiert niemanden die Mikrosekunde der Pegeländerung sondern nur die Tatsache "noch trocken" oder "Land unter".

    Die in #1 gestellte Frage lässt sich durch eine simple Taster-Abfrage lösen. Alles andere sind - mit Verlaub gesagt - akademische Blähungen.

    Wenn wir hier noch länger debattieren, wird der Thread immer länger - und keiner hat was davon.

    Denkt mal drüber nach!

    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,

    Danke für deine Tipps und Kritik. Deiner Anmerkung bezüglich der Pullup/down Widerstände werde ich mal nachgehen und gegen 10kOhm tauschen. Mir waren bislang selbst 100kOhm als bekannt und richtig vorgekommen.

    Um nochmal das Tasterabfragen von Post #1 aufzugreifen, gerade weil du es nochmal amsprichst: hast du einen Lösungsvorschlag wie man das anders als in meinem anfänglichen Testscript lösen kann?

  • Hallo opc,

    einen früheren Beitrag von mir findest Du unter.

    Wie gesagt, den Taster durch zwei Stifte einer Stiftleiste ersetzen - und dann funktioniert das. Wenn Du die Aufnahme der Stifte dran lässt, dann kannst Du die Stifte auch in eine Metallwanne legen. Eine Detektion von Wasser findet dann erst bei einer Füllhöhe von ca. 1 m statt.

    EDIT: Ansonsten ist es egal, ob Du mit einem Pullup- oder Pulldown-Widerstand arbeitest - aber einer von beiden muss sein, um in beiden Zuständen einen definierten Pegel zu erzeugen.

    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.

    2 Mal editiert, zuletzt von Andreas (9. Oktober 2017 um 23:44)

Jetzt mitmachen!

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