Partage
  • Partager sur Facebook
  • Partager sur Twitter

Sonde de Conductivité Arduino

    27 mars 2019 à 15:07:02

    Pour mon projet, je dois faire pour un aquarium un dispositif permettant mesurer le niveau d'eau.

    J'ai décidé d'utiliser 2 sondes de conductivité K1 DFR0300 sachant que je vais utiliser un arduino uno.

    Voici comment mon projet fonctionne:

    - lorsque l'eau arrive à la 1ère sonde, elle mesure la conductivité de l'eau et envoie l'information, on sait donc que l'eau est arrivée à 60% du niveau d'eau vu que la sonde a envoyé l'information.

    - lorsque l'eau arrive à la 2ème sonde, on sait donc que l'eau a atteint 80% du niveau de l'aquarium.

    On ne s'intéresse donc pas à la conductivité de l'eau mais seulement au fait que l'eau soit arrivée à la sonde

    J'ai besoin d'aide pour comprendre et modifier le code donné (Attention! Il est très long!) pour cette sonde de façon à ce qu'elle ne mesure que la conductivité. Car je n'arrive pas à comprendre ce code et à savoir ce qui serait inutile à mon programme.

    Merci d'avance!

    Cordialement!

    Sébastien

    #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; 
    }

    • Partager sur Facebook
    • Partager sur Twitter
      5 août 2019 à 16:20:25

      Salut pourquoi tu utilises pas simplement deux capteurs de niveau d'eau ?
      • Partager sur Facebook
      • Partager sur Twitter
        6 août 2019 à 18:53:15

        Pourquoi pas un capteur de distance qui serait dans le haut de ton aquarium , avec un simple différence tu aurais le niveau exacte de ton eau ( au lieu de ne pas savori si tu es a 61% ou 79%) ?
        • Partager sur Facebook
        • Partager sur Twitter

        Sonde de Conductivité Arduino

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown