Proje 13 - Bitki Takip Sistemi
Giriş
Bitkilerin konuşamadığını kim söyledi? Bu projede toprak nem sensörünü kullanarak çiçeğinin ne zaman susadığını anlayacağız. Eğer toprak kurumuşsa sistem seni hem görsel hem de sesli olarak uyaracak. Ama merak etme; buzzer seni rahatsız etmemek için sadece 3 kez kısa kısa ötecek, LED ise sen çiçeği sulayana kadar sana hatırlatmak için yanık kalacak.
Bu projede öğreneceklerin:
- Toprak nem sensörü ile analog değer okuma
- Bayrak (flag) değişkeni ile tek seferlik uyarı sistemi
- LCD ekran ile gerçek zamanlı değer gösterimi
- Analog sensör verilerini mantıksal kararlara dönüştürme
Elektronik
Bitki Takip Sistemi devresinde dört ana bileşen bulunuyor:
Toprak Nem Sensörü (Analog Pin A6)
Toprak nem sensörü, toprağın içindeki su miktarını ölçen iki bacaktan oluşur. Su iletken olduğu için toprak ıslakken bacaklar arası direnç düşer, kurudukça direnç artar. Arduino bu değişimi analogRead() ile 0 ile 1023 arasında bir sayı olarak okur.
Dikkat
Değer ne kadar düşükse, toprak o kadar kuru demektir. Bu sezgisel değil ama mantıklı: kuru toprakta direnç yüksek olduğu için az akım geçer, dolayısıyla sensör düşük değer okur.
Kırmızı LED (Digital Pin D10)
Toprak kuruduğunda sürekli yanan görsel uyarı. Çiçeği suladığında otomatik söner.
Buzzer (Digital Pin D3)
Toprak ilk kuruduğunda 3 kez kısa bip sesi çıkarır. Sonrasında sessiz kalır — sürekli bip sesi yerine tek seferlik uyarı sistemi kullanıyoruz.
LCD Ekran (I²C Adresi 0x21)
16x2 karakterlik LCD ekran, anlık nem değerini ve sistem durumunu gösterir:
- 1. satır: Anlık nem sensörü değeri
- 2. satır: "BENI SULA! :(" veya "DURUM: TAMAM :)"


Kod
Kütüphane kurulumu gerekli
Bu projenin çalışması için bazı kütüphanelerin kurulmuş olması gerekiyor. Detaylı kütüphane kurulum talimatları için Kütüphane kurma sayfasına bakabilirsin.
Bu proje için gerekli kütüphane:
- Adafruit LiquidCrystal Attiny85
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | |
Kodu nasıl Arduino'ya yüklerim?
Kiti USB kablosuyla bilgisayarına bağlayıp, Arduino IDE penceresinde bulunan
butonuna basarak kodu yükleyip çalıştırabilirsin.
Kodu yükledikten sonra sensörü toprağa daldır ve ekrandaki değerin nasıl değiştiğini izle. Çiçeği suladığında sayının nasıl yükseldiğini canlı canlı görebilirsin!
Olmadı mı?
Eğer bu süreçte bir problemle karşılaşırsan Sorun giderme kısmına bir göz at.
Bayrak (Flag) Mekanizması
Bu projede önemli bir programlama tekniği kullanıyoruz: bayrak değişkeni.
Sorun şu: loop() fonksiyonu sürekli tekrar ediyor. Eğer buzzer çalma koşulunu sadece if (nemDegeri < esikDegeri) ile kontrol etsek, toprak her kuru kaldığında buzzer çalmaya devam ederdi.
Çözüm: uyariVerildi adlı bir bool değişkeni tutuyoruz.
1 2 3 4 5 6 7 8 9 10 | |
Bu sayede buzzer her kuruma döneminde yalnızca bir kez 3 bip sesi çıkarır.
Kalibrasyon
Sensör değerleri bitkiden bitkiye, hatta topraktan toprağa değişir. Kendi bitkine göre esikDegeri değişkenini ayarla:
| Bitki Türü | Önerilen Eşik Değeri |
|---|---|
| Sukulent, Paşa Kılıcı | ~300 (az su sever) |
| Çiçek, sebze | ~400-500 |
| Tropikal bitkiler | ~500-600 |
Ekrandaki "Nem Degeri" sayısını izleyerek toprağı ıslattığında ve kuruttuğunda hangi aralıkta değer aldığını gör — eşiğini buna göre belirle.
Egzersizler
-
Kalibrasyon dene:
esikDegerideğişkenini 400 ve 500 olarak değiştirip sensörün tepkisinin nasıl değiştiğini gözlemle.1 -
Farklı bitki, farklı eşik: Farklı iki bitki için farklı eşik değerleri belirleyebilir misin?2
-
Aşırı sulama uyarısı: Nem değeri çok yükseldiğinde (örneğin 800'ü geçtiğinde) buzzer'ın farklı bir frekansta ötmesini sağlayabilir misin?3
-
int esikDegeri = 300;satırınıint esikDegeri = 400;olarak değiştir ve kodu yeniden yükle. ↩ -
İki farklı bitkinin toprak değerlerini ölçüp not al. Her birinin "kuru" sayılacağı değeri eşik olarak belirle. ↩
-
elsebloğuna yeni birifekle:if (nemDegeri > 800) { tone(buzzerPin, 2000); delay(500); noTone(buzzerPin); }↩