Sorunun Kökeni
Toprak nem sensörünün zıplayan analog değerler vermesinin başlıca nedenleri şunlardır:
- Güç dalgalanması – Arduino’nun 5 V hattı sensörle aynı hat üzerinden besleniyorsa pompa, LED vb. yükler gerilimi çeker.
- Kablolama ve topraklama – Uzun kablolar, gevşek bağlantılar ve eksik ortak toprak sinyali gürültü oluşturur.
- Sensörün kendisi – Çoğu ucuz toprak nem sensörü bir potansiyometre + bir NPN transistör içerir; sensörün iç direnci 10 kΩ‑20 kΩ civarında değişir ve yüksek empedans nedeniyle ADC girişinde “yüzeysel” ölçüm olur.
- ADC referansının değişmesi – Arduino’nun varsayılan 5 V referansı, besleme gerilimi dalgalandıkça ölçümde sapma meydana gelir.
Donanım Kontrolleri
Güç kaynağını izole edin
- Sensör ve Arduino’nun 5 V hatlarını ayırın. Sensör için bir regüleli 3.3 V (veya 5 V) kaynağı, Arduino’nun USB beslemesinden bağımsız bir DC‑DC buck ya da LDO kullanın.
- Pompayı transistör (IRLZ44N gibi) ya da MOSFET üzerinden sürün; Arduino’nun pininden doğrudan çekmeyin.
Kablolamayı kısaltın ve kablo kalınlığına dikkat edin
- 20 cm’den uzun kablo kullanıyorsanız, kalkanlı (shielded) kablo tercih edin.
- Sensör ve Arduino arasına 100 nF kapasitör (GND‑A0 arasında) ekleyerek yüksek frekanslı gürültüyü süzün.
Toprak nem sensörünün bağlantısı
`text
VCC → 5 V (veya 3.3 V)
GND → GND
AOUT → A0 (Arduino analog giriş)
`
- Eğer sensör iki kablolu (VCC‑GND) ve bir adet analog çıkışlı ise, 10 kΩ pull‑down direnci A0‑GND arasında bağlayın. Bu, girişin “yüzen” kalmasını önler.
Yazılım & Kalibrasyon
1. Sabit referans kullanın
`cpp
// AREF pinine stabil 3.3V bağlayın ve aşağıdaki satırı ekleyin
analogReference(EXTERNAL);
`
Bu, ADC’nin referans gerilimini sabitleyerek ölçümdeki dalgalanmayı azaltır.
2. Ortalama ve medyan filtre
`cpp
const uint8_t N = 10; // örnek sayısı
int readings[N];
uint8_t idx = 0;
int readSoil() {
readings[idx++] = analogRead(A0);
if (idx == N) idx = 0;
// medyan bul
int copy[N];
memcpy(copy, readings, sizeof(readings));
sort(copy, copy+N);
return copy[N/2];
}
`
Bu basit medyan filtresi “tek tek” pikleri yok eder.
3. Kalibrasyon adımları
| Adım | Açıklama |
|------|----------|
| Kuru toprak | Sensörü havada (veya tamamen kurumuş toprakta) 5 s tutun, ortalama değeri dryVal olarak kaydedin. |
| Islak toprak | Sensörü su dolu bir kaba (yaklaşık 100 % nem) 5 s tutun, ortalama değeri wetVal olarak kaydedin. |
| Haritalama | int moisture = map(readSoil(), dryVal, wetVal, 0, 100); ile % nem elde edin. |
| Eşik belirleme | Örneğin if (moisture < 30) pumpOn(); else pumpOff(); gibi bir eşik koyun. |
4. Pompa kontrolü (Gecikme & Koruma)
`cpp
unsigned long lastPump = 0;
const unsigned long pumpDelay = 60000; // 1 dk aralık
void loop() {
int moisture = map(readSoil(), dryVal, wetVal, 0, 100);
if (moisture < 30 && millis() - lastPump > pumpDelay) {
digitalWrite(PUMP_PIN, HIGH);
lastPump = millis();
} else {
digitalWrite(PUMP_PIN, LOW);
}
}
`
Bu, pompanın aşırı çalışmasını ve gerilim çöküşünü önler.
Son Kontroller
- GND ortaklığı: Tüm devre elemanlarının (Arduino, sensör, pompa sürücü) ortak bir GND’e bağlandığından emin olun.
- Gürültü ölçümü: Bir multimetre ile sensör çıkışının DC değerini ölçün; dalgalanma varsa güç kaynağını tekrar kontrol edin.
- Yazılım debug:
Serial.println(moisture); ile gerçek zamanlı % nem değerini izleyin, ani sıçramalar olup olmadığını kontrol edin.
Bu adımları izleyerek sensörün kararlı ve doğru veri vermesini sağlayabilir, pompanın da zamanında çalışmasını güvence altına alabilirsiniz. Başarılar!