Arduino İle TDS Meter Kullanımı

Hayatımızın en vazgeçilmez şeylerinden bir tanesi sudur. Su olmadan yaşamayız. Yapılan araştırmalar yetişkin bir kadının günlük 2.7 litre, erkeğin ise 3.7 litre sıvı alması gerektiğini söylemektedir. Peki hangi suların içilebilir olduğunu hiç düşündünüz mü? İçilebilir suyun nasıl ölçüldüğünü merak etiniz mi? Bu yazımızda “Arduino İle TDS Meter Kullanımı” nasıl gerçekleştirilir bunu öğreneceğiz.

Öncelikle yazımıza TDS nedir bunu açıklayarak başlayalım.

Arduino İle TDS Meter(TDS Sensörü) Kullanımı

TDS Nedir?

TDS, suyun kalitesinin belirlenmesi konusunda başvurulun kavramlardan biridir. Özellikle su arıtma teknolojileri kapsamında, arıtma sistemlerinin başarısını ve arıtma sonucunda suyun ulaşmış olduğu kalite seviyesinin tespit edilmesini sağlar. TDS, İngilizce olarak Total Dissolved Solids anlamına gelmektedir. TDS kavramının Türkçe karşılığı ise sudaki çözünmüş katı madde miktarı demektir. TDS, su içerisinde çözünmüş ve gözle görülemeyecek olan mineral, metal, tuz ve benzeri maddeleri ifade etmek için kullanılır. Bir suyun TDS değeri, aynı suyun içilebilir ve ya da içilemez olduğunu belirlemek için de kullanılır. Eğer bir su içerisindeki demir, metal, tuz ve benzeri maddeler ne kadar artarsa, suyun tadı da o kadar bozulur. Dolayısıyla su içerisindeki TDS miktarı ne kadar düşükse, su da o kadar içilebilir olur.

Bir diğer yandan, suyun içerisindeki TDS miktarını ölçmeye yarayan aletler, suyun içilebilir olup olmadığı konusunda belirleyici değildir. Çünkü TDS ölçümü yapan cihazlar suyun içerisindeki çözünmüş maddeleri tespit ettiği için, suyun ancak sert mi yoksa yumuşak mı olduğunu belirtir. Yumuşak su içilebilir su iken, suyun yumuşaklığı azaldıkça içilebilirliği de kaybolur.

300’den az-Mükemmel
300-600-İyi
600-900-Makul
900-1200-Kötü
1200 üstü-Kabul Edilemez

TDS’in ne olduğundan genel olarak bahsettik şimdi gelelim asıl konumuza 🙂 Tds sensörümüzün özelliklerine bakalım.

Bu yazımızda kullanacağımız malzemeler:

TDS Meter Özellikleri Nelerdir?

Keyestudio TDS Meter V1.0
Keyestudio TDS Meter V1.0

TDS Sensörü:

  • Giriş Voltajı: DC 3.3 ~ 5.5V
  • Çıkış Gerilimi: 0 ~ 2.3V
  • Çalışma Akımı: 3 ~ 6mA
  • TDS Ölçüm Aralığı: 0 ~ 1000ppm
  • TDS Ölçüm Hassasiyeti: ±% 10 FS (25 ℃)
  • Modül Arayüzü: XH2.54-3P
  • Elektrot Arayüzü: XH2.54-2P

TDS Probu:

  • İğne Sayısı: 2
  • Toplam Uzunluk: 83cm
  • Bağlantı Arayüzü: XH2.54-2P
  • Beyaz renk
  • Diğer: Su Geçirmez Prob

TDS Meter V1.0 Üretici Sayfası

Arduino İle TDS Meter Bağlantı Şeması

Arduino İle TDS Sensörü Bağlantı Şeması
Arduino İle TDS Sensörü Bağlantı Şeması

TDS Sensör Kodu

Arkadaşlar ilk olarak size keyestudio tds sensörünün kodunu vereceğim. Arkasından gravity tds sensörünün kodunu vereceğim. Keyestudio ve gravity tds sensörleri elektronik olarak temel komponentleri içermektedirler bu yüzden gravity sensörünün kütüphanesini keyestudio sensörü ilede kullanabiliyoruz. Ayrıca gravity sensörü üreticileri bu sensör için bir kütüphanede yazdıklarından dolayı işmizi daha da kolaylaştırmışlar.

#define TdsSensorPin A1
#define VREF 5.0 // 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 = 25;
void setup()
{
Serial.begin(115200);
pinMode(TdsSensorPin,INPUT);
}
void loop()
{
static unsigned long analogSampleTimepoint = millis();
if(millis()-analogSampleTimepoint > 40U) //every 40 milliseconds,read the analog value from the ADC
{
analogSampleTimepoint = millis();
analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin); //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/ 1024.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("voltage:");
//Serial.print(averageVoltage,2);
//Serial.print("V ");
Serial.print("TDS Value:");
Serial.print(tdsValue,0);
Serial.println("ppm");
}
}
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;
}

Şimdi kütüphanemizi aşağıdaki linkten indirelim ve işimizi daha da kolaylaştıralım.

#include <EEPROM.h>  // Kalibrasyon yapmak için eeprom kütüphanesini ekliyoruz
#include "GravityTDS.h"  //gravity sensör kütüphanesini ekliyoruz

#define TdsSensorPin A1  // Tds sensörü pinini tanımlıyoruz
GravityTDS gravityTds;  // Kütüphanemizden nesne tanımlıyoruz

float temperature = 25,tdsValue = 0;  // o anki su sıcaklığını yazıyoruz ve tds değerinin tutulacağı 

// değişkeni tanımlıyoruz

void setup()
{
    Serial.begin(115200); //seri haberleşmeyi başlatıyoruz
    gravityTds.setPin(TdsSensorPin);  // nesnemize pinimizi tanımlıyoruz
    gravityTds.setAref(5.0);  //referans voltajımızı tanımlıyoruz
    gravityTds.setAdcRange(1024);  //10bit ADC için 1024 değeri;12bit ADC için 4096 değerini              //girmeliyiz
    gravityTds.begin();  //sensörümüzü başlatıyoruz
}

void loop()
{
    //temperature = readTemperature();  //eğer sıcaklık sensörümüz varsa sıcaklığı okuyoruz
    gravityTds.setTemperature(temperature);  // sıcaklığımızı kütüphanemize ekliyoruz
    gravityTds.update();  //örnekleme ve hesaplama işlemi yaptırıyoruz
    tdsValue = gravityTds.getTdsValue();  // tds(ppm) değerini alıyoruz
    Serial.print(tdsValue,0); //seri port ekranına yazdırıyoruz
    Serial.println("ppm");
    delay(1000);
}

Burada önemli bir kaç nokta var. Sudaki çözünmüş madde miktarını ölçerken suyun sıcaklığının etkisi bulunmaktadır. Bu nedenle yukarıdaki kodda sıcaklık 25 derece iken verilmiş bir koddur. Aşağıda otomatik olarak sıcaklığı da okuyup ona göre daha doğru değerler veren kodumuzu da vereceğim.

Ayrıca bu sensörü kullanırken dikkat etmeniz bazı kurallar mevcuttur.

  • Prob, 55 santigrat derecenin üzerindeki suda kullanılamaz.
  • Prob kabın kenarına çok yakın olamaz, aksi takdirde okumayı etkiler.
  • Probun kafası ve kablosu su geçirmezdir, ancak konektör ve sinyal verici kartı su geçirmez değildir.

Şimdi tam otomatik kodumuza geçelim.

Otomatik TDS Ölçüm Bağlantı Şeması

Otomatik TDS Ölçümü

Otomatik TDS Ölçüm Kodu

#include <EEPROM.h>  //Kalibrasyon için gerekli olan eeprom kütüphanemizi ekliyoruz
#include "GravityTDS.h"  // gravity tds sensör kütüphanemizi ekliyoruz
#include <math.h> //ntc ile sıcaklık hesaplanması için matematik kütüphanemizi ekliyoruz

#define TdsSensorPin A1 //sensörümüzün pinini tanımlıyoruz
GravityTDS gravityTds;  //kütüphanemizden nesnemizi oluşturuyoruz

float temperature = 25,tdsValue = 0; //sıcaklık ve tds değerlerimizi tutacak değişkenler tanımlanıyor

// 10K NTC den sıcaklık hesaplama fonksiyonu tanımlanıyor.
double Termistor(int analogOkuma) {
  double sicaklik;
  sicaklik = log(((10240000 / analogOkuma) - 10000));
  sicaklik = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * sicaklik * sicaklik)) * sicaklik);
  sicaklik = sicaklik - 273.15;
  return sicaklik;
}

void setup()
{
    Serial.begin(115200); //seri haberleşme başlatılıyor
    gravityTds.setPin(TdsSensorPin); // nesneye tds sensör pini tanımlanıyor
    gravityTds.setAref(5.0);  //referans voltajı tanımlanıyor
    gravityTds.setAdcRange(1024);  //10bit ADC için 1024 değeri;12bit ADC için 4096 değer aralığı          //yazılıyor
    gravityTds.begin();  //sensör başlatılıyor
}

void loop()
{
    int okuma=analogRead(A0); //ntc analog değeri okunuyor
    temperature = Termistor(okuma);  //temperature değişkenine sıcaklık değeri aktarılıyor.
    gravityTds.setTemperature(temperature);  // sıcaklık kütüphaneye aktarılıyor
    gravityTds.update();  //örnekleme ve hesaplama yapılıyor
    tdsValue = gravityTds.getTdsValue();  // tds(ppm) değeri alınıyor
    double ec=gravityTds.getEcValue();  //EC(Electro Conductivity) İletkenlik değeri alınıyor 
    Serial.print(tdsValue,0); //bu değerler seri porta yazdırılıyor.
    Serial.print("ppm.");
    Serial.print(" EC :");
    Serial.print(ec);
    Serial.print(" Sicaklik:");
    Serial.print(temperature);
    Serial.println("*C");
    delay(1000);
}

TDS Sensörünü Kalibrasyon Etme

Arkadaşlar kodda eeprom kütüphanesini kalibrasyon için kullanıldığını söylemiştik. Şimdi tds sensörünün nasıl kalibrasyon yapıldığını öğreneceğiz. Öncelikle kalibrasyon yapmamız için bilmemiz gereken 3 tane kod bulunmaktadır.Kodlarımız şunlardır.

  • enter
  • cal:tds değeri
  • exit

Kalibrasyonun yapılışı:

  1. Yukarıda yazdığımız otomatik tds bulma kodunu yüklüyoruz.
  2. Hangi baudrate de seri haberleşmeyi başlattıysak o baudratede seri port ekranını açmamız lazım.
  3. Seri port ekranına kalibrasyonu başlatmak için öncelikle “enter” yazıp gönderiyoruz.
  4. Bizden probumuzu sıvıya koymamızı istiyor.
  5. Doğru ölçtüğünü düşündüğümüz cihazdan ppm değerini öğreniyoruz(mesela 430) ve “cal:430” şeklinde yazıp gönderiyoruz.
  6. Kalibrasyon ekranından çıkmak için “exit” yazıp gönderiyoruz ve kalibrasyon işlemini bitirmiş oluyoruz.