Danu Andrean, 16 Dec 2025

Cara Akses Sensor Tds Esp32

Penjelasan Gambar

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

TDSESP32
VCC3.3V / 5V (sesuai modul)
GNDGND
AOGPIO 27

 

⚠️ Penting:

Gunakan ADC1 (GPIO 32–39)

Jangan gunakan ADC2 jika ESP32 memakai WiFi
Penjelasan Gambar

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!! 🎉🎉🎉



#arduino #esp32 #tds


Kategori yang serupa