Tuşlu Rotary Encoder Modül Yapımı

sana böyle bişey lazım Gökhan abi
 

Ekler

  • IMG_20220331_114758.jpg
    IMG_20220331_114758.jpg
    1.7 MB · Görüntüleme: 87
  • IMG_20220331_114403.jpg
    IMG_20220331_114403.jpg
    179 KB · Görüntüleme: 101
Timur abi kızacak ama tek buton için şu kadar kod yazdım. Mantığı bir oturtayım da sonra kod kısaltmanın yollarına bakacağım.

C++:
    if (kursor_konum == 0) {
      u8g2.drawLine(52, 41, 59, 41);
      u8g2.drawLine(52, 42, 59, 42);
    } else if (kursor_konum == 1) {
      u8g2.drawLine(64, 41, 71, 41);
      u8g2.drawLine(64, 42, 71, 42);
    }else if (kursor_konum == 2) {
      u8g2.drawLine(88, 41, 95, 41);
      u8g2.drawLine(88, 42, 95, 42);
    }else if (kursor_konum == 3) {
      u8g2.drawLine(100, 41, 107, 41);
      u8g2.drawLine(100, 42, 107, 42);
    }
    if (digitalRead(right_btn) == 1) {
      if (kursor_konum == 0) {
        kursor_konum = 1;
      }else if(kursor_konum == 1){
        kursor_konum = 2;
      }else if(kursor_konum == 2){
        kursor_konum = 3;
      }else{
        kursor_konum = 0;
      }
    }

 
abi biz enkoderi ne yapıcaz voltajı keyPad'den yazıyoruz kursörü butonlardan seçiyoruz
enkoder ne iş yapacak
 
abi biz enkoderi ne yapıcaz voltajı keyPad'den yazıyoruz kursörü butonlardan seçiyoruz
enkoder ne iş yapacak
Kürsör hangi rakamın altındaysa, o rakamı enkoder ile ayrıca değiştirebileceğiz.
 
İşlemleri alt başlıklara ayırıp her birisini bir fonksiyona yaptırmak lazım. Yoksa iş çok karışır, çok hata yaparsın. Mesela şu anki kürsör pozisyonunu bir değişkende tut. Bu değişkeni değiştirince de kursor_tazele() diye bir fonksiyon çağır. Her butonun yapacağı işlev de bir fonksiyon olsun.
 
Bu gün 14:00-22:00 çalışıyorum. Akşam eve geçince encoder ile ilgileneceğim. Sonra hepsini fonksiyon olarak toparlamaya çalışacağım.
 
@insect23
Şu kodlara debouce yapabilir misin?
Nedense basmıyor lanet kafa. Benim anlayacağım dilde anlatan bulamadım bir türlü.

C++:
// Encoder Pinleri /////////////////////
#define PinSw 22
#define PinDt 21
#define PinClk 20
int durum;
int sondurum;
int sayac =0;
void setup() {
  Serial.begin(115200);
sondurum = digitalRead(PinClk);

}

void loop() {
  /// ROTARY ENCODER KODLARI /////////////
  if(digitalRead(PinSw) == 0){
      sayac = 0;
      Serial.print("Sayaç: ");
      Serial.println(sayac);
    }
    durum = digitalRead(PinClk);
    if(durum != sondurum){
      
      if(digitalRead(PinDt) != durum){
        sayac++;
      }else{
        sayac--;
      }
      Serial.print("Sayaç: ");
      Serial.println(sayac);
    }
  sondurum = durum;
}
 
@insect23
Şu kodlara debouce yapabilir misin?
Nedense basmıyor lanet kafa. Benim anlayacağım dilde anlatan bulamadım bir türlü.

C++:
// Encoder Pinleri /////////////////////
#define PinSw 22
#define PinDt 21
#define PinClk 20
int durum;
int sondurum;
int sayac =0;
void setup() {
  Serial.begin(115200);
sondurum = digitalRead(PinClk);

}

void loop() {
  /// ROTARY ENCODER KODLARI /////////////
  if(digitalRead(PinSw) == 0){
      sayac = 0;
      Serial.print("Sayaç: ");
      Serial.println(sayac);
    }
    durum = digitalRead(PinClk);
    if(durum != sondurum){
     
      if(digitalRead(PinDt) != durum){
        sayac++;
      }else{
        sayac--;
      }
      Serial.print("Sayaç: ");
      Serial.println(sayac);
    }
  sondurum = durum;
}
pull up yapıyor musun abi
 
Şu kodlar ile büyük ölçüde hallettim sorunu ama şaftı çervirirken arada bir butona basıldı diyor.
Bazen de sayı eksiltirken bir anda 10-15 sayı artıyor.

encoder buton.png


C++:
#define PinClk 20
#define PinDt 21
#define PinSw 22

int sayac = 0;
long oncekiZaman;
boolean oncekiDurum;
boolean buttonSonDurum = HIGH;
boolean yazildimi = false;

void setup() {
  Serial.begin(115200);
  pinMode(PinClk, INPUT);
  pinMode(PinDt, INPUT);
  pinMode(PinSw, INPUT);
  digitalWrite(PinClk, HIGH);
  digitalWrite(PinDt, HIGH);
}

void loop() {
  boolean a = digitalRead(PinDt);
  boolean b = digitalRead(PinClk);
  boolean c = debounce(PinSw);
  if (c == LOW && yazildimi == false) {
    Serial.println("Butona basildi ! ");
    yazildimi = true;

  } else if (c == HIGH) {
    yazildimi = false;
  }
 
  if (millis() - oncekiZaman > 3) {
    if (b != oncekiDurum) {
      if (b == LOW) {
        if (a == HIGH) {
          sayac++;
          Serial.print(sayac);
          Serial.println(" : sag");
        } else {
          sayac--;
          Serial.print(sayac);
          Serial.println(" : sol");
        }
      }
    }
    oncekiDurum = b;
    oncekiZaman = millis();
  }
}

boolean debounce(int pinNo) {
  boolean b_Durumu = digitalRead(pinNo);
  if (b_Durumu != buttonSonDurum) {
    delay(10);
    b_Durumu = digitalRead(pinNo);
    buttonSonDurum = b_Durumu;
  }
  return b_Durumu;
}
 
Son düzenleme:
Kurcalaya kurcalaya en sonunda anladım debounce'un ne olduğunu. Ama henüz nasıl yazacağımı tam çözemedim.
Genellikle delay kullanılmış ama bence millis kullanılması lazım. Benim encoder de 200ms gibi bir değerde ancak debounce oluyor. Delay için bu süre çok uzun.
 
10 ms yeterli olması lazım debounce için. Bu da saniyede 100 adım atabilmeni sağlar döndürme ile.
 
10 ms yeterli olması lazım debounce için. Bu da saniyede 100 adım atabilmeni sağlar döndürme ile.
Encoderin butonu için dedim abi 200ms yi.
Normalde butona basıp elimi çekene kadar 20 defa butona basıldı yazıyordu. Deneye deneye 200ms koydum. Sonunda istediğim kıvama geldi. Eğer bu yanlış bir metodsa ben yine anlamadım debounce'u demektir :)
 
Osiloskop ile sinyale bak. 10 ms içinde sönümlenip oturduğunu göreceksin.

Bir de 200 ms koyarsan döndürünce saniyede en fazla 5 adım ileri gidersin. Bu çok yavaş.
 
Bir de 200 ms koyarsan döndürünce saniyede en fazla 5 adım ileri gidersin. Bu çok yavaş.
Abi o buton için, döndürme için değil 200ms.
Döndürme için ayrı uğraşacağım. Tabi ne kadar mantıklı bir kod olacak bilmiyorum.
 
Hiç bir şey yapmamış olmayayım diye zorla biraz uğraştım.
Rotary encoder için aşağıdaki kodları yazdım. Boş sayfada çatır çatır çalışan encoder diğer kodların arasına girince teklemeye başladı.
Sonuca birazcık yaklaşmış olsam da yazdığım kodlar tam doğru çalışmıyor şuan.
Yarın biraz daha kafa yorup düzelteceğim. Ve tam çalışmaya başladığında fonksiyon içine alıp aynı şeyleri tekrar tekrar yazdırmayacağım.

C++:
/// Rotary Enkoder İle İşlem Yapma /////////////
    if (kursor_konum == 0) {
      if (millis() - oncekiZaman > 1) {
        if (b != oncekiDurum) {
          if (b == LOW) {
            if (a == HIGH) {
              kursorSayac++;
              if (kursorSayac <= 3 || kursorSayac >= 0) {
                voltaj_akim = kursorSayac * 10.0;
                Serial.print(kursorSayac);
                Serial.println(" : sag");
              }
            } else {
              kursorSayac--;
              if (kursorSayac <= 3 || kursorSayac >= 0) {
                voltaj_akim = kursorSayac * 10.0;
                Serial.print(kursorSayac);
                Serial.println(" : sol");
              }
            }
          }
        }
        oncekiDurum = b;
        oncekiZaman = millis();
      }
    } else if (kursor_konum == 1) {
      if (millis() - oncekiZaman > 1) {
        if (b != oncekiDurum) {
          if (b == LOW) {
            if (a == HIGH) {

              kursorSayac++;
              voltaj_akim = kursorSayac * 1.0;

              Serial.print(kursorSayac);
              Serial.println(" : sag");
            } else {
              kursorSayac--;
              voltaj_akim = kursorSayac * 1.0;
              Serial.print(kursorSayac);
              Serial.println(" : sol");
            }
          }
        }
        oncekiDurum = b;
        oncekiZaman = millis();
      }
    } else if (kursor_konum == 2) {
      if (millis() - oncekiZaman > 1) {
        if (b != oncekiDurum) {
          if (b == LOW) {
            if (a == HIGH) {

              kursorSayac++;
              voltaj_akim = kursorSayac * 0.1;

              Serial.print(kursorSayac);
              Serial.println(" : sag");
            } else {
              kursorSayac--;
              voltaj_akim = kursorSayac * 0.1;
              Serial.print(kursorSayac);
              Serial.println(" : sol");
            }
          }
        }
        oncekiDurum = b;
        oncekiZaman = millis();
      }
    } else if (kursor_konum == 3) {
      if (millis() - oncekiZaman > 1) {
        if (b != oncekiDurum) {
          if (b == LOW) {
            if (a == HIGH) {

              kursorSayac++;
              voltaj_akim = kursorSayac * 0.01;

              Serial.print(kursorSayac);
              Serial.println(" : sag");
            } else {
              kursorSayac--;
              voltaj_akim = kursorSayac * 0.01;
              Serial.print(kursorSayac);
              Serial.println(" : sol");
            }
          }
        }
        oncekiDurum = b;
        oncekiZaman = millis();
      }
    }
 

Forum istatistikleri

Konular
6,627
Mesajlar
112,644
Üyeler
2,722
Son üye
cansu

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top