Arduino buton okuma ve işleme

Anladım çok teşekkür ederim ama hala bu debounce işlemini koda nasıl işliycem onu anlayamadım
 
Yapmak istediğim şey şu void looop un altındaki ilk işlem çalışıyor sıkıntı yok ama diğer işlemler çalışmıyor benim ise void loopun altındaki işlemlerin hepsini döngüye sokmak

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

 void setup () {
    pinMode (ledPin,OUTPUT);
    pinMode (butonPin,INPUT);
    pinMode (buton2Pin,INPUT);
    pinMode (buton3Pin,INPUT);
}

void loop1(void){
    sayac==0;
    butondurum=digitalRead(butonPin);
    if(butondurum==HIGH){
        sayac=sayac+1;
        while (digitalRead(butonPin));
        if(sayac==3){
        digitalWrite(ledPin,HIGH);
    
        }
    }
    }
void loop2(void){
    while(digitalRead(buton2Pin));
    if(butondurum==HIGH)
        digitalWrite(ledPin,LOW);
         sayac=0;
    }
void loop3(void){
    butondurum=digitalRead(buton3Pin);
    if(butondurum==HIGH){
    digitalWrite(led2Pin,HIGH);
    }
    }
void loop(void) {
  loop1();
  loop2(); // loop komutlarını tetikleyecek
  loop3();
    }

Şöyle bir düzenleme yaptım ama kontrol edermisiniz rica etsem
 
Moderatör tarafında düzenlendi:
Senin buradaki kod, kullanıcının butonları belli bir sıra ile basacağını varsayıyor. Örneğin loop2 fonksiyonu butonun 2. butonun basılmasını bekliyor. Bu arada diğer butonlara tamamen kör durumda. Ama problemde böyle bir tanımlama yok. Adam butonları istediği sırayla basabilir ve bu durumda senin kod doğru çalışmaz.

Mevcut haliyle başka problemler de var, ama önemli değil. Önemli olan öncelikle butonları sağlıklı bir şekilde okumak. ledleri boşver şu anda. Her buton için "önceki değer (od)", "şimdiki değer (sd)", ve "aynı olma sayısı (aos)" "temiz değer (td)" diye dört tane değişken tut.

Aşağıda tek buton için algoritma. Bunu 3 butona genelleştirmen lazım bir for döngüsü ile.

Kod:
debounce_esik = 10;

void loop(void)
{
   delay(1);

   od = sd;
   sd = digitalRead(butonPin);
   if (sd == od)
   {
      if (aos == debounce_esik)
      {
         // 10 defa peş peşe aynı değer gördük, bu buton hakkaten basıldı.
         // yeni durumu td ye kaydet ve tekrar temiz buton aramaya başla
         aos = 0;
         td = sd;
      }
      else
      {
         // daha 10 defa aynı değeri göremedik, saymaya devam et
         ++aos;
      }
   }
   else
   {
     // Şimdiki değer öncekinden farklı, sayacı sıfırla ve tekrar 10 tane eşit değer görmeyi bekle
      aos = 0;
   }
}

Bu kodu arduino üzerinde denemedim, kopyala yapıştır yapma, mantığını anlamaya çalış. Bunu üç buton için de yaptıktan sonra elinde üç tane temiz buton değeri olacak, td1, td2, td3. Bu değerlere göre de problemde hocanın istediği şeyleri artık yapabilirsin.
 
Tamadır teşekkür ederim akşam bu kod üzerinde çalışıp bir derleme yapacağım çok saolun
 
Kod:
const int led1 = 3;
const int led2 = 4;
const int buton1 = 5;
const int buton2 = 6;
const int buton3 = 7;

 int deger=0;
 
void setup() {
 Serial.begin(9600);//seri port ekran için

pinMode(buton1, INPUT);
pinMode(buton2, INPUT);
pinMode(buton3, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
}

void loop() {
 
if(digitalRead(buton1) == HIGH )
{
digitalWrite(led1, HIGH);
}
 if(digitalRead(buton2) == HIGH )
{
delay(10);
deger++; //buton a her basışta dereğeri artırmak için
Serial.println(deger); //seri port ekran için
delay(1000);//seri port ekran için
}
if ( deger==3 )// değer 3 e eşit olunca 2.led i yakıyor
{
digitalWrite(led2, HIGH);
}

 if(digitalRead(buton3) == HIGH )
{
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  deger=0;
}
}
Sizin söylediğiniz kodu çalıştıramadım bir türlü fakat kodu toparlayabildim şuan çalışıyor fakat buton2 ye basılı tutulduğunda değer okumaya devam ediyor bunu nasıl önleyebilirim
 
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.
@taydin:

Debounce olayından uzun zamandır ben de şikayetçiyim.
olayın mantığını güzel anlatmışsın. Ancak çözüm için;

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

sözlerini basit bir örnekle açabilirsen çok makbul bir iş olacak.

Ben 4 tane butonla digital girişleri ( interup ile) temiz algılamak istiyorum, ancak kod devamlı "basıldı" ve "bırakıldı" gösteriyor.

Şimdiden yardımına teşekkür ederim.
 
Timer içerisinde bir değişkeniniz olsun.
Harici veya static tanımlansın.
Butona basılınca saymaya başlasın.
Bu belli bir değere (sizin debounce
olarak tanımladığınız zaman kadar)
gelince "buton hala basılı mı?" kontrol
edilsin ve bu değişken sıfırlansın.
 
Timer içerisinde bir değişkeniniz olsun.
Harici veya static tanımlansın.
Butona basılınca saymaya başlasın.
Bu belli bir değere (sizin debounce
olarak tanımladığınız zaman kadar)
gelince "buton hala basılı mı?" kontrol
edilsin ve bu değişken sıfırlansın.
Ben, daha pratik bulduğum için, yukarda verdiğiniz kod parçasını analiz ettim ve geliştirip tamamladım. Çok güzel çalışıyor. Net ve temiz.

Şimdi 4 buton için kodu geliştirmem lazım. Umarım sorunsuz başarırım. Teşekkürler.
 
Olmadı, beklediğim olmadı:

Led, devamlı yanıyor olması ile yanıp sönüyor olmasının ayırt edilemediği bir eleman. Bu nedenle, ben kırpıştırıyor olmasını düşünemedim ve butona doğru tepki verdiğini görünce çok sevinmiştim.

Oysa led basılı iken aralıksız HIGH oluyor, bırakıldığında ise aralıksız LOW oluyor. Bu durum LED için mahsurlu değil. Ama olay LED den çıkıp, wifi ile telefona mesaj gönderilmesine dönüştüğü zaman ipler kopuyor. Buton basılı iken devamlı "Basıldı" mesajı geliyor, bırakıldığında da devamlı "bırakıldı" mesajı geliyor.
Beklenen ise butonun sadece değişim anlarında telefona tek bir mesaj gelmesi.

Başka DeBounce kodlar da denedim. Şu ana kadar sorunumu çözeni bulamadım.
 

Forum istatistikleri

Konular
128,179
Mesajlar
915,658
Kullanıcılar
449,940
Son üye
yavuzturan

Yeni konular

Çevrimiçi üyeler

Geri
Üst