Analog_EC_Meter_SKU_DFR0300-DFRobot

Introduction

Specification

Electrode Size

EC_size.png

Use the EC Meter (Elementary)

Connecting Diagram

EC_Meter_Sys.png

Step to Use the EC Meter

Cautions

STEPS

  1. Connect equipments according to the connecting diagram, that is, the conductivity electrode is connected to the BNC connector on the EC meter board, and then use the analog connection line, the EC meter board is connected to the anlong pin 1 of the Arduino controller. The temperature sensor is connected to the connecting terminal of the terminal sensor adapter. Then you should use the digital connection line, the terminal sensor adapter is connected to the digital pin2 of the Arduino controller. When the Arduino controller gets power,you will see the blue LED on board is on.

  2. Upload the sample code to the Arduino controller.

    step 3

  3. Open the serial monitor of the Arduino IDE, you will see some information such as temperature, voltage, conductivity and so on. If you don't put the electorde in the solution, you will see "No solution!"

  4. Put the conductivity electrode and temperature sensor into the calibration solution, stir the solution for some time and wait for the stable readings. If the conductivity reading on the serial monitor is close to the solution's conductivity, you can apply it in your project now. e.g. The conductivity of the solution is 1413us/cm.

    <File:20140408120506.jpg>

Sample Code

Firstly, please install the library OneWire.


// #
// # Editor     : YouYou from DFRobot
// # Date       : 23.04.2014
// # E-Mail : youyou.yu@dfrobot.com

// # Product name: Analog EC Meter
// # Product SKU : DFR0300
// # Version     : 1.0

// # Description:
// # Sample code for testing the EC meter and get the data feedback from the Arduino Serial Monitor.

// # Connection:
// #        EC meter output     -> Analog pin 1
// #        DS18B20 digital pin -> Digital pin 2
// #

#include <OneWire.h>

#define StartConvert 0
#define ReadTemperature 1

const byte numReadings = 20;     //the number of sample times
byte ECsensorPin = A1;  //EC Meter analog output,pin on analog 1
byte DS18B20_Pin = 2; //DS18B20 signal, pin on digital 2
unsigned int AnalogSampleInterval=25,printInterval=700,tempSampleInterval=850;  //analog sample interval;serial print interval;temperature sample interval
unsigned int readings[numReadings];      // the readings from the analog input
byte index = 0;                  // the index of the current reading
unsigned long AnalogValueTotal = 0;                  // the running total
unsigned int AnalogAverage = 0,averageVoltage=0;                // the average
unsigned long AnalogSampleTime,printTime,tempSampleTime;
float temperature,ECcurrent;

//Temperature chip i/o
OneWire ds(DS18B20_Pin);  // on digital pin 2

void setup() {
 // initialize serial communication with computer:
  Serial.begin(115200);
  // initialize all the readings to 0:
  for (byte thisReading = 0; thisReading < numReadings; thisReading++)
    readings[thisReading] = 0;
  TempProcess(StartConvert);   //let the DS18B20 start the convert
  AnalogSampleTime=millis();
  printTime=millis();
  tempSampleTime=millis();
}

void loop() {
  /*
   Every once in a while,sample the analog value and calculate the average.
  */
  if(millis()-AnalogSampleTime>=AnalogSampleInterval)
  {
    AnalogSampleTime=millis();
     // subtract the last reading:
    AnalogValueTotal = AnalogValueTotal - readings[index];
    // read from the sensor:
    readings[index] = analogRead(ECsensorPin);
    // add the reading to the total:
    AnalogValueTotal = AnalogValueTotal + readings[index];
    // advance to the next position in the array:
    index = index + 1;
    // if we're at the end of the array...
    if (index >= numReadings)
    // ...wrap around to the beginning:
    index = 0;
    // calculate the average:
    AnalogAverage = AnalogValueTotal / numReadings;
  }
  /*
   Every once in a while,MCU read the temperature from the DS18B20 and then let the DS18B20 start the convert.
   Attention:The interval between start the convert and read the temperature should be greater than 750 millisecond,or the temperature is not accurate!
  */
   if(millis()-tempSampleTime>=tempSampleInterval)
  {
    tempSampleTime=millis();
    temperature = TempProcess(ReadTemperature);  // read the current temperature from the  DS18B20
    TempProcess(StartConvert);                   //after the reading,start the convert for next reading
  }
   /*
   Every once in a while,print the information on the serial monitor.
  */
  if(millis()-printTime>=printInterval)
  {
    printTime=millis();
    averageVoltage=AnalogAverage*(float)5000/1024;
    Serial.print("Analog value:");
    Serial.print(AnalogAverage);   //analog average,from 0 to 1023
    Serial.print("    Voltage:");
    Serial.print(averageVoltage);  //millivolt average,from 0mv to 4995mV
    Serial.print("mV    ");
    Serial.print("temp:");
    Serial.print(temperature);    //current temperature
    Serial.print("^C     EC:");

    float TempCoefficient=1.0+0.0185*(temperature-25.0);    //temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.0185*(fTP-25.0));
    float CoefficientVolatge=(float)averageVoltage/TempCoefficient;
    if(CoefficientVolatge<150)Serial.println("No solution!");   //25^C 1413us/cm<-->about 216mv  if the voltage(compensate)<150,that is <1ms/cm,out of the range
    else if(CoefficientVolatge>3300)Serial.println("Out of the range!");  //>20ms/cm,out of the range
    else
    {
      if(CoefficientVolatge<=448)ECcurrent=6.84*CoefficientVolatge-64.32;   //1ms/cm<EC<=3ms/cm
      else if(CoefficientVolatge<=1457)ECcurrent=6.98*CoefficientVolatge-127;  //3ms/cm<EC<=10ms/cm
      else ECcurrent=5.3*CoefficientVolatge+2278;                           //10ms/cm<EC<20ms/cm
      ECcurrent/=1000;    //convert us/cm to ms/cm
      Serial.print(ECcurrent,2);  //two decimal
      Serial.println("ms/cm");
    }
  }

}
/*
ch=0,let the DS18B20 start the convert;ch=1,MCU read the current temperature from the DS18B20.
*/
float TempProcess(bool ch)
{
  //returns the temperature from one DS18B20 in DEG Celsius
  static byte data[12];
  static byte addr[8];
  static float TemperatureSum;
  if(!ch){
          if ( !ds.search(addr)) {
              Serial.println("no more sensors on chain, reset search!");
              ds.reset_search();
              return 0;
          }
          if ( OneWire::crc8( addr, 7) != addr[7]) {
              Serial.println("CRC is not valid!");
              return 0;
          }
          if ( addr[0] != 0x10 && addr[0] != 0x28) {
              Serial.print("Device is not recognized!");
              return 0;
          }
          ds.reset();
          ds.select(addr);
          ds.write(0x44,1); // start conversion, with parasite power on at the end
  }
  else{
          byte present = ds.reset();
          ds.select(addr);
          ds.write(0xBE); // Read Scratchpad
          for (int i = 0; i < 9; i++) { // we need 9 bytes
            data[i] = ds.read();
          }
          ds.reset_search();
          byte MSB = data[1];
          byte LSB = data[0];
          float tempRead = ((MSB << 8) | LSB); //using two's compliment
          TemperatureSum = tempRead / 16;
    }
          return TemperatureSum;
}

Use the EC Meter (Advanced)

According to the above-mentioned steps, you can easily measure the conductivity between 1ms/cm to 20ms/cm. But the vessel constant of each electrode is different, so the accuracy is not very high. You need calibration. So the following will introduce the principle of measurement and scheme of calibration.

Principle of Measurement

Firstly, please open the schematic and find the chip U3B. It consists of the reverse scaled circuit. The transfer function is Vo=R10/R*Vi. R10 is a feedback resistance and it's value is 820ohm according to the schematic. R is the resisitance when the electrode inserted in aqueous solution. It's value is related to the conductivity of the aqueous solution. R10/R is called magnification. When the R is changed, the magnification is also changed, so the Vo changed.So Vo is related to R. On the right of the reverse scaled circuit, there is a absolute-value circuit. It's transfer function is Vo=|vi|. Arduino samples the output of the absolute-value circuit to calculate conductivity. The following analyses the calibration principle. Definition of resistance:dzdy.jpg ρ is the resistivity; L is the length of the resistor element; A is the cross section of a resistor. For the conductivity electrode, L is the spacing between two conductive sheets, A is the area of ​​the conductive sheet. Definition of conductivity:dddy.jpg According to the above two equations, we can get this equation:gxs.jpg 1/R is called conduction G.L/A is called vessel constant Q. The transfer function of the measurement circuit is: transfer.jpg R is the resistance of the electrode when inserted into aqueous solution. In conclusion, we can get this equation:result.jpg Q is the vessel constant. It is a constant and different from each electrode. In the schematic, R10 is 820Ω.|Vin| is also a constant depend on the signal generating circuit. It's value is about 200mV. So we can see, the conductivity is linear with the output voltage.

Scheme of Calibration

For step4. The relationship between the analog reading and the EC

  1. Make your solution temperature be at 25℃
  2. Do the wiring according to the above connecting diagram
  3. Upload the sample code in the above section: Sample Code
  4. Insert the probes (the conductivity electrode and the temperature sensor) into the solution A, e.g. the sample EC solution, 1413 uS/cm, and open the Arduino Serial monitor, you will read a average voltage, take it as V1. So the two numbers (V1, 1.413) composed to the first point A in the picture on the right: (X1, Y1) = (V1, 1.413)
  5. Take out the probes and clean it with pure water
  6. Then submerge them again into another sample EC solution, 12.88ms/cm. read another average Voltage as V2. Now you get another point B in the above picture, namely: (X2, Y2) = (V2, 12.88)
  7. With the two points (x1, y1) and (x2, y2), you can draw out the line to describe the relationship between the analog reading and the EC. Reading: how to draw out the line

This is how the three equations were calculated out using different EC solutions inbetween 1ms/cm ~ 3ms/cm ~ 10ms/cm ~ 20ms/cm in the sample code

if(CoefficientVolatge<=448)ECcurrent=6.84*CoefficientVolatge-64.32;   //1ms/cm<EC<=3ms/cm
else if(CoefficientVolatge<=1457)ECcurrent=6.98*CoefficientVolatge-127;  //3ms/cm<EC<=10ms/cm
else ECcurrent=5.3*CoefficientVolatge+2278;                           //10ms/cm<EC<20ms/cm

NOTE: This is a video about EC Calibration And you can get its code on Github.

Precautions

FAQ

Q&A Some general Arduino Problems/FAQ/Tips
Q Can you give me details of conductivity solutions?
A There are two kinds of EC solution for the four bottles. They are 1413 uS/cm and 12.88ms/cm.

For any questions/advice/cool ideas to share, please visit DFRobot Forum.

More Documents