Tahıl bitkileri, dünya nüfusunun temel besin kaynağını oluşturmakta ve küresel gıda güvenliğinde stratejik öneme sahip bulunmaktadır. Ancak bu bitkilerde görülen hastalıklar, özellikle fungal patojenler, üretim potansiyelini ciddi şekilde sınırlamaktadır. Bunlar arasında tahıl küllemesi (Erysiphe graminis), ılıman ve serin iklim bölgelerinde en yaygın ve ekonomik açıdan en önemli hastalıklardan biridir. Hastalık, özellikle yüksek nem ve orta dereceli sıcaklıkların hakim olduğu dönemlerde hızla yayılabilmekte ve uygun koşullarda tüm tarla yüzeyini kaplayan epidemilere neden olabilmektedir. Geleneksel mücadele yöntemleri, hastalığın erken tespiti ve zamanında müdahale konularında yetersiz kalmakta, bu durum gereksiz kimyasal kullanımına veya geç kalınan müdahaleler nedeniyle telafi edilemez verim kayıplarına yol açmaktadır. Son yıllarda dijital tarım teknolojilerinin gelişmesi, hastalık yönetiminde yeni olanaklar sunmaktadır. Nesnelerin İnterneti (IoT), yapay zekâ, makine öğrenmesi ve otomatik kontrol sistemlerinin tarımsal uygulamalara entegrasyonu, tahıl küllemesi gibi hastalıkların yönetiminde devrim niteliğinde değişimler yaratmaktadır. Bu teknolojiler, hastalığın erken tespitinden, risk tahminlemesine, optimum ilaçlama zamanının belirlenmesinden, bölgesel otomatik müdahaleye kadar geniş bir yelpazede çözümler sunmaktadır.
Tahıl Küllemesinin Etiyolojisi ve Biyolojisi
Etmen ve Taksonomisi
Tahıl küllemesinin etmeni *Erysiphe graminis* (DC.) Wint., Ascomycota şubesinin Erysiphales takımına ait obligat parazit bir fungustur. Etmen, konukçu bitkinin epidermis hücrelerinden emilimle beslenen ektoparazitik bir yaşam tarzına sahiptir. Yüzeysel misel örtüsü oluşturan fungus, özelleşmiş yapılar olan haustorya (emeç) adı verilen emici organlarla epidermis hücrelerine nüfuz eder ve beslenme faaliyetini gerçekleştirir.
E. graminis, konukçu bitki cinslerine göre belirgin bir spesiyalizasyon göstermektedir. Bu spesiyalizasyon, "forma specialis" (f.sp.) kavramı ile ifade edilmekte ve her forma sadece belirli bir tahıl türünü enfekte edebilmektedir. Başlıca formalar şunlardır:
- E. graminis f.sp. tritici: Buğday (Triticum spp.) küllemesi
- E. graminis f.sp. hordei: Arpa (Hordeum vulgare) küllemesi
- E. graminis f.sp. secalis: Çavdar (Secale cereale) küllemesi
- E. graminis f.sp. avenae: Yulaf (Avena sativa) küllemesi
- E. graminis f.sp. bromi: Bromus spp. küllemesi
- E. graminis f.sp. poae: Poa spp. küllemesi
Her forma specialis içinde ise çok sayıda fizyolojik ırk bulunmaktadır. Bu ırklar, aynı bitki türünün farklı çeşitlerine karşı değişken virülans özellikleri gösterirler. Bu durum, dayanıklı çeşit geliştirme çalışmalarını karmaşıklaştırmakta ve sürekli ıslah çalışmalarını zorunlu kılmaktadır.
Yaşam Döngüsü ve Epidemiyoloji
Tahıl küllemesi fungusunun yaşam döngüsü, eşeyli ve eşeysiz üreme fazlarını içeren kompleks bir yapıdadır.
Eşeysiz Üreme (Aseksüel Faz)
Eşeysiz üreme, hastalığın epidemik yayılışında birincil role sahiptir. Konukçu bitki yüzeyinde gelişen miseller, epidermis hücrelerinden yukarı doğru dikleşen konidioforlar (konidi taşıyıcı hifler) oluştururlar. Bu konidioforların ucunda, tespih tanesi görünümünde sıralanmış konidiosporlar (aseksüel sporlar) meydana gelir. Her konidioforun ucunda 3-10 adet konidi zincirleme şekilde oluşabilmektedir. Olgunlaşan konidiosporlar rüzgâr, su damlacıkları ve mekanik temas yoluyla kolaylıkla ayrılır ve yeni enfeksiyonlar için inokulum kaynağı oluştururlar. Konidiosporların çimlenme ve enfeksiyon gerçekleştirme özellikleri şu şekilde özetlenebilir:
- Optimum çimlenme sıcaklığı: 10°C (minimum 0°C, maksimum 35°C)
- Optimum enfeksiyon sıcaklığı: 15-20°C
- Nem gereksinimi: Yüksek bağıl nem (%85-95)
- Yaprak ıslaklık süresi: Enfeksiyon için minimum 4-6 saat, optimum 8-12 saat
- İnkubasyon süresi: Uygun koşullarda 5-7 gün
Konidiosporların bol üretimi ve hızlı yayılma kapasitesi, hastalığın epidemik karakterini belirleyen en önemli faktördür. Uygun çevre koşullarında, tek bir enfeksiyon odağından üretilen sporlar kısa sürede geniş alanları etkileyebilmektedir.
Eşeyli Üreme (Seksüel Faz)
Konukçu bitkinin gelişme mevsimi sonuna doğru, özellikle fizyolojik olgunlaşma döneminde, fungus eşeyli üreme yapılarını oluşturmaya başlar. Yapraklarda sararmalar belirginleştiğinde, misel yığınları içinde kleistotesyumlar adı verilen kapalı meyve cisimleri meydana gelir.Kleistotesyumlar, küresel veya elipsoid formda, siyah-kahverengi renkli, 100-200 μm çapında yapılardır. Her kleistotesyum içinde ortalama 15-20 adet askus (spor kesesi) bulunmaktadır. Her askus içinde ise dinlenme devresinden sonra, uygun koşullarda 4-8 adet askospor (eşeyli spor) oluşur. Kleistotesyumlar, fungusun kış aylarında veya olumsuz koşullarda canlılığını sürdürmesini sağlayan dayanıklı yapılardır. Kurumuş bitki artıkları üzerinde aylarca canlı kalabilirler ve yeni yetiştirme sezonunda askosporları serbest bırakarak primer enfeksiyonları başlatırlar.
Kışlama Stratejileri
Fungusun kışlama stratejisi, coğrafi bölgeye ve iklim koşullarına bağlı olarak değişiklik göstermektedir:
İlıman bölgelerde: Kış aylarında bile bitki örtüsünün sürekli yeşil kaldığı Akdeniz iklimi bölgelerinde, fungus aktif misel halinde kışı geçirebilmektedir. Sonbahar ekimli tahıllarda, kış aylarında düşük seviyede de olsa enfeksiyonlar devam edebilmekte, ilkbaharda koşullar uygun hale geldiğinde hızla yayılım göstermektedir.
Soğuk bölgelerde: Kış aylarının sert geçtiği ve kar örtüsünün uzun süre kaldığı bölgelerde, fungus kleistotesyum halinde kışı geçirmektedir. Bu yapılar, tarlada kalan bitki artıkları üzerinde bahar aylarına kadar canlılığını korumaktadır.
Enfeksiyon Süreci ve Hastalık Gelişimi
Tahıl küllemesi enfeksiyonunun başarılı olması için belirli bir dizi olayın gerçekleşmesi gerekmektedir:
- Spor çimlenmesi: Yaprak yüzeyine ulaşan konidiosporlar, yeterli nem varlığında çimlenir. Çimlenme tüpü, yaprak yüzeyine paralel gelişir ve spesifik tanıma mekanizmaları ile uygun enfeksiyon noktasını tespit eder.
- Appressorium oluşumu: Uygun enfeksiyon noktasında (genellikle epidermis hücre birleşme noktaları), çimlenme tüpü şişerek appressorium adı verilen yapışma ve penetrasyon organını oluşturur.
- Haustorya gelişimi: Appressoriumdan gelişen penetrasyon hifası, epidermis hücre duvarını mekanik ve enzimatik yollarla delerek hücre içine girer. Hücre zarını delerek içeriye giren hif, burada haustoryumu (emeç) oluşturur. Haustorya, hücre zarını içeri doğru iterek gelişir ancak zarı parçalamaz, böylece konukçu hücre ile parazit arasında sürekli bir arayüzey oluşur.
- Misel gelişimi: Başarılı penetrasyondan sonra, yaprak yüzeyinde hızla misel ağı gelişir. Miseller çok sayıda yeni haustorya oluşturarak beslenme yüzeyini artırır.
- Sporulasyon: Enfeksiyondan 5-7 gün sonra, yüzeysel miseller konidioforlar oluşturarak yeni konidiosporlar üretmeye başlar. Bu aşamadan itibaren hastalık makroskopik olarak görünür hale gelir ve sekonder enfeksiyonlar için inokulum kaynağı oluşur.
Çevresel Faktörlerin Hastalık Gelişimine Etkisi
Tahıl küllemesinin gelişimi, çevresel faktörlerden büyük ölçüde etkilenmektedir:
Sıcaklık
- Çimlenme aralığı: 0-35°C
- Optimum çimlenme: 10°C
- Optimum enfeksiyon: 15-20°C
- Optimum misel gelişimi: 15-22°C
Sıcaklığın 25°C'nin üzerine çıkması hastalık gelişimini yavaşlatır, 30°C üzerinde ise ciddi şekilde baskılanır. Bu nedenle sıcak yaz aylarında hastalık şiddeti doğal olarak azalmaktadır.
Nem ve Yaprak Islaklığı
Yüksek bağıl nem (%85-95), spor çimlenmesi ve enfeksiyon için kritik öneme sahiptir. Yaprak yüzeyinin en az 4-6 saat ıslak kalması, başarılı enfeksiyon için gereklidir. Çiy, hafif yağmurlar veya yüksek hava nemi bu koşulu sağlayabilmektedir.
Sürekli yaprak ıslaklığı (12 saat ve üzeri) enfeksiyon oranını maksimize ederken, aralıklı ıslaklık enfeksiyonu sınırlayabilmektedir. Bu nedenle akşam sulamaları veya gece çiğlenmeleri, sabah sulamalarına göre hastalık gelişimini daha fazla teşvik etmektedir.
Işık
Fungus, konukçudan karbonhidrat ve diğer besin maddelerini emerek beslenmektedir. Bu nedenle konukçunun fotosentetik aktivitesi hastalık gelişimini dolaylı olarak etkilemektedir. Bulutlu havalarda ve düşük ışık yoğunluğunda, bitki strese girerek hastalığa karşı daha hassas hale gelebilmektedir.
Rüzgâr
Rüzgâr, konidiosporların yayılmasında birincil role sahiptir. Hafif ve orta şiddetteki rüzgârlar, sporların uzak mesafelere taşınmasını sağlarken, şiddetli rüzgârlar yaprak yüzeyindeki misel örtüsünü fiziksel olarak zedeleyebilmekte ve yeni enfeksiyonları sınırlayabilmektedir.
Hastalığın Belirtileri ve Ekonomik Önemi
Makroskopik Belirtiler
Tahıl küllemesinin en karakteristik belirtisi, bitki yüzeyinde oluşan beyaz-gri renkli pudra görünümündeki misel örtüsüdür. Hastalığın gelişim evreleri şu şekilde izlenir:
Erken dönem: İlk belirtiler genellikle alt yaprakların üst yüzeyinde, nokta şeklinde küçük beyaz lekelerin görülmesi ile başlar. Bu püstüller (misel yığınları), başlangıçta 2-3 mm çapında olup, birbirinden bağımsızdır.
Gelişme dönemi: Uygun koşullarda püstüller hızla büyür ve birleşmeye başlar. Yaprak yüzeyinin önemli bir kısmı beyaz-gri misel örtüsü ile kaplanır. Bu aşamada sporulasyon yoğunlaşır ve yaprak yüzeyine parmakla dokunulduğunda pudra benzeri sporlar kolaylıkla dağılır.
İleri dönem: Hastalık yoğunluğunun artması ile birlikte, enfekte yapraklarda fizyolojik bozukluklar belirginleşir. Önce lokal sararmalar (klorozlar) görülür, ardından nekrotik bölgeler oluşmaya başlar. Yaprak yüzeyinde hastalıklı ve sağlıklı bölgelerin bir arada bulunması tipik bir "yeşil ada" görünümü oluşturur.
Olgunlaşma dönemi: Bitki sararmaya ve fizyolojik olgunluğa ulaşmaya başladığında, beyaz misel örtüsü içinde siyah noktalar halinde kleistotesyumlar belirmeye başlar. Bu aşamada hastalık esmer-gri bir görünüm alır.
Mikroskobik Belirtiler
Mikroskobik incelemede şu yapılar gözlenir:
- Epidermis yüzeyinde seyreden, dallanmış, septalı miseller
- Epidermis hücrelerine giren ve hücre içinde gelişen haustoryalar
- Konidioforlar (100-200 μm uzunluğunda, dik, silindirik yapılar)
- Zincirleme dizilmiş konidiosporlar (elipsoid, 25-30 x 10-12 μm)
- Kleistotesyumlar (küresel, 100-200 μm çapında, appendajlı)
- Kleistotesyum içinde askuslar ve askosporlar
Ekonomik Zarar ve Verim Kayıpları
Tahıl küllemesinin ekonomik zararı, birkaç mekanizma aracılığıyla ortaya çıkmaktadır:
Direkt Fizyolojik Zararlar
Fotosentez kapasitesinin azalması: Yaprak yüzeyini kaplayan misel örtüsü, ışık alımını engelleyerek fotosentez aktivitesini %30-50 oranında azaltabilmektedir. Özellikle bayrak yaprağın enfeksiyonu, tane dolum döneminde kritik verim kayıplarına neden olmaktadır.
Transpirasyon dengesizliği: Hastalıklı yaprakların stoma işlevleri bozulur, su ekonomisi olumsuz etkilenir. Bu durum, özellikle sıcak ve kurak koşullarda bitkiyi ek strese sokar.
Besin maddesi tükenmesi: Haustoryalar aracılığıyla fungusun konukçudan yoğun besin çekmesi, bitkinin rezerv karbonhidrat ve azotunu tüketir. Bu durum tane ağırlığının azalmasına ve kalite kaybına yol açar.
Erken yaşlanma: Ağır enfeksiyonlar, bitki dokularında erken nekroz ve yaşlanmaya neden olur. Bitki fizyolojik olgunluk dönemine erken girer ve tane dolum süresi kısalır.
Endirekt Zararlar
Yatmaya yatkınlık: Hastalıklı bitkiler, sap ve kılçık enfeksiyonları nedeniyle mekanik dayanıklılığını kaybeder. Rüzgâr ve yağmura karşı yatmaya daha elverişli hale gelir. Yatan bitkilerde hasat kayıpları artmakta ve kalite düşmektedir.
Sekonder enfeksiyonlara duyarlılık**: Külleme ile zayıflamış bitkiler, diğer fungal ve bakteriyel hastalıklara karşı daha duyarlı hale gelir. Özellikle yaprak leke hastalıkları ve başak çürüklükleri ile birlikte görüldüğünde, toplam zarar katlanarak artar.
Kalite kayıpları: Tane dolum döneminde ağır enfeksiyonlar, protein içeriğinin azalmasına, hektolitre ağırlığının düşmesine ve ekmeklik/maltlık kalite özelliklerinin bozulmasına neden olur.
Verim Kayıpları
Literatür verileri, tahıl küllemesinin neden olduğu verim kayıplarının geniş bir aralıkta değiştiğini göstermektedir:
- Hafif enfeksiyonlar (yaprak alanının <%10'u enfeksiyon): %5-10 verim kaybı
- Orta şiddette enfeksiyonlar (%10-25 yaprak alanı): %15-25 verim kaybı
- Şiddetli enfeksiyonlar (>%25 yaprak alanı, özellikle üst yapraklar): %30-50 verim kaybı
Enfeksiyonun zamanlaması kritik öneme sahiptir. Kardeşlenme döneminde başlayan enfeksiyonlar, sapa kalkma ve bayrak yaprak döneminde başlayanlara göre çok daha yüksek zarara neden olmaktadır.
Coğrafi Dağılım ve Risk Bölgeleri
Tahıl küllemesi, dünya çapında tahıl yetiştirilen tüm bölgelerde görülmekle birlikte, ılıman ve serin iklim bölgelerinde daha büyük ekonomik öneme sahiptir:
Yüksek risk bölgeleri:
- Kuzey Avrupa (İngiltere, Almanya, Fransa, Polonya)
- Kuzey Amerika (ABD Büyük Ovalar, Kanada)
- Orta Asya (Kazakistan, Rusya güney bölgeleri)
- Türkiye (Marmara, Karadeniz, İç Anadolu geçit bölgeleri)
Orta risk bölgeleri:
- Güney Avrupa (İspanya, İtalya)
- Güney Amerika (Arjantin, Şili)
- Avustralya (güneybatı ve güneydoğu bölgeleri)
Düşük risk bölgeleri:
- Tropikal ve sıcak kurak bölgeler (hastalık gelişimi için sıcaklık çok yüksek)
Türkiye'de özellikle Marmara, Batı Karadeniz ve İç Anadolu'nun yüksek rakımlı bölgeleri, bahar aylarında tahıl küllemesi için ideal iklim koşullarına sahiptir.
Kültürel Mücadele Yöntemleri
Kültürel mücadele, hastalığın gelişmesi için uygun olmayan koşullar yaratarak veya bitkinin doğal dayanıklılığını artırarak hastalık baskısını azaltmayı amaçlayan agronomik uygulamaları kapsar. Bu yöntemler, kimyasal mücadeleye göre çevresel açıdan daha sürdürülebilir, ekonomik olarak daha uygun ve direnç gelişimi riskini taşımayan alternatiflerdir.
Dayanıklı ve Toleranslı Çeşit Kullanımı
Dayanıklı çeşit kullanımı, tahıl küllemesi ile mücadelede en etkili, ekonomik ve çevre dostu yöntemdir. Modern bitki ıslahı çalışmaları, küllemeye karşı genetik dayanıklılık sağlayan çok sayıda gen tanımlamış ve bu genleri ticari çeşitlere aktarmıştır.
Dayanıklılık Tipleri
Irksal (vertikal) dayanıklılık: Tek bir veya birkaç majör gen tarafından kontrol edilen, patojenin belirli ırklarına karşı etkili olan dayanıklılık tipidir. Bu tip dayanıklılık genellikle yüksek etkilidir ancak patojen populasyonundaki değişimler sonucu hızla kırılabilmektedir.
Buğdayda Pm (Powdery mildew resistance) genleri olarak adlandırılan 100'den fazla dayanıklılık geni tanımlanmıştır (Pm1, Pm2, Pm3a-g, Pm4, vb.). Her gen, belirli patojen ırklarına karşı etkilidir.
Poligenik (horizontal) dayanıklılık: Çok sayıda minör etkili genin birlikte kontrolü altında olan, patojen populasyonunun tüm ırklarına karşı kısmi ancak uzun süreli dayanıklılık sağlayan tip. Bu tip dayanıklılık kırılmaya karşı daha kalıcıdır.
Çeşit Seçiminde Dikkat Edilecek Noktalar
- Bölgesel adaptasyon: Seçilecek çeşit, o bölgedeki hakim patojen ırklarına karşı etkili dayanıklılık genlerine sahip olmalıdır.
- Çoklu gen piramitleme: Tek bir dayanıklılık genine sahip çeşitler yerine, birden fazla Pm geni içeren çeşitler tercih edilmelidir.
- Verim ve kalite dengesi: Dayanıklılık tek başına yeterli değildir; çeşit aynı zamanda yüksek verim ve kalite özelliklerine sahip olmalıdır.
- Çeşit rotasyonu: Aynı çeşidin yıllarca sürekli ekilmesi, o çeşidin dayanıklılık genlerine adapte olmuş patojen ırklarının seleksiyonuna yol açar. Bu nedenle 3-4 yılda bir çeşit değişimi önerilmektedir.
Ekim Sıklığı ve Bitki Sıklığı Yönetimi
Sık ekim, tahıl küllemesi gelişimi için ideal mikroiklim koşulları oluşturan en önemli agronomik hatalardan biridir.
Sık Ekimin Olumsuz Etkileri
Hava sirkülasyonunun azalması: Bitki sıklığının artması, kardeşler arası ve bitkiler arası hava akımını kısıtlar. Bu durum:
- Yaprak yüzeylerinin uzun süre nemli kalmasına
- Çiy oluşumunun artmasına
- Nem oranının yüksek seyretmesine neden olur.
Işık nüfuzunun azalması: Sık ekilen tarlalarda alt yapraklara ulaşan ışık miktarı azalır. Düşük ışık yoğunluğu:
- Yaprakların daha yumuşak ve ince dokulu olmasına
- Epidermal mumsu tabakanın incelmesine
- Hastalığa karşı duyarlılığın artmasına yol açar.
Mikroklima nemi: Yoğun kanopi yapısı, yaprak yüzeyi mikroklima nemini artırır ve spor çimlenmesi ile enfeksiyon için ideal koşullar sağlar.
Optimum Ekim Normları
Ekim normu, bölgenin iklim koşullarına, toprak verimliliğine ve çeşidin kardeşlenme kapasitesine göre ayarlanmalıdır:
Kuru tarım koşulları:
- Buğday: 450-550 tohum/m²
- Arpa: 400-500 tohum/m²
Sulu tarım koşulları:
- Buğday: 400-450 tohum/m²
- Arpa: 350-400 tohum/m²
Sulu tarım koşullarında veya yüksek verimli topraklarda, ekim normunun daha düşük tutulması gerektiği unutulmamalıdır.
Dengeli Gübreleme ve Azot Yönetimi
Gübreleme, özellikle azot beslenmesi, bitki dokusunun fiziksel ve biyokimyasal özelliklerini doğrudan etkileyerek hastalığa karşı duyarlılığı değiştirmektedir.
Aşırı Azot Gübrelenmesinin Olumsuz Etkileri
Doku yapısının yumuşaması: Fazla azot alımı:
- Hücre duvarlarının incelmesine
- Hücre turgor basıncının artmasına
- Epidermis dokusunun daha kırılgan olmasına neden olur.
Bu özellikler, haustoryaların epidermis hücrelerine penetrasyonunu kolaylaştırır.
Sulu doku oluşumu: Yüksek azot seviyesi, yapraklarda sulu, yumuşak ve koyu yeşil doku oluşumuna yol açar. Bu dokular:
Yüksek serbest aminoasit ve basit şeker içeriğine sahiptir
- Fungus için ideal besin ortamı oluşturur
- Haustoryal beslenmede daha fazla besin sağlar
Kanopi yoğunluğunun artması: Aşırı azot, aşırı vejetatif büyümeye yol açar. Bu durum:
- Yaprak alanı indeksini (LAI) optimumun üzerine çıkarır
- Sık ekim etkisine benzer şekilde mikroklima nemini artırır
- Alt yapraklarda nem birikimine ve ışık noksanlığına neden olur
Olgunlaşmanın gecikmesi: Yüksek azot dozu, bitkinin vejetatif dönemini uzatır. Bu durum:
- Hastalığın gelişimi için daha uzun süre fırsat tanır
- Generatif dönemde bile yaprakların taze kalmasına ve enfeksiyonun devam etmesine neden olur
Dengeli Gübreleme Stratejisi
Toprak analizi: Gübreleme programı mutlaka toprak analizi sonuçlarına dayandırılmalıdır. Standart doz uygulamaları yerine, toprağın gerçek besin elementi seviyelerine göre program yapılmalıdır.
Azot bölümleme: Toplam azot dozunun tümünün ekimle birlikte verilmesi yerine, bölümlere ayrılarak verilmesi önerilir:
- %40-50: Ekim ile birlikte
- %30-40: Kardeşlenme dönemi
- %20-30: Sapa kalkma başlangıcı
Bu yöntem:
- Erken dönemde aşırı vejetatif büyümeyi önler
- Bitkinin gerçek ihtiyacına göre azot sağlar
- Azot kullanım verimliliğini artırır
Fosfor ve potasyum dengesi: Azot tek başına değil, fosfor ve potasyum ile dengeli verilmelidir:
- Fosfor: Kök gelişimini ve generatif gelişmeyi destekler, hastalığa karşı genel dayanıklılığı artırır.
- Potasyum: Hücre duvarı kalınlığını artırır, osmotik dengeyi sağlar, hastalığa karşı fiziksel bariyer oluşturur
Mikro element desteği: Özellikle silisyum (Si), mangan (Mn) ve çinko (Zn) gibi mikro elementler, epidermis dokusunun güçlenmesine ve hastalık direncine katkı sağlar.
Ekim Nöbeti (Münavebe) Uygulaması
Ekim nöbeti, aynı aileye ait bitkilerin ardışık yıllarda aynı tarlaya ekilmemesi prensibi üzerine kuruludur.
Ekim Nöbetinin Hastalık Yönetimine Katkıları
İnokulum baskılama: Tahıl – tahıl monokültürü:
- Tarlada sürekli canlı konukçu bulunmasını sağlar
- Kleistotesyum ve canlı misel kaynaklarının birikimini artırır
- Her yıl başlangıç inokulum seviyesinin yüksek olmasına neden olur
Münavebe ile:
- Tahıl olmayan bir bitki ekildiğinde, konukçu spesifik patojen beslenemez ve populasyon azalır
- Bitki artıklarındaki kleistotesyumlar ayrışır
- Sonraki yıl başlangıç inokulum seviyesi düşük olur
Mikrobiyolojik denge: Farklı bitki türleri:
- Toprak mikroflora kompozisyonunu değiştirir
- Yararlı antagonist mikroorganizmaların gelişimini destekler
- Patojen fungus için rekabet ve antagonizma ortamı oluşturur
Önerilen Münavebe Sistemleri
Tahıl – baklagil rotasyonu:
- Buğday → Nohut/Mercimek → Buğday
- Arpa → Yem bezelyesi → Buğday
Tahıl – yağ bitkisi rotasyonu:
- Buğday → Ayçiçeği → Buğday
- Arpa → Kanola → Buğday
Tahıl – endüstri bitkisi rotasyonu:
- Buğday → Şeker pancarı → Buğday
- Arpa → Patates → Buğday
Karmaşık rotasyonlar (4 yıllık):
- Buğday → Ayçiçeği → Nohut → Arpa
Bu sistemlerde, tahıl küllemesi etmeni için en az 1-2 yıl konukçusuz dönem oluşur ve hastalık baskısı önemli ölçüde azalır.
Bitki Artıklarının Yönetimi
Hasat sonrası tarlada kalan sap, yaprak ve kılçık artıkları, tahıl küllemesi etmeninin kışlama alanlarıdır.
Artık Yönetimi Stratejileri
Derin sürüm: Hasat sonrası artıkların toprak yüzeyinde bırakılması yerine, derin sürümle toprağa gömülmesi:
- Kleistotesyumları toprak derinliklerine taşır
- Mikrobiyal ayrışma hızını artırır
- Askospor salımını engeller veya geciktirir
Hızlı ayrıştırma: Bitki artıklarının parçalanması ve nem ile temas ettirilmesi:
- Saprofitik mikroorganizmaların aktivitesini artırır
- Artıkların 4-6 ay içinde ayrışmasını sağlar
- Bahar dönemine kadar inokulum seviyesini düşürür
Anızın yakılması: Bazı bölgelerde geleneksel olarak uygulanan yöntemdir, ancak:
- Çevresel olumsuz etkileri nedeniyle önerilmemektedir
- Hava kirliliği yaratır
- Toprak organik maddesini yok eder
- Yararlı toprak mikroorganizmalarına zarar verir
Modern yaklaşım, mekanik parçalama ve toprağa karıştırmadır.
Sulama Yönetimi
Sulama uygulamaları, yaprak yüzeyi nem koşullarını doğrudan etkileyerek hastalık gelişiminde kritik rol oynar.
Sulamanın Zamanlaması
Sabah sulaması: Tercih edilmesi gereken zamandır çünkü:
- Yaprak yüzeyi gün içinde hızla kurur
- Güneş ışığı nem birikimini önler
- Sporların çimlenme süresi kısalır
Akşam sulaması: Kaçınılması gereken zamandır çünkü:
- Yaprak yüzeyi gece boyunca ıslak kalır
- Çiy ile birleşerek ıslaklık süresi 10-14 saate uzar
- Enfeksiyon için ideal koşullar oluşur
Sulama Yöntemi
Yağmurlama: Yaprak yüzeyini doğrudan ıslatır, en riskli yöntemdir. Eğer zorunlu ise:
- Sabah erken saatlerde yapılmalı
- Kısa süreli, yüksek debi ile uygulanmalı
- Yaprak yüzeyinin uzun süre ıslak kalması önlenmeli
Damla sulama: Tercih edilen yöntemdir çünkü:
- Yaprak yüzeyini ıslatmaz
- Mikroklima nemini minimum düzeyde etkiler
- Su kullanım verimliliği yüksektir
Karık sulama: Geleneksel yöntemdir, yaprak ıslaklığı riski düşüktür ancak:
- Su kullanım verimliliği düşüktür
- Toprak nemini artırarak dolaylı nem etkisi yaratır
Ekim Tarihi Optimizasyonu
Ekim tarihi, bitkinin kritik gelişme dönemlerinin hastalık için riskli dönemlerle çakışmasını önlemek açısından önemlidir.
Sonbahar Ekimli Tahıllarda
Erken ekim riskleri:
- Sonbahar aylarında bitki çok gelişmiş olur
- Sonbahar yağışları ile birlikte erken enfeksiyonlar başlar
- Kış öncesi canlı misel popülasyonu yüksek olur
Optimum ekim: Bölgesel tarım kuruluşlarının önerdiği tarihlere uyulmalıdır. Genellikle:
- Marmara: Ekim sonu – Kasım başı
- İç Anadolu: Ekim ortası
- Güneydoğu: Kasım ortası – sonu
Geç ekim: Aşırı geç ekim:
- Kardeşlenmeyi azaltır
- Verim potansiyelini düşürür
- Hastalık riskini azaltsa da ekonomik değildir
Entegre Kültürel Yaklaşım
Yukarıda açıklanan tüm kültürel önlemlerin birlikte ve koordineli şekilde uygulanması, hastalık baskısını maksimum düzeyde azaltır: - Dayanıklı çeşit seçimi ile başlangıç
- Toprak analizi ve dengeli gübreleme programı
- Optimum ekim normu ve zamanlaması
- Münavebe sistemi kurulması
- Artık yönetimi ile inokulum azaltma
- Sulama optimizasyonu
Bu bütüncül yaklaşım, kimyasal mücadele ihtiyacını %60-70 oranında azaltabilmektedir.
Kimyasal Mücadele Stratejileri
Kimyasal mücadele, kültürel önlemlerin yetersiz kaldığı veya hastalık baskısının ekonomik zarar eşiğini aştığı durumlarda başvurulan bir yöntemdir. Modern fungisitler, hem koruyucu hem de tedavi edici etkiye sahip olup, doğru zamanlama ve uygulama ile yüksek etkinlik sağlamaktadır.
Ekonomik Zarar Eşiği ve İlaçlama Kararı
Her tarla için ilaçlama otomatik olarak gerekli değildir. İlaçlama kararı, aşağıdaki kriterlerin birlikte değerlendirilmesi ile verilmelidir:
Zarar Eşiği Kriterleri
Hastalık başlangıç zamanı:
- Kardeşlenme – sapa kalkma dönemi: YÜKSEK RİSK
- Sapa kalkma – bayrak yaprak dönemi: KRİTİK RİSK
- Başaklanma sonrası: DÜŞÜK RİSK (ilaçlama genellikle gerekli değil)
Üst yapraklara ilerleme durumu:
- Sadece alt 2 yaprakta: İZLEME
- Üstten 3. yaprağa ulaştıysa: İLAÇLAMA GEREKLİ
- Bayrak yaprağa ulaştıysa: ACİL İLAÇLAMA
Çeşit duyarlılığı:
- Dayanıklı çeşit: İlaçlama eşiği yüksek
- Hassas çeşit: İlaçlama eşiği düşük
Hava tahminleri:
- Önümüzdeki 7-10 gün: serin (15-20°C), nemli, yağışlı → İLAÇLAMA ÖNERİLİR
- Önümüzdeki 7-10 gün: sıcak (>25°C), kuru → İLAÇLAMA GEREKMEYEBİLİR
Hastalık Şiddeti Değerlendirme Skalası
Tarla düzeyinde hastalık değerlendirmesi için standart 0-5 skalası kullanılır:
Skala 0: Bitki tamamen sağlam, hiçbir belirti yok
Skala 1: Hafif misel gelişmesi var, yaprak yüzeyinin %1'inden azı püstüllerle kaplı, sporulasyon yok veya çok az
Skala 2: Orta derecede misel gelişmesi, az miktarda spor üretilmiş, küçük nekroz ve klorozlar başlamış, yaprak yüzeyinin %1.1-5'i etkilenmiş
Skala 3: Orta ile yoğun arası misel gelişmesi, belirgin sporulasyon, küçük nekroz ve klorozlar var, yaprak yüzeyinin %5.1-10'u lekelerle kaplı
Skala 4: Yaprak yüzeyi geniş alanlarla miselyum, nekroz ve klorozla kaplı, lekeler üzerinde kleistotesyumlar belirmeye başlamış, yaprak yüzeyinin %10.1-25'i etkilenmiş
Skala 5: Geniş lekeler, bol sporulasyon ve kleistotesyumlar, yaprak yüzeyinin %25'den fazlası lekelerle kaplı, yaprak işlevini büyük ölçüde kaybetmiş
Örnekleme Protokolü
Objektif karar için standart örnekleme yapılmalıdır:
Küçük parseller (<10 ha): 100 bitki örneklemesi
Büyük parseller (>10 ha): 200 bitki örneklemesi
Örnekleme yöntemi:
- Tarlanın köşegenleri boyunca yürüyerek
- Rastgele seçilen bitkilerin üstten 3. yapraklarını inceleme
- Her bitkiyi 0-5 skalasına göre skorlama
- Ortalama hastalık şiddeti hesaplama
İlaçlama eşiği:
- Ortalama skala değeri ≥2.0: İlaçlama önerilir
- Ortalama skala değeri <2.0: İzleme devam ettirilir
Fungisit Grupları ve Etki Mekanizmaları
Triazol Grubu (DMI - Demethylation Inhibitors)
Triazol grubu fungisitler, tahıl küllemesi mücadelesinde en yaygın kullanılan gruptur. FRAC kod: 3 (G1)
Etki mekanizması: Fungal sterol biyosentezini inhibe ederler. Spesifik olarak, ergosterol sentezinde kritik enzim olan C14-demetilaz (CYP51) enzimini bloke ederler. Ergosterol, fungal hücre zarının yapısal bütünlüğü için gereklidir. Sentezin engellenmesi:
- Hücre zarı geçirgenliğinin bozulmasına
- Hücre büyümesinin durmasına
- Misel gelişiminin yavaşlamasına neden olur
Sistemik hareket: Ksilem boyunca yukarı doğru translokasyon gösterirler (akropetal hareket). İlaçlanan yapraktan emilin ve bitkinin üst kısımlarına taşınır, bu nedenle bayrak yaprağı da koruma altına alınır.
Etkililik profili:
- Koruyucu etki: +++
- Tedavi edici etki: +++ (enfeksiyondan sonra 48-72 saat içinde uygulanırsa)
- Eradikant etki: ++ (sınırlı)
- Etki süresi: 14-21 gün
Başlıca aktif maddeler:
- Tebukonazole: Geniş spektrumlu, güçlü etkili
- Epoxiconazole: Küllemeye yüksek etkinlik
- Cyproconazole: Düşük doz, yüksek etkinlik
- Difenoconazole: Külleme + pas kombinasyonu için ideal
Avantajlar:
- Geniş etki spektrumu (külleme, pas, leke hastalıkları)
- Hem koruyucu hem tedavi edici etki
- Uzun etki süresi
- Ekonomik
Dezavantajlar:
- Direnç gelişimi riski (orta-yüksek)
- Bitki büyümesini yavaşlatma etkisi (büyüme regülatörü etkisi)
- Sürekli kullanımda etkinlik azalması
Strobilurin Grubu (QoI - Quinone Outside Inhibitors)
Strobilurin fungisitleri, mitokondriyal solunumu inhibe eden geniş spektrumlu fungisitlerdir. FRAC kod: 11 (C3)
Etki mekanizması: Mitokondriyal elektron transport zincirinin kompleks III'ünde (cytochrome bc1 kompleksi) Qo bölgesini bloke ederler. Bu:
- ATP üretiminin durmasına
- Hücresel enerji krizine
- Spor çimlenmesinin engellenmesine neden olur
Hareket tipi: Translaminnar hareket gösterirler (yaprak içinde bir yüzeyden diğer yüzeye geçiş) ancak ksilemde yukarı hareket sınırlıdır.
Etkililik profili:
- Koruyucu etki: ++++
- Tedavi edici etki: ++ (sınırlı, erken enfeksiyonda)
- Eradikant etki: + (çok sınırlı)
- Etki süresi: 21-28 gün
Başlıca aktif maddeler:
- Azoxystrobin: İlk geliştirilen strobilurin
- Pyraclostrobin: Yüksek lokal sistemik aktivite
- Trifloxystrobin: Güçlü sporulasyon inhibisyonu
- Fluoxastrobin: Uzun etki süresi
Fizyolojik yan etkiler (Plant Health Effect):
- Yaprakta "yeşil kalma" etkisi (stay-green effect)
- Nitrat redüktaz enzim aktivitesini artırma
- Azot kullanım verimliliğini iyileştirme
- Stres toleransını artırma
- Sonuç: %2-5 verim artışı
Avantajlar:
- Çok geniş spektrum (tüm major fungal hastalıklar)
- Bitki sağlığı üzerine pozitif etki
- Uzun etki süresi
- Düşük fitotoksisite
Dezavantajlar:
- Yüksek direnç gelişimi riski (tek tek kullanımda)
- Nispeten yüksek maliyet
- Tedavi edici etkisi sınırlı
SDHI Grubu (Succinate Dehydrogenase Inhibitors)
SDHI fungisitleri, nispeten yeni bir gruptur ve külleme dahil geniş spektrumlu etkiye sahiptir. FRAC kod: 7 (C2)
Etki mekanizması: Mitokondriyal kompleks II (suksinat dehidrojenaz) enzimini inhibe ederler. Bu enzim, hem Krebs döngüsünde hem de elektron transport zincirinde rol oynar.
Başlıca aktif maddeler:
- Bixafen: Güçlü külleme etkisi
- Fluxapyroxad: Geniş spektrum
- Benzovindiflupyr: Yeni nesil, yüksek etkinlik
Özellikler:
- Hem koruyucu hem tedavi edici
- Uzun etki süresi (21-28 gün)
- Düşük çevre toksisitesi
- Direnç riski orta düzey
Kükürt (Sülfür)
Kükürt, en eski fungisitlerden biridir ve tahıl küllemesine karşı hala kullanılmaktadır.
Etki mekanizması: Çok noktalı (multi-site) etki. Fungal hücrede:
- Protein sentezini bozar
- Enzim aktivitesini engeller
- Hücre solunumunu inhibe eder
Formülasyonlar:
- Toz kükürt (WP): %80-90 kükürt
- Islak olabilir kükürt (WG): %80 kükürt
- Sıvı kükürt (SC): %40-50 kükürt
Avantajlar:
- Çok düşük maliyet
- Direnç gelişimi riski yok
- Organik tarımda kullanılabilir
- Akar etkisi de var
Dezavantajlar:
- Sadece koruyucu etki, tedavi edici değil
- Sıcaklık >27°C'de fitotoksisite riski
- Kısa etki süresi (7-10 gün)
- Sık uygulama gereksinimi
- Günümüzde tahılda çok sınırlı kullanım
Karışım Stratejileri ve Direnç Yönetimi
Fungal patojenlerde fungisit direnci, dünya çapında ciddi bir sorundur. Tahıl küllemesi etmeninde, özellikle triazol ve strobilurin gruplarına karşı direnç gelişimi rapor edilmiştir.
Direnç Tipleri
Cross-resistance (çapraz direnç): Aynı FRAC grubu içindeki farklı aktif maddelere karşı aynı anda direnç gelişmesi. Örneğin, tebuconazole'e dirençli popülasyon, genellikle diğer triazollere de (propiconazole, epoxiconazole) dirençlidir.
Multi-resistance (çoklu direnç): Farklı FRAC gruplarına karşı bağımsız olarak direnç gelişmesi. Hem triazol hem strobilurin direnci taşıyan izolatlar rapor edilmiştir.
Karışım Stratejileri
Tank-mix (Tank karışımı): İki farklı FRAC grubundan fungisitin aynı aplikasyonda karıştırılması:
- Triazol + Strobilurin
- Triazol + SDHI
- Strobilurin + SDHI
Formülasyon karışımı (Pre-mix): Üretici tarafından hazır karışım olarak sunulan ürünler:
- Epoxiconazole + Pyraclostrobin
- Propiconazole + Azoxystrobin
- Bixafen + Prothioconazole + Fluopyram
Karışım avantajları:
- Direnç gelişimi riskini azaltma
- Etki spektrumunu genişletme (külleme + pas + leke)
- Sinerjistik etki potansiyeli
- Daha uzun koruma süresi
Anti-Direnç Stratejileri
Rotasyon: Aynı FRAC grubunun ardışık sezonlarda kullanılmaması
- Yıl 1: Triazol
- Yıl 2: Strobilurin + Triazol karışımı
- Yıl 3: SDHI + Triazol karışımı
Doz disiplini: Etiket dozunun altında uygulama yapılmaması. Düşük doz:
- Dirençli popülasyonları selekte eder
- Direnç gelişimini hızlandırır
Tek uygulama prensibi: Aynı sezonda aynı aktif madde ile tekrarlı ilaçlama yapılmaması
Uygulama Zamanlaması ve Teknikleri
Kritik Uygulama Zamanı
EN DOĞRU ZAMAN:
- Hastalık alt yapraklardan orta yapraklara yayılmış
- Üstten 3. yaprakta ilk belirtiler görülüyor
- Bayrak yaprağı henüz tamamen açılmamış veya yeni açılmış
- BBCH 31-37 (sapa kalkma başlangıcı – bayrak yaprak dönemi)
Bu zamanlama:
- Tedavi edici etkiyi maksimize eder
- Bayrak yaprağını koruma altına alır
- Tek ilaçlama ile sezonu kontrol etmeyi mümkün kılar
ÇOK ERKEN UYGULAMA (kardeşlenme dönemi):
- Hastalık henüz görünmüyor
- İlaç boşa harcanır
- Kritik dönemde etki kalmaz
ÇOK GEÇ UYGULAMA (başaklanma dönemi):
- Bayrak yaprağı zaten enfekte olmuş
- Verim kaybı telafi edilemez
- Tedavi edici etki yetersiz kalır
Uygulama Tekniği
Püskürtme ekipmanı:
- Tarla pülverizatörü (boom sprayer)
- Çalışma basıncı: 2-3 bar
- Meme tipi: Düz yelpaze (flat fan) veya hava emişli (air induction)
- Meme aralığı: 50 cm
Su miktarı:
- 200-300 L/ha (optimum: 250 L/ha)
- Çok az su (<150 L/ha): kapsama yetersiz
- Çok fazla su (>400 L/ha): damla akışı, etkisizlik
Rüzgar koşulları:
- İdeal: 5-10 km/saat hafif rüzgar
- Rüzgar >15 km/saat: sürüklenme riski, uygulanmamalı
- Rüzgar 0 (durgun hava): termal hareketler, sürüklenme riski
Sıcaklık koşulları:
- Optimum: 15-25°C
- >28°C: buharlaşma, etkinlik kaybı
- <10°C: biyolojik aktivite düşük
Nem koşulları:
- Bağıl nem >60%: tercih edilir
- Bağıl nem <40%: hızlı kuruma, etkinlik azalır
Tekrar İlaçlama Kararı
Tek ilaçlama çoğunlukla yeterlidir. Ancak şu durumlarda 2. ilaçlama gerekebilir:
- İlk ilaçlamadan 15-20 gün sonra hastalık tekrar görülüyor
- Hava koşulları sürekli nemli ve serin
- Çeşit çok hassas
- Ağır hastalık baskısı var - ilaçlama için:
- Farklı FRAC grubu kullanılmalı
- Bayrak yaprak – başaklanma arası dönem (BBCH 37-51)
İlaçlama Etkinlik Değerlendirmesi
İlaçlamanın başarısını değerlendirmek için:
İlaçlama öncesi: Standart örnekleme ile ortalama hastalık şiddeti hesaplanır (örn: 2.8)
İlaçlama sonrası (15-20 gün): Aynı yöntemle yeniden değerlendirme (örn: 2.2)
Başarı kriterleri:
- Hastalık şiddeti artmamış veya azalmış: BAŞARILI
- Hastalık şiddeti 1.0 birim azalmış: ÇOK BAŞARILI
- Hastalık şiddeti artmış: BAŞARISIZ (yetersiz doz, geç uygulama veya direnç)
Veri Analizi ve Karar Destek Sistemleri
Modern tahıl tarımında veri analizi, hastalık yönetimini reaktif (hastalık olduktan sonra müdahale) yaklaşımdan proaktif (hastalık olmadan önce önleme) yaklaşıma dönüştürmektedir.
Veri Kaynakları ve Toplama Yöntemleri
Tahıl küllemesi risk analizi ve karar destek sistemleri için çeşitli veri kaynaklarından bilgi toplanması gerekmektedir.
Meteorolojik Veriler
Sıcaklık verileri:
- Günlük minimum, maksimum ve ortalama sıcaklık
- Saatlik sıcaklık ölçümleri (daha hassas tahmin için)
- Degree-day (derece-gün) hesaplamaları
- 7-14 günlük sıcaklık ortalamaları ve trendleri
Nem verileri:
- Bağıl nem (%) – günlük min/max/ortalama
- Yaprak ıslaklık süresi (saat/gün)
- Çiy noktası sıcaklığı
- Buhar basıncı açığı (VPD)
Yağış verileri:
- Günlük toplam yağış (mm)
- Yağış şiddeti ve süresi
- Yağışlı gün sayısı (ardışık)
- Son 7/14/30 günlük toplam yağış
Rüzgar ve diğer parametreler:
- Rüzgar hızı ve yönü
- Güneşlenme süresi
- Solar radyasyon
- Atmosfer basıncı
Veri kaynakları:
- Ulusal meteoroloji istasyonları (genel iklim)
- Tarla içi otomatik hava istasyonları (mikro-iklim)
- IoT sensör ağları (gerçek zamanlı, yüksek çözünürlük)
Tarla Gözlem Verileri
Hastalık izleme verileri:
- Haftalık hastalık şiddeti skorları (0-5 skala)
- Enfeksiyon başlangıç tarihi
- Enfeksiyonun yayılım hızı
- Yaprak pozisyonlarına göre dağılım
- İlk belirti – epidemi aralığı süresi
Bitki fenolojisi:
- BBCH gelişme devreleri
- Kardeşlenme başlangıcı
- Sapa kalkma başlangıcı
- Bayrak yaprak çıkışı
- Başaklanma tarihi
Agronomik veriler:
- Çeşit adı ve dayanıklılık profili
- Ekim tarihi
- Ekim normu (tohum/m²)
- Gübreleme (tip, doz, tarih)
- Sulama (yöntem, frekans, miktar)
- Önceki bitki (rotasyon)
Uzaktan Algılama Verileri
Uydu görüntüleri:
- NDVI (Normalized Difference Vegetation Index): Bitki yeşil alanı ve sağlığı
- NDRE (Normalized Difference Red Edge): Stres tespiti
- Klorofil indeksleri: Fotosentez aktivitesi
- Sıcaklık haritaları (termal bantlar): Stres alanları
Kullanılan uydu platformları:
- Sentinel-2 (ESA): 10m çözünürlük, 5 gün tekrar, ücretsiz
- Landsat-8 (NASA): 30m çözünürlük, 16 gün tekrar, ücretsiz
- Planet Labs: 3m çözünürlük, günlük, ticari
Drone (UAV) görüntüleri:
- RGB görüntüler (yüksek çözünürlük, 1-5 cm/piksel)
- Multispektral görüntüler (5-10 bant)
- Termal görüntüler
- Hiperspektral görüntüler (araştırma amaçlı)
Avantajları:
- Talep üzerine görüntüleme
- Bulut sorununu aşma
- Çok yüksek mekansal çözünürlük
- Tarla düzeyinde değişkenlik analizi
Görüntü işleme ve analiz:
- Makine öğrenmesi ile hastalık tespiti
- Piksel seviyesinde risk haritaları
- Temporal (zamansal) değişim analizi
- Prescriptive map oluşturma (değişken dozlu ilaçlama)
Toprak ve Çevre Verileri
Toprak özellikleri:
- Toprak tipi ve tekstürü
- Organik madde içeriği
- pH ve besin elementi seviyeleri
- Su tutma kapasitesi
- Drenaj durumu
Topoğrafik veriler:
- Yükselti
- Eğim
- Bakı (aspect)
- Topoğrafik nem indeksi
Bu veriler, tarla içi hastalık dağılımının heterojenliğini açıklamada kullanılır. Örneğin, düşük alanlarda nem birikimi daha fazla olduğundan külleme riski yüksektir.
Veri Entegrasyonu ve Veritabanı Yönetimi
Zaman Serisi Veritabanları
Meteorolojik veriler gibi zaman serisi verileri için özel veritabanları kullanılır:
InfluxDB: En popüler açık kaynak zaman serisi veritabanı
- Yüksek yazma/okuma performansı
- Otomatik veri sıkıştırma
- Zaman bazlı sorgulama optimizasyonu
- Retention policies (eski veri otomatik silinmesi)
TimescaleDB: PostgreSQL tabanlı alternatif
- SQL uyumluluğu
- Relational + Time-series hybrid yapı
Örnek veri yapısı:
Measurement: weather_data
Tags: station_id, field_id
Fields: temperature, humidity, leaf_wetness
Timestamp: 2025-12-08T08:00:00Z
İlişkisel Veritabanları
Agronomik veriler ve tarla bilgileri için:
PostgreSQL/PostGIS: Mekansal veri desteği ile
- Tarla sınırları (polygon)
- Nokta koordinatları
- Mekansal sorgular (intersection, buffer, etc.)
Örnek tablo yapıları:
- fields: field_id, geometry, area, soil_type
- varieties: variety_id, name, pm_resistance_genes
- observations: obs_id, field_id, date, disease_severity
- applications: app_id, field_id, date, fungicide, dose
Feature Store (Özellik Deposu)
Makine öğrenmesi modelleri için hazırlanmış özellikler:
Ham veriden türetilmiş özellikler:
- Rolling averages (7-gün ortalaması)
- Degree-days (baz 10°C)
- Kümülatif yaprak ıslaklık saatleri
- Ardışık uygun enfeksiyon günleri sayısı
- Sıcaklık-nem kombinasyon indeksleri
Örnek feature engineering:
python
Külleme risk indeksi hesaplama
def powdery_mildew_risk_index(temp, humidity, leaf_wetness_hours):
temp_score = 0 if (temp < 10 or temp > 35) else (1 - abs(temp - 17.5) / 17.5)
humidity_score = humidity / 100.0
wetness_score = min(leaf_wetness_hours / 8.0, 1.0)
risk = 0.35 * temp_score + 0.30 * humidity_score + 0.35 * wetness_score
return risk
Tanımlayıcı Analitik (Descriptive Analytics)
Hastalık Gelişim Dinamikleri Analizi
Yıllık seyir analizi:
- Hastalığın ilk görülme tarihi (takvim haftası)
- Epidemi gelişim eğrisi (lojistik eğri fit)
- Maksimum hastalık şiddeti ve tarihi
- AUDPC (Area Under Disease Progress Curve) hesaplama
AUDPC formülü:
AUDPC = Σ [(Yi + Yi+1) / 2] × (ti+1 - ti)
Burada Yi = i zamanındaki hastalık şiddeti, ti = gözlem zamanı
İklim-hastalık korelasyonları:
- Pearson korelasyon analizi
- Spearman rank korelasyon (non-parametrik)
- Cross-correlation (zaman gecikmeli ilişkiler)
Örnek bulgular:
- 7-gün ortalama sıcaklık ile hastalık şiddeti: r = 0.68
- Kümülatif yaprak ıslaklık saatleri ile AUDPC: r = 0.82
- Azot dozu ile hastalık duyarlılığı: r = 0.54
Mekansal Analiz
Tarla içi değişkenlik:
- Semivariogram analizi
- Kriging interpolasyonu
- Hot-spot analizi (Getis-Ord Gi*)
Bu analizler, tarlanın hangi bölgelerinin sistematik olarak yüksek/düşük hastalık riski taşıdığını ortaya koyar.
Bölgesel epidemiyoloji:
- Coğrafi bilgi sistemleri (GIS) ile bölgesel hastalık haritaları
- İklim bölgeleri ile hastalık şiddeti overlay analizi
- Komşu tarla etkileri (spatial autocorrelation)
Tahminsel Analitik (Predictive Analytics)
Klasik Epidemiyolojik Modeller
FAST (Forecasting Asochyta blight, Septoria and sTagonospora) benzeri modeller:
Meteorolojik değişkenlere dayalı regresyon modelleri:
Risk Score = β0 + β1×T_avg + β2×RH_avg + β3×LWD + β4×Rain + ε
Parametreler:
- T_avg: 7-gün ortalama sıcaklık
- RH_avg: 7-gün ortalama nem
- LWD: Yaprak ıslaklık süresi (saat)
- Rain: Son 7 gün yağış (mm)
Eşik modelleri:
Basit kural tabanlı sistemler:
IF (T >= 15°C AND T <= 22°C) AND
(RH >= 85%) AND
(LWD >= 6 hours) FOR 3 consecutive days
THEN: HIGH RISK → Spray recommended
Makine Öğrenmesi Modelleri
Regresyon modelleri (hastalık şiddeti tahmini):
Multiple Linear Regression:
- Basit, yorumlanabilir
- Özellik önemliliği doğrudan katsayılardan
- Varsayımları: lineerlik, normallik, homoscedasticity
Random Forest Regressor:
- Non-linear ilişkileri yakalama
- Özellik etkileşimlerini modelleme
- Overfitting'e dirençli (bagging)
- Feature importance metrikleri
Hiperparametreler:
python
RandomForestRegressor(
n_estimators=500,
max_depth=15,
min_samples_split=10,
min_samples_leaf=5,
max_features='sqrt',
random_state=42
)
Gradient Boosting (XGBoost/LightGBM):
- Çok güçlü tahmin performansı
- Sequential ensemble yöntemi
- Düzenlileştirme (regularization) yetenekleri
Örnek XGBoost konfigürasyonu:
python
xgb.XGBRegressor(
n_estimators=800,
learning_rate=0.05,
max_depth=6,
subsample=0.8,
colsample_bytree=0.8,
reg_alpha=0.1,
reg_lambda=1.0
)
Sınıflandırma modelleri (risk kategorisi tahmini):
Logistic Regression:
- Binary: Risk Var/Yok
- Multinomial: Düşük/Orta/Yüksek Risk
- Probability scores (0-1 arası)
Support Vector Machines (SVM):
- Kernel trick ile non-linear boundary
- C ve gamma hiperparametreleri
Neural Networks:
- Multilayer Perceptron (MLP)
- Deep learning (çok katmanlı)
- Karmaşık pattern recognition
Model ensemble:
Birden fazla modelin çıktılarını birleştirme:
Python
Stacking ensemble
final_prediction = 0.4 × RF_pred + 0.3 × XGB_pred + 0.3 × NN_pred
Zaman Serisi Modelleri
LSTM (Long Short-Term Memory):
Özellikle zaman serisi tahminleri için güçlü bir deep learning mimarisi.
Mimari:
Input Layer: [lookback_days, n_features]
↓
LSTM Layer 1: 64 units, return_sequences=True
↓
Dropout: 0.2
↓
LSTM Layer 2: 64 units
↓
Dropout: 0.2
↓
Dense Layer: 32 units, ReLU
↓
Output Layer: 1 unit (hastalık şiddeti) veya 3 units (risk kategorileri)
Lookback window: Son 14 günün verileri → Önümüzdeki 7 günün riski
Özellikler:
- Uzun vadeli bağımlılıkları öğrenme (long-term dependencies)
- Gradient vanishing problemini çözme
- Sequence-to-sequence predictions
GRU (Gated Recurrent Unit):
LSTM'e alternatif, daha basit mimari, daha hızlı eğitim.
Model Değerlendirme ve Validasyon
Regresyon metrikleri:
- R² (Coefficient of Determination): 0.85 üzeri iyi
- RMSE (Root Mean Square Error): Düşük olmalı
- MAE (Mean Absolute Error): Düşük olmalı
- MAPE (Mean Absolute Percentage Error): <15% iyi
Sınıflandırma metrikleri:
- Accuracy: Genel doğruluk
- Precision: Pozitif tahminlerin doğruluğu
- Recall (Sensitivity): Gerçek pozitifleri yakalama oranı
- F1-Score: Precision ve Recall'un harmonik ortalaması
- ROC-AUC: 0.85 üzeri iyi model
- Confusion Matrix: Detaylı performans analizi
Cross-validation:
Zaman serisi verileri için özel CV yöntemleri:
Time Series Split:
Python
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
for train_idx, test_idx in tscv.split(X):
X_train, X_test = X[train_idx], X[test_idx]
y_train, y_test = y[train_idx], y[test_idx]
Model training and evaluation
Walk-forward validation:
- Yıl 1-2: Training
- Yıl 3: Test
- Yıl 1-3: Training
- Yıl 4: Test
Bu yöntem, modelin gerçek senaryoda nasıl performans göstereceğini test eder.
Reçete Edici Analitik (Prescriptive Analytics)
Karar Kuralları ve Optimizasyon
Model tahminleri, ilaçlama kararına dönüştürülmelidir:
Risk skoru → Aksiyon matrisi:
Risk Score Action Priority
─────────────────────────────────────────────────────
R < 0.40 No action Monitor
0.40 ≤ R < 0.60 Increase monitoring Alert
0.60 ≤ R < 0.80 Prepare for spraying High alert
R ≥ 0.80 Spray immediately Critical
Ekonomik analiz entegrasyonu:
python
def spray_decision(risk, fungicide_cost, yield_loss_value):
expected_loss_no_spray = risk × yield_loss_value
expected_loss_with_spray = fungicide_cost + (1 - efficacy) × risk × yield_loss_value
if expected_loss_with_spray < expected_loss_no_spray:
return "SPRAY"
else:
return "DO NOT SPRAY"
Örnek hesaplama:
- Risk: 0.75 (75% hastalık gelişme olasılığı)
- Potansiyel verim kaybı değeri: $200/ha
- Fungisit maliyeti: $30/ha
- Fungisit etkinliği: 85%
Beklenen kayıp (ilaç yok) = 0.75 × $200 = $150/ha
Beklenen kayıp (ilaç var) = $30 + (1-0.85) × 0.75 × $200 = $30 + $22.5 = $52.5/ha
Karar: İLAÇLA (tasarruf: $150 - $52.5 = $97.5/ha)
Değişken Dozlu İlaçlama (Variable Rate Application)
Tarla içi risk haritaları, değişken dozlu aplikasyon için kullanılır:
Prescription map oluşturma:
- Drone/uydu görüntüsünden hastalık yoğunluğu haritası
- Risk skorlarının grid hücrelere atanması (örn: 10×10m gridler)
- Her grid için doz hesaplama:
- Yüksek risk: %100 etiket dozu
- Orta risk: %75 etiket dozu
- Düşük risk: %50 etiket dozu veya ilaçlama yok
Uygulama:
GPS-guided sprayer ile prescription map'e göre otomatik valf kontrolü.
Avantajlar:
- İlaç kullanımında %30-50 azalma
- Daha homojen hastalık kontrolü
- Maliyetlerde düşüş
- Çevre yükünde azalma
Erken Uyarı Sistemleri
Sistem Mimarisi
Bileşenler: - Veri toplama katmanı: Sensörler, hava istasyonları, tarla gözlemleri
- Veri işleme katmanı: ETL (Extract-Transform-Load), feature engineering
- Model katmanı: ML modelleri, risk hesaplama
- Karar katmanı: Risk eşikleri, aksiyon kuralları
- Kullanıcı arayüzü: Dashboard, mobil bildirimler, SMS/email alerts
Gerçek zamanlı pipeline:
Sensörler → MQTT broker → Stream processor (Kafka) →
Feature calculation → Model inference →
Risk score → Alert system → Farmer notification
Uyarı Seviyeleri ve İletişim
4 seviyeli uyarı sistemi:
Seviye 0 (Yeşil): Düşük risk
- Risk skoru: <0.40
- Mesaj: "Hastalık riski düşük, izlemeye devam edin"
- Aksiyon: Yok
Seviye 1 (Sarı): Orta risk
- Risk skoru: 0.40-0.60
- Mesaj: "Hastalık riski artmakta, tarlayı sıkı izleyin"
- Aksiyon: Haftalık saha kontrolü
Seviye 2 (Turuncu): Yüksek risk
- Risk skoru: 0.60-0.80
- Mesaj: "Hastalık riski yüksek, ilaçlamaya hazırlıklı olun"
- Aksiyon: İlaç ve ekipman kontrolü, saha gözlemi
Seviye 3 (Kırmızı): Kritik risk
- Risk skoru: >0.80
- Mesaj: "ACİL! Derhal ilaçlama yapın"
- Aksiyon: Hemen ilaçlama
İletişim kanalları:
- Web dashboard: Gerçek zamanlı haritalar, grafikler, trend analizleri
- Mobil uygulama: Push notifications, GPS lokasyon bazlı uyarılar
- SMS: Kritik uyarılar için (internet olmayan bölgeler)
- Email: Detaylı raporlar, haftalık özetler
- WhatsApp/Telegram: Çiftçi grupları için
Yapay Zeka ve İleri Teknoloji Uygulamaları
Computer Vision ve Görüntü Tabanlı Hastalık Tespiti
Derin Öğrenme ile Hastalık Tanıma
Convolutional Neural Networks (CNN) mimarileri, yaprak görüntülerinden tahıl küllemesini otomatik olarak tespit edebilmektedir.
Popüler CNN mimarileri:
ResNet-50/101:
- Residual connections ile derin ağlar
- Transfer learning için ideal
- ImageNet pre-trained weights
EfficientNet:
- En yüksek performans/parametre oranı
- Mobile deployment için uygun
- EfficientNet-B0 to B7 varyantları
MobileNet:
- Lightweight, hızlı inferans
- Mobil ve edge device için optimize
- Depthwise separable convolutions
Örnek mimari (tahıl küllemesi tespiti):
python
import tensorflow as tf
from tensorflow.keras import layers, models
base_model = tf.keras.applications.EfficientNetB3(
include_top=False,
weights='imagenet',
input_shape=(224, 224, 3)
)
Base model'i freeze et
base_model.trainable = False
model = models.Sequential([
base_model,
layers.GlobalAveragePooling2D(),
layers.Dropout(0.3),
layers.Dense(128, activation='relu'),
layers.Dropout(0.2),
layers.Dense(4, activation='softmax') # 4 sınıf: healthy, mild, moderate, severe
])
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
loss='categorical_crossentropy',
metrics=['accuracy', 'precision', 'recall']
)
Veri artırma (Data augmentation):
Sınırlı etiketli veri sorununu çözmek için:
Python
data_augmentation = tf.keras.Sequential([
layers.RandomFlip("horizontal_and_vertical"),
layers.RandomRotation(0.2),
layers.RandomZoom(0.2),
layers.RandomContrast(0.2),
layers.RandomBrightness(0.2)
])
Model performansı:
- Accuracy: >95%
- Precision/Recall: >92%
- Inference time: <100ms (GPU), <500ms (CPU)
Semantic Segmentation
Pixel-level hastalık tespiti için:
U-Net mimarisi:
Tıbbi görüntü segmentasyonu için geliştirilmiş, tarımda yaygın kullanılan mimari:
Encoder Path (Downsampling):
Conv → Conv → MaxPool →
Conv → Conv → MaxPool →
Bottleneck:
Conv → Conv
Decoder Path (Upsampling):
UpConv → Concat → Conv → Conv →
UpConv → Concat → Conv → Conv →
Çıktı: Her piksel için sınıf tahmini
- Class 0: Background
- Class 1: Healthy tissue
- Class 2: Diseased tissue (powdery mildew)
Uygulamalar:
- Hastalıklı alan yüzdesinin hassas hesaplanması
- Hastalık dağılımının mekansal analizi
- Temporal progression tracking
Object Detection
Yaprak üzerinde külleme püstüllerinin konumlarını tespit etme:
YOLO (You Only Look Once) ailesi:
- YOLOv8: En güncel, yüksek hız ve doğruluk
- Real-time detection: 30-60 FPS
- Bounding box + confidence score
Faster R-CNN:
- İki aşamalı detector (region proposal + classification)
- Daha yüksek doğruluk, daha yavaş
- Küçük obje tespiti için iyi
Uygulamalar:
- Püstül sayısı otomatik saym human
- Erken evrede (küçük lekeler) tespit
- Sporulasyon yoğunluğu tahmini
Doğal Dil İşleme (NLP) Uygulamaları
Literatür Madenciliği
Bilimsel yayınlardan otomatik bilgi çıkarma:
Named Entity Recognition (NER):
Metinlerden anahtar bilgilerin çıkarılması:
- Fungisit isimleri
- Dayanıklılık genleri
- Tahıl çeşit isimleri
- Coğrafi lokasyonlar
- Hastalık şiddeti verileri
Relation Extraction:
Varlıklar arası ilişkilerin çıkarılması:
- "Çeşit X, Pm3a genini taşır" → (Variety X, has_gene, Pm3a)
- "Tebuconazole, %85 etkinlik gösterdi" → (Tebuconazole, efficacy, 85%)
Uygulamalar:
- Yeni dayanıklılık genlerinin otomatik keşfi
- Fungisit etkinlik meta-analizi
- Coğrafi hastalık dağılım haritaları
Çiftçi Rapor Analizi
Çiftçilerden gelen serbest metin raporlarının analizi:
Sentiment Analysis:
"İlaç hiç işe yaramadı, hastalık yayılmaya devam ediyor" → Negatif sentiment → Fungisit direnci riski
Intent Classification:
- Sorgu: "Bu hastalık ne?"
- Şikayet: "İlaç işe yaramadı"
- Bilgi paylaşımı: "Tarlamda külleme başladı"
Chatbot uygulamaları:
LLM (Large Language Model) tabanlı tarım danışmanı:
- Çiftçi sorularına 24/7 yanıt
- Hastalık tanımlama yardımı
- İlaç tavsiyesi
- Agronomik öneriler
Reinforcement Learning (Pekiştirmeli Öğrenme)
Optimal İlaçlama Politikası Öğrenme
Problem formülasyonu:
- State (Durum: Hastalık şiddeti, bitki fenolojisi, hava koşulları
- Action (Aksiyon): İlaçla / İlaçlama / Hangi fungisit / Doz
- Reward (Ödül): Net kar (verim değeri - ilaç maliyeti - hastalık kaybı)
Q-Learning yaklaşımı:
Q(s,a) ← Q(s,a) + α[r + γ max Q(s',a') - Q(s,a)]
Deep Q-Network (DQN):
Neural network ile Q-function approximation
Policy Gradient (REINFORCE):
Doğrudan optimal politikayı öğrenme
Avantajlar:
- Dinamik, adapt olan stratejiler
- Uzun vadeli kazanç optimizasyonu
- Çoklu objektif dengesi (verim + maliyet + çevre)
Explainable AI (Açıklanabilir Yapay Zeka)
Black-box modellerin kararlarını açıklama:
SHAP (SHapley Additive exPlanations)
Her özelliğin tahmine katkısını hesaplama:
Global explanation:
Python
import shap
explainer = shap.TreeExplainer(xgb_model)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test, plot_type="bar")
Örnek çıktı:
Feature Importance:
- Leaf wetness hours (7-day): 0.35
- Avg temperature (7-day): 0.28
- Relative humidity: 0.18
- Variety susceptibility: 0.12
- Nitrogen dose: 0.07
Local explanation (tek tahmin için):
python
shap.force_plot(explainer.expected_value, shap_values[0,:], X_test.iloc[0,:])
Bu, belirli bir tarla için "neden yüksek risk var?" sorusunu yanıtlar:
Risk Score: 0.82 (HIGH RISK)
Contributions:
+ Leaf wetness (12 hours): +0.25
+ Temperature (18°C optimal): +0.20
+ Humidity (92%): +0.18
+ Susceptible variety: +0.15
- Nitrogen (normal dose): -0.05
LIME (Local Interpretable Model-agnostic Explanations)
Herhangi bir model için yerel açıklamalar:
python
from lime import lime_tabular
explainer = lime_tabular.LimeTabularExplainer(
X_train.values,
feature_names=X_train.columns,
class_names=['Low Risk', 'Medium Risk', 'High Risk'],
mode='classification'
)
exp = explainer.explain_instance(X_test.iloc[0], model.predict_proba)
exp.show_in_notebook()
Attention Mechanisms
Derin öğrenme modellerinde hangi girdilere odaklandığını görselleştirme:
Grad-CAM (Gradient-weighted Class Activation Mapping):
CNN modellerinde hangi bölgelerin sınıflandırmada etkili olduğunu gösterir:
python
import tf_keras_vis
cam = GradCAM(model, layer_name='last_conv_layer')
heatmap = cam(image, class_index=disease_class)
Çıktı: Yaprak görüntüsü üzerinde ısı haritası - model hangi bölgelere bakarak "külleme var" dedi?
Çiftçiye açıklama:
"Modelimiz bu tahmini yaparken yaprak üst yüzeyindeki beyaz lekelere ve alt yapraktaki yoğunluğa odaklandı."
Federasyon Öğrenmesi (Federated Learning)
Gizlilik Korumalı Model Eğitimi
Çiftçilerin verilerini paylaşmadan ortak model eğitimi:
Mimari:
Central Server (Global Model)
↓ ↑
Distribution / Aggregation
↓ ↑
Farm 1 → Local Training → Gradients
Farm 2 → Local Training → Gradients
Farm 3 → Local Training → Gradients
Farm N → Local Training → Gradients
FedAvg algoritması:
python
Central server
global_weights = initialize_model()
for round in range(num_rounds):
Distribute global model to clients
selected_clients = random_sample(clients)
local_weights = []
for client in selected_clients:
Client trains locally
w = client.local_train(global_weights, local_data)
local_weights.append(w)
Aggregate (weighted average)
global_weights = federated_averaging(local_weights)
Avantajlar:
- Veri gizliliği korunur
- Bölgesel veri heterojenlığinden öğrenme
- Daha robust global model
- Compliance with GDPR/KVKK
Edge AI ve Gerçek Zamanlı İnferans
Model Optimizasyonu
Tarla sensör düğümlerinde çalışabilecek hafif modeller:
Model Compression Teknikleri:
Quantization: 32-bit float → 8-bit integer
python
converter = tf.lite.TFLiteConverter.from_keras_model(model)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
quantized_model = converter.convert()
Sonuç: Model boyutu 4x küçük, hız 2-4x artar
Pruning: Önemsiz ağırlıkları sıfırlama
Python
import tensorflow_model_optimization as tfmot
pruning_params = {
'pruning_schedule': tfmot.sparsity.keras.PolynomialDecay(
initial_sparsity=0.0,
final_sparsity=0.5,
begin_step=0,
end_step=1000
)
}
model_for_pruning = tfmot.sparsity.keras.prune_low_magnitude(model, pruning_params)
Knowledge Distillation: Büyük öğretmen modelden küçük öğrenci modele bilgi transferi
ONNX Format: Platform-agnostic model formatı
python
import tf2onnx
onnx_model = tf2onnx.convert.from_keras(model)
Edge Deployment Platformları
NVIDIA Jetson Series:
- Jetson Nano: Entry-level, $99, 128 CUDA cores
- Jetson Xavier NX: Mid-range, $399, 384 CUDA cores
- Jetson AGX Xavier: High-end, 512 CUDA cores
Google Coral:
- Edge TPU: Özel AI accelerator
- USB Accelerator: $60
- Dev Board: $150
Intel Neural Compute Stick:
- USB formfaktör
- OpenVINO toolkit optimizasyonu
Raspberry Pi + AI accelerator:
- RPi 4 + Coral USB Accelerator
- En ekonomik çözüm: ~$100
Örnek deployment pipeline:
python
1. Train on cloud (GPU)
model = train_large_model(cloud_gpu)
2. Optimize for edge
optimized_model = quantize_and_prune(model)
3. Convert to edge format
edge_model = convert_to_tflite(optimized_model)
4. Deploy to Jetson Nano
deploy_to_edge_device(edge_model, jetson_nano)
5. Real-time inference
while True:
sensor_data = read_sensors()
risk = edge_model.predict(sensor_data)
if risk > threshold:
send_alert()
Mikrodenetleyici Tabanlı Otomatik Sistem Tasarımı
Sistem Mimarisi ve Bileşenler
Tahıl küllemesi için entegre akıllı izleme ve müdahale sistemi, dört ana katmandan oluşur:
Donanım Katmanı (Hardware Layer)
Sensör Düğümleri (Node):
Her sensör düğümü şu bileşenleri içerir:
Mikrodenetleyici (MCU):
- ESP32: WiFi/BLE destekli, 240MHz dual-core, $4-8
-Avantaj: WiFi built-in, güçlü işlem
- Dezavantaj: Yüksek güç tüketimi (~160mA aktif)
- STM32WB: BLE/Sub-GHz dual-core, ultra-low power
- Avantaj: Çok düşük güç (~5mA aktif)
- Dezavantaj: WiFi yok, harici radio gerekli
Sensörler:
Sıcaklık ve Nem:
- SHT35/SHT31: ±0.2°C, ±2% RH, I2C, $5-10
- BME280: Sıcaklık + Nem + Basınç, I2C/SPI, $8
Yaprak Islaklığı:
- Kapasitif sensor: Dielektrik sabitindeki değişimi ölçer
- Rezistif sensor: İki elektrot arası direnç değişimi
- DIY yapım: FR4 PCB üzerine interdigital electrode pattern
- Kalibrasyonu: Kuru (0%) - Tamamen ıslak (100%)
Yağış:
- Tipping bucket rain gauge: 0.2mm çözünürlük
- Reed switch + magnet, interrupt-based ölçüm
- Kalibrasyonu: Bilinen su miktarı ile
Rüzgar:
- Cup anemometer: Rotasyon hızı → rüzgar hızı
- Hall effect sensor ile RPM ölçümü
- Ultrasonic anemometer: Ultrason transit time (pahalı ama bakım gerektirmez)
Işık/PAR (opsiyonel):
- TSL2591: Lüx + IR ölçümü, I2C, $7
- Quantum PAR sensor: Fotosentetik aktif radyasyon (profesyonel, pahalı)
Güç Sistemi:
Solar Panel (10-20W) →
Charge Controller (MPPT) →
LiFePO4 Battery (12V 20Ah) →
Buck Converter (3.3V/5V) →
MCU + Sensors
Güç bütçesi hesabı:
ESP32 aktif: 160mA × 30 sn/5 dak = 16mAh
ESP32 deep sleep: 10μA × 4.5 dak = 0.75μAh
Sensörler: 5mA × 10 sn/5 dak = 0.83mAh
LoRa TX: 120mA × 2 sn/5 dak = 4mAh
Toplam (saatlik): ~25mAh
Günlük: 600mAh
20Ah batarya → 33 gün yedek (güneş yok)
Haberleşme Modülü:
LoRaWAN:
- SX1276/RFM95: 868/915 MHz, 10-15 km menzil
- Çok düşük güç: 20mA RX, 120mA TX
- Bandwidth: 125/250/500 kHz
- Spreading Factor: SF7-SF12 (hız vs. menzil dengesi)
NB-IoT/LTE-M:
- Cellular bağlantı, unlimitged menzil
- Quectel BC95: NB-IoT modem
- Daha yüksek güç: 100-300mA TX
- Aylık data planı gerekli (~$2-5/ay)
WiFi (kısa menzil):
- ESP32 built-in
- Yüksek güç tüketimi
- Sadece gateway yakınında kullanılabilir
Muhafaza (Enclosure):
- IP66/IP67 seviyesi (toz ve su geçirmez)
- UV dayanımlı plastik (ABS/Polycarbonate)
- Havalandırma gözenekleri (nem birikimine karşı)
- Stevenson screen prensibi (doğrudan güneş ışığından koruma)
Gateway ve Edge Computing
Gateway (RTU - Remote Terminal Unit):
Raspberry Pi 4 veya Jetson Nano tabanlı:
Görevler:
- LoRaWAN Network Server
- Lokal veri aggregation (10-20 node'dan toplama)
- Edge ML inference (hafif modeller)
- Bulut bağlantısı (4G/Ethernet)
- OTA (Over-The-Air) firmware güncelleme yönetimi
Bağlantı:
Sensor Nodes → LoRaWAN → Gateway → 4G/Ethernet → Cloud
Edge computing avantajları:
- Düşük latency (<1 sn)
- Bandwidth tasarrufu (ham veri değil, işlenmiş veri buluta)
- Offline çalışabilme
- Gerçek zamanlı kritik karar
İlaçlama Kontrol Ünitesi
Bileşenler:
MCU: STM32 veya Arduino Mega
- Çok kanallı (4-8 kanal) solenoid valf kontrolü
- PWM motor sürücü
- Safety interlocks
Valf Sürücüler:
- Solenoid valve: 12V/24V, normalde kapalı
- MOSFET/Relay drivers: Yüksek akım sürme
- Optoisolation: MCU koruması
Pompa Kontrolü:
- PWM ile hız kontrolü
- Basınç sensörü feedback
- Akım sensörü (motor koruması)
GPS Modülü:
- Konum bazlı otomatik valf açma/kapama
- Prescription map koordinatlarıyla senkronizasyon
Safety Features:
- Emergency stop button (fiziksel)
- Watchdog timer
- Pressure relief valve
- Leak detection
Drone entegrasyonu (gelecek):
- MAVLink protokol köprüsü
- Otonom drone ile bölgesel ilaçlama
- GPS waypoint bazlı spray mission
Gömülü Yazılım (Firmware) Geliştirme
Sensör Düğümü Firmware
Arduino/PlatformIO kodu (ESP32 örneği):
cpp
#include
#include
#include
#include
#include "credentials.h" // LoRaWAN keys
// Sensör tanımlamaları
SHTSensor sht(SHTSensor::SHT3X);
const int LEAF_WET_PIN = 34;
const int RAIN_PIN = 35;
volatile int rainTips = 0;
// LoRaWAN konfigürasyonu
static const u1_t PROGMEM APPEUI[8] = { /* ... */ };
static const u1_t PROGMEM DEVEUI[8] = { /* ... */ };
static const u1_t PROGMEM APPKEY[16] = { /* ... */ };
// Timing
const unsigned long MEASURE_INTERVAL = 5 * 60 * 1000; // 5 dakika
unsigned long lastMeasure = 0;
// Rain interrupt handler
void IRAM_ATTR rainISR() {
rainTips++;
}
void setup() {
Serial.begin(115200);
Wire.begin();
// Sensör başlatma
if (!sht.init()) {
Serial.println("SHT sensor error!");
}
sht.setAccuracy(SHTSensor::SHT_ACCURACY_HIGH);
// Yağış sensörü
pinMode(RAIN_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(RAIN_PIN), rainISR, FALLING);
// LoRaWAN başlatma
os_init();
LMIC_reset();
LMIC_setClockError(MAX_CLOCK_ERROR * 1 / 100); // Clock accuracy
// İlk ölçüm
doMeasurementAndSend();
}
void loop() {
os_runloop_once(); // LMIC event loop
unsigned long now = millis();
if (now - lastMeasure >= MEASURE_INTERVAL) {
lastMeasure = now;
doMeasurementAndSend();
}
}
void doMeasurementAndSend() {
// Sensör okuma
float temp = 0, humidity = 0;
if (sht.readSample()) {
temp = sht.getTemperature();
humidity = sht.getHumidity();
}
// Yaprak ıslaklık (0-100%)
int leafWetRaw = analogRead(LEAF_WET_PIN);
float leafWet = map(leafWetRaw, 500, 3500, 0, 100); // Kalibrasyon değerleri
leafWet = constrain(leafWet, 0, 100);
// Yağış (her tip = 0.2mm)
float rainfall = rainTips * 0.2;
rainTips = 0; // Reset counter
// Lokal risk hesaplama (basit)
float riskScore = calculateLocalRisk(temp, humidity, leafWet);
// Payload oluşturma (compact binary)
uint8_t payload[10];
int16_t tempInt = (int16_t)(temp * 100);
int16_t humInt = (int16_t)(humidity * 100);
uint16_t rainInt = (uint16_t)(rainfall * 10);
payload[0] = (tempInt >> 8) & 0xFF;
payload[1] = tempInt & 0xFF;
payload[2] = (humInt >> 8) & 0xFF;
payload[3] = humInt & 0xFF;
payload[4] = (uint8_t)leafWet;
payload[5] = (rainInt >> 8) & 0xFF;
payload[6] = rainInt & 0xFF;
payload[7] = (uint8_t)(riskScore * 255);
payload[8] = batteryLevel(); // Batarya durumu
payload[9] = 0; // Reserved
// LoRaWAN gönderimi
LMIC_setTxData2(1, payload, sizeof(payload), 0);
Serial.printf("T:%.1f H:%.1f LW:%.0f R:%.1f Risk:%.2f\n",
temp, humidity, leafWet, rainfall, riskScore);
// Deep sleep (power saving)
// LMIC callback'den sonra sleep moduna geçilecek
}
float calculateLocalRisk(float temp, float humidity, float leafWet) {
// Basit risk skoru (0-1)
float tempScore = 0;
if (temp >= 10 && temp <= 35) {
// Optimal: 15-20°C
float tempDev = abs(temp - 17.5);
tempScore = 1.0 - (tempDev / 17.5);
}
float humScore = humidity / 100.0;
float wetScore = leafWet / 100.0;
float risk = 0.35 * tempScore + 0.30 * humScore + 0.35 * wetScore;
return constrain(risk, 0.0, 1.0);
}
uint8_t batteryLevel() {
// ADC ile batarya voltajı ölçümü
int adcValue = analogRead(36); // GPIO36 (VP)
float voltage = (adcValue / 4095.0) * 3.3 * 2; // Voltage divider
// LiFePO4: 13.6V (full) - 10.0V (empty)
float percentage = (voltage - 10.0) / 3.6 * 100;
return constrain((int)percentage, 0, 100);
}
// LoRaWAN event handlers
void onEvent(ev_t ev) {
switch(ev) {
case EV_TXCOMPLETE:
Serial.println("TX complete");
if (LMIC.txrxFlags & TXRX_ACK)
Serial.println("ACK received");
// Sleep mode'a geç
esp_sleep_enable_timer_wakeup(MEASURE_INTERVAL * 1000);
esp_deep_sleep_start();
break;
// ... diğer event'ler
}
}
Önemli noktalar:
- Interrupt-driven: Yağış sensörü interrupt kullanır (güç tasarrufu)
- Deep sleep: Ölçümler arası derin uyku modu (güç tasarrufu)
- Binary payload: Bandwidth tasarrufu (10 byte vs. 100+ byte JSON)
- Local risk: Basit hesaplama, edge intelligence
- Battery monitoring: Düşük batarya uyarısı
Gateway Yazılımı (Python)
Raspberry Pi gateway kodu:
python
import paho.mqtt.client as mqtt
import json
import struct
import requests
from datetime import datetime
import sqlite3
import numpy as np
Konfigürasyon
MQTT_BROKER = "localhost"
MQTT_PORT = 1883
API_ENDPOINT = "https://api.example.com/sensor-data"
DB_PATH = "/var/lib/gateway/data.db"
class GatewayProcessor:
def __init__(self):
self.db_conn = sqlite3.connect(DB_PATH)
self.setup_database()
def setup_database(self):
cursor = self.db_conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS sensor_data (
timestamp TEXT,
node_id TEXT,
temperature REAL,
humidity REAL,
leaf_wetness REAL,
rainfall REAL,
risk_score REAL,
battery_level INTEGER
)
''')
self.db_conn.commit()
def decode_payload(self, payload):
"""LoRaWAN binary payload decode"""
if len(payload) < 10:
return None
temp = struct.unpack('>h', payload[0:2])[0] / 100.0
humidity = struct.unpack('>h', payload[2:4])[0] / 100.0
leaf_wet = payload[4]
rainfall = struct.unpack('>H', payload[5:7])[0] / 10.0
risk = payload[7] / 255.0
battery = payload[8]
return {
'temperature': temp,
'humidity': humidity,
'leaf_wetness': leaf_wet,
'rainfall': rainfall,
'risk_score': risk,
'battery_level': battery
}
def calculate_advanced_risk(self, node_id):
"""Son 7 günün verisinden gelişmiş risk hesaplama"""
cursor = self.db_conn.cursor()
cursor.execute('''
SELECT temperature, humidity, leaf_wetness, rainfall
FROM sensor_data
WHERE node_id = ? AND timestamp > datetime('now', '-7 days')
ORDER BY timestamp DESC
''', (node_id,))
data = cursor.fetchall()
if len(data) < 10: # Yetersiz veri
return None
Feature engineering
temps = [row[0] for row in data]
hums = [row[1] for row in data]
lw_hours = sum([row[2] > 50 for row in data]) * 0.083 # 5 dak intervals
total_rain = sum([row[3] for row in data])
avg_temp = np.mean(temps)
avg_hum = np.mean(hums)
Risk modeli (basitleştirilmiş)
temp_score = max(0, 1 - abs(avg_temp - 17.5) / 17.5)
hum_score = avg_hum / 100.0
lw_score = min(lw_hours / 48.0, 1.0) # 48 saat max
rain_score = min(total_rain / 50.0, 1.0) # 50mm max
risk = 0.30 * temp_score + 0.25 * hum_score + 0.30 * lw_score + 0.15 * rain_score
return risk
def process_message(self, node_id, payload):
"""Gelen mesajı işle"""
data = self.decode_payload(payload)
if not data:
return
timestamp = datetime.now().isoformat()
Veritabanına kaydet
cursor = self.db_conn.cursor()
cursor.execute('''
INSERT INTO sensor_data VALUES (?, ?, ?, ?, ?, ?, ?, ?)
''', (timestamp, node_id, data['temperature'], data['humidity'],
data['leaf_wetness'], data['rainfall'], data['risk_score'],
data['battery_level']))
self.db_conn.commit()
Gelişmiş risk hesaplama
advanced_risk = self.calculate_advanced_risk(node_id)
if advanced_risk:
data['advanced_risk'] = advanced_risk
Yüksek risk uyarısı
if advanced_risk >= 0.75:
self.send_alert(node_id, advanced_risk)
Buluta gönder
self.send_to_cloud(node_id, timestamp, data)
print(f"[{timestamp}] Node {node_id}: T={data['temperature']:.1f}°C "
f"H={data['humidity']:.0f}% Risk={data['risk_score']:.2f}")
def send_to_cloud(self, node_id, timestamp, data):
"""Bulut API'ye veri gönderimi"""
payload = {
'node_id': node_id,
'timestamp': timestamp,
**data
}
try:
response = requests.post(API_ENDPOINT, json=payload, timeout=10)
response.raise_for_status()
except Exception as e:
print(f"Cloud send error: {e}")
Retry mekanizması eklenebilir
def send_alert(self, node_id, risk):
"""Yüksek risk uyarısı gönder"""
alert_msg = {
'type': 'high_risk_alert',
'node_id': node_id,
'risk_score': risk,
'message': f'CRITICAL: Powdery mildew risk {risk:.0%} - Spray recommended'
}
SMS/Email/Push notification servise gönder
requests.post("https://api.example.com/alerts", json=alert_msg)
print(f"⚠️ ALERT: Node {node_id} - Risk {risk:.0%}")
MQTT client setup
processor = GatewayProcessor()
def on_connect(client, userdata, flags, rc):
print(f"Connected to MQTT broker (rc={rc})")
client.subscribe("application/+/device/+/rx") # LoRa Server topic
def on_message(client, userdata, msg):
try:
payload_json = json.loads(msg.payload)
node_id = payload_json['devEUI']
data = bytes.fromhex(payload_json['data'])
processor.process_message(node_id, data)
except Exception as e:
print(f"Message processing error: {e}")
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(MQTT_BROKER, MQTT_PORT, 60)
client.loop_forever()
Bulut Platformu ve Veri Pipeline
Veri Alımı (Data Ingestion)
MQTT Broker (EMQX/Mosquitto):
yaml
docker-compose.yml
version: '3'
services:
mqtt:
image: emqx/emqx:latest
ports:
- "1883:1883" # MQTT
- "8883:8883" # MQTT/TLS
- "8083:8083" # WebSocket
- "18083:18083" # Dashboard
environment:
EMQX_NAME: powdery_mildew_broker
EMQX_HOST: 127.0.0.1
Apache Kafka (yüksek throughput için):
python
from kafka import KafkaProducer, KafkaConsumer
import json
Producer (gateway'den gelen veriyi Kafka'ya)
producer = KafkaProducer(
bootstrap_servers=['localhost:9092'],
value_serializer=lambda v: json.dumps(v).encode('utf-8')
)
def send_to_kafka(node_id, data):
producer.send('sensor-data', value={'node_id': node_id, **data})
producer.flush()
Consumer (Kafka'dan veriyi işleme)
consumer = KafkaConsumer(
'sensor-data',
bootstrap_servers=['localhost:9092'],
value_deserializer=lambda m: json.loads(m.decode('utf-8'))
)
for message in consumer:
data = message.value
Process and store
store_to_influxdb(data)
Zaman Serisi Veritabanı (InfluxDB)
Veri yazma:
python
from influxdb_client import InfluxDBClient, Point
from influxdb_client.client.write_api import SYNCHRONOUS
client = InfluxDBClient(url="http://localhost:8086", token="my-token", org="my-org")
write_api = client.write_api(write_options=SYNCHRONOUS)
def store_sensor_data(node_id, field_id, data):
point = Point("weather") \
.tag("node_id", node_id) \
.tag("field_id", field_id) \
.field("temperature", data['temperature']) \
.field("humidity", data['humidity']) \
.field("leaf_wetness", data['leaf_wetness']) \
.field("rainfall", data['rainfall']) \
.field("risk_score", data['risk_score'])
write_api.write(bucket="sensor-data", record=point)
Veri sorgulama (Flux):
from(bucket: "sensor-data")
|> range(start: -7d)
|> filter(fn: (r) => r["_measurement"] == "weather")
|> filter(fn: (r) => r["node_id"] == "node001")
|> aggregateWindow(every: 1h, fn: mean)
Makine Öğrenmesi Model Servisi
Model Training Pipeline
Scikit-learn pipeline:
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
import joblib
Feature engineering
def create_features(df):
df['temp_7d_avg'] = df['temperature'].rolling(window=2016).mean() # 7 days
df['hum_7d_avg'] = df['humidity'].rolling(window=2016).mean()
df['lw_cumsum_7d'] = df['leaf_wetness'].rolling(window=2016).sum() * 0.083
df['rain_7d_sum'] = df['rainfall'].rolling(window=2016).sum()
df['optimal_temp_days'] = ((df['temperature'] >= 15) & (df['temperature'] <= 22)).rolling(window=288).sum() # 1 gün
df['high_humidity_hours'] = (df['humidity'] >= 85).rolling(window=2016).sum() * 0.083
return df.dropna()
Model pipeline
model_pipeline = Pipeline([
('scaler', StandardScaler()),
('classifier', RandomForestClassifier(
n_estimators=500,
max_depth=15,
min_samples_split=10,
class_weight='balanced',
random_state=42
))
])
Training
X_train, y_train = load_training_data()
model_pipeline.fit(X_train, y_train)
Save model
joblib.dump(model_pipeline, 'models/powdery_mildew_rf_v1.pkl')
Model Serving (FastAPI)
REST API endpoint:
python
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import joblib
import numpy as np
app = FastAPI()
Model yükleme
model = joblib.load('models/powdery_mildew_rf_v1.pkl')
class SensorData(BaseModel):
node_id: str
temp_7d_avg: float
hum_7d_avg: float
lw_cumsum_7d: float
rain_7d_sum: float
optimal_temp_days: int
high_humidity_hours: float
class PredictionResponse(BaseModel):
node_id: str
risk_class: str
risk_probability: float
confidence: float
recommendation: str
@app.post("/predict", response_model=PredictionResponse)
async def predict_risk(data: SensorData):
try:
Feature array oluştur
features = np.array([[
data.temp_7d_avg,
data.hum_7d_avg,
data.lw_cumsum_7d,
data.rain_7d_sum,
data.optimal_temp_days,
data.high_humidity_hours
]])
Tahmin
risk_class = model.predict(features)[0]
risk_proba = model.predict_proba(features)[0]
Risk kategorileri: 0=Low, 1=Medium, 2=High
class_names = ['Low', 'Medium', 'High']
risk_name = class_names[risk_class]
confidence = risk_proba[risk_class]
Öneri oluştur
if risk_class == 2 and confidence > 0.75:
recommendation = "IMMEDIATE ACTION: Spray fungicide within 24 hours"
elif risk_class == 2:
recommendation = "HIGH RISK: Prepare for spraying, monitor closely"
elif risk_class == 1:
recommendation = "MODERATE RISK: Increase monitoring frequency"
else:
recommendation = "LOW RISK: Continue routine monitoring"
return PredictionResponse(
node_id=data.node_id,
risk_class=risk_name,
risk_probability=float(risk_proba[2]), # High risk probability
confidence=float(confidence),
recommendation=recommendation
)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@app.get("/health")
async def health_check():
return {"status": "healthy", "model_version": "v1.0"}
Model performance monitoring
@app.post("/feedback")
async def record_feedback(node_id: str, prediction: str, actual: str):
"""Model tahminlerinin gerçek durumla karşılaştırılması"""
Database'e kaydet
Periodically retrain model
return {"status": "feedback_recorded"}
Docker deployment:
dockerfile
Dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
bash
docker build -t pm-model-api .
docker run -d -p 8000:8000 pm-model-api
TensorFlow Serving (Deep Learning modelleri için)
Model export:
python
import tensorflow as tf
LSTM model
model = tf.keras.models.load_model('lstm_model.h5')
SavedModel format'a çevir
model.save('saved_models/lstm_v1')
TensorFlow Serving deployment:
bash
docker run -p 8501:8501 \
--mount type=bind,source=/path/to/saved_models/lstm_v1,target=/models/lstm_v1 \
-e MODEL_NAME=lstm_v1 \
-t tensorflow/serving
Inference request:
python
import requests
import json
def predict_with_tf_serving(input_data):
url = 'http://localhost:8501/v1/models/lstm_v1:predict'
payload = {
"instances": input_data.tolist()
}
response = requests.post(url, json=payload)
predictions = response.json()['predictions']
return predictions
Web Dashboard ve Görselleştirme
Frontend (React)
Real-time dashboard bileşenleri:
jsx
import React, { useState, useEffect } from 'react';
import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend } from 'recharts';
import { MapContainer, TileLayer, Marker, Popup, Circle } from 'react-leaflet';
function Dashboard() {
const [sensorData, setSensorData] = useState([]);
const [riskMap, setRiskMap] = useState([]);
useEffect(() => {
// WebSocket connection for real-time data
const ws = new WebSocket('ws://api.example.com/ws');
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
setSensorData(prev => [...prev.slice(-100), data]); // Son 100 veri
};
// Periodically fetch risk map
const interval = setInterval(async () => {
const response = await fetch('/api/risk-map');
const data = await response.json();
setRiskMap(data);
}, 60000); // Her dakika
return () => {
ws.close();
clearInterval(interval);
};
}, []);
return (
Tahıl Küllemesi İzleme Sistemi
{/* Gerçek zamanlı metrikler */}
title="Aktif Sensörler"
value={sensorData.filter(s => s.online).length}
total={sensorData.length}
/>
title="Yüksek Risk Alanlar"
value={riskMap.filter(r => r.risk > 0.75).length}
color="red"
/>
title="Ortalama Risk Skoru"
value={(riskMap.reduce((sum, r) => sum + r.risk, 0) / riskMap.length).toFixed(2)}
/>
{/* Zaman serisi grafikleri */}
Son 24 Saat Trendler --------------------
{/* Risk haritası */}
Tarla Risk Haritası -------------------
{riskMap.map((node, idx) => (
key={idx}
center={[node.lat, node.lon]}
radius={50}
fillColor={getRiskColor(node.risk)}
color={getRiskColor(node.risk)}
fillOpacity={0.5}
>
Node {node.id}
Risk: {(node.risk * 100).toFixed(0)}%
Sıcaklık: {node.temperature.toFixed(1)}°C
Nem: {node.humidity.toFixed(0)}%
))}
{/* Uyarılar */}
r.risk > 0.75)} />
);
}
function getRiskColor(risk) {
if (risk < 0.4) return 'green';
if (risk < 0.6) return 'yellow';
if (risk < 0.75) return 'orange';
return 'red';
}
export default Dashboard;
Nackend API (Node.js/Express)
Javascript
const express = require('express');
const WebSocket = require('ws');
const mqtt = require('mqtt');
const { InfluxDB } = require('@influxdata/influxdb-client');
const app = express();
const wss = new WebSocket.Server({ port: 8080 });
// InfluxDB client
const influx = new InfluxDB({ url: 'http://localhost:8086', token: 'my-token' });
const queryApi = influx.getQueryApi('my-org');
// MQTT client (sensör verilerini dinle)
const mqttClient = mqtt.connect('mqtt://localhost:1883');
mqttClient.on('message', (topic, message) => {
const data = JSON.parse(message.toString());
// WebSocket ile connected client'lara broadcast
wss.clients.forEach(client => {
if (client.readyState === WebSocket.OPEN) {
client.send(JSON.stringify(data));
}
});
});
mqttClient.subscribe('sensor/#');
// REST API endpoints
app.get('/api/risk-map', async (req, res) => {
const query = from(bucket: "sensor-data") |> range(start: -1h) |> filter(fn: (r) => r\["\_measurement"\] == "weather") |> last() |> pivot(rowKey:\["\_time"\], columnKey: \["\_field"\], valueColumn: "\_value") ;
const result = [];
await queryApi.queryRows(query, {
next(row, tableMeta) {
const record = tableMeta.toObject(row);
result.push({
id: record.node_id,
lat: parseFloat(record.latitude),
lon: parseFloat(record.longitude),
temperature: record.temperature,
humidity: record.humidity,
risk: record.risk_score
});
},
error(error) {
console.error(error);
res.status(500).json({ error: 'Query failed' });
},
complete() {
res.json(result);
}
});
});
app.get('/api/historical/:nodeId', async (req, res) => {
const { nodeId } = req.params;
const { start, end } = req.query;
const query = from(bucket: "sensor-data") |> range(start: ${start}, stop: ${end}) |> filter(fn: (r) => r\["node\_id"\] == "${nodeId}") |> aggregateWindow(every: 1h, fn: mean) ;
// Query and return data...
});
app.post('/api/spray-command', async (req, res) => {
const { nodeId, zone, dose } = req.body;
// Publish to MQTT control topic
mqttClient.publish(control/${nodeId}/spray, JSON.stringify({
zone: zone,
dose: dose,
timestamp: new Date().toISOString()
}));
res.json({ status: 'command_sent' });
});
app.listen(3000, () => {
console.log('API server running on port 3000');
});
Otomatik İlaçlama Sistemi Entegrasyonu
İlaçlama Kontrolcüsü Firmware
Arduino/STM32 kodu:
Cpp
#include
#include
#include
// GPS
TinyGPSPlus gps;
HardwareSerial GPS_Serial(2); // RX=16, TX=17
// MQTT
WiFiClient espClient;
PubSubClient mqtt(espClient);
// Valf kontrol pinleri
const int VALVE_PINS[8] = {25, 26, 27, 14, 12, 13, 23, 22};
const int PUMP_PWM_PIN = 21;
const int PRESSURE_SENSOR_PIN = 34;
const int EMERGENCY_STOP_PIN = 35;
// Prescription map (GPS zone -> Dose)
struct SprayZone {
float lat_min, lat_max;
float lon_min, lon_max;
int dose_percent; // 0-100
};
SprayZone prescription_map[50];
int map_size = 0;
// Safety
volatile bool emergency_stop = false;
void IRAM_ATTR emergencyStopISR() {
emergency_stop = true;
stopAllValves();
}
void setup() {
Serial.begin(115200);
GPS_Serial.begin(9600, SERIAL_8N1, 16, 17);
// Valf pinleri
for (int i = 0; i < 8; i++) {
pinMode(VALVE_PINS[i], OUTPUT);
digitalWrite(VALVE_PINS[i], LOW);
}
// Pompa PWM
ledcSetup(0, 5000, 8); // 5kHz, 8-bit resolution
ledcAttachPin(PUMP_PWM_PIN, 0);
// Emergency stop
pinMode(EMERGENCY_STOP_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(EMERGENCY_STOP_PIN), emergencyStopISR, FALLING);
// WiFi & MQTT
connectWiFi();
mqtt.setServer("mqtt.example.com", 1883);
mqtt.setCallback(mqttCallback);
connectMQTT();
// Subscribe to control topics
mqtt.subscribe("control/spray-command");
mqtt.subscribe("control/prescription-map");
}
void loop() {
if (emergency_stop) {
stopAllValves();
Serial.println("EMERGENCY STOP ACTIVE");
delay(1000);
return;
}
// GPS okuma
while (GPS_Serial.available() > 0) {
gps.encode(GPS_Serial.read());
}
if (gps.location.isUpdated()) {
float lat = gps.location.lat();
float lon = gps.location.lng();
// Mevcut zone'u bul
int dose = getDoseForLocation(lat, lon);
if (dose > 0) {
// Pompa hızını ayarla (PWM duty cycle)
int pwm_value = map(dose, 0, 100, 0, 255);
ledcWrite(0, pwm_value);
// Valfleri aç
openValves();
// Telemetry
sendTelemetry(lat, lon, dose);
} else {
// Zone dışında, kapat
closeValves();
ledcWrite(0, 0);
}
}
// Basınç kontrolü
int pressure = analogRead(PRESSURE_SENSOR_PIN);
if (pressure > 3500) { // Yüksek basınç
Serial.println("HIGH PRESSURE - STOPPING");
stopAllValves();
}
mqtt.loop();
delay(100);
}
int getDoseForLocation(float lat, float lon) {
for (int i = 0; i < map_size; i++) {
if (lat >= prescription_map[i].lat_min && lat <= prescription_map[i].lat_max &&
lon >= prescription_map[i].lon_min && lon <= prescription_map[i].lon_max) {
return prescription_map[i].dose_percent;
}
}
return 0; // Zone dışı
}
void mqttCallback(char* topic, byte* payload, unsigned int length) {
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
if (strcmp(topic, "control/prescription-map") == 0) {
// Parse JSON prescription map
parsePresсriptionMap(message);
Serial.println("Prescription map updated");
}
if (strcmp(topic, "control/spray-command") == 0) {
// Manual spray command
executeSprayCommand(message);
}
}
void openValves() {
for (int i = 0; i < 8; i++) {
digitalWrite(VALVE_PINS[i], HIGH);
}
}
void closeValves() {
for (int i = 0; i < 8; i++) {
digitalWrite(VALVE_PINS[i], LOW);
}
}
void stopAllValves() {
closeValves();
ledcWrite(0, 0); // Pompa durdur
}
void sendTelemetry(float lat, float lon, int dose) {
char buffer[200];
snprintf(buffer, 200, "{\"lat\":%.6f,\"lon\":%.6f,\"dose\":%d,\"pressure\":%d}",
lat, lon, dose, analogRead(PRESSURE_SENSOR_PIN));
mqtt.publish("telemetry/sprayer", buffer);
}
Prescription Map Oluşturma
Python script (risk haritasından prescription map):
python
import geopandas as gpd
from shapely.geometry import Polygon
import json
def create_prescription_map(field_boundary, risk_grid):
"""
field_boundary: GeoDataFrame (tarla sınırı)
risk_grid: DataFrame (lat, lon, risk_score)
"""
Grid hücrelerini oluştur (10x10m)
prescription_zones = []
for idx, row in risk_grid.iterrows():
lat, lon, risk = row['lat'], row['lon'], row['risk_score']
Dose hesaplama
if risk < 0.4:
dose = 0 # İlaçlama yok
elif risk < 0.6:
dose = 50 # %50 doz
elif risk < 0.75:
dose = 75 # %75 doz
else:
dose = 100 # %100 doz (etiket dozu)
Zone oluştur (10m x 10m)
lat_offset = 0.00009 # ~10m
lon_offset = 0.00012 # ~10m
zone = {
'lat_min': lat - lat_offset,
'lat_max': lat + lat_offset,
'lon_min': lon - lon_offset,
'lon_max': lon + lon_offset,
'dose_percent': dose,
'risk_score': risk
}
prescription_zones.append(zone)
return prescription_zones
def export_to_mqtt(zones, mqtt_topic='control/prescription-map'):
"""MQTT'ye prescription map gönder"""
import paho.mqtt.publish as publish
payload = json.dumps({'zones': zones})
publish.single(mqtt_topic, payload, hostname='mqtt.example.com')
print(f"Prescription map published: {len(zones)} zones")
def calculate_savings(zones):
"""İlaç tasarrufu hesaplama"""
total_area = len(zones) * 100 # Her zone 100m²
Uniform application (tüm alan %100)
uniform_dose = total_area * 1.0
Variable rate application
vra_dose = sum([z['dose_percent'] / 100.0 * 100 for z in zones])
savings_percent = (uniform_dose - vra_dose) / uniform_dose * 100
savings_area = total_area - vra_dose
return {
'savings_percent': savings_percent,
'savings_area_m2': savings_area,
'total_area_m2': total_area,
'zones_no_spray': len([z for z in zones if z['dose_percent'] == 0])
}
Kullanım
risk_data = load_risk_grid_from_database()
zones = create_prescription_map(field_boundary, risk_data)
export_to_mqtt(zones)
savings = calculate_savings(zones)
print(f"İlaç tasarrufu: {savings['savings_percent']:.1f}% ({savings['savings_area_m2']:.0f} m²)")
Sistem Entegrasyon Testi ve Validasyon
End-to-End Test Senaryosu
Test protokolü:
Python
import pytest
import time
import requests
from datetime import datetime
class TestIntegratedSystem:
@pytest.fixture
def test_environment(self):
"""Test ortamı hazırlama"""
Mock sensor node başlat
Test database temizle
API servisleri kontrol et
pass
def test_sensor_to_cloud_pipeline(self):
"""Sensörden buluta veri akışı testi"""
1. Mock sensor data gönder
sensor_data = {
'node_id': 'test_node_001',
'temperature': 18.5,
'humidity': 88.0,
'leaf_wetness': 75.0,
'rainfall': 2.5
}
publish_to_mqtt('sensor/test_node_001/data', sensor_data)
2. Gateway'in veriyi işlemesini bekle
time.sleep(2)
3. Database'de veriyi kontrol et
result = query_influxdb("SELECT * FROM weather WHERE node_id='test_node_001'")
assert len(result) > 0
assert result[-1]['temperature'] == 18.5
4. API'den veri çekmeyi test et
response = requests.get('http://api.example.com/sensor/test_node_001/latest')
assert response.status_code == 200
assert response.json()['temperature'] == 18.5
def test_risk_prediction_accuracy(self):
"""Risk tahmin modelinin doğruluğu"""
Test veri seti
test_cases = [
(temp, hum, lw_hours, expected_risk_class)
(17.0, 90.0, 10.0, 'High'),
(25.0, 60.0, 2.0, 'Low'),
(15.0, 75.0, 5.0, 'Medium'),
]
for temp, hum, lw, expected in test_cases:
features = prepare_features(temp, hum, lw)
prediction = model_api_predict(features)
assert prediction['risk_class'] == expected
def test_alert_system(self):
"""Yüksek risk uyarı sistemi"""
Yüksek risk verisi gönder
high_risk_data = create_high_risk_scenario()
publish_sensor_data(high_risk_data)
Uyarının gelmesini bekle
alert_received = wait_for_alert(timeout=30)
assert alert_received is not None
assert alert_received['type'] == 'high_risk_alert'
assert alert_received['risk_score'] >= 0.75
def test_prescription_map_generation(self):
"""Prescription map oluşturma"""
Mock risk grid
risk_grid = create_mock_risk_grid(size=100)
Prescription map oluştur
zones = create_prescription_map(field_boundary, risk_grid)
assert len(zones) == 100
assert all(0 <= z['dose_percent'] <= 100 for z in zones)
MQTT'ye publish test
success = publish_prescription_map(zones)
assert success
def test_spray_controller_response(self):
"""İlaçlama kontrolcüsünün yanıtı"""
GPS pozisyonu simüle et
test_location = {'lat': 39.9334, 'lon': 32.8597}
Bu lokasyon için doz hesapla
expected_dose = get_expected_dose(test_location)
Kontrolcüye komut gönder
send_spray_command(test_location)
Telemetry verisi kontrol et
time.sleep(2)
telemetry = get_latest_telemetry()
assert telemetry['dose'] == expected_dose
def test_system_latency(self):
"""Sistem gecikme süresi"""
start_time = time.time()
Sensor data -> Cloud -> Prediction -> Alert
publish_critical_sensor_data()
alert = wait_for_alert(timeout=60)
end_time = time.time()
latency = end_time - start_time
assert latency < 30 # 30 saniyeden kısa olmalı
print(f"System latency: {latency:.2f} seconds")
def test_power_consumption_simulation(self):
"""Güç tüketimi simülasyonu"""
24 saatlik çalışma simülasyonu
daily_power = calculate_daily_power_consumption(
measurement_interval=300, # 5 dakika
tx_power=120, # mA
sleep_power=0.01, # mA
sensor_power=5 # mA
)
20Ah batarya ile çalışma süresi
battery_capacity = 20000 # mAh
days_on_battery = battery_capacity / daily_power
assert days_on_battery > 30 # En az 30 gün yedek
print(f"Battery life: {days_on_battery:.1f} days")
8.7.2. Saha Validasyonu (Field Validation)
Pilot uygulama protokolü:
Kurulum (Week 1):
50 ha test alanı seçimi
5 sensör düğümü yerleştirme (her 10 ha için 1)
Gateway ve ilaçlama kontrolcüsü kurulumu
Baseline ölçümleri
Kalibrasyon (Week 2-3):
Sensör kalibrasyonu (laboratuvar standartları ile)
Manuel gözlemler ile model kalibrasyonu
İlaçlama ekipmanı test ve ayarı
Operasyon (Week 4-16):
Tam otonom çalışma
Günlük sistem sağlık kontrolleri
Haftalık manuel hastalık skoru kayıtları
Karşılaştırma:
Treatment group: Sistem destekli değişken dozlu ilaçlama
Control group: Geleneksel uniform ilaçlama
Ölçülen metrikler:
İlaç kullanımı (L/ha)
Hastalık kontrol başarısı (AUDPC)
Verim (kg/ha)
Net kar ($/ha)
Beklenen sonuçlar:
Metrik Control Treatment İyileştirme
─────────────────────────────────────────────────────────
İlaç kullanımı (L/ha) 2.5 1.4 -44%
AUDPC 850 650 -24%
Verim (kg/ha) 5200 5450 +4.8%
İlaç maliyeti ($/ha) 45 25 -44%
Net kar ($/ha) 620 695 +12%
Tahıl küllemesi, küresel tahıl üretiminde önemli ekonomik kayıplara neden olan, ancak modern teknolojilerle etkin şekilde yönetilebilir bir hastalıktır. Bu makale kapsamında ortaya konulan entegre yaklaşım, üç temel sütun üzerine inşa edilmiştir:
- Biyolojik ve Agronomik Temel Bilgi:
Hastalığın yaşam döngüsü ve epidemiyolojisinin derinlemesine anlaşılması
Çevresel faktörlerin etki mekanizmalarının bilinmesi
Kültürel ve kimyasal mücadele yöntemlerinin bilimsel prensipleri - Veri Bilimi ve Yapay Zeka:
Çok kaynaklı veri entegrasyonu (sensör + uydu + gözlem)
Makine öğrenmesi ile pattern recognition ve risk tahmini
Explainable AI ile karar şeffaflığı - IoT ve Otomasyon Teknolojileri:
Gerçek zamanlı veri toplama (mikrodenetleyici tabanlı)
Edge computing ile düşük latency
Otomatik müdahale sistemleri (precision spraying)
2030 yılına kadar, gelişmiş ülkelerde tahıl üretiminin %80'inin bir şekilde dijital destekli olması beklenmektedir. Tahıl küllemesi gibi major hastalıklar için:
Tam otomatik izleme ve müdahale standart haline gelecek
İlaç kullanımı %60-70 azalacak
Hastalık kaynaklı verim kayıpları %50 azalacak
Karbon ayak izi önemli ölçüde düşecek
Ancak bu dönüşümün başarılı olması için teknoloji, bilim, politika ve toplum arasında güçlü bir sinerji gereklidir. Tek başına teknoloji çözüm değildir; agronomik bilgi, çiftçi deneyimi ve sürdürülebilir tarım prensipleriyle bütünleştirildiğinde gerçek değer yaratır.
Tahıl küllemesi mücadelesinde yeni era, reaktif yaklaşımdan (hastalık olunca ilaçla) proaktif yaklaşıma (hastalık olmadan önle) ve nihayetinde prediktif yaklaşıma (hastalık olma ihtimali yüksek yerleri önceden bil ve hedefli müdahale et) doğru gelişmektedir.




