Arduino buton okuma ve işleme

bywanex

Üye
Katılım
13 Eyl 2012
Mesajlar
9
Puanları
1
Merhaba yapmam gereken bir proje var ve bir türlü bununla alkalı çalışan bir kod toparlayamadım yardımcı olursanız sevinirim projemde 3 adet buton ve 2 adet led var butonları B1-B2-B3 olarak yan yana sıralarsak ve Ledleri de L1-L2 olarak sıralarak projem şu şeklide B1 butonuna basıldığında L1 ledi yanacak ve yanılı kalacak ve B2 butonuna 3 defa basıldığında L2 ledi yanacak ve yanılı kalacak B3 butonuna birkez basıldığında B1-B2 butonunun sayacını sıfırlayacak ve L1-L2 ledleri sönecek. Umarım açıklayıcı anlatabilmişimdir
 
Elindeki kodun şu andaki halini paylaş onun üzerinden gidelim
 
Kod:
const int buton2Pin = 10;

const int butonPin = 9;

int ledPin = 8;

int butondurum =0;

int buton2durum =0;

int sayac =0;

 void setup()

{

    pinMode(ledPin,OUTPUT);

    pinMode(butonPin,INPUT);

    pinMode(buton2Pin,INPUT);

 

}

void loop()

{

    sayac==0;

    butondurum = digitalRead(butonPin);

    buton2durum = digitalRead(buton2Pin);

    if(buton2durum ==LOW){

    digitalWrite(ledPin,HIGH);

    }

    if(butondurum == HIGH){

        delay(150);

        sayac=sayac+1;

        while(digitalRead(butonPin));

        if(sayac==3){

            digitalWrite(ledPin,LOW);

            sayac=0;

        }

    }

}

Bu şekilde birşey oluşturdum ama yoparlayamadım
 
Moderatör tarafında düzenlendi:
İlk eksik butonları okurken "debounce" etmen gerekir. Yoksa istenmeyen değişimler okursun ve sanki butona birisi sürekli basıp bırakıyor gibi davranır.

Bir butondan örnek, üç kere ardı ardına "basıldı" bilgisi okursan, o butona gerçekten basılmıştır. Ama iki kere basıldı, sonra basılmadı okursan o zaman sayacı sıfırla. Buton "bırakıldı" durumu içiln de aynı algoritma geçerli. Peş peşe 3 kere "bırakıldı" okursan, gerçekten buton artık basılı değildir. Ama iki kere bırakıldı, sonra basılı okursan, o buton hala basılı kabul etmelisin ve sayacı sıfırlamalısın.

Bu işi yapan ayrı bir fonksiyon oluştur. Bu fonksiyonun tek yaptığı iş, butonları takip etmek ve 3 kere ardışık olarak aynı durumu gösteren butonların debounce edilmiş durumlarını belirlemek. Bunu yaptıktan sonra artık debounce edilmiş buton durumlarına göre iş yap.
 
Öncelikle desteğiniz için teşekkür ederim butona eğer üç kere basılmadı daha az basıldı ise sayacı üçüncü butona bastığında sıfırlanmasını ve tekrar saymacın çalışmasını istiyorum ama eksik bilgim saysinde bu durumu sağlıyamıyorum
 
problemdeki butona 3 kere basılınca led'in sönmesi tamamen ayrı bir konu. O aşamada değilsin daha. Benim bahsettiğim 3 kere buton okuma, debounce amaçlıdır. istersen kafa karıştırmasın, onu 4 kere diyelim. buton eğer 4 kere peş peşe aynı değer okursan, o buton gerçekten basılmıştır veya bırakılmıştır. Bunu önce yapman lazım.

Bir kere temiz bir şekilde buton değerlerini elde ettikten sonra, artık problemde belirtilen butonun 3 kez basılması sonunda led'in sönmesini yapabilirsin.
 
Anladım ama bu debounce yi anlamadım

Kod:
int buton2Pin=4;
int butonPin=2;
int buton3Pin=5;
int ledPin=3;
int led2Pin=6;
int sayac=0;
int butondurum=0;
int butondurum2=0;

void setup(){
    pinMode(ledPin,OUTPUT);
    pinMode(ledPin,OUTPUT);
    pinMode(butonPin,INPUT);
    pinMode(buton2Pin,INPUT);
    pinMode(buton3Pin,INPUT);
}
void loop(){
    sayac==0;
    butondurum=digitalRead(butonPin);
    if(butondurum==HIGH){
        delay(150);
        sayac=sayac+1;
        while(digitalRead(butonPin));
        if(sayac==3){
        digitalWrite(ledPin,HIGH);
    butondurum=digitalRead(buton2Pin);
        if(butondurum==HIGH){
        digitalWrite(ledPin,LOW);
        sayac=0;
        if(butondurum==HIGH);
        digitalWrite(led2Pin,LOW);
        butondurum2=digitalRead(buton3Pin);
        if(butondurum2==HIGH){
        digitalWrite(led2Pin,HIGH);
    }
        
    }
    }
    }
}

Yeniden şöyle bir kod oluşturdum ama şuan deneyemedim
 
Moderatör tarafında düzenlendi:
Debounce'un etkisini osiloskop ile görüntüleyince aşağıdaki gibi görünüyor. Buradaki devre, bir push button, bir seri direnç, ve bunlar da 5V bir kaynağa bağlı. Burada buton basılı iken butonu bıraktım. Ama gördüğün gibi defalarca 0 ve 1 arasında gidip geliyor ve anca 10ms sonra stabilize oluyor.

deounce_on.PNG


Bu da butonun basılma anında olan durum:

debounce_off.PNG


Şimdi senin kod diyelim 1 milisaniyede bir butonun durumunu okuyor. Ne görecek? buton sürekli durum değiştiriyor olacak, öyle değil mi? İşte bun engellemek için yapılıyor debounce işi.

Burada kullanılan buton yaylı mekanik bir buton o yüzden baya sorunlu. 1 milisaniyede bir okuyorsan, belki de 10 kere peş peşe aynı değeri görmen lazım ki durum değiştirdi diyebilesin. Bunu deneyerek bulacaksın. O yüzden o sayıyı bir değişken yap ve kodda o değişkeni kullan. Sonra da o değişken değeri ile oynayarak optimize et.
 
Moderatör tarafında düzenlendi:
Bu buton okuma işleminde söylediğiniz gibi bir dalgalanmadan okuma işlemi hatalı oluyordu bir arkadaşımın uyarısı üzerine butona bir de 10k direnç bağladım ve birde delay ekledim şimdi stabil okuyor gibi sanırsam
 

Ekli dosyalar

  • 4EE39134-0CF0-48C4-987E-6B31436569C9.png
    4EE39134-0CF0-48C4-987E-6B31436569C9.png
    4.8 MB · Görüntüleme: 31
Türk usülü çözmeye çalışma kardeşim :) işin doğrusu debounce yapmak. O tip çözümler bir yere kadar sonuç verir. Bir devrede işe yarar diğerinde yaramaz. Önemli olan hocaya kör topal çalışan birşey göstermek değil işi öğrenmek.
 

Forum istatistikleri

Konular
128,149
Mesajlar
915,466
Kullanıcılar
449,888
Son üye
kalemx

Yeni konular

Geri
Üst