Arduino buton

aylin142

Üye
Katılım
6 Mar 2014
Mesajlar
30
Puanları
1
İkinci Uygulama: Bir buton ve 3 LED bulunan bir devre hazırlayın. Butona her basışımızda sıradaki LED yanacak, önceki LED sönecektir. Butona bastığımız sürece olay bu şekilde devam edecektir.
1. basışta 1. LED yanacaktır
2. basışta 1. LED sönecek 2. LED yanacaktır
3. basışta 2. LED sönecek 3. LED yanacaktır.
4. basışta 3. LED sönecek ve a) maddesine dönülecektir.

İyi akşamlar arkadaşlar.Arduino ile bu uygulamayı yapmaya çalışıyorum.Yazdığım kodlar çalışmadı hatamı bana söyleyebilecek var mı?
1627062713389.png
 
Son düzenleme:
Butona basıldığı zamanlar kontak sıçraması denen olay nedeniyle butona 1 kere basmanıza rağmen butona birden fazla basılmış gibi olur. kodunuz doğru olsa bile çalışmayacaktır.

Şurada buton tık sayacı diye bir anlatım var. Kodları inceleyip kendinize göre düzenlerseniz sonuca ulaşabilirsiniz.

Kolay gelsin.
 
Tam olarak neyi çalışmadı eğer ledler kararsız yanıyorsa her if koşulunun sonuna delay(500) ekle ki elini butondan çekene kadar sana biraz süre versin. Eğer söz dizimi hatası alıyorsan loop döngüsünü kapatmamışsın. Kodları resim olarak değil de doğrudan kod seçeneğiyle paylaşırsan derlemeyi deneyebiliriz yoksa kimse yeniden yazmak için uğraşmaz.
 
Evet kontak sıçraması butonlarda problem o yüzden bir alt program yapmalısın buna Debouncer deniyor
 
Butonu 2 veya 3. Pine baglayip INPUT_PULLUP olarak pin mode verin. Butonun diger bacagini gnd hattina baglayin. İnterupt servis rutini yazin. Tabii ki pull up oldugu ve diger bacak gnd ye bagli oldugu icin falling edge uzerine yazmalisiniz. Boylece her buton basisini 1 ve yalniz 1 kere algilayacaktir. Rising edge uzerine yazarsaniz butondan elinizi cektiginizde durum degisimi olur.

Bir diger nokta herhangi bir integer degisken tanimlayip bunu kalanli bolmeden kalan (mod) olarak switch case yapisindaki bir fonksiyona gonderin.

Ledlere koruma direnci baglamayi unutmayin...

Bu sekilde yazarsaniz loop icinde hic bir sey yazmaniza gerek kalmaz.
İnterrupt icin
https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

Switch case yapisi icin
https://www.arduino.cc/reference/en/language/structure/control-structure/switchcase/

Kalanli bolmeden kalan (mod / modulo) icin
https://www.arduino.cc/en/pmwiki.php?n=Reference/Modulo

Input pullup icin
https://www.arduino.cc/en/Tutorial/Foundations/DigitalPins

Fonksiyon aciklamasi icin
https://www.arduino.cc/en/Reference/FunctionDeclaration

Yeterli olur sanirim.
 
Son düzenleme:
Bazı kodlar kağıt üstünde çalışır gibi görünse de uygulamada çalışmazlar. Arkadaşların da dediği gibi buton olayında basma ve bırakma anında debouce denen parazitler, sıçramalar oluşur. Bu da butonun basışının sağlıklı tespitini engeller. Çözüm olarak pull-up veya pull-down dirençlerle buton boşta kaldığı anlarda ground (GND, LOW, eksiye) ya da artıya (HIGH) çekilir. Böylece parazit yapması bir nebze önlenerek basma anları biraz daha netleşir. Bu da yetmez, loop bloğunun hızından dolayı butona basılmasıyla bir çok kez basılmış gibi bir sonuç elde edersiniz. O sebeple bu sorunu da delay() ile bekleme koyarak bir nebze engelleyebilirsiniz. Sağlıklı bir buton olayında bu da yetmeyecektir. Çünkü elinizi basılı tutarsanız yine birden fazla basmışsınız gibi davranacaktır. O sebeple basma anını kesin tespit için butonun önceki halinin LOW olmasına ve şimdiki halinin HIGH olmasını karşılaştırmanız gerekir. Aşağıdaki tinkercad örneğine bakabilirsiniz. Sadece butonun basma anının tespit kısmını eklemeniz yeterli olacaktır.
1627116905350.png
 
Teşekkürler arkadaşlar. Pull down direnci bağlamıştım zaten.şöyle bir değişiklik yapınca çalıştı.
1627124922084.png

Tam olarak neyi çalışmadı eğer ledler kararsız yanıyorsa her if koşulunun sonuna delay(500) ekle ki elini butondan çekene kadar sana biraz süre versin. Eğer söz dizimi hatası alıyorsan loop döngüsünü kapatmamışsın. Kodları resim olarak değil de doğrudan kod seçeneğiyle paylaşırsan derlemeyi deneyebiliriz yoksa kimse yeniden yazmak için uğraşmaz.
sürekli ilk led yandı butona bastığımda üçü birden. Dediğiniz delay ekleyince oldu.Yalnız delay düüşük olursa da sorun oluyor yüksek bir değer olunca da beklemk gerekiyor arka arkaya basınca olmuyor..
 
Yukarıda verdiğim örnekteki gibi, butona basma durumunun kesin tespiti sorunu çözecektir.
 
sürekli ilk led yandı butona bastığımda üçü birden. Dediğiniz delay ekleyince oldu.Yalnız delay düüşük olursa da sorun oluyor yüksek bir değer olunca da beklemk gerekiyor arka arkaya basınca olmuyor..
Buton kontrolü için birçok yol var normalde harici kesme yada timer kullanarak polling yapıyoruz ama sen başlangıç seviyesinde olduğun için

if döngülerinin başına

C++:
delay(50);

ekle ki butondan gelen ekstra darbelerin sönmesi beklensin. En sonuna koyduğun delay(1000) yerine de

C++:
while(digitalRead(buton)){};

yaz ki elini butondan çekmeni beklesin.
 

Forum istatistikleri

Konular
129,840
Mesajlar
930,680
Kullanıcılar
452,678
Son üye
TengRi

Yeni konular

Çevrimiçi üyeler

Geri
Üst