Forum: Mikrocontroller und Digitale Elektronik ESP32 : 1-2nF messen


von Gerd Schroer (Gast)


Lesenswert?

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

von Christian S. (roehrenvorheizer)


Lesenswert?

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

von Gerd Schroer (Gast)


Lesenswert?

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

von G. H. (schufti)


Lesenswert?

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"

von Gerd Schroer (Gast)


Lesenswert?

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

von Gerd Schroer (Gast)


Lesenswert?

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.

von MiMa (Gast)


Lesenswert?

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

von Johannes S. (Gast)


Lesenswert?

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.

von jemand (Gast)


Lesenswert?

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.

von Gerd Schroer (Gast)


Lesenswert?

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

von Sascha W. (sascha-w)


Lesenswert?

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

von Gerd Schroer (Gast)


Lesenswert?

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

von Gerd Schroer (Gast)


Lesenswert?

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

von Gerd Schroer (Gast)


Lesenswert?

@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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Johannes S. (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.