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:
- Salin
analogBuffer
keanalogBufferTemp
- Gunakan median filter untuk mengurangi noise.
- Hitung tegangan (voltage) dari nilai ADC:
averageVoltage = getMedianNum(...) * (float)VREF / 4096.0;
- 4096 = resolusi ADC 12-bit (0–4095).
- Kompensasi suhu:
float compensationCoefficient = 1.0 + 0.02 * (temperature - 25.0); float compensationVolatge = averageVoltage / compensationCoefficient;
- 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).
- Print hasil ke serial monitor:
Serial.print("TDS:"); Serial.print(tdsValue, 0); Serial.println("ppm");
- Salin
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
Komponen | Fungsi |
---|---|
analogRead | Membaca tegangan dari sensor TDS |
median filter | Mengurangi noise dari pembacaan sensor |
kompensasi suhu | Koreksi hasil pembacaan sesuai suhu air |
konversi ke ppm | Hitung nilai TDS (Total Dissolved Solids) dalam satuan ppm |
untuk diskusi bisa kontak dibawah ini :

Sosial media :