Arduino Hareket Sensörü Kullanımı | PIR Sensör Örnek Kod

 Arduino ile Hareket Sensörü (PIR Sensör) Kullanımı

    HC-Sr501 sensörü kullanacağımız bu uygulamada sensörün Arduino Uno 'ya bağlanmasını ve basit bir kod ile nasıl çalıştırılabildiğine bakıyor olacağız. Sensörün nasıl çalıştığını özelliklerini ya da modifikasyonlarını merak ediyorsanız sensörü detaylıca yazdığım : Hc-SR501  Sensör İncelemesi konusuna bakıp gelebilirsiniz.
    Bu sensörü basitçe bir anahtar (switch) gibi düşünebilirsiniz, tek yaptığı şey bir hareket algıladığında sinyal pini üzerinden 5v vermesidir.

Arduino PIR sensör bağlantısı


    Görselde gördüğünüz bağlantıyı yapmanız yeterli, ben sinyal pinini Arduino 'nun ikinci pinine bağladım, siz dilediğiniz herhangi boş bir pine bağlayabilirsiniz, 1 ve 0 pinlerinden birini tercih etmenizi önermem, seri iletişim için o pinler kullanılıyor zira.


Kod kısmına gelecek olursak o da gayet basitçe şu şekilde olacak

// C++ code
//
#define MOTION 2
void setup()
{
  pinMode(MOTION, INPUT);
  Serial.begin(115200);
}

void loop()
{
  if(digitalRead(MOTION))
  {
    Serial.println("Motion Detected!");
  }
}


    Burada Arduino 'nun yapacağı iş; sensör bir hareket algıladığında seri ekrana seri bir şekilde "Motion Detected!" yazacak. Sanki başka hiç işimiz yokmuş gibi :) Tamam başka işlerimiz de olabilir, örneğin hareket algılandığında alarm çalabiliriz buzzer kullanarak, ya da bir ikaz lambası da yakabiliriz aynı zamanda, ya da yanan sönen lambalar kullanabiliriz, örnekler çoğaltılabilir. Bu yapmayı hayal ettiğimiz herşeyi if bloğunun içine yazarsak işimizi görür, ancak şöyle bir durum var, hareketin algılanması tek bir durumdur, dolayısıyla hareket algılandığında tek bir işler serisi yapmak isteriz. Eğer yukarıdaki kodu kullanacak olursanız, nasıl ki seri ekrana seri şekilde defalarca ( bu aslında sensörün hareket algıladığı andan sonra sinyal pinini ne süreyle HIGH seviyede tuttuğuyla alakalı ) "Motion Detected!" yazıyorsa, oradaki tüm işleri de sinyal kesilene kadar yapacak demektir.


    Peki ne yapalım, kesme kullanabiliriz, kesme tetikleyicisi olarak da RISING seçersek yani yükselen kenarda tetiklensin, bu durumda sadece bir kez istediğimiz tüm fonksiyonları çalıştırabiliriz :

// C++ code
//
#define MOTION 2
void setup()
{
  pinMode(MOTION, INPUT);
  Serial.begin(115200);
  attachInterrupt(digitalPinToInterrupt(MOTION), MotionRoutine, RISING);
}

void loop()
{
 
}
void MotionRoutine()
{
 Serial.println("Motion Detected!");  
 playAlarm();
 FlashLeds();
 doOtherStaff();
}
void playAlarm()
{
  // play Alarm code
}
void FlashLeds()
{
  //Flash Leds code
}
void doOtherStaff()
{
  // do sth 
}

    Yukarıdaki kod ile sadece bir defa MotionRoutine fonksiyonu yürütülür. Diğer fonksiyonları dilediğiniz işler için kullanabilirsiniz. Interrupt konusunda henüz birşeyler yazmadım ancak kısaca bahsedelim; bu noktada artık dilediğiniz pini kullanabilirsiniz lüksüne sahip değilsiniz, arduino uno için yalnızca 2 ve 3 numaralı pinlerin kesme özelliği var, yani ya 2 ya 3 başka şansınız yok.
    
Kesme için diğer seçenekler de :
  • FALLING : hareket bittiğinde yürütülür.
  • HIGH : ilk örnekle aynı şekilde HIGH iken peşpeşe yürütülür.
  • LOW : hareket bittikten sonre bir sonraki harekete kadar peşpeşe yürütülür.
  • CHANGE : lazım olur mu bilmem ama 5 iken 0 olursa, ya da 0 iken 5 olursa bir kez yürütülür.
Eğer olur da sensörünüz düzgün çalışmazsa hareket algılanmadığında da fonksiyonlarını çalışıyorsa mesela; sensörün sinyal pininden arduino GND 'ye 1k 'lık bir direnç bağlarsanız bu sorunu yaşamazsını diye ümid ediyorum, Bir dikkat etmeniz gereken şey de, sensörün düzgün çalışmaya başlaması çalışmaya başladığı andan sonra bie dakikayı buluyor olması, bunu da aklınızda bulundurun derim.

Tinkercad simulasyonu :



Herkese kolay gelsin!


Hiç yorum yok:

Yorum Gönder

Türksat Saat Kanalı ve IRIG-B Time Code

Türksat Saat Kanalından Saat Bilgisi Nasıl Alınır? Uyduda kanalları dolaşırken, şu Türksat Saat kanalı hep dikkatimi çekmiştir. Özellikle  S...