Arduino’da buton programlama

In Haber by Victor CuiumjuLeave a Comment

Merhabalar technopatlar, daha önce yaptığımız projeye devam edelim. Butonla ilgili projeyi geliştirelim. Yaptığımız projede  butona bastığı zaman LED’i yakıyordu, butonu bırakınca LED’i söndürüyordu.

Şimdi projemizde butona bastığımız zaman LED’i yakacak ve tekrar bastığımız zaman söndüreceğiz.

int switchPin=8;

int ledPin=13;

boolean lastButton=LOW;

boolean ledOn=false;

void setup()

{

pinMode(switchPin,INPUT);

pinMode(ledPin,OUTPUT);

}

void loop()

{

if(digitalRead(switchPin)==HIGH && lastButton==LOW)

{

ledOn=!ledOn;

lastButton=HIGH;

}

else

{

lastButton=digitalRead(switchPin);

}

digitalWrite(ledPin,ledOn);

}

Bu programda bizim daha önce kullandığımız komutlar mevcut:

boolean lastButton=LOW;

Boolean (integer tipi gibi) değişkenler için bellekte yer  ayarlıyor. Boolean iki farklı değeri alabiliyor: true veya false , 0 veya 1. Boolean  bellek tasarrufu  sağlıyor.

void loop()

{

if(digitalRead(switchPin)==HIGH && lastButton==LOW)

{

Bu satırda 8. pini okuyoruz ve eğer pin HIGH ise  (basılmışsa) ve aynı anda lastButton (butonun son durumu ) LOW  ise (daha önce LED ’i söndürdük):

&&  (“AND” Türkçe’de “VE” demektir) işareti  iki şartların aynı anda doğru olması gerektiğini söylüyor.

||  (“OR” Türkçe’de  “VEYA” demektir) işareti  iki şartların birinci veya ikincinin doğru olması gerektiğini söylüyor.

  ledOn=! ledOn;

Satırı  ledOn değerini tersine döndürmeye yarıyor. Mesela ledOn ’un  içinde 0’sa o zaman 1 olacak veya  HIGH ise LOW olacaktır.

=!   Değişkenin ters değeri olması  imkanı veriyor. Bizim programda  switchPin==HIGH && lastButton==LOW doğruysa LED yanacaktır.

lastButton=digitalRead(switchPin);

Eğer  switchPin==HIGH && lastButton==LOW  yanlışsa  lastButton=digitalRead(switchPin); satırına geçiyoruz ve lastButton’a  (butonun son durumu)  switchPin’den  değeri  aktarıyoruz.

digitalWrite(ledPin,ledOn);

Ve son satırda LED ’i  ledOn  durumuna göre  yakıyoruz  veya söndürüyoruz.

Devreyi kurmak için Proteus ’u kullanabiliriz:

Atmega8 Butonlu Devre

Gördüğümüz gibi devre aynı. Ama butona bastığımız zaman farklı davranıyor.

Pini dirençten  toprağa bağlayacağız . Çünkü dijital pinler boştayken rastgele olarak sayı üretiyorlar.  Direncin direnci  büyük olduğu (68K daha fazla da olabilir, mesela 100k) için butonu bastığımız zaman elektrik toprağa gitmiyor, Arduino’ya gidiyor ve bıraktığımız zaman kalan elektrik toprağa gidecektir. Butona bastığımız zaman  titreşim  oluşuyor  ve  8. pine rastgele olarak sinyalleri göndermeye devam ediyor. Yeni programımızda bir fonksiyon oluşturacağız. Fonksiyonun amacı titreşimin yaratan negatif etkileri ortadan kaldırmak. Bunu fonksiyonun içinde delay() metodu kullanarak  yapacağız.

Programın kodu :

int switchPin=8;

int ledPin=13;

boolean ledOn=false;

boolean lastButton=LOW;

boolean currentButton=LOW;

 

void setup()

{

pinMode(switchPin,INPUT);

pinMode(ledPin,OUTPUT);

}

boolean debounce(boolean last)

{

boolean current=digitalRead(switchPin);

if(last!=current)

{

delay(5);

current=digitalRead(switchPin);

}

return current;

}

void loop()

{

currentButton=debounce(lastButton);

if(lastButton==LOW && currentButton==HIGH)

{

ledOn=!ledOn;

}

lastButton=currentButton;

digitalWrite(ledPin,ledOn);

}

Kodu inceleyelim :

boolean debounce(boolean last)

Bu satırda debounce (gönderici)  fonksiyonu belirliyoruz. “Fonksiyon nedir” sorabilirsiniz. Kısaca fonksiyon ismi taşıyan kod bloğu. Programımızda fonksiyonun isimi debounce. Fonksiyonu çağırdığımız zaman içendeki kodları çalıştırıyor ve kodların yaptığı sonucu fonksiyonu çağırdığı yere gönderiyor.

Fonksiyonun yapısı :

type  fonksiyonun_İsimi (type parametreler)

{

operatörler;

}

 

Type fonksiyonu göndereceği sonucun tipini (integer, boolean, void v.s.) belirliyor. Örneğimizde boolean debounce  fonksiyonu boolean tipi değerini  (bizde  current)  geri gönderecek. Programda fonksiyonu çağırdığımız zaman onu değişkenlerle (parametre) beraber çağırıyoruz. Fonksiyon parametreleri işletiyor ve bize sonucu gönderiyor. Fonksiyonun avantajı programı kısaltabiliyor. Tekrarlayan işi fonksiyonda  bir defa yazdıktan sonra programdan çağırabiliriz. Böylece programın karmaşık olmasının önüne geçilebiliyor.

boolean current=digitalRead(switchPin);

Burada fonksiyonun içinde yeni değişkeni (current ismi) belirliyoruz. Ve ona 8.  pinden değeri aktarıyoruz. Bu değişken sadece bu fonksiyonda  geçerlidir.

if(last!=current)

{

delay(5);

current=digitalRead(switchPin);

}

Eğer  son durum (last)  yeni duruma (current) eşit değilse, 5 milisaniye bekle. Butonun titreşimi bitsin diye 5 milisaniye bir gecikme yaptık.

return current;

Current değişkenini return komutuyla programa aktarıyoruz.

Return  komutu (geri göndermek) fonksiyonun yaptığı sonucu programa aktarmak için kullanıyor.

Fonksiyonun tipi void olsaydı (setup ve loop gibi) o zaman fonksiyon geri bir şey  göndermiyor demektir.

Demek ki   return 0;  diyebiliriz.

void loop()

{

currentButton=debounce(lastButton);

if(lastButton==LOW && currentButton==HIGH)

{

ledOn=!ledOn;

}

lastButton=currentButton;

digitalWrite(ledPin,ledOn);

}

Son metodda (Arduino’da fonksiyonların ismi) currentButton’a  metodun çıkışını aktarıyoruz (currentButton=debounce(lastButton); ) .  If komutu kullanarak butonun durumu değiştiyse ledOn değişkeninin durumunu da değiştiriyoruz.

lastButton=currentButton;

digitalWrite(ledPin,ledOn);

Butonun yeni durumunu kaydediyor ve LED ’i  ledOn ’a göre yakıyor veya söndürüyor.

httpv://www.youtube.com/watch?v=SUqB5M6kqek

Umarım iyi anlatmışımdır. Size bol şanslar. Bir sonraki makalede Technopat’ta  görüşürüz.