Hallo zusammen, ich möchte an einem ESP32 die Kapazität eines Kondensators (Hygrometer) messen. Die Kapazität schwankt zwischen 2nF (Dieelektrikum: Wasser) und 0,02nF (Dielektrikum: Luft), wobei die praktisch auftretenden Werte zwischen 1,5nF (feuchte Blumenerde) und 0,5nF (trockene Blumenerde) liegen. Ich habe einige Threads zu diesem Thema gelesen und bin zu dem Schluss gekommen dass folgende Minimal-Schaltung theoretisch funktionieren sollte: IOx (GND/3.3V) | | R 5M | \ -- ADC / | C XnF | GND Bitte korrigiert mich (alles gerundete Werte): Über das RC-Glied sollte mit einer Zeitkonstante von 5-10ms nach 25-50ms den Kondensator vollständig geladen haben. Wenn der Kondensator geladen ist schalte ich den IO auf GND und der Kondensator entlädt. Bei einer ADC-Samplingrate von ~6K am ESP habe ich zwischen 62 und 125 Zyklen. Habe ich irgendetwas übersehen oder komplett falsch verstanden? LG Gerd
Hallo , mit 5Megohm und 2 nF ergibt sich Tau=5ms. Da passen 30 Wandlungen hinein. Bei 0,5 nF sind es nur ein viertel, also 7. Im Prinzip möchtest Du messen wie hoch die Spannung ist, nach einer festen Zeit, die der Widerstand an + angeschlossen war oder nach dem kurz Schließen des Kondensators. Mit 5Megohm kannst Du Dir richtig Störungen einfangen. 470k oder 1Meg zu verwenden, wäre vielleicht besser. Die Zeitkonstante wird bis zum 0,707-fachen der Betriebsspannung gemessen. https://www.homofaciens.de/technics-base-circuits-rc-circuit_ge.htm mfG
Vorab: kleiner Fehler in der Eingangsbeschreibung des Hygrometers: bei Luft als Dielektrikum liegt die Kapazität bei 0,2nF, nicht wie geschrieben 0,02nF... Christian S. schrieb: > Mit 5Megohm kannst Du Dir richtig Störungen einfangen. 470k oder 1Meg zu > verwenden, wäre vielleicht besser. Oh - das ist mit ein Grund warum ich hier gefragt habe: Das hab ich überhaupt nicht auf dem Schirm gehabt. Aber: wenn ich so weit runter gehe mit dem Widerstand liegt das doch schon ziemlich nahe an der Grenze meines ADC vom ESP32, oder nicht? Hmm... wenn ich allerdings nicht die Zeit messe bis 100% sondern wie von Dir vorgeschlagen (wenn ich Dich richtig Verstanden habe) per Timer-Interrupt nach z.B. 1ms den ADC auslese kann ich vom gemessenen Wert auch auf die Kapazität schliessen. Das würde deutlich effizienter funktionieren (Code mässig meine ich)... Aber Grundsätzlich würde die Schaltung wie oben Skizziert (nur halt mit 1M) funktionieren ohne weitere externe Bauteile, richtig? Wenn ich 1M für R nehme hätte ich nach 1ms etwa 2,3V (C=0,9nF) bzw 1,6V (C=1,5nF), richtig? Hört sich machbar an... Gruss Gerd
ich habe das am esp8266 mal ganz ohne adc gemacht: (kann mich aber nicht erinnern für welche C Werte) Messvorgang: C definiert entladen (gpio_meas=low) bis gpio_sense low erkennt C laden (gpio_meas=high) bis gpio_sens high erkennt C definiert entladen 'a' (gpio_meas=low) bis 'b' gpio_sens low erkennt Zeit zwischen a und b ist "Messwert" geht auch mit nur einem gpio: C entladen (gpio=output,low) für best. Zeitdauer C laden 'a' (gpio=input,pull_up) bis 'b' gpio high erkennt Zeit zwischen a und b ist "Messwert"
... und wenn ich statt nur den IO auf GND zu setzen, zwischen den Messungen auch den ADC auf GND setze entlädt sich der Kondensator sofort und ich brauche für eine Mittelung der Werte über z.B. 5 Messreihen nur die hälfte der Zeit, da ich nicht warten muss mis sich der Kondensator über R entladen hat. Hält das ein ESP-IO aus oder grille ich den damit, wenn ich worst-case die Ladung von 2nF ohne R direkt durch den IO nach GND jage? :D Gruß Gerd
G. H. schrieb: > geht auch mit nur einem gpio: > C entladen (gpio=output,low) für best. Zeitdauer > C laden 'a' (gpio=input,pull_up) bis 'b' gpio high erkennt > Zeit zwischen a und b ist "Messwert" Hmm, das hört sich auch reizvoll an. Ich will ja eigentlich nicht wissen welche Kapazität C hat, sondern nur anhand relativer Werte wissen ob die Blume Wasser braucht. Der (noch imaginäre) Code der hierfür nötig scheint fühlt sich noch kürzer an als die ursprüngliche Idee per ADC.
Hallo, sollte tadellos funktionieren. Um die Störungen loszuwerden, einfach oft genug messen und die Werte mitteln. Gibt übrigens für Arduino eine lib die das genau so macht: https://playground.arduino.cc/Main/CapacitiveSensor?from=Main.CapSense
zuletzt wurde das Thema hier diskutiert: Beitrag "YACMS - noch ein kapazitiver Feuchtigkeitssensor" zwar nicht direkt mit ESP, aber die Kapazitätsmessung für diesen Zweck allgemein. Ich kann allerdings nicht verstehen warum alle Welt den ESP für alles einsetzen möchte obwohl es deutlich bessere (stromsparendere) Lösungen gibt. Aber egal, da gibt es mehrere weitere Probleme: - 1-2 nF, was ist das für ein Sensor? Mit einfachen Elektroden hast du eher wenige pF in Luft und vielleicht 500-600 pF in Wasser. Der Faktor 80 durch die unterschiedlichen Er ist nicht gegeben weil die Elektroden ja noch isoliert sind. - der ADC ist zu langsam und belastet die Messung, mit einem analog Komparator geht das besser. Ob der ESP einen hat weiss ich nicht, dafür gibt es kleine µC die das können. - der grösste Nachteil: durch die Messung mit Gleichspannung hat man den Messeffekt nur direkt an der Oberfläche des Sensors. Damit misst du eher den Füllstand, also wieviel an Flächen durch Feuchtigkeit kurzgeschlossen sind. Es gibt einen älteren Ansatz von Albertas Mickėnas, https://github.com/Miceuz Der macht das über die Messung der Dämpfung bei HF, das scheint besser zu gehen und das wollte ich jetzt auch mal testen. In Fall kann man wieder mit ADC arbeiten, braucht aber noch ein HF Signal mit 1-20 MHz.
Mach mal folgendes Experiment: Schließ den Sensor DIREKT an den Port an. Zieh den Sensor auf 0V, dazu schaltest du ihn einfach gege Masse kurz. Mach dann 100-1000 ADC-Wandlungen so schnell wie möglich und merk dir den letzten Wert. Jetzt solltest du einen Wert bekommen, der direkt von der Kapazität abhängt. Umso geringer die Kapazität, umso höher der ADC-Wert. Der Grund dafür ist, dass ein ADC eine Ladung aus dem Port entnimmt - er lädt für jede Wandlung einen Kondensator. Meist hat der Samplekondensator den Wert VREF, so dass eine Ladung in den Port gedrückt wird. Dadurch wird der Sensor aufgeladen. Und umso kleiner seine Kapazität ist, umso schneller passiert das. Ich habe das (just for Fun) so schon mal verwendet, um die Kapazität eines Breadbords abschätzen zu können.
Johannes S. schrieb: > zuletzt wurde das Thema hier diskutiert: > Beitrag "YACMS - noch ein kapazitiver Feuchtigkeitssensor" > zwar nicht direkt mit ESP, aber die Kapazitätsmessung für diesen Zweck > allgemein. Ich kann allerdings nicht verstehen warum alle Welt den ESP > für alles einsetzen möchte obwohl es deutlich bessere (stromsparendere) > Lösungen gibt. Weil (das gilt zumindest für mich): WiFi/BLE + DAU kompatible IDE (Arduino) + gegen 0 gehende nötige externe Beschaltung = ESP. In der IT-Welt könntest Du mich "Script-Kiddy" nennen, und ich bin wohl nicht der einzige... > Aber egal, da gibt es mehrere weitere Probleme: > - 1-2 nF, was ist das für ein Sensor? Mit einfachen Elektroden hast du > eher wenige pF in Luft und vielleicht 500-600 pF in Wasser. Der Faktor > 80 durch die unterschiedlichen Er ist nicht gegeben weil die Elektroden > ja noch isoliert sind. Das sind keine einfachen Elektroden - das Ding sieht aus wie eine beidseitig mit einer Kammstruktur versehene Platine, also ca 2x ~6cm² wobei die Strukturen deutlich < 1mm sind, ist aber schwer zu erkennen, da beschichtet... > - der ADC ist zu langsam und belastet die Messung, mit einem analog > Komparator geht das besser. Ob der ESP einen hat weiss ich nicht, dafür > gibt es kleine µC die das können. > - der grösste Nachteil: durch die Messung mit Gleichspannung hat man den > Messeffekt nur direkt an der Oberfläche des Sensors. Damit misst du eher > den Füllstand, also wieviel an Flächen durch Feuchtigkeit > kurzgeschlossen sind. Kurzgeschlossen ist da nix, selbst wenn das Ding (bis auf die Anschluss-Kontakte untergetaucht ist...) > > Es gibt einen älteren Ansatz von Albertas Mickėnas, > https://github.com/Miceuz > Der macht das über die Messung der Dämpfung bei HF, das scheint besser > zu gehen und das wollte ich jetzt auch mal testen. In Fall kann man > wieder mit ADC arbeiten, braucht aber noch ein HF Signal mit 1-20 MHz. Steht da nicht relativ zügig die Post vor der Tür wenn da ein (oder - schlimmer - gleich mehrere) Sender in dem Bereich die Umgebung verseuchen? Gruß Gerd
Gerd Schroer schrieb: > G. H. schrieb: >> geht auch mit nur einem gpio: >> C entladen (gpio=output,low) für best. Zeitdauer >> C laden 'a' (gpio=input,pull_up) bis 'b' gpio high erkennt >> Zeit zwischen a und b ist "Messwert" > > Hmm, das hört sich auch reizvoll an. Ich will ja eigentlich nicht wissen > welche Kapazität C hat, sondern nur anhand relativer Werte wissen ob die > Blume Wasser braucht. > > Der (noch imaginäre) Code der hierfür nötig scheint fühlt sich noch > kürzer an als die ursprüngliche Idee per ADC. Wenn die Zeiten zu klein sind um die mit entsprechender Auflösung zu messen kannst du den C auch schrittweise laden. Dazu den Pullup für sagen wir mal 20μs einschalten und danach wieder aus und schauen ob der PIN High erkennt. Das ganze so lange wiederholen bis der PIN High ist. Anhand der Anzahl der benötigten Ladezyklen hast du gleich einen entsprechenden Messwert. Sascha
Johannes S. schrieb: > Es gibt einen älteren Ansatz von Albertas Mickėnas, > https://github.com/Miceuz Interessanter Stoff - danke für den Link! Gruß Gerd
jemand schrieb: > Schließ den Sensor DIREKT an den Port an. > Zieh den Sensor auf 0V, dazu schaltest du ihn einfach gege Masse kurz. > Mach dann 100-1000 ADC-Wandlungen so schnell wie möglich und merk dir > den letzten Wert. > > Jetzt solltest du einen Wert bekommen, der direkt von der Kapazität > abhängt. > Umso geringer die Kapazität, umso höher der ADC-Wert. Ahhh... Das meinte Johannes mit "belastet die Messung". Verstehe. Und Umgekehrt (also Dein Weg) nutzt genau diesen Effekt für die Messung. Ich messe die Veränderung die meine Messung verursacht und ermittle dadurch den gewünschten Wert... Aber ich gebe auch offen zu - sobald eine Schaltung mehr als 3 Bauteile hat blick ich schon nicht mehr durch. Software ist mehr mein Ding. Gruß Gerd
@Sascha: Hört sich gut an. Ich denke, ich habe, was ich brauchte: * Bestätigung, dass das skizzierte Konstrukt den Anforderungen potentiell gerecht wird und ich die Aufgabe prinzipiell ausreichend verstanden habe * Anregungen wie man die Sache vereinfachen kann * Alternativen wie man ggf. mit der gegebenen HW auch ans Ziel kommt Ich werde berichten wie/ob es bzw. was funktioniert (hat)... Danke erst mal @all Gerd
Gerd Schroer schrieb: > Steht da nicht relativ zügig die Post vor der Tür wenn da ein (oder - > schlimmer - gleich mehrere) Sender in dem Bereich die Umgebung > verseuchen? Kannste heutzutage vergessen. Jedes mistige Schaltnetzteil erzeugt EMI, die deinen kleinen Oszillator weit in den Schatten stellt.
Gerd Schroer schrieb: > Das sind keine einfachen Elektroden - das Ding sieht aus wie eine > beidseitig mit einer Kammstruktur versehene Platine, also ca 2x ~6cm² > wobei die Strukturen deutlich < 1mm sind, ist aber schwer zu erkennen, > da beschichtet... so Versuche sind auch nicht neu, ich behaupte eine kunstvolle Kammstruktur sieht schön aus (wenn man sie sehen könnte), bringt aber nix. Der Kondensator in Luft bildet sich aus der Eletrodenfläche und dem Isolationsmaterial. Kommt Wasser dazu, verbindet das die Flächen (das meine ich mit Kurzschluss) und der Elektrodenabstand verringert sich auf die Dicke der Isolationsschichten und die Kapazität erhöht sich. Durch die Kammstruktur hat der Sensor in Luft vielleicht einen etwas höheren Kapazitätswert, mehr aber auch nicht. Als Touchsensor funktioniert das gut, wenn ich sowas in die Erde stecke zählt nur der Feuchtigkeitsfilm der sich auf der Oberfläche breit macht. Ob dahinter jetzt noch ein Zentner trockene oder feuchte Erde liegt macht 0,0 Änderung im Messergebnis. Ich habe das Experiment mit Platten im Wasser gemacht, der Elektrodenabstand (im Bereich einiger cm) spielt keine Rolle für den Kapazitätswert. Ich hoffe das der Ansatz von Albertas besser ist und die paar MHz reichen um mit dem Sensor weiter in die Tiefe sehen zu können.
Eigentlich brauchst du nicht die Kapazität zu messen, du musst nur feststellen, ob sie einen gewissen Schwellwert überschreitet. Ich messe Kapazitäten mit AVR und STM32 Mikrocontrollern so (dann wird es wohl beim ESP auch gehen):
1 | GND |----||------o digitaler I/O Pin |
2 | C |
Zuerst konfiguriere ich den I/O Pin als Ausgang mit Low Pegel und warte ein paar µs. Dann konfiguriere ich den I/O Pin als Eingang mit internem Pull-Up. Nun warte ich, bis der Eingang von Low nach High wechselt. Je größer der Kondensator ist, umso länger dauert das. Die gleiche Methode wurde bei PCs an analogen Joysticks angewendet (die mit dem 15 Poligen Sub-D Stecker). Der Haken dieser Methode ist: Die internen Pull-Up Widerstände sind nicht gut berechenbar. Sie haben typischerweise irgend etwas zwischen 35kΩ und 60kΩ. Außerdem ist die Spannung, ab der ein High erkannt wird nicht präzise definiert. Für deinen Anwendungsfall ist das aber ziemlich egal. Du wirst deine Anlage sowieso auf einen gewissen Sollzustand justieren. Wichtig ist nur, ob die Erde trockener oder feuchter als der manuell eingestellte Schwellwert ist. Wie viel nF oder Mikrosekunden das entspricht, ist ziemlich wurscht. > Aber ich gebe auch offen zu - sobald eine Schaltung mehr > als 3 Bauteile hat blick ich schon nicht mehr durch. Ich helfe gerne.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.