Danu Andrean, 16 Dec 2025
Cara Akses Sensor Tds Esp32

Total Dissolved Solids (TDS) adalah ukuran jumlah zat terlarut (dalam ppm atau mg/L) di dalam air. Sensor TDS banyak digunakan pada sistem IoT water quality, hidroponik, akuakultur, dan monitoring air minum.
Cara Kerja Sensor TDS
Sensor TDS sebenarnya tidak mengukur TDS secara langsung. Sensor ini mengukur konduktivitas listrik (EC – Electrical Conductivity) air.
Semakin banyak zat terlarut (garam, mineral, ion), maka:
- Konduktivitas meningkat
- Tegangan output sensor berubah
Hubungan umumnya:
TDS (ppm) ≈ EC (µS/cm) × factor
Nilai factor biasanya berada di rentang 0.5 – 0.7, tergantung jenis larutan.
Koneksi Hardware
Wiring Sensor TDS ke ESP32
| TDS | ESP32 |
|---|---|
| VCC | 3.3V / 5V (sesuai modul) |
| GND | GND |
| AO | GPIO 27 |
⚠️ Penting:
Gunakan ADC1 (GPIO 32–39)
Jangan gunakan ADC2 jika ESP32 memakai WiFi

Akses Data ADC ESP32
ESP32 memiliki resolusi ADC 12-bit, sehingga:
ADC Range = 0 – 4095
Konversi ADC ke tegangan:
Voltage = ADC_value × (VREF / 4095)
Contoh kode dasar:
#define TdsSensorPin 27
#define VREF 3.3
int adcValue = analogRead(TdsSensorPin);
float voltage = adcValue * VREF / 4095.0;Filtering Data (Median Filter)
Sensor TDS sangat sensitif terhadap noise. Oleh karena itu filtering wajib dilakukan.
Metode yang umum digunakan adalah median filter.
#define SCOUNT 30
int analogBuffer[SCOUNT];
int analogBufferIndex = 0;
void readTds() {
analogBuffer[analogBufferIndex++] = analogRead(TdsSensorPin);
if (analogBufferIndex == SCOUNT) analogBufferIndex = 0;
}
int getMedian(int *arr, int len) {
int temp[len];
memcpy(temp, arr, sizeof(temp));
sort(temp, temp + len);
return temp[len / 2];
}Median filter efektif menghilangkan spike sesaat akibat noise listrik.
Perhitungan TDS
Formula umum dari modul TDS Gravity:
float tdsValue = (133.42 * voltage * voltage * voltage
- 255.86 * voltage * voltage
+ 857.39 * voltage) * kValue;Di mana:
- voltage = hasil ADC
- kValue = faktor kalibrasi
Konsep Kalibrasi Sensor TDS
Kalibrasi bertujuan untuk menyesuaikan hasil sensor dengan nilai referensi nyata.
Alat Kalibrasi:
Larutan standar TDS (misalnya 342 ppm atau 1000 ppm)
TDS meter digital (opsional, tapi disarankan)
Langkah Kalibrasi Manual
- Siapkan larutan standar (misalnya 342 ppm)
- Celupkan probe TDS
- Baca nilai TDS dari sistem
- Hitung faktor kalibrasi:
CALIBRATION_fACTOR = TDS_referensi / TDS_sensor
- Masukkan nilai k ke dalam kode
contoh:
TDS_sensor = 300 ppm
TDS_referensi = 342 ppm
CALIBRATION_fACTOR = 342 / 300 = 1.14
Kode Lengkap
#define TDS_PIN 27
#define VREF 3.3 // analog reference voltage(Volt) of the ADC
#define ADC 4096.0 // adc max
#define SCOUNT 30 // sum of sample point
#define CALIBRATION_fACTOR 1.360 // CAL = REAL / READ
int analogBuffer[SCOUNT]; // store the analog value in the array, read from ADC
int analogBufferTemp[SCOUNT];
// 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 TdsSetup() {
pinMode(TDS_PIN, INPUT);
}
int TdsRun(float temperature) {
static float tdsValue = 0;
static float averageVoltage = 0;
static int analogBufferIndex = 0;
static int copyIndex = 0;
static unsigned long analogSampleTimepoint = millis();
//every 40 milliseconds,read the analog value from the ADC
if (millis() - analogSampleTimepoint > 40U) {
analogSampleTimepoint = millis();
analogBuffer[analogBufferIndex] = analogRead(TDS_PIN); //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 / ADC;
//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) * CALIBRATION_fACTOR;
}
}
return tdsValue;
}
void setup() {
Serial.begin(115200);
TdsSetup();
}
void loop() {
int tdsVal = TdsRun(25.0f);
Serial.print("tds : ");
Serial.println(tdsVal);
}Penutup
Sensor TDS tidak bisa langsung akurat tanpa kalibrasi. Dengan filtering yang baik dan kalibrasi menggunakan larutan standar, ESP32 dapat digunakan sebagai sistem monitoring dengan kualitas yang lebih baik. Happy hacking!! 🎉🎉🎉







