Arduino ile sera otomasyonu

bolubeyi

Profesyonel Üye
Katılım
27 Eyl 2008
Mesajlar
1,670
Puanları
421
Yaş
54
Konum
Trabzon
Arduino ile sera otomasyonu:

Bu dersimizde arduino ile sera otomasyonu yapmayı öğreneceğiz.

Senaryo:
Sistemde ortam ısısını, havadaki nemi ve topraktaki nemi ölçen sensörler bulunmaktadır.

Başlangıçta bu sensörlerden gelen veriler okunup lcd ekranda gösterilecek.

Ortam ısısı 25 derecenin altında ise bir lamba ya da ısıtıcı istenilen süre çalıştırılıp durdurulacak.
Ortam ısısı 25 derecenin üzerinde ise lamba ya da ısıtıcı çalışmayacak.

Havadaki nem oranı %75'in üzerine çıkarsa bir fan istenilen süre kadar çalıştırılıp durdurulacak.
Havadaki nem oranı %75'in altında ise fan çalışmayacak.

Topraktaki nem oranı %85'in altında ise bir selenoid valf devreye girerek istenilen süre kadar sulama işini gerçekleştirecek.
Topraktaki nem oranı %85'in üzerinde ise selenoid valf tepki vermeyecek, sulama yapılmayacak.

Senaryonun her aşaması lcd ekranda görüntülenecek.

Daha sonra sistem istenilen bir süre kadar durup, sürenin sonunda senaryoyu sonsuza dek tekrarlayacak.

Aşağıdaki videoda çalışması gösterilmiştir.


DHT22
Ortam ısısını ve ortamdaki nemi ölçmek için DHT22 ısı ve nem sensörü kullanacağız.

dht22.jpg


DHT22 sıcaklık ve nem algılayıcı kalibre edilmiş dijital sinyal çıkışı veren gelişmiş bir sensör birimidir. Yüksek güvenilirliktedir ve uzun dönem çalışmalarda dengelidir. 8 bit mikroişlemci içerir, hızlı ve kaliteli tepki verir.

-40 ile 80°C arasında +/-1°C hata payı ile sıcaklık ölçen birim, 0-100% RH arasında +/-5% RH hata payı ile nem ölçümü yapabilmektedir. Sensör ölçümü olarak sensörün datah toplama periyodundan kaynaklı olarak 2 saniyelik periyotlarla ölçüm sonuçları alınabilmektedir. DHT21, diğer DHT modellerine göre boyut olarak bir miktar daha büyüktür.

Özellikleri:
DHT serisinin yüksek performanslı modellerindendir.
Dijital çıkış vermektedir.
Çalışma Gerilimi: 3.3-5 VDC
Ölçüm Aralığı:
Nem: 0-100%RH
Sıcaklık: -40 - 80 °C
Hassasiyet:
Nem: +/- %3 (Max %5) RH
Sıcaklık: < +/- 1°C
Ölçüm Periyodu: 2 s
Ürün Ölçüleri: 22x28x5 mm
Not: Vcc ile çıkış pini arasında pull-up direncine ihtiyaç duyulmaktadır. Bu sebeple 4.7K ile 10K arasında bir direnç ile beraber kullanmanız gerekmektedir. DHT11 modeli de benzer özelliklerde olduğu için bir model ile yapılmış uygulama diğer modele de uygulanabilmektedir.

Toprak nem sensörü:

nem.jpg


Toprak nem sensörü, toprağın içerisindeki nem miktarını veya ufak ölçekte bir sıvının seviyesini ölçmek için kullanabileceğiniz bir sensördür.

Nem ölçer problar ölçüm yapılacak ortama batırılarak kullanılır. Toprağın veya içine batırılan sıvının meydana getirdiği dirençten dolayı, prob uçları arasında bir gerilim farkı oluşur. Bu gerilim farkının büyüklüğüne göre de nem miktarı ölçülebilir. Topraktaki nem oranı arttıkça iletkenliği de artmaktadır. Kart üzerinde yer alan trimpot sayesinde hassasiyet ayarı yapılabilmektedir.

Arduino veya farklı mikrodenetleyiciler ile rahatlıkla kullanılabilir.

Özellikleri:
Çalışma Gerilimi: 3.3V-5V
Çıkış Gerilimi: 0-4.2V
Akım: 35 mA
Çıkış Türü: Dijital ve Analog

Arduino kodlarımız:
Kod:
#include "DHT.h"  // ısı ve nem sensörü kütüphanesi eklendi
#define DHTPIN 2     // ısı ve nem sensörü 2nolu pine bağlandı
#define DHTTYPE DHT22   // DHT 22  (AM2302)
#define lamba 13 // 13. pine lamba adı verildi
#define fan 12 // 12. pine fan adı verildi
int toprak_nem_sensoru=A5;  // toprak nem sensörü analog 5 pinine bağlanacak
int OkunanDeger;       // Analog 5'ten okunacak değer (0-1023)
int Nem;     // Nem isminde değişken oluşturuldu
int selenoid_valf=3;  // selenoid valf dijital 3 pinine bağlanacak
int maxHum = 75;  // fanın devreye gireceği nem seviyesi %75
int maxTemp = 25; // lamba 20 derece ve üstündeki sıcaklıklrda devreden çıkar

DHT dht(DHTPIN, DHTTYPE);

// LIKID KRISTAL KUTUPHANESİ EKLENIYOR
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
int lcd_key     = 0;
int adc_key_in  = 0;
// LIKID KRISTAL KUTUPHANESİ EKLENMESI TAMAMLANDI

void setup()
{
  pinMode(lamba, OUTPUT); // 13 nolu pin lamba için çıkış yapıldı
  pinMode(fan, OUTPUT); // 12 nolu pin fan için çıkış yapıldı 
  pinMode(toprak_nem_sensoru, INPUT);        // A5 pini toprak nem sensörü için giriş yapıldı
  pinMode(selenoid_valf, OUTPUT);  // dijital 3 pini selenoid valf için çıkış yapıldı
  Serial.begin(9600); // seri haberleşme
  dht.begin();
  lcd.begin(16, 2);           
  lcd.setCursor(0,0);
  lcd.print("SERA");   // açılışta ilk okunacak yazı (ilk satır)
  lcd.setCursor(0,1);
  lcd.print("OTOMASYONU");  // açılışta ilk okunacak yazı (ikinci satır)
  delay(5000);  // 5 saniye bekle
  lcd.clear();    // lcd temizle
}
void loop()
{
  float h = dht.readHumidity(); // nemi oku
  float t = dht.readTemperature();  // sıcaklığı oku

  lcd.clear();  // lcd temizlendi
  lcd.setCursor(0,0);  // ilk satır
  lcd.print("ISI:");  // ilk satıra ISI: yazıldı
  lcd.print(t); // ISI:'nın yanına okunan sıcaklık değeri yazıldı
  lcd.print(" DERECE");  // okunan sıcaklığın yanına derece yazıldı

  lcd.setCursor(0,1); // ikinci satır
  lcd.print("NEM:");  // ikinci satıra NEM: yazıldı
  lcd.print("% ");  // NEM:'in yanına % yazıldı
  lcd.print(h); // %'nin yanına okunan nem değeri yazıldı
  delay(5000);  // 5 saniye bekle

  lcd.clear();  // lcd temizlendi
  OkunanDeger = analogRead(toprak_nem_sensoru);  // Toprak nem sensöründen okunan değer, OkunanDeger adında birdeğişken olarak atandı
  Nem = map (OkunanDeger, 1023, 0, 0, 160);   // Toprak nemi sensöründen 5 volt ile 0 volt arasındaki okunan değer yüzde olarak ifade edildi
  lcd.setCursor(0,0);      // ilk satır                     
  lcd.print("TOPRAK NEMi");    // ilk satıra TOPRAK NEMİ yazıldı                     
  lcd.print("% "); // Yanına % yazıldı
  lcd.print(Nem); // Toprak nem sensöründen okunan değer yazıldı
  delay(5000);  // 5 saniye bekle
  // ısı belirlenen seviyeyi geçerse şunları yap burada başladı
  if( t > maxTemp)
  {
  digitalWrite(lamba, LOW);   // lambayı söndür
  lcd.clear();  // lcd temizlendi
  lcd.setCursor(0,0); // ilk satır
  lcd.print("ISI NORMAL");  // ISI NORMAL yazıldı
  lcd.setCursor(0,1); // ikinci satır
  lcd.print("LAMBA KAPALI");  // Lamba kapalı yazıldı
  delay(5000);  // 5 saniye bekle
  // ısı belirlenen seviyeyi geçerse şunları yap burada bitti   
  }
  // ısı belirlenen seviyeyinin altında ise şunları yap burada başladı
  else
  {
  digitalWrite(lamba, HIGH); // lambayı yak
  lcd.clear();  // lcd temizlendi
  lcd.setCursor(0,0); // ilk satır
  lcd.print("YETERSiZ ISI");  //YETERSİZ ISI yazıldı
  lcd.setCursor(0,1); // ikinci satır
  lcd.print("LAMBA YANIYOR"); // LAMBA YANIYOR yazıldı
  delay(10000); // lambanın yanık kalma süresi
  digitalWrite(lamba, LOW);   // lambayı söndür
  }
  // ısı belirlenen seviyeyinin altında ise şunları yap burada bitti
  // nem belirlenen seviyeyi geçerse şunları yap burada başladı
  if(h > maxHum)
  {
  digitalWrite(fan, HIGH);   // havalandırma fanını çalıştır
  lcd.clear();  // lcd temizlendi
  lcd.setCursor(0,0); // ilk satır
  lcd.print("NEM YUKSEK");  // NEM YUKSEK yazıldı
  lcd.setCursor(0,1); // ikinci satır
  lcd.print("FAN CALISIYOR"); // FAN CALISIYOR yazıldı
  delay(60000);  // fanın devrede kalacağı süre 1 dakika olarak belirlendi
  digitalWrite(fan, LOW);   // fanı kapat
  }
  // nem belirlenen seviyeyi geçerse şunları yap burada bitti 
  // nem belirlenen seviyeyinin altındaysa şunları yap burada başladı
  else
  {
  digitalWrite(fan, LOW); // havalandırma fanı kapatıldı
  lcd.clear();  // lcd temizlendi
  lcd.setCursor(0,0); //ilk satır
  lcd.print("NEM NORMAL");  // NEM NORMAL yazıldı
  lcd.setCursor(0,1);   // ikinci satır
  lcd.print("FAN KAPALI");  // FAN KAPALI yazıldı
  delay(5000); // 2 sn bekle
  }
  // nem belirlenen seviyeyi altındaysa şunları yap bitti
  toprak_nem_sensoru = analogRead(A5);  // Toprak nem sensöründen gelen bilgi okundu
  if (toprak_nem_sensoru > 543) // 543 değeri %85'e tekabul etmektedir
  {
  lcd.clear();  // lcd temizlendi                                 
  lcd.setCursor(0,0);   // ilk satır                       
  lcd.print("TOPRAK NEMi");     // TOPRAK NEMİ yazıldı                     
  lcd.print("% "); // yanına % yazıldı
  lcd.print(Nem);   // Toprak nem değeri yazıldı
  lcd.setCursor(0,1); // ikinci satır
  lcd.print("SELENOID ACIK"); // SELENOID ACIK yazıldı
  digitalWrite(selenoid_valf, HIGH);  // selenoid valf açıldı
  delay(5000); // selenoidin devrede kalacağı süre
  digitalWrite(selenoid_valf, LOW); // selenoid kapatıldı
  }
  else
  {
  lcd.clear();  // lcd temizlendi                                 
  lcd.setCursor(0,0);   //ilk satır                       
  lcd.print("TOPRAK NEMi");    // TOPRAK NEMi yazıldı                     
  lcd.print("% "); // % yazıldı
  lcd.print(Nem);   // Toprak nem değeri yazıldı
  lcd.setCursor(0,1); // ikinci satır
  lcd.print("SELENOID KAPALI"); // SELENOID KAPALI yazıldı
  digitalWrite(selenoid_valf, LOW);  // selenoid kapatıldı
  delay(5000); // 5 saniye bekle
  }
  lcd.clear();  // lcd temizlendi
  lcd.setCursor(0,0);   //ilk satır 
  lcd.print("VERiLER");  // VERİLER yazıldı
  lcd.setCursor(0,1); // ikinci satır
  lcd.print("GUNCELLENiYOR ");  // Güncelleniyor yazıldı
  delay(5000);  // bir sonraki ölçüm ve işlemler için bekleme süresi
}

Devre şeması:
ezgif-2-6e51cde57b.jpg

arduino-dht22-circuit.png
 

Ekli dosyalar

  • Simulino_LCD_Keypad_Shield.rar
    763.7 KB · Görüntüleme: 13
  • aa.rar
    83.2 KB · Görüntüleme: 12
Emeğiniz için tebrikler
Paylasiminiz için teşekkürler


aydinDr
 
hocam benim kafamda bir proje varda nasıl yapılır ne şekilde olur yardımcı olabilirmisiniz özelden mesaj atarsanız sevinirim
 
bolubeyi bu projenizi bir bütün olarak sitemizde yayınlamak isteriz. Mümkün müdür ?
 
Hocamıza temrinlerim.org sitesinden ulaşabilirsiniz @AlperP
 

Forum istatistikleri

Konular
128,128
Mesajlar
915,269
Kullanıcılar
449,844
Son üye
mehmet.ali.turhan.99@gmai

Yeni konular

Geri
Üst