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: 107
  • IMG_20220331_114403.jpg
    IMG_20220331_114403.jpg
    179 KB · Görüntüleme: 121
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.

Kod:
    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ü.

Kod:
// 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ü.

Kod:
// 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


Kod:
#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.

Kod:
/// 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
7,285
Mesajlar
123,215
Üyeler
2,939
Son üye
Cano

Son kaynaklar

Son profil mesajları

Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
Freemont2.0 posta Freemont2.0 wrote on posta's profile.
Merhabalar :)
az bilgili çok meraklı
Prooffy semih_s Prooffy wrote on semih_s's profile.
Merhaba, sizden DSO2C10 hakkında bilgi rica ettim. Yanıtlarsanız sevinirim...
Unal taydin Unal wrote on taydin's profile.
Timur Bey, Arduino kontrollü bir akü şarj cihazı yapmaya çalışıyorum. Aklımdaki fikri basit bir çizim olarak konu açmıştım. Özellikle sizin fikirlerinizi çok önemsiyorum.
Back
Top