ARDUINO 13 - BUTON & LED

Arduino programlama konularımızda bir adım daha ileri gidiyoruz. Önceki konularımızda Arduino ile led yakmıştık. Şimdi ise Arduino'muza bir buton bağlayıp ledimizi buton yardımıyla yakacağız. Böylece Arduino'da digital giriş-çıkış işlemlerinin nasıl olduğunu öğrenmiş olacağız.

Bu konuya başlamadan önce atmel-avr-9-buton-baglantları  konusunu okursanız faydalı olacaktır. Buton bağlantılarının nasıl yapıldığı konusunda detaylı bilgi sahibi olacaksınız. Konuyu anlatırken buton bağlantılarının nasıl yapıldığını bildiğinizi varsayarak anlatacağım.

Bu konumuzda yapmak istediğimiz Arduino'nun Digital giriş/çıkışlarından (D0,D1,........D13) herhangi birine bir buton ve diğer bir tanesine de led bağlayıp, butonumuza bastığımız zaman led'i yakmak. 

Önce devremizi hazırlayalım. Daha sonra devre bağlantılarına göre programımızı yazmaya başlayacağız.

Buton bağlantısının nasıl olması gerektiğine karar vermeliyiz. atmel-avr-9-buton-baglantları  buradaki konuda da bahsettiğim gibi genellikle pull-up buton bağlantısını tercih ediyorum.
 
Şekilde de gördüğünüz gibi butona basılmadığı durumlarda buton için belirlenen mikrodenetleyici pini lojik 1(HIGH) durumundadır. Butona basıldığı zaman ise bu pin Lojik 0 (LOW) durumuna geçecektir. O zaman biz de programımızda normalde Lojik 1(HIGH) durumunda olan pini devamlı olarak kontrol eder Lojik 0 durumuna geçip geçmediğine bakarız. Eğer pinin durumu lojik 0 durumuna geçtiyse anlarız ki butona basılmış.  Şunu da bilmeliyiz ki butondan bilgi pine geldiği için bu pin giriş pini olmalı ve giriş olarak yönlendirilmelidir.

Dijital giriş pininin durumunu,  o pinin o anki değerini okuyarak öğrenebiliriz. Bunun için Arduino 'nun digitalRead(pin) fonksiyonundan yararlanacağız.

digitalRead(pin) bize pin ile belirtmiş olduğumuz pinin o anki değerini okur ve LOW veya HIGH olmak üzere bize durum bildirir. 

 Örneğin buton D11 pinine yukarıdaki şekildeki gibi pull-up olarak bağlı olmuş olsun. 

digitalRead(11) =HIGH  ise butona basılmamış 
digitalRead(11)=LOW  ise butona basılmıştır deriz.

digitalRead(pin)  fonksiyonunda pin ifadesi önceden tanımlanabilir ve tipi int (integer) olmalıdır. (değişken tipleri konusunda bir sonraki konuda bilgi vereceğim.)

Devremizin tamamı  aşağıdaki gibi olacak

Devrede de görüldüğü gibi led D12 pinine bağlanmış. bağlantı şekline göre D12 pininin durumu lojik 1(HIGH) olduğunda led yanacak, Lojik 0 (LOW) olduğunda led sönecek.

Programımızda öncelikle led ve buton pin tanımlamalarını yapmalıyız.

#define led 12   
#define buton  11

led ve butonun bağlı olduğu pinler için pinlerin giriş/çıkış yönlendirmesini yapmalıyız. Bunu setup() fonkisyonu içersinde yapacağız.

 pinMode(led,OUTPUT);    led pini çıkış
 pinMode(buton,INPUT);   buton pini giriş

Şimdi sıra geldi butonun bağlı olduğu pinin durumunu  okumaya . Bunun için  if () - else  deyimini kullanacağız. Önce  atmel-avr-10-buton-led-uygulamas konusunu incelemenizde fayda var.
 
kabaca programımız şöyle olmalı   
        Eğer buton sıfır ise led yak 
            değil ise led söndür 

yani  
if(digitalRead(buton)== LOW)
      {
        digitalWrite(led,HIGH);
      }


burada  if(digitalRead(buton)== LOW) ifadesindeki "==" iki tane  eşit "eşit midir? " anlamına gelir.

 if(digitalRead(buton)== LOW)  ifadesini   if(!digitalRead(buton)) şeklinde de yazabiliriz. aynı anlama gelir. burada "!" sıfır anlamı taşımaktadır. if( şart )  deyiminde şart kısmının  sonucu sıfır veya LOW oluyursa , "== LOW " ifadesi yerine başa "!" konulabilir.  

 yukarıdaki kod parçasında  "EĞER BUTON LOW İSE LED'İ YAK "demiş olduk.

peki "EĞER BUTON LOW DEĞİL İSE " ne yapacağını nasıl belirteceğiz. burada devreye else ifadesi giriyor. if (şart) içersinde şart doğru değil ise  if(şart)'tan sonra gelen {..}  parantez aralığındaki işlemler yapılmayacak bu sefer else {...} 'teki işlemler yapılacak.

  else
      {
        digitalWrite(led,LOW);
      }

burada da "EĞER BUTON LOW DEĞİL İSE (HIGH İSE) LED'İ SÖNDÜR  "  demiş olduk.

buna göre programımızın tamamı :


#define led 12
#define buton  11

void setup() {
  pinMode(led,OUTPUT);
  pinMode(buton,INPUT);
}

void loop() {
    if(!digitalRead(buton))
      {
        digitalWrite(led,HIGH);
      }
     else
      {
        digitalWrite(led,LOW);
      }
}


Programımızı Arduino kütüphanesindeki digitalRead() ve digitalWrite() fonksiyonlarını kullanarak yazdık. Şimdi de bu fonksiyonları kullanmadan Arduino Nano içindeki Atmega328p mikrodenetleyicisinin registerlarını kullanarak yazacağız. Programları bu şekilde yazıp yazmamak sizin tercihinize kalmış . Sadece ben kütüphane fonksiyonlarını öğrenmek istiyorum diyebilirsiniz. Ancak mikrodenetleyici ile register seviyesinde kod yazmak mikrodenetleyiciye daha çok hakim olmanızı sağlar. Arka planda neler döndüğünü , mikrodenetleyicinin nasıl davrandığını bilmenizi sağlar.

Atmega328p ile Atmel Studio programında atmel-avr-10-buton-led-uygulamas konusunda register seviyesind nasıl kod yazdığımız anlatmıştım. Bu konuyu incelemelisiniz. burada yapmış olduğumuz programı şimdi arduinoya uyarlayacağız.

Öncelikle led için kullandığımız D12 ve buton için kulandığımız   D11 pinlerinin gerçekte Atmega 328p'de neye karşılık geldiğini bilmeliyiz.


D12 = PB4 ve D11 = PB3

led ve buton tanımlamalarımızı baştan yapmalıyız.

#define led 4
#define buton3

giriş /çıkş yönlendirmemiz için DDRB registerını kullanmalıyız. DDRB registerı portb'nin giriş/çıkış yönlendirmesini yapar. atmel-avr-4-ilk-programmz-led-yakmaca buradaki konuda port yönlendirme işlemi detaylı olarak anlatılmıştır.

DDRB|=(1<<led);   led pini çıkış
DDRB&=~(1<<buton);  buton pini giriş yapıldı

şimdi sıra geldi buton pinini okumaya 

 if(!(PINB & 0X80))  // butona basıldıysa
     {
      PORTB|=(1<<led);  // led yak
     }

     else
     {
        PORTB&=~(1<<led); // led söndür
     }

programın tamamı :

#define led 4
#define buton 3

void setup() {
  DDRB|=(1<<led);             
// buton pini giriş
  DDRB&=~(1<<buton);   
// led pini çıkış

}

void loop() {

   if(!(PINB & 0X80))      
// butona basıldıysa
     {
      PORTB|=(1<<led);   
// led yak
     }

     else                        
     // butona basılmadıysa
     {
        PORTB&=~(1<<led); 
// led söndür
     }
}

Yorumlar