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:
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.