Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define TdsSensorPin A0
- #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;
- int copyIndex = 0;
- int highValue = 200;
- float averageVoltage = 0;
- float tdsValue = 0;
- float temperature = 25; // current temperature for compensation
- // median filtering algorithm
- 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;
- }
- void setup() {
- Serial.begin(115200);
- pinMode(8, OUTPUT);
- pinMode(9, OUTPUT);
- digitalWrite(8, LOW);
- digitalWrite(9, HIGH);
- 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];
- // read the analog value more stable by the median filtering algorithm, and convert to voltage value
- averageVoltage = getMedianNum(analogBufferTemp, SCOUNT) * (float)VREF / 1024.0;
- //temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02*(fTP-25.0));
- float compensationCoefficient = 1.0 + 0.02 * (temperature - 25.0);
- //temperature compensation
- float compensationVoltage = averageVoltage / compensationCoefficient;
- //convert voltage value to tds value
- tdsValue = (133.42 * compensationVoltage * compensationVoltage * compensationVoltage - 255.86 * compensationVoltage * compensationVoltage + 857.39 * compensationVoltage) * 0.5;
- //Serial.print("voltage:");
- //Serial.print(averageVoltage,2);
- //Serial.print("V ");
- Serial.print("TDS Value:");
- Serial.print(tdsValue, 0);
- Serial.println("ppm");
- if (tdsValue > highValue) {
- digitalWrite(8, HIGH);
- digitalWrite(9, LOW);
- }
- else {
- digitalWrite(8, LOW);
- digitalWrite(9, HIGH);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement