TDS Sensörü Arduino: ppm Ölçümü, Kalibrasyon ve Su Kalitesi
TDS sensörü Arduino ile nasıl kullanılır? ppm ne demek, DS18B20 ile sıcaklık kompanzasyonu, kalibrasyon, içme suyu, akvaryum ve hidroponik değerleri, ESP32.
TDS sensörü Arduino ile birleşince, suyun içinde ne kadar çözünmüş mineral, tuz ve metal bulunduğunu birkaç saniyede ppm (milyonda bir) olarak gösteren ucuz bir su kalitesi ölçerin olur. TDS (Total Dissolved Solids), yani toplam çözünmüş katı madde, musluk suyunun sertliğini, su arıtma cihazının hâlâ çalışıp çalışmadığını, akvaryum suyunun değişim zamanını ya da hidroponik besin çözeltisinin yoğunluğunu anlamak için kullanılan en pratik ölçüdür. Kalem tipi TDS ölçerlerin içinde de aynı prensip çalışır; Arduino ile yaptığında bu ölçümü sürekli kaydedebilir, ekranda gösterebilir ve eşik aşılınca uyarı verebilirsin.
Bu yazıda ppm'in ne anlama geldiğini, sensörün aslında iletkenliği nasıl ölçtüğünü, sıcaklığın sonuca etkisini ve DS18B20 ile nasıl düzeltileceğini, kalibrasyon sıvısıyla ayarı, Arduino Uno kodunu, içme suyu, akvaryum ve hidroponik için değer tablolarını, su arıtma filtresinin takibini, ESP32 ile zaman damgalı kayıt ve Raspberry Pi Pico kodunu adım adım anlatıyoruz. Son bölümde TDS sensörünün pH sensöründen farkını ve en sık yapılan hataları göreceksin.

TDS nedir, ppm ne demek?
TDS, bir litre suyun içinde çözünmüş hâlde bulunan tüm maddelerin toplam miktarıdır: kalsiyum, magnezyum, sodyum, potasyum, bikarbonat, klorür, sülfat ve nitrat gibi iyonlar en büyük payı oluşturur. Birimi ppm (parts per million, milyonda bir parça) ya da bunun suda karşılığı olan mg/L'dir; 1 ppm, 1 litre suda 1 miligram çözünmüş madde demektir. Örneğin 250 ppm'lik bir musluk suyunun her litresinde çeyrek gram mineral vardır. Saf (damıtılmış) suyun TDS'si sıfıra çok yakındır, deniz suyununki ise yaklaşık 35.000 ppm'dir.
TDS'nin tek başına "suyun temiz ya da kirli" olduğunu söylemediğini baştan bilmek önemlidir. Mineralli bir kaynak suyunun TDS'si yüksek olabilir ve gayet sağlıklıdır; buna karşılık TDS'si düşük bir su bakteri, kurşun ya da tarım ilacı içerebilir, çünkü bunlar suyun iletkenliğini neredeyse hiç değiştirmez. TDS sensörü, suyun mineral yükünü ve bu yükteki değişimi izlemek için mükemmeldir; mikrobiyolojik güvenlik için laboratuvar analizi gerekir.
TDS sensörü nasıl çalışır? İletkenlikten ppm'e
Arduino için satılan TDS sensörleri aslında bir iletkenlik (EC) ölçeridir. Saf su elektriği neredeyse hiç iletmez; içinde çözünmüş iyonlar arttıkça iletkenlik de artar. Probun ucundaki iki elektrot arasına kart küçük bir gerilim uygular ve geçen akımı ölçer. Bu gerilim doğru akım değil alternatif akımdır: DC kullanılsaydı elektrotlarda gaz kabarcıkları birikir (polarizasyon), ölçüm kayar ve elektrotlar hızla aşınırdı. Kart sonucu 0–2,3 V arasında bir analog gerilime çevirir; Arduino bu gerilimi okur, önce iletkenliğe (µS/cm), sonra bir dönüşüm katsayısıyla TDS'ye çevirir.
İletkenlikten TDS'ye geçiş yaklaşık bir hesaptır: TDS (ppm) = EC (µS/cm) × k. Çoğu ölçer ve bu yazıdaki kod k = 0,5 kullanır (sodyum klorür ölçeği). Bazı hidroponik ölçerler 0,7 kullanır; bu yüzden aynı suyu iki farklı ölçer 500 ve 700 ppm olarak gösterebilir, ikisi de "doğrudur". Değerleri karşılaştırırken hangi katsayının kullanıldığına dikkat et, hidroponikte ise mümkünse doğrudan EC (mS/cm) değeriyle çalış.
| Özellik | Değer (yaygın TDS modülü) |
|---|---|
| Besleme | 3,3–5,5 V |
| Çıkış | 0–2,3 V analog |
| Ölçüm aralığı | 0–1000 ppm |
| Doğruluk | Yaklaşık ±%10 (25 °C'de, tam ölçeğe göre) |
| Uyarım | Alternatif akım (polarizasyonu önler) |
| Prob | Su geçirmez, iki elektrotlu; en fazla yaklaşık 55 °C |
| Kart | Su geçirmez değildir, kuru yerde durmalı |
Sıcaklık kompanzasyonu: neden DS18B20 gerekir?
Suyun iletkenliği sıcaklıkla belirgin şekilde değişir: iyonlar ısındıkça daha hızlı hareket eder ve aynı su her 1 °C'de yaklaşık %2 daha iletken görünür. 15 °C'deki bir su ile aynı suyun 30 °C'deki ölçümü arasında yaklaşık üçte bir oranında fark çıkar; bu, ölçümün kendisinden çok daha büyük bir hatadır. Bu yüzden TDS ölçümleri 25 °C'ye göre düzeltilir: düzeltilmiş gerilim = ölçülen gerilim / (1 + 0,02 × (T − 25)). Suyun sıcaklığını ölçmek için en uygun sensör, su geçirmez paslanmaz kılıflı DS18B20'dir; probu TDS probunun yanına, aynı suya daldırırsın.

DS18B20, OneWire adı verilen tek veri kablolu bir protokolle çalışır ve ±0,5 °C doğruluk verir. Veri hattı ile VCC arasına 4,7 kΩ'luk bir pull-up direnci gerekir; direncin renk kodunu bilmiyorsan direnç renk kodu aracına bakabilirsin. Sensörün ayrıntıları ve birden fazla DS18B20'yi aynı hatta bağlamak için DS18B20 sıcaklık sensörü yazısını okuyabilirsin. Sıcaklık sensörün yoksa kod 25 °C kabul eder; ölçümlerin oda sıcaklığında yapıldığı basit testler için bu da iş görür.
Bağlantı: Arduino Uno, ESP32 ve Pico
| Parça pini | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| TDS VCC (+) | 5V | 3V3 | 3V3 (OUT) |
| TDS GND (−) | GND | GND | GND |
| TDS A (sinyal) | A0 | GPIO 34 (ADC1) | GP26 (ADC0) |
| DS18B20 VCC (kırmızı) | 5V | 3V3 | 3V3 (OUT) |
| DS18B20 GND (siyah) | GND | GND | GND |
| DS18B20 DATA (sarı) | D2 + 4,7 kΩ VCC'ye | GPIO 4 + 4,7 kΩ 3V3'e | GP22 + 4,7 kΩ 3V3'e |
Arduino TDS kodu: medyan filtre ve kompanzasyon
- Kütüphane Yöneticisi'nden OneWire ve DallasTemperature kütüphanelerini kur.
- TDS modülünü ve DS18B20'yi tablodaki gibi bağla; probu ve sıcaklık sensörünü aynı suya daldır.
- Kodu yükle ve Seri Monitör'ü 115200 baud'da aç.
- Sayılar oturana kadar 20–30 saniye bekle; prob suya yeni girdiğinde ilk ölçümler dalgalanır.
- Elinde bilinen bir kalibrasyon sıvısı varsa probu ona daldır ve Seri Monitör'e örneğin cal:707 yaz.
1#include <OneWire.h>
2#include <DallasTemperature.h>
3#include <EEPROM.h>
4
5const int TDS_PIN = A0; // TDS modülü sinyal (A) / TDS module signal (A)
6const int DS_PIN = 2; // DS18B20 veri, 4,7 kΩ pull-up / DS18B20 data, 4.7 kΩ pull-up
7const float VREF = 5.0; // Uno ADC referansı / Uno ADC reference
8const int ORNEK = 30; // medyan filtresi örnek sayısı / samples for the median filter
9
10OneWire oneWire(DS_PIN);
11DallasTemperature ds(&oneWire);
12
13int ornekler[ORNEK];
14int indeks = 0;
15float kFaktor = 1.0; // kalibrasyon katsayısı (EEPROM'da) / calibration factor (in EEPROM)
16float sicaklik = 25.0;
17float gerilim = 0;
18unsigned long sonOrnek = 0, sonOlcum = 0;
19
20int medyan() { // gürültüye karşı ortanca değer / median against noise
21 int t[ORNEK];
22 memcpy(t, ornekler, sizeof(t));
23 for (int i = 1; i < ORNEK; i++) { // ekleme sıralaması / insertion sort
24 int x = t[i], j = i - 1;
25 while (j >= 0 && t[j] > x) { t[j + 1] = t[j]; j--; }
26 t[j + 1] = x;
27 }
28 return (t[ORNEK / 2] + t[ORNEK / 2 - 1]) / 2;
29}
30
31float tdsHesapla(float volt, float derece, float k) {
32 float komp = 1.0 + 0.02 * (derece - 25.0); // %2/°C sıcaklık kompanzasyonu / 2 %/°C compensation
33 float v = volt / komp; // 25 °C'ye indirgenmiş gerilim / voltage at 25 °C
34 float ec = 133.42 * v * v * v - 255.86 * v * v + 857.39 * v; // iletkenlik, µS/cm / conductivity
35 return ec * 0.5 * k; // TDS (ppm) = EC x 0,5 / TDS (ppm) = EC x 0.5
36}
37
38void setup() {
39 Serial.begin(115200);
40 ds.begin();
41 ds.setWaitForConversion(false); // 750 ms beklemeden ölç / measure without blocking 750 ms
42 ds.requestTemperatures();
43 EEPROM.get(0, kFaktor);
44 if (isnan(kFaktor) || kFaktor < 0.5 || kFaktor > 2.0) kFaktor = 1.0; // boş EEPROM / empty EEPROM
45 Serial.println("Kalibrasyon / calibration: cal:707 gibi yaz / type e.g. cal:707");
46}
47
48void loop() {
49 if (millis() - sonOrnek >= 40) { // 40 ms'de bir örnek / one sample every 40 ms
50 sonOrnek = millis();
51 ornekler[indeks] = analogRead(TDS_PIN);
52 indeks = (indeks + 1) % ORNEK;
53 }
54
55 if (millis() - sonOlcum >= 1000) { // saniyede bir sonuç / one result per second
56 sonOlcum = millis();
57 float t = ds.getTempCByIndex(0);
58 if (t != DEVICE_DISCONNECTED_C) sicaklik = t; // sensör yoksa 25 °C / 25 °C if no sensor
59 ds.requestTemperatures(); // bir sonraki okuma için / for the next reading
60 gerilim = medyan() * VREF / 1024.0;
61 float tds = tdsHesapla(gerilim, sicaklik, kFaktor);
62 Serial.print("Sicaklik / temp: ");
63 Serial.print(sicaklik, 1);
64 Serial.print(" C TDS: ");
65 Serial.print(tds, 0);
66 Serial.println(" ppm");
67 }
68
69 if (Serial.available()) { // "cal:707" -> bilinen sıvıya göre K / K from a known solution
70 String s = Serial.readStringUntil('\n');
71 s.trim();
72 if (s.startsWith("cal:")) {
73 float hedef = s.substring(4).toFloat();
74 float ham = tdsHesapla(gerilim, sicaklik, 1.0);
75 if (hedef > 0 && ham > 10) {
76 kFaktor = hedef / ham;
77 EEPROM.put(0, kFaktor); // kalıcı kaydet / save permanently
78 Serial.print("Yeni K / new K: ");
79 Serial.println(kFaktor, 3);
80 }
81 }
82 }
83}
84| Kod parçası | Ne yapar? |
|---|---|
| Her 40 ms'de analogRead | Son 30 ölçümü (1,2 saniye) halka şeklinde bir dizide tutar |
| medyan() | Ortalamadan farklı olarak ani sıçramaları (parazit, kabarcık) tamamen yok sayar |
| 1 + 0,02 × (T − 25) | Gerilimi 25 °C'ye indirger; 30 °C'de bölen 1,10 olur |
| 133,42 v³ − 255,86 v² + 857,39 v | Bu sensör kartı için deneysel olarak çıkarılmış gerilim-iletkenlik eğrisi |
| × 0,5 | İletkenliği TDS'ye çeviren katsayı (500 ölçeği) |
| setWaitForConversion(false) | DS18B20'nin 750 ms'lik dönüşümünü beklemeden örneklemeye devam eder |
| cal:707 ve EEPROM | Bilinen sıvıya göre K katsayısını hesaplar ve kalıcı olarak saklar |
Koddaki üçüncü dereceden polinom, sensör kartının çıkış gerilimini iletkenliğe çeviren deneysel bir eğridir; karttaki devre doğrusal olmadığı için basit bir çarpan yetmez. Bu eğri yaygın Gravity tipi TDS kartı için geçerlidir; farklı bir kart kullanıyorsan üreticinin formülünü kullan ya da birkaç bilinen sıvıyla kendi eğrini çıkar. Unutma, 5 V ile beslenen Uno'da analog okuma 5,0 V'a göre, ESP32 ve Pico'da 3,3 V'a göre hesaplanır; VREF değerini kartına göre seçmezsen sonuçlar baştan yanlış çıkar.
Kalibrasyon sıvısıyla TDS sensörü ayarı
Her prob ve kart arasında küçük farklar vardır; en doğru sonucu almak için sensörü değeri bilinen bir sıvıyla kalibre etmelisin. Laboratuvar ve elektronik malzemesi satıcılarında bulunan 1413 µS/cm'lik potasyum klorür (KCl) standart çözeltisi en yaygın seçenektir; 0,5 katsayısıyla yaklaşık 707 ppm'e karşılık gelir. Bazı kalem TDS ölçerlerle birlikte gelen 342 ppm'lik sodyum klorür çözeltisi de kullanılabilir. Kalibrasyon için probu temiz suyla durula, kâğıt havluyla kurula, çözeltiye daldır, 1–2 dakika bekle ve Seri Monitör'e cal: ile birlikte çözeltinin ppm değerini yaz. Kod, ölçtüğü değerle gerçek değer arasındaki oranı K katsayısı olarak EEPROM'a kaydeder; kart kapansa bile ayar kaybolmaz.
TDS değer tablosu: içme suyu, akvaryum ve hidroponik
Ölçtüğün sayının ne anlama geldiğini bilmek, sensörün kendisi kadar önemlidir. Dünya Sağlık Örgütü'nün tat değerlendirmesine göre 300 ppm'in altındaki su tat açısından mükemmel, 300–600 ppm iyi, 600–900 ppm orta, 900–1200 ppm zayıf, 1200 ppm'in üzeri ise kabul edilemez sayılır. Bunlar sağlık sınırı değil, tat ve kullanım rahatlığı için verilen aralıklardır. Aşağıdaki tablo yaygın kullanım alanları için tipik değerleri özetliyor.
| Su türü | Tipik TDS (ppm) | Yorum |
|---|---|---|
| Damıtık su, ters ozmoz (RO) çıkışı | 0–50 | Arıtma iyi çalışıyor |
| Dağ kaynağı, düşük mineralli şişe suyu | 20–150 | Çok hafif, yumuşak |
| Musluk suyu (şehre göre) | 100–500 | Kaynağa göre değişir; ani artış dikkat ister |
| Mineralli şişe suyu | 300–1500+ | Bilinçli olarak yüksek mineral |
| Tatlı su akvaryumu (genel) | 150–350 | Değişimlerden önce ve sonra ölç |
| Karides akvaryumu (Caridina) | 80–150 | RO suyuna mineral eklenerek ayarlanır |
| Afrika çiklit akvaryumu | 300–500 | Sert ve mineralli su sever |
| Deniz suyu | Yaklaşık 35.000 | Bu sensörün aralığının çok dışında |
Hidroponikte besin çözeltisi genellikle iletkenlik (EC) olarak ifade edilir ve bitkiye göre değişir. Ancak dikkat: bu sensörün ölçüm aralığı 1000 ppm'de biter, domates ve biber gibi besin isteyen bitkilerin çözeltisi bu sınırı aşar. Bu durumda ya çözeltiden bir örneği bilinen oranda damıtık suyla seyreltip ölçer ve sonucu çarparsın ya da doğrudan daha geniş aralıklı bir EC sensörü kullanırsın.
| Bitki | Önerilen EC (mS/cm) | Yaklaşık TDS (0,5 ölçeği) |
|---|---|---|
| Marul, ıspanak | 0,8–1,2 | 400–600 ppm |
| Fesleğen, nane | 1,0–1,6 | 500–800 ppm |
| Çilek | 1,0–1,5 | 500–750 ppm |
| Salatalık | 1,7–2,5 | 850–1250 ppm (seyreltme gerekir) |
| Domates, biber | 2,0–3,5 | 1000–1750 ppm (seyreltme gerekir) |
Su arıtma filtresi takibi
TDS sensörünün evde en faydalı kullanımı ters ozmoz (RO) arıtma cihazını izlemektir. RO membranı sağlıklıyken giren suyun minerallerinin büyük kısmını tutar; giriş 300 ppm iken çıkış genellikle 10–30 ppm civarındadır. Performansı tutma oranı = (1 − çıkış / giriş) × 100 formülüyle hesaplarsın: 300 ppm girip 15 ppm çıkıyorsa oran %95'tir. Membran yaşlandıkça çıkış TDS'si yavaş yavaş yükselir; oran %80–85'in altına inmeye başladığında membran ve ön filtreleri değiştirme zamanı yaklaşmıştır. İki prob ve iki DS18B20 ile giriş ve çıkışı aynı anda ölçen bir Arduino, bu değişimi aylar boyunca grafik olarak gösterebilir.
ESP32 ile TDS kaydı
ESP32 ile TDS ölçümlerini dakikada bir, zaman damgasıyla kaydedebilir ve ileride internete gönderebilirsin. Aşağıdaki kod saati NTP ile internetten alır, her dakika suyun sıcaklığını ve TDS değerini ölçer ve kartın kendi flaş belleğindeki LittleFS dosya sistemine "/tds.csv" adlı bir dosyaya "tarih,sıcaklık,tds" satırları ekler. Bu dosyayı daha sonra Excel'de açıp grafik çizebilirsin. ESP32'nin ADC'si doğrusal değildir; kod bu yüzden kart üzerindeki kalibrasyon verisini kullanan analogReadMilliVolts() fonksiyonunu kullanır. TDS sinyalini Wi-Fi açıkken de çalışan ADC1 pinlerinden birine (GPIO 32–39) bağlamalısın; ADC2 pinleri Wi-Fi ile birlikte kullanılamaz. NTP saatinin ayrıntıları ESP32 NTP saat yazısında.
1#include <WiFi.h>
2#include <LittleFS.h>
3#include <OneWire.h>
4#include <DallasTemperature.h>
5#include <time.h>
6
7const char* WIFI_SSID = "AgAdi";
8const char* WIFI_PASS = "Sifre123";
9const int TDS_PIN = 34; // ADC1 kanalı, Wi-Fi ile çalışır / ADC1 channel, works with Wi-Fi
10const int DS_PIN = 4;
11const float K_FAKTOR = 1.0; // Arduino'daki gibi kalibre et / calibrate as on the Arduino
12const unsigned long ARALIK_MS = 60000; // dakikada bir kayıt / one log per minute
13
14OneWire oneWire(DS_PIN);
15DallasTemperature ds(&oneWire);
16unsigned long sonKayit = 0;
17
18float gerilimOku() { // 30 örneğin ortancası, volt / median of 30 samples, volts
19 int mv[30];
20 for (int i = 0; i < 30; i++) { mv[i] = analogReadMilliVolts(TDS_PIN); delay(5); }
21 for (int i = 1; i < 30; i++) {
22 int x = mv[i], j = i - 1;
23 while (j >= 0 && mv[j] > x) { mv[j + 1] = mv[j]; j--; }
24 mv[j + 1] = x;
25 }
26 return mv[15] / 1000.0;
27}
28
29float tdsHesapla(float v, float derece) {
30 v = v / (1.0 + 0.02 * (derece - 25.0)); // sıcaklık kompanzasyonu / temperature compensation
31 return (133.42 * v * v * v - 255.86 * v * v + 857.39 * v) * 0.5 * K_FAKTOR;
32}
33
34void setup() {
35 Serial.begin(115200);
36 ds.begin();
37 LittleFS.begin(true); // ilk açılışta biçimlendir / format on first boot
38 WiFi.begin(WIFI_SSID, WIFI_PASS);
39 while (WiFi.status() != WL_CONNECTED) delay(500);
40 configTzTime("<+03>-3", "pool.ntp.org"); // zaman damgası için NTP / NTP for timestamps
41}
42
43void loop() {
44 if (millis() - sonKayit < ARALIK_MS && sonKayit != 0) return;
45 sonKayit = millis();
46
47 ds.requestTemperatures(); // ~750 ms bekler / waits ~750 ms
48 float derece = ds.getTempCByIndex(0);
49 if (derece == DEVICE_DISCONNECTED_C) derece = 25.0;
50 float tds = tdsHesapla(gerilimOku(), derece);
51
52 struct tm t;
53 char zaman[20] = "saat-yok";
54 if (getLocalTime(&t, 2000)) strftime(zaman, sizeof(zaman), "%Y-%m-%d %H:%M:%S", &t);
55
56 char satir[64];
57 snprintf(satir, sizeof(satir), "%s,%.1f,%.0f", zaman, derece, tds);
58 File f = LittleFS.open("/tds.csv", FILE_APPEND); // tarih,sicaklik,tds / date,temp,tds
59 if (f) { f.println(satir); f.close(); }
60 Serial.println(satir);
61}
62Kaydı internete taşımak istersen aynı satırı LittleFS yerine bir Google E-Tablolar sayfasına ya da MQTT ile Home Assistant'a gönderebilirsin; ayrıntılar ESP32 Google Sheets ve ESP32 MQTT yazılarında. Flaş bellek sınırlı bir yazma ömrüne sahiptir; dakikada bir kısa satır sorun yaratmaz, ama her saniye yazmak yerine ölçümleri bellekte toplayıp aralıklı yazmak iyi bir alışkanlıktır.
Raspberry Pi Pico ile TDS (MicroPython)
Pico'da TDS sinyalini GP26'ya (ADC0), DS18B20'yi GP22'ye bağlarsın. MicroPython'da DS18B20 için gereken onewire ve ds18x20 modülleri firmware içinde hazır gelir, ek kurulum gerekmez. Pico'nun ADC'si read_u16() ile 0–65535 arasında bir değer döndürür; bunu 3,3 V'a göre gerilime çeviririz. Formül ve kompanzasyon Arduino koduyla aynıdır; K_FAKTOR değerini Arduino'daki kalibrasyon yöntemiyle bulup koda yazabilirsin.
1from machine import ADC, Pin
2import onewire, ds18x20, time
3
4adc = ADC(26) # GP26 = ADC0, TDS sinyali / TDS signal
5ds = ds18x20.DS18X20(onewire.OneWire(Pin(22))) # DS18B20 veri pini / data pin
6roms = ds.scan()
7K_FAKTOR = 1.0 # kalibrasyon katsayısı / calibration factor
8
9def gerilim_oku(n=31): # ortanca ile gürültü filtresi / median noise filter
10 olcumler = []
11 for _ in range(n):
12 olcumler.append(adc.read_u16())
13 time.sleep_ms(5)
14 olcumler.sort()
15 return olcumler[n // 2] * 3.3 / 65535
16
17def tds_hesapla(v, derece):
18 v = v / (1.0 + 0.02 * (derece - 25.0)) # 25 °C'ye indir / normalise to 25 °C
19 ec = 133.42 * v ** 3 - 255.86 * v ** 2 + 857.39 * v
20 return ec * 0.5 * K_FAKTOR
21
22while True:
23 derece = 25.0
24 if roms:
25 ds.convert_temp()
26 time.sleep_ms(750) # DS18B20 dönüşüm süresi / conversion time
27 derece = ds.read_temp(roms[0])
28 tds = tds_hesapla(gerilim_oku(), derece)
29 print("Sicaklik: {:.1f} C TDS: {:.0f} ppm".format(derece, tds))
30 time.sleep(1)
31TDS sensörü ile pH sensörü farkı
Su kalitesi projelerinde TDS ve pH sensörleri sık karıştırılır, oysa tamamen farklı şeyleri ölçerler. TDS suyun içindeki iyonların miktarını, pH ise suyun asitliğini ya da bazlığını (hidrojen iyonu etkinliğini) gösterir. Bir bardak suya birkaç damla limon suyu eklersen pH belirgin şekilde düşer ama TDS çok az değişir; bir tutam tuz eklersen TDS fırlar, pH neredeyse aynı kalır. Akvaryum ve hidroponikte genellikle ikisi birlikte izlenir.
| Özellik | TDS sensörü | pH sensörü |
|---|---|---|
| Ölçtüğü şey | Çözünmüş iyon miktarı (iletkenlik) | Asitlik / bazlık (0–14) |
| Birim | ppm (mg/L) ya da µS/cm | pH birimi |
| Prob | Dayanıklı iki metal elektrot | Kırılgan cam elektrot |
| Kalibrasyon | Tek nokta (ör. 1413 µS/cm) | İki ya da üç nokta (pH 4, 7, 10 tampon) |
| Bakım | Ara sıra temizlik | Islak saklama, düzenli kalibrasyon, 1–2 yılda prob değişimi |
| Fiyat | Ucuz | Daha pahalı |
| Tipik kullanım | Arıtma takibi, sertlik, besin yoğunluğu | Akvaryum, havuz, hidroponik pH ayarı |
TDS sensörü ile proje fikirleri
- Arıtma filtresi alarmı: RO çıkışında TDS 50 ppm'i geçince buzzer çal ve ekranda "filtre değiştir" yaz.
- Akvaryum monitörü: TDS, sıcaklık ve su seviyesini tek ekranda göster, su değişim zamanını hatırlat.
- Hidroponik besin kontrolü: EC düşünce peristaltik pompayla besin ekle; akıllı sera projesiyle birleştir.
- Musluk suyu kaydı: Evdeki suyun TDS'sini günlerce kaydet ve şebeke değişimlerini grafikte gör.
- Bitki sulama suyu: Yağmur suyu, musluk suyu ve arıtılmış suyu karşılaştır; tuzlanmaya hassas bitkiler için en uygununu seç.
- Okul deneyi: Farklı miktarda tuz ve şeker çözerek iletkenlik ile çözünen madde türü arasındaki ilişkiyi göster.
Sık yapılan hatalar ve çözümleri
| Belirti | Olası neden | Çözüm |
|---|---|---|
| Değer sürekli dalgalanıyor | Prob suya yeni girdi ya da kabarcık var | 20–30 saniye bekle, probu hafifçe salla, medyan filtre kullan |
| Sıcak ve soğuk suda farklı sonuç | Sıcaklık kompanzasyonu yok | DS18B20 ekle ve sıcaklığı formüle ver |
| Bütün değerler yaklaşık %50 farklı | VREF yanlış (5 V yerine 3,3 V ya da tersi) | Kartının ADC referansını doğru yaz |
| Kalem ölçerden farklı sonuç | Farklı dönüşüm katsayısı (0,5 / 0,7) ya da kalibrasyonsuz | Aynı ölçeği kullan, bilinen sıvıyla kalibre et |
| Yüksek değerlerde tavan yapıyor | Sensörün aralığı 1000 ppm | Örneği seyrelt ya da geniş aralıklı EC sensörü kullan |
| pH sensörüyle birlikte saçma sonuçlar | İki prob aynı suda birbirini etkiliyor | Sırayla ölç ya da yalıtımlı modül kullan |
| ESP32'de Wi-Fi açılınca okuma bozuluyor | Sinyal ADC2 pinine bağlı | GPIO 32–39 arasındaki ADC1 pinlerinden birini kullan |
TDS sensörü, su kalitesini sayıya döken en ucuz ve en kolay araçtır: doğru sıcaklık kompanzasyonu ve basit bir kalibrasyonla musluk suyunu, arıtma cihazını, akvaryumu ve hidroponik çözeltini güvenle izleyebilirsin. Sonuçları yorumlarken TDS'nin mikrobiyolojik güvenliği ölçmediğini aklında tut. BlueGrays uygulamasında akıllı sulama istasyonu ve zaman damgalı sıcaklık kaydedici projelerini adım adım devre şemaları ve kodlarıyla bulabilir, TDS sensörünü bu projelere ekleyebilirsin.
Sıkça sorulan sorular
TDS değeri kaç olmalı?
İçme suyu için Dünya Sağlık Örgütü'nün tat değerlendirmesine göre 300 ppm'in altı mükemmel, 300–600 ppm iyi kabul edilir; 1200 ppm'in üzeri tat açısından kabul edilemez sayılır. Ters ozmoz arıtma çıkışında genellikle 10–50 ppm görülür. Akvaryum ve hidroponikte ideal değer canlıya ve bitkiye göre değişir.
TDS ölçer ne ölçer, suyun temiz olduğunu gösterir mi?
TDS ölçer suyun iletkenliğinden yola çıkarak içindeki çözünmüş mineral ve tuz miktarını tahmin eder. Bakteri, virüs, kurşun ya da tarım ilacı gibi kirleticiler iletkenliği pek değiştirmediği için TDS düşük diye su güvenli sayılmaz. TDS, arıtma performansını ve mineral yükündeki değişimi izlemek için kullanılmalıdır.
TDS sensörü nasıl kalibre edilir?
Probu temizleyip değeri bilinen bir kalibrasyon çözeltisine, örneğin 1413 µS/cm KCl standardına (yaklaşık 707 ppm) daldırırsın. Ölçüm oturunca okunan değer ile gerçek değerin oranı bir katsayı olarak kaydedilir ve sonraki tüm ölçümler bu katsayıyla çarpılır. Kalibrasyon sırasında sıcaklık kompanzasyonunun açık olması gerekir.
TDS ile EC arasındaki fark nedir?
EC (elektriksel iletkenlik) suyun elektriği ne kadar iyi ilettiğini µS/cm ya da mS/cm cinsinden doğrudan ölçer. TDS ise bu iletkenlikten bir katsayıyla, genellikle 0,5 ya da 0,7 ile hesaplanan tahmini çözünmüş madde miktarıdır (ppm). Hidroponikte EC, içme suyunda ise TDS daha yaygın kullanılır.
TDS sensörü sürekli suda kalabilir mi?
Prob su geçirmezdir ve akvaryum ya da hidroponik tankında sürekli kalabilir, ancak birkaç haftada bir temizlenmesi gerekir; sinyal kartı ise su geçirmez değildir ve kuru yerde durmalıdır. Prob yaklaşık 55 °C'nin üzerindeki sularda kullanılmamalıdır. Uzun süreli kullanımda ölçüm kayması için kalibrasyonu ara sıra tekrarla.
Arduino TDS sensörü ile pH ölçülür mü?
Hayır. TDS sensörü yalnızca iletkenliği ve buna bağlı çözünmüş madde miktarını ölçer; pH yani asitlik için cam elektrotlu ayrı bir pH sensörü gerekir. İkisi aynı projede kullanılabilir, ama aynı kapta aynı anda çalıştıklarında birbirlerinin ölçümünü bozabilecekleri için sırayla ölçmek ya da yalıtımlı modül kullanmak gerekir.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
Akıllı Sulama İstasyonu
Tatile gidince çiçeklerin kurumasın diye kendi kendine sulayan bir bahçıvan. Toprak nem sensörü toprağın ne kadar ıslak olduğunu ölçer; toprak kuruyunca Arduino su pompasını birkaç saniye çalıştırır v

ESP32 Sıcaklık Loglayıcı (DHT22 + DS1307 RTC + microSD + OLED)
ESP32 ile zamanlı sıcaklık ve nem kayıt sistemi kur! Bu projede DHT22 sensörü ile dakikada bir sıcaklık/nem okuyup DS1307 RTC modülünden aldığın gerçek zaman etiketiyle microSD karta CSV formatında kaydediyoruz. OLED ekranda büyük font ile son sıcaklık değeri, nem yüzdesi, timestamp ve toplam kayıt sayısı canlı gösterilir. SD kart üzerindeki /temp_log.csv dosyası Excel/Google Sheets/Python pandas ile açılıp analiz edilebilir — sera monitörü, ev/oda sıcaklık takibi, laboratuvar veri toplama,

ESP32 DHT22 Sıcaklık ve Nem (LCD Ekranlı)
DHT22 sensörü ile ortam sıcaklığını ve nem oranını ölçüp 16x2 I2C LCD ekranda gerçek zamanlı olarak gösteren bir projedir. Adafruit DHT kütüphanesi kullanılarak tek kablo (one-wire) protokolü ile sensörden veri okunur. Bu proje, IoT hava istasyonu, akıllı ev otomasyonu veya seralarda ortam takip sistemlerinin temelini oluşturur. ESP32'nin GPIO 4 pini üzerinden DHT22 ile haberleşme sağlanır.

DHT11 İle Sıcaklık Ve Nem
Odan kaç derece, hava nemli mi, kuru mu? DHT11 sensörü sıcaklığı ve nemi ölçer, Arduino da bu değerleri iki satırlık LCD ekrana yazar ve birkaç saniyede bir yeniler. Sensöre bir şey olursa ekranda hat

NTC ve 2x16 Lcd Ekran İle Sıcaklık Ölçümü
Ortamın sıcaklığını küçük bir boncuk gibi görünen sensörle ölç. NTC adlı bu parça ısındıkça elektriği daha kolay geçirir; Arduino bu değişimi okuyup bir formülle santigrat dereceye çevirir ve iki satı

LCD Ekran ile Dijital Voltmetre
Pilin ya da adaptörün ne kadar gerilim verdiğini kendi yaptığın ölçü aletiyle öğren. İki dirençten oluşan bir bölücü yüksek gerilimi kartın okuyabileceği seviyeye indirir, Arduino da gerçek değeri hes

Ldr İle Işık Şiddeti Okuma
Odanın ne kadar aydınlık olduğunu sayıyla görmek ister misin? Işığa duyarlı küçük bir parça olan LDR ortam ışığını ölçer ve Arduino bu değeri yarım saniyede bir bilgisayar ekranına yazar. Elinle üstün
Diğer yazılar
BlueGrays uygulaması
Bu devreyi telefonunda adım adım kur
Devre şeması, kod ve parça listesi tek ekranda. 200'den fazla Arduino, ESP32 ve Pico projesi seni bekliyor.
Telefonunla tara
Kamerayı koda tut; telefonunun uygulama mağazası açılır.
ya da mağazada aç

