Dans ce guide, vous apprendrez à utiliser un compteur TDS (Total Dissolved Solids) avec l’ESP32. Un compteur TDS indique le total des solides dissous comme les sels, les minéraux et les métaux, dans une solution. Ce paramètre peut être utilisé pour vous donner une idée de la qualité de l’eau et comparer l’eau de différentes sources. L’une des principales applications d’un compteur TDS est la surveillance de la qualité de l’eau de l’aquarium.

Nous utiliserons le compteur TDS de keystudio et vous montrerons un exemple simple pour mesurer le TDS en unités ppm à l’aide de l’IDE Arduino.
Table des matières
Dans ce didacticiel, nous aborderons les sujets suivants
Présentation du compteur TDS
Un compteur TDS mesure le nombre total de solides dissous comme les sels, les minéraux et les métaux dans l’eau. À mesure que le nombre de solides dissous dans l’eau augmente, la conductivité de l’eau augmente, ce qui nous permet de calculer le total des solides dissous en ppm (mg/L).

Bien qu’il s’agisse d’un bon indicateur pour surveiller la qualité de l’eau, notez qu’il ne mesure pas les contaminants dans l’eau. Ainsi, vous ne pouvez pas vous fier uniquement à cet indicateur pour déterminer si l’eau est bonne à la consommation ou non.
Un compteur TDS peut être utile pour surveiller la qualité de l’eau dans de nombreuses applications telles que les piscines, les aquariums, les aquariums, la culture hydroponique, les purificateurs d’eau, etc.
Dans ce tutoriel, nous utiliserons le compteur TDS de keystudio qui est livré avec un module d’interface et une sonde à électrode (voir image ci-dessus).
Pour plus d’informations sur le compteur TDS, nous vous recommandons de consulter le documents officiels.
Caractéristiques et spécifications
Ce tutoriel fait référence au TDS Meter V1.0 de keystudio. Voici les paramètres du capteur :
Mètre TDS :
- Tension d’entrée : cc 3,3 ~ 5,5 V.
- Tension de sortie : 0 ~ 2,3 V
- Courant de fonctionnement : 3 ~ 6 mA
- Plage de mesure TDS : 0 ~ 1000 ppm
- Précision de mesure TDS : ± 10 % FS (25 ℃)
- Interface de modules : XH2.54-3P
- Interface d’électrode : XH2.54-2P
Sonde TDS :
- Nombre d’aiguilles : 2
- Longueur totale : 60 cm
- Interface de connexion : XH2.54-2P
- Couleur blanche
- Sonde étanche
Où acheter le capteur TDS ?
Vous pouvez vérifier le capteur TDS sur Maker Advisor pour trouver le meilleur prix :
Vous pouvez utiliser les liens précédents ou accéder directement à MakerAdvisor.com/tools pour trouver toutes les pièces pour vos projets au meilleur prix !
Interfaçage du compteur TDS avec l’ESP32
Le compteur TDS émet un signal analogique qui peut être mesuré à l’aide d’une broche ADC sur l’ESP32. Vous pouvez vérifier les broches ESP32 ADC ici.
Câblez le capteur comme dans le tableau suivant :
| Capteur TDS | ESP32 |
| Terre | Terre |
| VCC | 3.3V |
| Données | GPIO 27 (ou toute autre broche ADC ESP32) |
Lecture TDS (qualité de l’eau) avec l’ESP32 – Code
Comme nous l’avons mentionné précédemment, le capteur émet un signal analogique qui peut être converti en TDS en ppm. Nous utilisons le code fourni par le documentation du capteur avec quelques modifications.

Pour obtenir des résultats plus précis, vous devrez probablement calibrer votre capteur par rapport à une solution avec une valeur TDS connue. Tenez également compte de la non-linéarité de l’ESP32 ADC en ce qui concerne les valeurs basses et hautes.
Cependant, ces ajustements peuvent ne pas être nécessaires si vous n’êtes pas concerné par des valeurs spécifiques mais par une valeur qualitative de TDS.
Téléchargez le code suivant sur votre ESP32.
// Original source code: https://wiki.keyestudio.com/KS0429_keyestudio_TDS_Meter_V1.0#Test_Code
// Project details: https://Raspberryme.com/esp32-tds-water-quality-sensor/
#define TdsSensorPin 27
#define VREF 3.3 // 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;
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(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 / 4096.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 compensationVolatge=averageVoltage/compensationCoefficient;
//convert voltage value to tds value
tdsValue=(133.42*compensationVolatge*compensationVolatge*compensationVolatge - 255.86*compensationVolatge*compensationVolatge + 857.39*compensationVolatge)*0.5;
//Serial.print("voltage:");
//Serial.print(averageVoltage,2);
//Serial.print("V ");
Serial.print("TDS Value:");
Serial.print(tdsValue,0);
Serial.println("ppm");
}
}
}
Comment fonctionne le code
Jetons un coup d’œil rapide au code. Vous pouvez également passer directement à la Manifestation section.
le TdsSensorPin La variable enregistre le GPIO où vous souhaitez obtenir les lectures. Nous avons choisi GPIO27, mais vous pouvez utiliser n’importe quelle autre broche ADC.
#define TdsSensorPin 27
Ensuite, insérez la référence de tension analogique pour l’ADC. Pour l’ESP32 c’est 3.3V, pour un Arduino par exemple c’est 5V.
#define VREF 3.3 // analog reference voltage(Volt) of the ADC
Avant d’obtenir une valeur de mesure, nous appliquerons un algorithme de filtrage médian pour obtenir une valeur plus stable. le COMPTER La variable fait référence au nombre d’échantillons que nous allons filtrer avant d’obtenir une valeur réelle.
#define SCOUNT 30 // sum of sample point
Ensuite, nous avons besoin de tableaux pour stocker les lectures ainsi que de certaines variables d’index qui nous permettront de parcourir les tableaux.
int analogBuffer[SCOUNT]; // store the analog value in the array, read from ADC
int analogBufferTemp[SCOUNT];
int analogBufferIndex = 0;
int copyIndex = 0;
Initialiser le tensionmoyenne variables et tsdValue comme variables flottantes.
float averageVoltage = 0;
float tdsValue = 0;
le Température La variable enregistre la valeur de température actuelle. La température influence les lectures, il existe donc un algorithme qui compense les fluctuations de température. Dans cet exemple, la température de référence est de 25 °C, mais vous pouvez la modifier en fonction de votre environnement. Pour des résultats plus précis, vous pouvez ajouter un capteur de température et obtenir la température réelle au moment de la lecture du capteur.
float temperature = 25; // current temperature for compensation
La fonction suivante sera utilisée pour obtenir une valeur TDS stable à partir d’un tableau de lectures.
// 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;
}
Dans le mettre en place()initialisez le moniteur série à un débit en bauds de 115 200.
Serial.begin(115200);
Définissez la broche du capteur TDS comme entrée.
pinMode(TdsSensorPin,INPUT);
Dans le boucle()obtenez de nouvelles lectures TDS toutes les 40 millisecondes et enregistrez-les dans la mémoire tampon :
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;
}
}
Toutes les 800 millisecondes, il obtient les dernières lectures et obtient la tension moyenne en utilisant l’algorithme de filtrage créé auparavant :
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 / 4096.0;
Ensuite, il calcule un coefficient de compensation de température et calcule la valeur TDS en tenant compte de cette valeur :
//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 compensationVolatge=averageVoltage/compensationCoefficient;
//convert voltage value to tds value
tdsValue=(133.42*compensationVolatge*compensationVolatge*compensationVolatge - 255.86*compensationVolatge*compensationVolatge + 857.39*compensationVolatge)*0.5;
Enfin, il imprime la valeur TDS en ppm :
Serial.print("TDS Value:");
Serial.print(tdsValue,0);
Serial.println("ppm");
Manifestation
Après avoir copié le code sur l’IDE Arduino, téléchargez le code sur votre carte. N’oubliez pas de sélectionner le bon tableau dans Outils > Planche et le bon port COM dans Outils > Port.
Après le téléchargement, ouvrez le moniteur série à un débit en bauds de 115200 et appuyez sur le bouton ESP32 RST pour que le code commence à fonctionner.

Il affichera une valeur de 0 si la sonde n’est pas immergée. Mettez la sonde sur une solution pour vérifier son TDS. Vous pouvez essayer avec de l’eau du robinet et ajouter du sel pour voir si les valeurs augmentent.

J’ai mesuré la valeur TDS de l’eau du robinet dans ma maison et j’ai obtenu une valeur d’environ 100 ppm, ce qui est une bonne valeur pour l’eau potable.
J’ai également testé le thé et la valeur TDS a augmenté à environ 230 ppm, ce qui semble une valeur raisonnable.
Enfin, j’ai également mesuré la valeur TDS de l’eau en bouteille et j’ai obtenu une valeur de 0 ppm. Je ne sais pas si cette valeur est correcte car l’eau est annoncée comme de l’eau minérale, donc les minéraux dissous dans l’eau devraient représenter une valeur TDS. Je pense que cette valeur peut être expliquée en raison de la non-linéarité des broches ESP32 ADC pour les petites valeurs de tension. Avez-vous un de ces capteurs ? Quelles valeurs avez-vous obtenu pour l’eau en bouteille ?
Conclusion
Un compteur TDS peut mesurer le total des solides dissous dans une solution. Il peut être utilisé comme indicateur de la qualité de l’eau et permet de caractériser l’eau. Le compteur renvoie la valeur TDS en ppm (parties par million—mg/L). La valeur TDS a de nombreuses applications mais elle ne peut pas être utilisée seule pour déterminer si l’eau est potable ou non.
Une excellente application de ce type de capteur est un moniteur de qualité de l’eau d’aquarium. Vous pouvez utiliser ce capteur avec un capteur de température étanche DS18B20 pour surveiller votre aquarium, par exemple.
Êtes-vous intéressé par un moniteur de qualité de l’eau d’aquarium? Je pensais créer une application Web pour surveiller et contrôler la température et la qualité de l’eau de votre aquarium et, en outre, pouvoir contrôler une pompe via une broche de sortie de l’ESP32. Qu’est-ce que tu penses?
Nous espérons que vous avez trouvé ce tutoriel utile. Nous avons des tutoriels pour d’autres capteurs populaires que vous pourriez aimer :
En savoir plus sur l’ESP32 avec nos ressources :
Merci d’avoir lu.


