Arduino için toprak nem sensörünü nasıl bağlar ve ayarlarsınız?

Kerem Aydın·7 Temmuz 2026·⏱5 dk

Toprak nem sensörünü Arduino'ya bağlamak için güç çıkışlarını (VCC, GND) ve sinyal çıkışını (AO veya DO) mikrodenetleyicinin ilgili pinlerine bağlamanız gerekir. En önemli nokta, metal uçların hızlı korozyonunu önlemek için sensöre sadece ölçüm anında güç vermek amacıyla bir transistör veya dijital pin kullanmaktır. Doğru veriler, belirli bir toprak türünde "kuru" ve "ıslak" değerlerinin önceden kalibre edilmesinden sonra analog giriş (A0) üzerinden elde edilir.

Sensör tipi seçimi: Dirençli mi yoksa Kapasitif mi?

Piyasada iki ana sensör tipi bulunur ve seçim projenizin bütçesine ve dayanıklılık gereksinimlerine bağlıdır.

Dirençli sensörler (FC-28, YL-69, HL-69 modelleri) En ucuz ve popüler seçeneklerdir. Çalışma prensibi toprağın elektrik iletkenliğini ölçmeye dayanır: su miktarı arttıkça, iki metal prob arasındaki akım daha iyi iletilir.

  • Avantajları: Düşük fiyat, basit bağlantı.
  • Dezavantajları: Metal parçalar nemli ortamda elektroliz etkisiyle hızla oksitlenir ve bozulur. Darbeli güç kaynağı olmadan 1–3 ay içinde arızalanırlar.

Kapasitif sensörler (Capacitive Soil Moisture Sensor v1.2, v2.0) Topraktan sabit akım geçirmeden toprağın dielektrik geçirgenliğini ölçerler. Prob nem koruyucu vernikle kaplıdır ve metal doğrudan toprakla temas etmez.

  • Avantajları: Yüksek doğruluk, korozyon olmaması, uzun ömür (yıllarca).
  • Dezavantajları: Maliyet daha yüksektir (3–5 kat), daha dikkatli kalibrasyon gerektirirler.

Eğitim projeleri ve kısa süreli testler için dirençli FC-28 uygundur. Gerçek bir akıllı bahçe veya sera için kapasitif sensör kullanılması şiddetle tavsiye edilir.

Arduino'ya bağlantı şemaları

Yeni başlayanların yaptığı en büyük hata, dirençli sensöre sürekli 5V gerilim uygulamaktır. Bu, elektroliz reaksiyonuna neden olur ve topraktaki suyu birkaç gün içinde probları "yiyip bitiren" agresif bir ortama dönüştürür.

Seçenek 1: Darbeli güç kaynağı (dirençli sensörler için)

5V çıkışı yerine Arduino'nun dijital pinini (örneğin D7) kullanıyoruz. Pin, yalnızca veri okuma süresi boyunca voltaj sağlar.

Sensör ÇıkışıArduino Bağlantısıİşlevi
VCCDijital pin (örn., D7)Güç (kontrol edilebilir)
GNDGNDToprak
AO (Analog Out)Analog pin (örn., A0)Nem seviyesi sinyali
DO (Digital Out)KullanılmıyorEşik değeri (AO kullanıldığında gerekmez)

Seçenek 2: Kapasitif sensör bağlantısı

Kapasitif sensörler sürekli güce karşı daha az hassastır, ancak otonom projelerde enerji tasarrufu sağlamak için kontrollü güç şemasının uygulanması yine de önerilir.

Sensör ÇıkışıArduino Bağlantısıİşlevi
VCC3.3V veya 5V (veya dijital pin)Güç
GNDGNDToprak
SIG / AOAnalog pin (örn., A0)Sinyal

Dirençli sensörü asla sürekli olarak voltaj altında bırakmayın. Sadece ölçümden hemen önce digitalWrite(VCC_PIN, HIGH) ve hemen sonra LOW fonksiyonlarını kullanın.

Toprakta doğru kalibrasyon

Fabrika ayarları işe yaramaz çünkü toprağın yoğunluğu ve bileşimi (turba, kil, kum) iletkenliği büyük ölçüde etkiler. Kalibrasyon, bitkinin duracağı toprakta yapılmalıdır.

Kalibrasyon algoritması:

  1. Okuma kodunun yüklenmesi: analogRead() "ham" değerlerini seri monitörde görüntüleyen basit bir kod yükleyin.
  2. "Kuru" noktası: Sensörü tamamen kuru toprağa yerleştirin (önceden fırında veya havada birkaç gün kurutulmuş). Ortalama değeri kaydedin. Genellikle bu 950–1023 aralığındadır. Buna VALUE_DRY diyelim.
  3. "Islak" noktası: Toprağı "bataklık" haline gelene kadar sulayın veya sensörü suya batırın (belirli modelin talimatları buna izin veriyorsa). Alan koşulları için maksimum suyla doymuş toprak kullanmak daha iyidir. Değeri kaydedin. Dirençli sensörler için genellikle 450–600, kapasitif sensörler için 200–400 arasındadır. Buna VALUE_WET diyelim.

Bu iki sabit, ham verileri yüzdeye dönüştürmek için kodda kullanılacaktır.

Örnek kod: Yüzdelik hesaplamalı izleme

Bu kod, darbeli güç kaynağını uygular, analog sinyali okur ve bunu anlaşılır nem yüzdelerine dönüştürür (0% — kuru, 100% — ıslak).

// Bağlantı pinleri
const int POWER_PIN = 7; // Sensör güç pini
const int SENSOR_PIN = A0; // Analog sinyal pini

// Kalibrasyon sabitleri (KENDİ DEĞERLERİNİZLE DEĞİŞTİRİN)
const int VALUE_DRY = 1000;  // Kuru topraktaki değer
const int VALUE_WET = 550;   // Islak topraktaki değer

void setup() {
  Serial.begin(9600);
  
  // Güç pinini çıkış olarak başlatıp hemen kapatıyoruz
  pinMode(POWER_PIN, OUTPUT);
  digitalWrite(POWER_PIN, LOW);
}

void loop() {
  // 1. Sensör gücünü aç
  digitalWrite(POWER_PIN, HIGH);
  
  // 2. Sinyalin stabilize olması için bekle (dirençli için 10-50 ms yeterli)
  delay(50); 
  
  // 3. Verileri oku
  int sensorValue = analogRead(SENSOR_PIN);
  
  // 4. Sensör ömrünü korumak için gücü kapat
  digitalWrite(POWER_PIN, LOW);
  
  // 5. Yüzdeye dönüştür
  // map fonksiyonu [VALUE_WET...VALUE_DRY] aralığını [100...0] aralığına çevirir
  int moisturePercent = map(sensorValue, VALUE_WET, VALUE_DRY, 100, 0);
  
  // Değerlerin 0-100 sınırlarını aşmaması için kısıtlama
  moisturePercent = constrain(moisturePercent, 0, 100);
  
  // 6. Sonuçları yazdır
  Serial.print("Ham deger: ");
  Serial.print(sensorValue);
  Serial.print(" | Nem: ");
  Serial.print(moisturePercent);
  Serial.println("%");
  
  // Kontrol mantığı (örnek)
  if (moisturePercent < 30) {
    Serial.println(">> Sulama gerekli!");
  }
  
  // Ölçümler arası bekleme (örneğin, enerji tasarrufu için 1 saat)
  delay(3600000); 
}

Otomatik sulama sisteminin kurulması

Tam teşekküllü bir otomatik sulama sistemi oluşturmak için şemaya pompayı kontrol eden bir röle modülü eklenir.

Çalışma mantığı:

  • Nem eşik değerinin altına düşerse (örneğin %30) — pompa rölesini aç.
  • Sabit bir süre boyunca (örneğin 5 saniye) veya kapanış eşiğine ulaşana kadar (örneğin %80) sula.
  • Pompanın sınır değerinde sürekli açıp kapanmasını ("titremesini") önlemek için histerezis (açma ve kapama arasındaki fark) eklemek önemlidir.

Histerezisli örnek mantık

const int PUMP_RELAY_PIN = 8;
const int THRESHOLD_LOW = 30;  // <%30 olduğunda sulamayı başlat
const int THRESHOLD_HIGH = 80; // >%80 olduğunda sulamayı durdur

void controlPump(int moisture) {
  static bool isWatering = false;

  if (!isWatering && moisture < THRESHOLD_LOW) {
    digitalWrite(PUMP_RELAY_PIN, HIGH); // Pompayı aç (röle tipine bağlı)
    isWatering = true;
    Serial.println("Pompa ACIK");
  } 
  else if (isWatering && moisture >= THRESHOLD_HIGH) {
    digitalWrite(PUMP_RELAY_PIN, LOW); // Pompayı kapat
    isWatering = false;
    Serial.println("Pompa KAPALI");
  }
}

Sık yapılan hatalar ve sorunlar

  1. Okumalar dalgalanıyor veya 0/1023'e eşit.

    • Sensör problarıyla kablolar arasındaki temas kalitesini kontrol edin (ucuz modellerde genellikle kötü lehim).
    • Pompa için harici bir kaynak kullanıyorsanız, Arduino'nun toprağı (GND) ile güç kaynağının toprağının ortak olduğundan emin olun.
  2. Sensör kuru havada %100 nem gösteriyor.

    • Prob kontaklarının kir veya lehim artıklarıyla kısa devre yapması. Probları alkolle temizleyin.
    • Yanlış kalibrasyon: map() fonksiyonunda VALUE_DRY ve VALUE_WET değerlerinin yerleri karıştırılmış.
  3. Probların hızlı tahribatı.

    • Ölçümler arasında gücü kapatmayı unuttunuz. Dirençli sensörler sadece darbeli modda çalıştıklarında (görev döngüsü 1:1000 ve üzeri) uzun ömürlü olurlar.

SSS

Tek bir sensörü birden fazla bitki için kullanabilir miyim? Hayır. Her saksının kendi mikrokliması ve toprak hacmi vardır. Sensör, sadece problarına çok yakın mesafedeki nemi ölçer (2–3 cm yarıçap).

Neden seri monitördeki değerler değişmiyor? Dirençli bir sensör kullanıyorsanız, onu toprakta hafifçe hareket ettirmeyi veya sulamayı deneyin. Değerler maksimum veya minimumda takılı kaldıysa, kabloların bütünlüğünü ve kodda doğru pinin seçildiğini kontrol edin.

Ölçüm doğruluğunu nasıl artırabilirim? Tek bir ölçüm yapmak yerine, 1 ms aralıklarla 10–20 okumalık bir seri yapıp ardından aritmetik ortalamayı hesaplayın. Bu, rastgele elektriksel parazitleri yumuşatacaktır.