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.
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
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.