Toprak Nem Sensörü ile Otomatik Sulama Sistemi
Arduino ile toprak nem sensöründen analog değer okuyup toprak kuruduğunda röle üzerinden su pompasını çalıştırmayı öğreneceğiz.
Bu derste Arduino ile basit bir otomatik sulama sistemi hazırlayacağız. Toprak nem sensörü, toprağın nem durumuna göre Arduino’ya analog değer gönderir. Arduino bu değeri okuyarak toprak kuruysa pompayı çalıştırır, yeterince nemliyse pompayı kapalı tutar.
- Arduino Uno
- Toprak nem sensörü
- 1 kanal röle modülü
- Mini su pompası
- Harici güç kaynağı veya pil kutusu
- Jumper kablolar
- Su kabı ve hortum
- İsteğe bağlı olarak kırmızı ve yeşil LED
Su pompası doğrudan Arduino pininden çalıştırılmamalıdır. Pompa için harici güç kullanılmalı, Arduino sadece röle modülünü kontrol etmelidir.
Toprak nem sensörünün analog çıkışı Arduino’nun A0 pinine bağlanır. Röle modülünün kontrol pini ise Arduino’nun 8 numaralı dijital pinine bağlanır. Pompa rölenin anahtarlama uçları üzerinden harici güç kaynağına bağlanır.
Bazı röle modülleri LOW sinyal geldiğinde aktif olur. Kodda bu durum için ROLE_AKTIF_LOW değişkeni eklendi. Röleniz ters çalışırsa bu değeri değiştirebilirsiniz.
Toprak nem sensörü Arduino’ya 0 ile 1023 arasında analog bir değer gönderir. Sensörün verdiği değer, kullanılan sensör tipine ve toprağın nem durumuna göre değişebilir.
Genellikle toprak kurudukça okunan değer yükselir. Kodda belirlenen eşik değerinin üzerinde bir okuma yapılırsa toprak kuru kabul edilir ve röle aktif edilerek pompa çalıştırılır.
En doğru sonuç için sensör önce kuru toprakta, sonra nemli toprakta denenmeli ve eşik değeri buna göre belirlenmelidir.
Bu kodda toprak nem sensöründen okunan değer eşik değerinden büyükse pompa çalışır. Değer eşik değerinin altına düştüğünde pompa kapanır.
const int nemSensoru = A0;
const int rolePin = 8;
const int esikDeger = 600;
// Röleniz LOW sinyalle aktif oluyorsa true,
// HIGH sinyalle aktif oluyorsa false yapın.
const bool ROLE_AKTIF_LOW = true;
int nemDegeri = 0;
void setup() {
pinMode(rolePin, OUTPUT);
roleKapat();
Serial.begin(9600);
}
void loop() {
nemDegeri = analogRead(nemSensoru);
Serial.print("Toprak nem degeri: ");
Serial.println(nemDegeri);
if (nemDegeri > esikDeger) {
roleAc();
Serial.println("Toprak kuru. Pompa calisiyor.");
} else {
roleKapat();
Serial.println("Toprak nemli. Pompa kapali.");
}
delay(1000);
}
void roleAc() {
if (ROLE_AKTIF_LOW) {
digitalWrite(rolePin, LOW);
} else {
digitalWrite(rolePin, HIGH);
}
}
void roleKapat() {
if (ROLE_AKTIF_LOW) {
digitalWrite(rolePin, HIGH);
} else {
digitalWrite(rolePin, LOW);
}
}
Bu sürümde pompanın sürekli açılıp kapanmasını engellemek için iki farklı eşik değeri kullanıldı. Ayrıca pompanın çok uzun süre açık kalmasını önlemek için güvenlik süresi eklendi.
const int nemSensoru = A0;
const int rolePin = 8;
const int kirmiziLed = 6;
const int yesilLed = 7;
// Toprak kuruyken genellikle değer yükselir.
// Kendi sensörünüze göre bu değerleri değiştirebilirsiniz.
const int kuruEsik = 650;
const int nemliEsik = 520;
// Röleniz LOW sinyalle aktif oluyorsa true,
// HIGH sinyalle aktif oluyorsa false yapın.
const bool ROLE_AKTIF_LOW = true;
const unsigned long maksimumSulamaSuresi = 5000;
const unsigned long beklemeSuresi = 10000;
int nemDegeri = 0;
bool pompaCalisiyor = false;
unsigned long pompaBaslamaZamani = 0;
unsigned long sonSulamaZamani = 0;
void setup() {
pinMode(rolePin, OUTPUT);
pinMode(kirmiziLed, OUTPUT);
pinMode(yesilLed, OUTPUT);
roleKapat();
digitalWrite(kirmiziLed, LOW);
digitalWrite(yesilLed, LOW);
Serial.begin(9600);
}
void loop() {
nemDegeri = analogRead(nemSensoru);
Serial.print("Toprak nem degeri: ");
Serial.println(nemDegeri);
unsigned long simdikiZaman = millis();
if (!pompaCalisiyor && nemDegeri >= kuruEsik && simdikiZaman - sonSulamaZamani >= beklemeSuresi) {
pompaBaslat();
}
if (pompaCalisiyor && nemDegeri <= nemliEsik) {
pompaDurdur();
}
if (pompaCalisiyor && simdikiZaman - pompaBaslamaZamani >= maksimumSulamaSuresi) {
pompaDurdur();
}
durumLedleriniGuncelle();
delay(500);
}
void pompaBaslat() {
roleAc();
pompaCalisiyor = true;
pompaBaslamaZamani = millis();
Serial.println("Toprak kuru. Pompa calisti.");
}
void pompaDurdur() {
roleKapat();
pompaCalisiyor = false;
sonSulamaZamani = millis();
Serial.println("Pompa durdu.");
}
void durumLedleriniGuncelle() {
if (pompaCalisiyor) {
digitalWrite(kirmiziLed, HIGH);
digitalWrite(yesilLed, LOW);
} else {
digitalWrite(kirmiziLed, LOW);
digitalWrite(yesilLed, HIGH);
}
}
void roleAc() {
if (ROLE_AKTIF_LOW) {
digitalWrite(rolePin, LOW);
} else {
digitalWrite(rolePin, HIGH);
}
}
void roleKapat() {
if (ROLE_AKTIF_LOW) {
digitalWrite(rolePin, HIGH);
} else {
digitalWrite(rolePin, LOW);
}
}
Bu kodda kuruEsik değerine ulaşıldığında sulama başlar, nemliEsik değerine düşüldüğünde sulama durur. Böylece sistem eşik değerinin çevresinde sürekli açılıp kapanmaz.
Toprak nem sensörleri her ortamda aynı değeri vermeyebilir. Bu yüzden önce sensörü kuru toprakta okuyup seri port ekranındaki değeri not edin. Daha sonra sensörü nemli toprakta okuyup ikinci değeri not edin.
Bu iki değer arasında uygun bir eşik belirleyerek sistemi daha kararlı hale getirebilirsiniz.
Uzun süreli projelerde kapasitif toprak nem sensörü kullanmak daha sağlıklı olabilir. Dirençli tip sensörler sürekli toprak içinde kaldığında zamanla oksitlenebilir.