V tomto návodu se naučíš, jak použít TDS senzor (Total Dissolved Solids) s ESP32. Tento senzor měří množství rozpuštěných látek ve vodě (např. soli, minerály nebo kovy) a udává hodnotu v ppm (mg/l).
TDS hodnota slouží jako indikátor kvality vody, ale sama o sobě nestačí k určení, zda je voda pitná.
Co je TDS senzor
TDS (Total Dissolved Solids) měří množství rozpuštěných látek ve vodě. Čím více látek je rozpuštěno, tím vyšší je vodivost vody – a právě z ní se TDS vypočítává.
Použití:
- akvária
- hydroponie
- bazény
- filtrace vody
- IoT monitorování kvality vody
Důležité:
- neměří konkrétní látky
- pouze celkové množství rozpuštěných částic

Parametry senzoru (přepsané z tabulky)
Použitý modul (např. Keyestudio TDS Meter V1.0) má tyto vlastnosti:
- napájení: 3.3 V až 5.5 V
- výstupní napětí: 0 až 2.3 V
- proud: cca 3 až 6 mA
- rozsah měření: 0 až 1000 ppm
- přesnost: ±10 % (při 25 °C)
- analogový výstup (ADC)
- konektor pro sondu + řídicí modul

Zapojení k ESP32
Senzor vrací analogový signál, takže ho připojíš na ADC pin.
Zapojení:
- GND → GND
- VCC → 3.3 V
- DATA → GPIO 27 (nebo jiný ADC pin)

Jak to funguje
- senzor měří vodivost vody
- ESP32 přečte analogovou hodnotu
- ta se přepočítá na TDS v ppm
Pro stabilnější hodnoty se používá:
- průměrování
- median filtr
- kompenzace teploty
Kompletní kód (ESP32 + TDS)
1#include <Arduino.h>
2
3#define TdsSensorPin 27
4#define VREF 3.3
5#define SCOUNT 30
6
7int analogBuffer[SCOUNT];
8int analogBufferTemp[SCOUNT];
9
10int analogBufferIndex = 0;
11int copyIndex = 0;
12
13float averageVoltage = 0;
14float tdsValue = 0;
15
16float temperature = 25;
17
18// Median filtr
19int getMedianNum(int bArray[], int iFilterLen){
20 int bTab[iFilterLen];
21 for (byte i = 0; i<iFilterLen; i++)
22 bTab[i] = bArray[i];
23
24 int i, j, bTemp;
25 for (j = 0; j < iFilterLen - 1; j++) {
26 for (i = 0; i < iFilterLen - j - 1; i++) {
27 if (bTab[i] > bTab[i + 1]) {
28 bTemp = bTab[i];
29 bTab[i] = bTab[i + 1];
30 bTab[i + 1] = bTemp;
31 }
32 }
33 }
34
35 if ((iFilterLen & 1) > 0)
36 bTemp = bTab[(iFilterLen - 1) / 2];
37 else
38 bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2;
39
40 return bTemp;
41}
42
43void setup() {
44 Serial.begin(115200);
45 pinMode(TdsSensorPin, INPUT);
46}
47
48void loop() {
49 static unsigned long analogSampleTimepoint = millis();
50
51 if(millis() - analogSampleTimepoint > 40U){
52 analogSampleTimepoint = millis();
53
54 analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin);
55 analogBufferIndex++;
56
57 if(analogBufferIndex == SCOUNT)
58 analogBufferIndex = 0;
59 }
60
61 static unsigned long printTimepoint = millis();
62 if(millis() - printTimepoint > 800U){
63 printTimepoint = millis();
64
65 for(copyIndex = 0; copyIndex < SCOUNT; copyIndex++)
66 analogBufferTemp[copyIndex] = analogBuffer[copyIndex];
67
68 averageVoltage = getMedianNum(analogBufferTemp, SCOUNT) * (float)VREF / 4096.0;
69
70 float compensationCoefficient = 1.0 + 0.02 * (temperature - 25.0);
71 float compensationVoltage = averageVoltage / compensationCoefficient;
72
73 tdsValue = (133.42 * compensationVoltage * compensationVoltage * compensationVoltage
74 - 255.86 * compensationVoltage * compensationVoltage
75 + 857.39 * compensationVoltage) * 0.5;
76
77 Serial.print("TDS Value: ");
78 Serial.print(tdsValue);
79 Serial.println(" ppm");
80 }
81}Jak kód funguje
- každých ~40 ms se čte analogová hodnota
- uloží se do pole (buffer)
- použije se median filtr pro stabilní výsledek
- napětí se přepočítá na ppm
- výsledek se vypisuje do Serial Monitoru
Kalibrace a přesnost
Pro přesnější výsledky:
- kalibruj senzor pomocí známého roztoku
- přidej teplotní senzor
- počítej s nepřesností ADC na ESP32
Pokud ti jde jen o orientační hodnoty, kalibrace není nutná.
Ukázkové hodnoty měření
Přibližné hodnoty z testování:
- voda z kohoutku: ~100 ppm
- čaj: ~230 ppm
- balená voda: ~0 ppm (může být zkreslené)
Další příklady:
- pivo: ~384 ppm
- ocet: ~610 ppm
- gin & tonic: ~43 ppm
Shrnutí
TDS senzor:
- měří celkové množství rozpuštěných látek
- funguje přes analogový vstup
- je ideální pro IoT projekty
Použití:
- akvária
- monitoring vody
- chytré domácnosti
Důležité:
➡️ Neříká, jestli je voda pitná – jen její „čistotu“
