Cara Memprogram Sensor TDS Pada ESP32

Cara Memprogram Sensor TDS Pada ESP32

Sensor TDS (Total Dissolved Solids) adalah alat yang digunakan untuk mengukur jumlah total zat padat terlarut dalam suatu cairan, biasanya air. Zat padat terlarut ini bisa berupa garam, mineral, logam, dan senyawa organik anorganik lainnya yang larut dalam air.Berikut ini adalah cara memprogram nya :

#include <Arduino.h>


#define TdsSensorPin 13
#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, copyIndex = 0;
float averageVoltage = 0, tdsValue = 0, temperature = 29;


 
void proses_analog_tds() {
  int a = analogRead(TdsSensorPin);
  if (a != 0) {
    static unsigned long analogSampleTimepoint = millis();
    if (millis() - analogSampleTimepoint > 40U)  //every 40 milliseconds,read the analog value from the ADC
    {
      analogSampleTimepoint = millis();
      analogBuffer[analogBufferIndex] = a;  //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 / 4096.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
 
      Serial.print("TDS:");
      Serial.print(tdsValue, 0);
      Serial.println("ppm");
      // d
    }
  }
}
 
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(9600);
Serial.begin(9600);
  pinMode(TdsSensorPin, INPUT);

}
void loop(){
proses_analog_tds();


}

Berikut ini adalah penjelasan dari kode di atas :


Struktur Umum Kode

Header dan Konstanta

#include <Arduino.h><br><br>#define TdsSensorPin 16<br>#define VREF 3.3<br>#define SCOUNT 30<br>
  • TdsSensorPin: Pin input analog tempat sensor TDS terhubung.
  • VREF: Tegangan referensi ADC (Analog to Digital Converter). Umumnya 3.3V pada ESP32.
  • SCOUNT: Jumlah sampel analog yang diambil untuk perhitungan median filter (30 data).

Variabel Global

int analogBuffer[SCOUNT];        // buffer untuk menyimpan hasil pembacaan analog
int analogBufferTemp[SCOUNT];    // buffer sementara untuk perhitungan median
int analogBufferIndex = 0, copyIndex = 0;
float averageVoltage = 0, tdsValue = 0, temperature = 29;
  • analogBuffer: Menyimpan hasil pembacaan ADC secara berkala.
  • temperature: Suhu air digunakan untuk kompensasi pembacaan sensor (dalam °C).

Fungsi Utama: proses_analog_tds()

1. Membaca nilai analog

int a = analogRead(TdsSensorPin);
  • Membaca nilai ADC dari sensor TDS.

2. Sampling setiap 40 ms

if (millis() - analogSampleTimepoint > 40U)
  • Setiap 40 milidetik, nilai analog disimpan ke analogBuffer.

3. Setiap 800 ms – Proses data

if (millis() - printTimepoint > 800U)
  • Setiap 800 ms:
    1. Salin analogBuffer ke analogBufferTemp
    2. Gunakan median filter untuk mengurangi noise.
    3. Hitung tegangan (voltage) dari nilai ADC: averageVoltage = getMedianNum(...) * (float)VREF / 4096.0;
      • 4096 = resolusi ADC 12-bit (0–4095).
    4. Kompensasi suhu: float compensationCoefficient = 1.0 + 0.02 * (temperature - 25.0); float compensationVolatge = averageVoltage / compensationCoefficient;
    5. Konversi tegangan ke nilai TDS (ppm): tdsValue = (133.42 * V³ - 255.86 * V² + 857.39 * V) * 0.5;
      • Formula empiris dari produsen sensor (konversi tegangan → ppm).
    6. Print hasil ke serial monitor: Serial.print("TDS:"); Serial.print(tdsValue, 0); Serial.println("ppm");

Fungsi Tambahan: getMedianNum()

int getMedianNum(int bArray[], int iFilterLen)
  • Fungsi untuk menghitung nilai median dari array:
    • Disalin dulu ke array sementara.
    • Diurutkan dengan metode Bubble Sort.
    • Median diambil sebagai nilai tengah.

Fungsi setup() dan loop()

void setup() {
  Serial.begin(9600);
  pinMode(TdsSensorPin, INPUT);
}

void loop() {
  proses_analog_tds();
}
  • Inisialisasi Serial Monitor.
  • Menjalankan proses_analog_tds() terus-menerus dalam loop.

Ringkasan

KomponenFungsi
analogReadMembaca tegangan dari sensor TDS
median filterMengurangi noise dari pembacaan sensor
kompensasi suhuKoreksi hasil pembacaan sesuai suhu air
konversi ke ppmHitung nilai TDS (Total Dissolved Solids) dalam satuan ppm

untuk diskusi bisa kontak dibawah ini :

Sosial media :

Apa itu ESP32?