Last active
December 2, 2018 22:23
-
-
Save marcozecchini/b4adf8256d419ae6aa7c9c2f92172313 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define TdsSensorPin A1 | |
#define VREF 5.0 // analog reference voltage(Volt) of the ADC | |
#define SCOUNT 30 // sum of sample point | |
int analogBuffer[SCOUNT]; // store the analog value in the array, read from ADC | |
int analogBufferTemp[SCOUNT]; | |
int analogBufferIndex = 0,copyIndex = 0; | |
float averageVoltage = 0,tdsValue = 0,temperature = 25; | |
void setup() | |
{ | |
Serial.begin(115200); | |
pinMode(TdsSensorPin,INPUT); | |
} | |
void loop() | |
{ | |
static unsigned long analogSampleTimepoint = millis(); | |
if(millis()-analogSampleTimepoint > 40U) //every 40 milliseconds,read the analog value from the ADC | |
{ | |
analogSampleTimepoint = millis(); | |
analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin); //read the analog value and store into the buffer | |
analogBufferIndex++; | |
if(analogBufferIndex == SCOUNT) | |
analogBufferIndex = 0; | |
} | |
static unsigned long printTimepoint = millis(); | |
if(millis()-printTimepoint > 800U) | |
{ | |
printTimepoint = millis(); | |
for(copyIndex=0;copyIndex<SCOUNT;copyIndex++) | |
analogBufferTemp[copyIndex]= analogBuffer[copyIndex]; | |
averageVoltage = getMedianNum(analogBufferTemp,SCOUNT) * (float)VREF / 1024.0; // read the analog value more stable by the median filtering algorithm, and convert to voltage value | |
float compensationCoefficient=1.0+0.02*(temperature-25.0); //temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02*(fTP-25.0)); | |
float compensationVolatge=averageVoltage/compensationCoefficient; //temperature compensation | |
tdsValue=(133.42*compensationVolatge*compensationVolatge*compensationVolatge - 255.86*compensationVolatge*compensationVolatge + 857.39*compensationVolatge)*0.5; //convert voltage value to tds value | |
//Serial.print("voltage:"); | |
//Serial.print(averageVoltage,2); | |
//Serial.print("V "); | |
Serial.print("TDS Value:"); | |
Serial.print(tdsValue,0); | |
Serial.println("ppm"); | |
} | |
} | |
int getMedianNum(int bArray[], int iFilterLen) | |
{ | |
int bTab[iFilterLen]; | |
for (byte i = 0; i<iFilterLen; i++) | |
bTab[i] = bArray[i]; | |
int i, j, bTemp; | |
for (j = 0; j < iFilterLen - 1; j++) | |
{ | |
for (i = 0; i < iFilterLen - j - 1; i++) | |
{ | |
if (bTab[i] > bTab[i + 1]) | |
{ | |
bTemp = bTab[i]; | |
bTab[i] = bTab[i + 1]; | |
bTab[i + 1] = bTemp; | |
} | |
} | |
} | |
if ((iFilterLen & 1) > 0) | |
bTemp = bTab[(iFilterLen - 1) / 2]; | |
else | |
bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2; | |
return bTemp; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment