Skip to content

TDS Water Quality Sensor

TDS-sensor-768x598

Use this sensitive measurement board to determine the quality of water based on its total dissolved solids or TDS. Find out whether your tap water is clean, or keep an eye on your aquarium water, and more!

This set includes the measurement board as well as a detachable water-proof measurement probe of 60 cm. The board has a standard 3-pin header interface connector and has a simple analog voltage readout.

The TDS measurement ranges from 0 – 1000 ppm, and has an accuracy of ± 10 % full-scale at 25 °C.

Source: https://www.velleman.eu/downloads/25/prototyping/manual_wpm356.pdf

Wiring Diagram

Pin Name Arduino® connection
- Ground GND
+ Supply Voltage (3,3 - 5,5 V) 5V
A Analog sensor output signal Analog Pin (e.g. A1)

image-910x1024

Example Code

#define TdsSensorPin A1   // Define PIN number on Arduino
#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(9600);
    pinMode(TdsSensorPin, INPUT); // define seonsor Pin as 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
        //tdsValue is the variable used to store the ppm (parts per million) value.
        // Serial.print("voltage:");
        //Serial.print(averageVoltage,2);
        //Serial.print("V ");
        Serial.print("TDS Value:");     //Serial ouput
        Serial.print(tdsValue, 0);      //Serial ouput with value from sensor
        Serial.println("ppm");          //Serial ouput
    }
}
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;
}