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 staticbyte data[12]; staticbyte addr[8]; staticfloat 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; }
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%) ?
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.