Messungen mit Arduino vornehmen

Hallo Community,

nach längerem Mitlesen ist es mir leider nicht gelungen die gefundenen Infos für mein eigenes Projekt zusammenzuklöppeln, daher hoffe ich auf eure Hilfe:

Zunächst meine Hardware:

  1. Arduino Uno
  2. LCD Keypad-Shield
    3.diverse Kleinteile, Widerstände, das Übliche Bastelequipment

Mein "Projekt":

Mein Absicht ist es die Leitfähigkeit einer Flüssigkeit zu messen. Das ist zunächst einfach gesagt, aber ein wenig schwierig:

Als Messspannung habe ich mir die 3,3V des Arduino vorgestellt. Das ist gering genug, um Elektrolyseeffekt klein zu halten.
Wegen der Elektroslyseeffekte ist allerdings eine Wechselspannung erforderlich, welche die Söreffekte minimiert. Bei den angedachten 3,3V sind etwa 3 KHz ausreichend.

Hieraus resultiert dann meine 1. Frage:

Wie erzeuge ich mit dem Arduino eine solch frequente Spannung?

Als nächste kommt die Messung:

  1. Da der Leitwert als Kehrwert des Widerstand definiert ist, bietet sich zur Messung ein Spannungsteiler an, der die 3,3V gegen einen definierten Widerstand (dachte an 1kOhm) teilt. Über die bekannten Widerstandsformeln sollte man so den Widerstand berechnen können. Den dann als Kehrwert auszudrücken ist ja nun kein wirkliches Ding.
    Hierzu müsste man aber die Spannug, die recht klein sein kann, über einen AnalogPin messen.

  2. Die zweite, in meinen Augen besserer und elegantere, Lösung wäre wohl, über den Strom der Messtrecke einen Kondensator zu laden. Hier kann die Ladezeit ja über ein R/C-Glied berechnet werden. Meine Idee wäre es, denn Kondensator so zu wählen, dass man die Schaltschwelle des Arduino zur Messung der Ladezeit nutzen kann.

Dazu müsste der Arduin die Zeitspanne bis zum Erreichen der Schaltschwelle messen und aus dieser Zeitspanne den fließenden Strom berechnen. Aus dem Strom kann man bei bekannter Spannung wiederum den Widerstand berechnen, dessen Kehrwert der Leitwert ist.
Ich sehe hier den Vorteil, dass man quasi ein digitales Signal erzeugt und nicht wie bei einer Spannungsmessung am Analogpin ein permanent schwankendes Signal.

Der Programmcode dazu ist mir im Augenblick erstmal noch relativ egal, denn ohne eine funktionierende Hardwaregrundlage weiss ich ja nicht, was ich wie ansteuern will/muss.

Es wäre echt klasse, wenn die Cracks mich hier ein wenig auf den richtigen Weg bringen könnten, denn ich habe jetzt einige Literatur zum Arduino gelesen, aber irgendwie habe ich einen Haufen Zeug im Kopf ohne es zu einer Anwendung verknüpfen zu können.

Wahrscheinlich muss man einfach ein konkretes Projekt verfolgen und daran lernen, was man wo benötigt. Allerdings benötigt man da wohl einen ortskundigen Frendenführer fürs Arduinoland, wie mir scheint.

VG
Y.

Wie meinst du das nun mit der "Wechselspannung"? Soll das lediglich eine gepulste Gleichspannung sein? Wenn ja, so erreichst du die 3kHz problemlos mit einem HardwarePWM Pin des Arduinos. Ob aber das ganze mit der Widerstandsmessung wirklich aufgeht, solltest du vorher testen mit einem Multimeter anstelle des Arduinos. Ich gehe davon aus, das es nicht so einfach wird, da hier keine ausreichende Auflösung erreicht wird.

Hallo,

danke für deine Antwort. Eine gepulste Spannung wird da leider nicht reichen, da die Wechselspannung zwischen den Messelektroden die Elektrolyse der Flüssigkeit verhindert.

VG
CE

Du brauchst ja keine sinusförmige Wechselspannung sondern musst nur ständig umpolen damit deine Elektroden nicht so schnell korrodieren.
Eigentlich müsste es doch reichen mit zwei Ausgängen ein Rechtecksignal zu erzeugen welches ständig umpolt.

Du erzeugst z.B. Pin 2 deine 3KHz und benutzt Pin 3 als Masse. Dann schaltest du um, belegst Pin 3 mit deinem Signal und benutzt Pin 2 als Masse.
Danach musst doch noch deinen Widerstandswert ermitteln mit einem analogen Eingang.

Hi,

zwei Pins wechselseitig zu schalten, war auch zunächst meine Idee, allerdings habe ich keine Lösung gefunden die Messung vorzunehmen.

VG
CE

Du könntest dir parallel dazu einen kleinen Spannungsteiler aufbauen und mit dem analogen Eingang verbinden. Immer wenn ein Ausgangspin high hat liest du deine Spannung ein und errechnest dir den Wiederstand. So mal die Theorie...
Wie kommst du denn auf die 3 KHz?

Scherheinz:
Du könntest dir parallel dazu einen kleinen Spannungsteiler aufbauen und mit dem analogen Eingang verbinden. Immer wenn ein Ausgangspin high hat liest du deine Spannung ein und errechnest dir den Wiederstand. So mal die Theorie...
Wie kommst du denn auf die 3 KHz?

Bei meiner Recherche im Netz habe ich an verschiedenen Stellen gelesen, dass die 3 KHz ein guter Wert sind, um Elektrolyse zu verhindern. Gasbläschen auf den Elektroden würden den Leitwert ja auch kräftig verändern, deswegen ist eine Messung mit Gleichspannung nicht wirklich optimal bzw. mit starken Abweichungen behaftet.

Früher gab es für den Arduino auch mal einen Sensor, der das alles schon selbst gemacht hat. Leider wird der nicht mehr hergestellt und die Restbestände sind sauteuer.
Außerdem lernt man da auch weniger bei.

VG
CE

Ein zusätzliches Messgerät für die Referenz bräuchtest du ja schon noch, oder?

Scherheinz:
Ein zusätzliches Messgerät für die Referenz bräuchtest du ja schon noch, oder?

Eigentlich nicht, meiner (Anfänger) Meinung nach: Wenn man wirklich mit einem Spannungsteiler arbeitet, so hab ich ja einen Referenzwiderstand im Spannungsteiler selbst. Da müsste man nur ein wenig investieren, damit man eine möglichst geringe Toleranz erzielt. Wobei da wahrschienlich irgendwann die Frage akut wird, mit wieviel Toleranz der restliche Arduino arbeitet.

VG
CE

Oder aus was die Elektroden bestehen, die Abmaßungen, die Abstände, wie weit tauchen sie ein, Leitungswiderstände....
ich denke da gibt es viele Faktoren...

Hardwaregechnisch würde ich den Sensor zwischen einem pwm- und einem normalen pin verbauen.

Fall 1: normaler pin Low
Spg zwischen widerstand und Sensor messen

Fall 2: normaler pin High
Nix tun.

Mit Hilfe des bekannten widerstandes kannst du den Leitwert des Sensors berechnen.

Messfehler durch Elektrolyse entstehen ja durch die Wechselspg erst garnicht :wink:

Hallo,

mittels programmierten Timer könnte man doch 2 Pins per Port-Register im Timer ISR Handler zeitgleich umschalten lassen. Damit hätte man eine sauber wechselnde Polung. Nur wie man dann den Strom oder Spannung wegen der wechselnden Polung einliest entzieht sich noch meiner Kenntnis.

Hallo,

also ich würde das wie in der Skizze im Anhang aufbauen.

Die Softwareseite ist dann recht übersichtlich, man schaltet die digitalen Pins wechselseitig auf High und Low. Dadurch fließt der Strom abwechselnd von links nach rechts und umgekehrt. Das ist Wechselstrom.
Über die Beiden analog Eingänge kann man den sich ergebenden Spannungsteiler vollständig messen. Über den bekannten Vorwiderstand kann man den Strom rechnen, I = Umess/Rv (auf der jeweiligen LOW Seite). Und der Widerstand des Mediums ist dan Rx= Udiff/I. (Wobei Udiff die Differenz zwischen analog0 und analog 1 ist. Also man muß nur je nach dem ich welche richtung gerade der Srtom fließt analog1-analog2 bzw. analog2-analog1 rechnen.) Ohmsches Gesetz bzw. Kirchhoffsches Gesetz :wink: Die Schaltgeschwindigkeit wird in erster Linie von den langsamen analog-Reads begrenzt.

Klar, gegenüber Schalungsmasse liegt man im Mittel auf +2.5V aber das ist völlig bedeutungslos solange es keine Masseverbindung gibt (auch nicht z.B. über die Stromversorgung u.s.w.). Also Batterie- oder Akkubetrieb oder notfalls über einen isolierten DC-DC Wandler.

Sehr problemaisch ist aber der Zusammenhang zwischen Sensorelektroden und Widerstand, das hängt u.a. von der Oberfläche und auch vom Material ab; wird jedenfalls ohne Vergleich und Kalibierung mit Referenzgerät nichts.

Auch wird man noch eine Schutzbeschalung hinzufügen müssen um Fremdspannung von den Eingängen sicher fernzuhalten, >6V von außen killen den ATMEGA rasch und zuverlässig!

Christian

Sensor.jpg

Welche Flüssigkeit willst Du messen? In welchen Bereich ändert sich der Leitwert?

Grüße Uwe

Hallo,

schön, dass es hier so fleissig weitergegangen ist, während ich verreisen musste. Wieder zurück, wird jetzt weitergebastelt.

Inzwischen habe ich eine Möglichkeit gefunden, wie jemand schon einmal mit einem Microcontroller die Messung durch gezogen hat. Mir fehlen noch so ein wenig die Grundlagen, das alles zu verstehen und auch zu programmieren, aber es klingt irgendwie pfiffig für mich:

Die schaltung, die ich im Netz gefunden habe, benutzt die zu messende Flüssigkeit, um den Kondensator eines RC-Gliedes zu laden. Hierbei wird die Zeit gemessen, und so aus der Formel t= R*C nach R aufgelöst.

Der Trick ist dabei der, dass der Microcontroller mit seinen Ein-/Ausgängen als Schmitt-Trigger arbeitet und so über die State-Änderung des Eingangs merkt, wenn der Kondensator geladen ist.

Als abschließender Clou ist die Kapazität des Kondensators mit 3,3nF so gewählt, dass die Ladevorgänge so schnell ablaufen, dass dabei der Strom mit 3kHz zwischen den Pins geschaltet und so Elektrolyse verhindert wird.

Mein Problem als Beginner besteht jetzt darin nicht abschätzen zu können, ob man das mit dem Arduino auch umsetzen kann bzw. wie.

Bitte nicht falsch verstehen, denn ich weiss, dass man leicht in den Verdacht kommt, alles vorgekaut haben zu wollen, aber könnt ihr mich auf die Schiene setzen, wie ich mir die notwendigen Skills aneigenn kann, denn ich will verstehen und nicht einfach etwas bestehendes unreflektiert nachbauen. Reicht ja, wenn ich mir das Messprinzip zu nutze mache.

Ich habe hier übrigens eine kleinen Leitwertmesser aus China, der in der Bucht etwa einen 10er kostet. Der misst temperaturkompensiert von 0-999µS und bei dem geringen Preis dachte ich schon dran, ihn einfach zu hacken, aber leider habe ich keine Infos über sein Innenleben und wüsste nicht, an welcher Stelle ich die Messwerte abgreifen sollte.
Außerdem möchte ich ja automatisiert in regelmäßigen Abständen messen, um eine Verlaufskurve aufnehmen zu können.

VG
CE

Confusedelectron:
Früher gab es für den Arduino auch mal einen Sensor, der das alles schon selbst gemacht hat. Leider wird der nicht mehr hergestellt und die Restbestände sind sauteuer.

Arduino-Conductivity-Sensor
Das kann zwar preislich nicht mit einem 10Euro China-Teil mithalten, Sauteuer finde ich das aber auch nicht.

Oder http:/E-C-meter-for-Arduino-with-Grove-connector-Conductivity-circuit-ATC
Da kommt es dann auf den Sensor an.

Confusedelectron:
Der Trick ist dabei der, dass der Microcontroller mit seinen Ein-/Ausgängen als Schmitt-Trigger arbeitet und so über die State-Änderung des Eingangs merkt, wenn der Kondensator geladen ist.

Das ist aber sehr ungenau. Die Schaltschwellen der digitalen Eingänge sind nicht definiert und können über Temperatur, Alterung etc stark schwanken.

Du könntest höchsten den analogen Komperator des ATMega323 verwenden, aber der ist in der Arduino-Bibliothek nicht enthalten und, je nach Pinnutzung, hast du dann keinen AD-Wandler mehr.

Besser ist sicherlich die Schaltung aus Post #12 von dir. Wobei du dir einen Widerstand und einen AD sparen kannst, weil Rv und der Widerstand des Sensors ja den Spannungsteiler bilden.
Zwischenablage01.jpg

Der zugehörige Code könnte (Stark vereinfacht) in etwa so aussehen:

void loop() {
  digitalWrite(D2,HIGH);   // Positive Spannung am Sensor anlegen
  digitalWrite(D3,LOW);
  int Messwert1 = analogread(A0);
  digitalWrite(D2,LOW);   // Negative Spannung am Sensor anlegen
  digitalWrite(D3,HIGH);
  int Messwert2 = analogread(A0);
  digitalWrite(D3,LOW);     // Spannung Null  am Sensor anlegen

  Serial.print("Messwerte 1 und 2: "];
  Serial.print(Messwert1); Serial.print("\t");
  Serial.println(Messwert2);
}

Hallo,

sehr schön Zeichnung Gunther. :slight_smile:
Zur weiteren Verarbeitung braucht er dann nur einen analogen Meßwert. Den anderen würde ich drin lassen, damit die Frequenz symmetrisch bleibt.

Hi,

danke für eure Anregungen, dann werde ich es wohl so einmal probieren. Dabei fällt mir gerade ein:

Wie schnell schaltet denn Arduino? Sollte ich ein delay einfügen um die Frequenz "einzustellen"?

Wahrscheinlich macht es auch Sinn eine bestimmte Anzahl Messwerte in ein Array zu schreiben und dann zu mitteln, oder wird das bei mir gerade ein gedanklicher Overkill?

VG
CE

Generell wird hier ja eigentlich meist von der Benutzung des delays abgeraten um noch mehrere andere sachen im code zu machen.

In deinem Fall soll ja aber nicht mehr viel anderes gemacht werden und die Einhaltung der Frequenz ist oberstes Gebot, daher würde ich vorschlagen, dass du das mit delay in einer Funktion verpackst und die dann im loop immer dann aufrufst, wenn du eine Messung machen willst.

So kannst du z.B. immer nur alle X Sekunden deine Messung machen.
(siehe hierzu Beispiel ohne delay() )

Denk aber daran, dass du mit delay() in Millisekunden wartest.
Da kommst du nicht in deinen Frequenzbereich, weil du 0,3ms warten müsstest.

Es müsste etwa so aussehen:

void Messung()
{
  int Frequenz = 3000; // Angabe in Hz
  long Microdelay = 1000000 / Frequenz; 
 
  digitalWrite(D2,HIGH);   // Positive Spannung am Sensor anlegen
  digitalWrite(D3,LOW);
  int Messwert1 = analogread(A0);

  delayMicroseconds(Microdelay);

  digitalWrite(D2,LOW);   // Negative Spannung am Sensor anlegen
  digitalWrite(D3,HIGH);
  int Messwert2 = analogread(A0);
  delayMicroseconds(Microdelay);

  digitalWrite(D3,LOW);     // Spannung Null  am Sensor anlegen

  Serial.print("Messwerte 1 und 2: "];
  Serial.print(Messwert1); Serial.print("\t");
  Serial.println(Messwert2);

}

Dennoch würde ich dir empfehlen das Ganze dann noch über ein Oszilloskop zu messen, was für Pulse dabei raus kommen.
Das High und Low setzen der Pins dauert ne Zeit (war jedenfalls für mich bei IR Steuerung vom Fernseher wichtig... waren das 13ns?) und die delay-Funktionen sind auch leider recht schwammig...
Also verlasse dich nicht darauf, dass dein korrektes Programm auch korrekte Ausgaben erzeugt.
Ist mir selbst leider schon ein paar mal passiert.

Liebe Grüße