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.
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:
- Arduino Uno
- Keyestudio TDS Meter V1.0
- TDS İletkenlik + NTC Sensör Kablosu
- 1 adet 10K direnç
- Dijital Tds Metre Su Sertlik iletkenlik Ölçümü Kılıf ve Pil H(Sensörün doğruluğunu kontrol etmek için)
TDS Meter Özellikleri Nelerdir?
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ı
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 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ışı:
- Yukarıda yazdığımız otomatik tds bulma kodunu yüklüyoruz.
- Hangi baudrate de seri haberleşmeyi başlattıysak o baudratede seri port ekranını açmamız lazım.
- Seri port ekranına kalibrasyonu başlatmak için öncelikle “enter” yazıp gönderiyoruz.
- Bizden probumuzu sıvıya koymamızı istiyor.
- Doğru ölçtüğünü düşündüğümüz cihazdan ppm değerini öğreniyoruz(mesela 430) ve “cal:430” şeklinde yazıp gönderiyoruz.
- Kalibrasyon ekranından çıkmak için “exit” yazıp gönderiyoruz ve kalibrasyon işlemini bitirmiş oluyoruz.