Leitwert über MCP3221 messen

  • Halllo und guten Morgen

    Ich versuche den Leitwert zu messen. Mangels Zeit habe ich ein µCBoard von Sparkywidget.com bestellt. Darauf sitzt ein MCP3221 der an den I2C (SDA,SCL) Bus angeschlossen wird. Ich komm nicht ganz klar mit dem git rep wo ein Beispiel für den Arduino hinterlegt ist also musste ich mir mangels Beiträgen im Internet ein selber schreiben.
    Ich hab mir dann gestern ein Perl Skript geschrieben womit ich den ankommenden Messwert auslese und in eine DB schreibe. Der ausgelesene Wert ist hex, ich wandle den um in Dez. und lass mir den anzeigen. Der stimmt aber niemals was ich da lese. Es ist ja auch noch nichts kalibriert und ich hab kein Plan wie ich das integrieren soll.

    So wie ich das sehe oszilliert die Messwerterfassung und misst jeweils mit verschiedenen Spannungen wenn ich die Schaltung richtig deute, d. h. ich erhalte bei jeder Messung ein anderes Ergebnis von der Sonde. Der Wert selbst oszilliert und bewegt sich min. bei 23000µS/cm bis max. 39000µS/cm. ( Die Sonde hängt im Salzwasser, der erwartete Wert müsste sich bei 49000µS/cm einpendeln).
    Hier ist das Schaltbild des Boards -> https://github.com/SparkysWidgets…/MinieCV1_2.pdf

    Es gibt ein ähnliches Board für pH welches im Prinzip den pH auf ähnliche Weise misst. Dafür gibt es ein git rep und auch code dazu aber das ist in python. Davon hab ich keinen Plan und würde das gern auch in perl lösen um einigermaßen einheitlich zu bleiben.

    Hier das Python Skript:

    So ähnlich muss das auch den Leitwert gehen. Das pH Board hab ich auch noch hier zum anschließen, wollte aber erstmal die EC Sonde in Betrieb kriegen.

    Kann mir hier wer helfen und mich mal in die richtige Richtung schubsen? Hab die ganze Nacht gegoogelt aber das Board scheint nicht weit verbreitet....

  • Ich habe noch nicht eine Zeile Perl in meinem Leben programmiert, aber zur Not gelesen werde ich das bekommen. Es wuerde also helfen, wenn du mal deinen Code postest.

    Und das Python macht nichts anderes als zwei Bytes vom I2C-Bus einzulesen, und den resultierenden 12-Bit-Wert (also 0-4095) linear auf eine Skala von 0 - 14 abzubilden. Das ist ja nix als ein simpler Dreisatz. Genau da setzt man auch mit der Kalibration an.


  • Ich habe noch nicht eine Zeile Perl in meinem Leben programmiert, aber zur Not gelesen werde ich das bekommen. Es wuerde also helfen, wenn du mal deinen Code postest.

    Und das Python macht nichts anderes als zwei Bytes vom I2C-Bus einzulesen, und den resultierenden 12-Bit-Wert (also 0-4095) linear auf eine Skala von 0 - 14 abzubilden. Das ist ja nix als ein simpler Dreisatz. Genau da setzt man auch mit der Kalibration an.

    Hai

    ich kann gar nicht programmieren...ich bezeichne mich als Skripter. Daher muss ich so doof fragen weil ich das Prinzip nicht verstehe den Controller über den i2c Bus auszulesen. Das einzige was mir gelungen ist den aktuellen Wert in Echtzeit abzufragen und via Perl in eine Variable zu schreiben die ich wiederrum in eine rrd db schreibe zur Weiterverarbeitung.

    Das mache ich ganz simple mit:

    Mir fehlt hier der Rechenweg dahinter wie du schon bemerkt hast. Und da hörts bei mir auf. Leider.

    Ich müsste in der noch nicht vorhandenen Rechnung die Abweichung des Sensors mit einer Referenz einbeziehen. Da ich kurz und knapp nur den aktuellen Ist Wert auslese und unbehandelt anzeigen lasse sieht das Ganze dann so aus:

    ec.png

    Das haut natürlich nicht hin. Welchen Rechenweg muss ich gehen damit das passt?

    In dem python skript im ersten Fred wird die Messwertbestimmung des miniPH Moduls beschrieben welches ähnlich arbeitet. Vielleicht kann man da was ablesen. Wobei die Kalibrierung von pH Sonden auch ähnlich ablaufen sollte. Kalibrierung eines niedrigen Wertes, Mittelwert, Maximalwert.

    Ich wußte vorher schon das ich dem Punkt nicht weiter kommen würde und hatte auf Tante Google gehofft. Aber das Modul von Sparky ist noch nicht so weit verbreitet das jemand ein how-to veröffentlicht hätte. Ich bin schon einigermaßen froh das ich es geschafft habe das Winzmodul ohne es kaputt zu löten an den Pi angeschlossen zu bekommen und auslesen zu können an einem Abend.

    Edited once, last by 4zap (June 26, 2016 at 2:19 PM).

  • ich will ja kein Spielverderber sein aber man kann nicht oft genaug darauf hinweisen das der PI nicht 5V tolerant ist, die GPIO Ports können sterben.
    Dein Modul hat lt. Schaltbild pullups nach 5V, die sollte man nach dieser Anleitung entfernen

    ps915
    September 3, 2013 at 7:44 PM

    weil der PI eigene pullups nach 3,3V integriert hat(te?)

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • An sich ist das ja schon ganz ok - deine Rechnung um das in's RDD einzupflegen braucht halt noch einen Faktor und eine Verschiebung. Die zu bestimmen ist die Kunst. Dazu musst du Eichwerte ermitteln, fuer mindestens zwei, besser mehr bekannte pH-Werte. Und ggf. rauscht die ganze Geschichte noch, man sollte also ggf. glaetten.

    Mir waere es am liebsten, wenn du einfach mit Wasser, am besten natuerlich destilliert, die direkte Ausgabe von i2cget hier postest - ohne deine Umrechnung "hex($EC)/10". Und am besten mal mit einem Abstand von 1 Sekunde/Messwert, ueber ein paar Minuten.

    Dann wirst du aber auch nicht drum herum kommen eine wohldefinierte Fluessigkeit mit anderem pH-Wert zu besorgen & ebenfalls diese Messreihe zu erfassen.

  • Hallo Deetz

    ich hab diverse Kalibrierlösungen für Leitwert und pH (das pH Modul hab ich noch nicht dran, es geht hier um das Leitwert /EC Modul).
    Reinstwasser hab ich auch. Ein zweites Leitwertmessgerät als Referenz ist auch vorhanden.

    Ich setz mal diverse Messreihen inkl. Referenzmessungen (wobei das Referenzgerät nur bis 2000µS/m geht) und poste mal die Ergebnisse.
    Das aber später, Frau will zum Fussi :(

    Dank dir aber schonmal für deine Hilfe.

    jar: ich weiß, aber ist noch alles im grünen Bereich. Hatte auf die schnelle keinen 3.3er frei zum experimentieren. Werd das auf 3.3v umbasteln wenn das pH Modul mit angeschlossen wird. Da müssen die Pullups auf alle Fälle erstmal runter. Das Leitwert Modul macht da keine Zicken.

  • Hai

    hab jetzt mal drei verschiedene Lösungen gemessen. Ich hatte den Eindruck die Sonde reagiert stark verzögert.
    Die Werte im txt file sind original aus dem i2c bus im sekundentakt gemessen. Der Leitwerk schwantk immer leicht, d. h die Werte sind nie genau identisch auf den Punkt.

    Regelmäßigkeiten kann man nur grob erkennen. Wie verarbeite ich das weiter?


  • Hai

    wo wo wo (ich bin Fisch und reagiere auf Hai allergisch)

    Die Werte im txt file sind original aus dem i2c bus im sekundentakt gemessen. Der Leitwerk schwantk immer leicht

    scheint bei vielen Sensoren normal, ergo oversampling, viele Werte aufnehmen und den Mittelwert bilden

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)


  • Was mir auffällt: In allen drei Messreihen ist das 2. Byte jeweils konstant. Kann es sein, daß hier das weniger signifikante Byte zuerst ausgegeben wird?

    gut gesehen, das könnte natülich sein!

    Das ausgerechnet das letzte Byte immer konstant ist erscheint unlogisch!

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Edited once, last by jar (June 27, 2016 at 8:13 AM).

  • Das macht mich auch stutzig. Ich bin mir nicht sicher ob mir diese Werte was nutzen bzw. relevant sind.
    Die Idee mit dem Oversampling hatte ich auch schon, die Frage ist nur in welcher Frequenz und in welcher Zeit ich den Mittelwert ziehen soll. Da ich in den logs keine wirklich Wiederholungsfrequenz erkennen kann bin ich ziemlich ratlos wie ich die Werte weiterverarbeiten soll.
    Automatisch zusammengefügt:


    [quote='4zap','http://test.forum-raspberrypi.de/forum/index.ph…8406#post228406']
    Hai
    wo wo wo (ich bin Fisch und reagiere auf Hai allergisch)

    Bin auch Fisch und liebe Haie. Sorry für die Aufregung! :angel:

    Edited once, last by 4zap (June 27, 2016 at 10:07 AM).


  • Das macht mich auch stutzig. Ich bin mir nicht sicher ob mir diese Werte was nutzen bzw. relevant sind.
    Die Idee mit dem Oversampling hatte ich auch schon, die Frage ist nur in welcher Frequenz und in welcher Zeit ich den Mittelwert ziehen soll.

    du solltest vorher die Byteorder prüfen

    Du könntest auch in 2 Versuchsreihen
    https://de.wikipedia.org/wiki/Byte-Reihenfolge
    Byteorder Big-Endian
    Byteorder Little-Endian

    mit Wasser und verschiedenen Salzlösungen Messreihen aufstellen

    mich irritiert wirklich das das hintereste Byte sich nicht bewegt.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Es gibt eine Implementierung des Boards für Arduino (ich glaub das wurde auf einem Mega abgebildet)

    MiniEC.ino heißt die Datei im Git rep. / Nur hab ich davon noch weniger Plan. Wenn ich mir das anschaue

    Ich sehe hier das immer EClow EChigh Werte definiert sind. Also Oversampling. Ich kenn mich hier mit dem Arduino Skript aber nicht aus und weiß nicht wie ich das auf perl umbastele. Ich fummel das Arduino skript nachher mal auseinander und schau mal ob sich mir hier was erschließt.... muss erstmal was arbeiten....so produktives zeugs erstmal...


  • ...Der folgende link scheint übrigens meine Vermutung bzgl. der byte order zu bestätigen....

    auch das unveränderte letzte Byte zeigt ja in diese Richtung, das ist nicht normal das alle Bytes hinten unverändert sind über viele Messungen.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Sagte ich doch oben - deshalb bin ich ja überhaupt erst auf die Idee gekommen. Ich wollte halt noch schauen, ob ich im Netz dazu was finde. Die C- und Pythonbeispiele haben halt erst mal dagegen gesprochen, daher blieb nach Blick ins Perlskript eigentlich nur noch i2cget als Kandidat für die verdrehte Bytereihenfolge.


  • Sagte ich doch oben -

    eben und genau deswegen bin ich deiner Meinung zu 100% da braucht man über Mittelwert nicht zu sinnieren!

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Kein Oversampling,... schon verstanden. Wenn ich mir das Arduino Skript genauer anschaue (welches ich nicht wirklich verstehe) sehe ich

    Code
    params;
    
    
    float eC, temperatute;
    const int I2CadcVRef = 4948;
    const int oscV = 185; //voltage of oscillator output after voltage divider in millivolts i.e 120mV (measured AC RMS) ideal output is about 180-230mV range   
    const float kCell = 1.0; //set our Kcell constant basically our microsiemesn conversion 10-6 for 1 10-7 for 10 and 10-5 for .1
    const float Rgain = 3000.0; //this is the measured value of the R9 resistor in ohms

    und

    Code
    void calcEc(int raw)
    {
    float temp, tempmv, tempgain, Rprobe;
    tempmv = (float)i2cADC.calcMillivolts(raw);
    tempgain = (tempmv / (float)oscV) - 1.0; // what is our overall gain again so we can cal our probe leg portion
    Rprobe = (Rgain / tempgain); // this is our actually Resistivity
    temp = ((1000000) * kCell) / Rprobe; // this is where we convert to uS inversing so removed neg exponant
    eC = temp / 1000.0; //convert to EC from uS
    }

    sehe ich den Rechenweg und die Parameter die verwendet werden. In dem Skript werden die Werte der Kalibrierung in einem Eeprom abgelegt um sie bei Stromausfall nicht neu erstellen zu müssen. params.eCLowCal und params.eCHighCal enthält wohl die Daten zur Abweichung vom gelesenen Messwert. Das ist komplexer als ich dachte. Ohne Hilfe krieg ich das nicht zusammen.


  • ......params.eCLowCal und params.eCHighCal enthält wohl die Daten zur Abweichung vom gelesenen Messwert. Das ist komplexer als ich dachte. Ohne Hilfe krieg ich das nicht zusammen.

    wieso du brauchst doch "nur" 2 Byte zu swappen

    geht bestimmt auch eleganter aber ich sags mal so und einfach

    hilf1 = variable;
    hilf2 = variable;

    hilf1/=256; // oder um 8 Bit nach rechts geschoben
    hilf2 &=0x00FF; // oberste 8 Bit genullt
    hilf2*=256; // um 8 Bits nach links geschoben

    variable = hilf1 + hilf2;

    sollt Byteswap sein.


    Code
    Unsigned 16 bit conversion:
    swapped = (num>>8) | (num<<8);

    das soll es auch geben....

    By including:

    #include <byteswap.h>
    __bswap_16 (uint16_t input)

    kenne ich aber nicht

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Edited once, last by jar (June 27, 2016 at 2:19 PM).

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!