Arduino buton

  • Konbuyu başlatan aylin142
  • Başlangıç tarihi

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:

bolubeyi

Profesyonel Üye
Katılım
27 Eyl 2008
Mesajlar
1,247
Puanları
421
Konum
Trabzon
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.
 

FakirMaker

Katılımcı Üye
Katılım
5 May 2009
Mesajlar
558
Puanları
56
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.
 
Katılım
15 Ara 2009
Mesajlar
287
Puanları
1
Yaş
38
Evet kontak sıçraması butonlarda problem o yüzden bir alt program yapmalısın buna Debouncer deniyor
 

kocakus

Üye
Katılım
5 Tem 2020
Mesajlar
77
Puanları
6
Yaş
40
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:

rsimsek

Profesyonel Üye
Katılım
3 Haz 2010
Mesajlar
1,457
Puanları
281
Konum
Anadolu yakası
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
 
Konu Sah
aylin142

aylin142

Üye
Katılım
6 Mar 2014
Mesajlar
30
Puanları
1
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..
 

FakirMaker

Katılımcı Üye
Katılım
5 May 2009
Mesajlar
558
Puanları
56
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.
 

Benzer Konular

Yeni mesajlar

Forum istatistikleri

Konular
117,751
Mesajlar
829,860
Kullanıcılar
428,558
Son üye
Harunn06

Yeni konular

Üst