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

C++:
    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;
      }
    }
    if (digitalRead(left_btn) == 1) {
      if (kursor_konum == 0) {
        kursor_konum = 3;
      } else if (kursor_konum == 3) {
        kursor_konum = 2;
      } else if (kursor_konum == 2) {
        kursor_konum = 1;
      } else {
        kursor_konum = 0;
      }
    }
kursor_konum değişkenini değiştirmek üzere kullandığınız kısmı şu hale getirebilirsiniz:
C++:
    if (digitalRead(right_btn) == 1) {
      kursor_konum++;
      if (kursor_konum>=3) {kursor_konum=0;}
    }
    else if (digitalRead(left_btn) == 1) {
      kursor_konum--;
      if (kursor_konum<=0) {kursor_konum=3;}
    }
 
page = 'i' kısmını da paylaşabilir misiniz?
 
Senkronizasyon ile ilgili şu kanaate vardım sayın @Gokrtl:
Ekrana yazdırma sürecinde ağır kodların işlediği kısımlarda encoder palsi saymayı yavaşlatmamız gerekmekte. Bu durumda interrupt içerisinde sağlıklı olarak kullanılabilecek yalnızca delayMicroseconds() fonksiyonu bulunmakta, tabi ki Arduino web referansına göre.
Siz şu kodların sıkıntısız çalıştığını belirtmiştiniz:

C++:
void encoder() {
  boolean PinDT = digitalRead(PinDt);
  boolean PinCLK = digitalRead(PinClk);
  if (millis() - oncekiZaman > 1) {
    if (PinCLK != oncekiDurum) {
      if (PinCLK == LOW) {
        if (PinDT == HIGH) {
          sayac++;
          Serial.print(sayac);
          Serial.println(" : sag");
        } else {
          sayac--;
          Serial.print(sayac);
          Serial.println(" : sol");
        }
      }
    }
    oncekiDurum = PinCLK;
    oncekiZaman = millis();
  }
}

Burayı şu şekle çevirebiliriz:
C++:
volatile bool PinDT = LOW;
volatile int sayac = 0;

attachInterrupt(digitalPinToInterrupt(PinCLK), encoder, FALLING);

void encoder() {
  PinDT = digitalRead(PinDt);
  detachInterrupt(PinCLK);
  if (millis() - oncekiZaman > 1) {
    if (PinDT == HIGH) {
      sayac++;
      Serial.print(sayac);
      Serial.println(" : sag");
    } else {
      sayac--;
      Serial.print(sayac);
      Serial.println(" : sol");
    }
  }
  delayMicroseconds(10000); //Burası Debounce süresi için 10 milisaniye gecikme vererek encoder pals okuma sıklığını saniyede en falza 100'e ayaralar.
  attachInterrupt(digitalPinToInterrupt(PinCLK), encoder, FALLING);
  oncekiZaman = millis();
}
 
page = 'i' kısmını da paylaşabilir misiniz?
Aşağıdaki kod page = 'i'; kısmıdır.
Kodun tamamınıda ayrıca ekliyorum.
Birazdan sizin önerilerinizi uygulayacağım.
Bu arada tekrar dışarı çıkmam icabedebilir.

C++:
else if (page == 'i') {
    //// MARKA GÖSTERGESİ /////////////////////
    //u8g2.drawRFrame(34, 52, 15, 11, 3);
    //u8g2.drawRFrame(33, 53, 13, 9, 3);
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_nokiafc22_tu);
    u8g2.setCursor(2, 10);
    u8g2.print("RIGOL");
    //// ÇIKIŞ GÖSTERGESİ /////////////////////
    u8g2.drawRFrame(34, 1, 15, 11, 3);
    //u8g2.drawRFrame(33, 53, 13, 9, 3);
    u8g2.setFont(u8g2_font_micro_tr);
    u8g2.setCursor(38, 9);
    u8g2.print("ON");
    //// CC GÖSTERGE ////////////////////////
    //drawF(43, 52, 42, 12, 44, 53, 40, 10);
    u8g2.drawRFrame(51, 1, 15, 11, 3);
    //  u8g2.drawRFrame(50, 53, 13, 9, 3);
    u8g2.setCursor(55, 9);
    u8g2.print("CC");
    /// FAN GÖSTERGE ////////////////////////
    if (sicaklik >= 21) {
      u8g2.drawRFrame(68, 1, 17, 11, 3);
      //u8g2.drawRFrame(67, 53, 17, 9, 3);
      u8g2.setCursor(71, 9);
      u8g2.print("FAN");
    }
    //// Volt Çerçeve ////////////////////////
    drawF(0, 13, 85, 25, 1, 14, 83, 23);

    //// Voltaj değerini ekrana yazdırma /////
    ival = vIN * 100;
    sprintf(buffer, "%02d.%02d", ival / 100, ival % 100);
    u8g2.setFont(u8g2_font_VCR_OSD_tr);
    //u8g2.drawStr(21, 0, "5");
    u8g2.setCursor(5, 34);
    u8g2.print(buffer);
    u8g2.setCursor(69, 34);
    u8g2.print(F("V"));
    ival = 0;

    //// Akım Çerçeve ////////////////////////
    drawF(0, 39, 85, 25, 1, 40, 83, 23);

    //// Amper değerini ekrana yazdırma //////
    double valueI = (I <= 0) ? 00.00 : I;
    ival = valueI * 100;
    sprintf(buffer, "%02d.%02d", ival / 100, ival % 100);
    u8g2.setFont(u8g2_font_VCR_OSD_tr);
    //u8g2.drawStr(69, 0, "5");
    u8g2.setCursor(5, 60);
    u8g2.print(buffer);
    u8g2.setCursor(69, 60);
    u8g2.print(F("A"));

    //// Kademe Çerçeve //////////////////////
    drawF(86, 0, 42, 21, 87, 1, 40, 19);
    if (vIN <= 11.00) {
      digitalWrite(yirmialtiv, LOW);
      digitalWrite(otuzikiv, LOW);
      delay(20);
      digitalWrite(onikiv, HIGH);
      u8g2.setFont(u8g2_font_6x10_tr);
      u8g2.drawStr(90, 10, "Kademe");
      u8g2.setFont(u8g2_font_chikita_tr);
      u8g2.drawStr(93, 17, "12 Volt");
    } else if ((vIN >= 11.10) && (vIN <= 25.00)) {
      digitalWrite(onikiv, LOW);
      digitalWrite(otuzikiv, LOW);
      delay(20);
      digitalWrite(yirmialtiv, HIGH);
      u8g2.setFont(u8g2_font_6x10_tr);
      u8g2.drawStr(90, 10, "Kademe");
      u8g2.setFont(u8g2_font_chikita_tr);
      u8g2.drawStr(92, 17, "26 Volt");
    } else if (vIN >= 25.10) {
      digitalWrite(onikiv, LOW);
      digitalWrite(yirmialtiv, LOW);
      delay(20);
      digitalWrite(otuzikiv, HIGH);
      u8g2.setFont(u8g2_font_6x10_tr);
      u8g2.drawStr(90, 10, "Kademe");
      u8g2.setFont(u8g2_font_chikita_tr);
      u8g2.drawStr(92, 17, "32 Volt");
    }

    //// Temp Çerçeve ////////////////////////
    drawF(86, 22, 42, 22, 87, 23, 40, 20);

    if (sicaklik <= 38) {
      digitalWrite(fan_led, LOW);
      temp(sicaklik);
    } else if (sicaklik >= 45) {
      digitalWrite(fan_led, HIGH);;
      temp(sicaklik);
    } else {
      temp(sicaklik);
    }

    //// Watt Çerçeve ////////////////////////
    drawF(86, 45, 42, 19, 87, 46, 40, 17);

    //// Watt hesaplama ve ekrana yazdırma ///
    double value = (I * vIN < 0) ? 0.00 : I * vIN;
    u8g2.setFont(u8g2_font_6x10_tr);
    u8g2.drawStr(119, 60, "W");
    u8g2.setFont(u8g2_font_chikita_tr);
    //u8g2.setFont(u8g2_font_profont10_tn);
    u8g2.setCursor(93, 58);
    u8g2.print(value);

    u8g2.sendBuffer();
    //// Değerleri sıfırlama ////////////////
    /*Cdata = 0;
      I = 0;
      V = 0;
      Vdata = 0;
      vIN = 0;
      value;*/
    delay(50);
  }
 

Ekler

  • 128x64_ekran_Triyakli_Guc_kaynak.ino
    14.8 KB · Görüntüleme: 66
C++:
if (page == 'a') {
  u8g2.clearBuffer();
  if (digitalRead(right_btn) + digitalRead(left_btn) >= 0) {
    if (digitalRead(right_btn) == 1) {
      kursor_konum++;
      if (kursor_konum >= 3) {kursor_konum = 0;}
    }
    else if (digitalRead(left_btn) == 1) {
      kursor_konum--;
      if (kursor_konum <= 0) {kursor_konum = 3;}
    }
  }

  switch (kursor_konum) {
  case 0:
    u8g2.drawLine(52, 41, 59, 41);
    u8g2.drawLine(52, 42, 59, 42);
    sayi1 = sayac;
    break;
  case 1:
    u8g2.drawLine(64, 41, 71, 41);
    u8g2.drawLine(64, 42, 71, 42);
    sayi2 = sayac;
    break;
  case 2:
    u8g2.drawLine(88, 41, 95, 41);
    u8g2.drawLine(88, 42, 95, 42);
    sayi3 = sayac;
    break;
  case 3:
    u8g2.drawLine(100, 41, 107, 41);
    u8g2.drawLine(100, 42, 107, 42);
    sayi4 = sayac;
    break;
  }

  voltaj_akim = sayi1 * 10.0 + sayi2 * 1.0 + sayi3 * 0.1 + sayi4 * 0.01;
  //// Akım değerini ekrana yazdırma /////

  drawF(0, 0, 128, 64, 1, 1, 126, 62);
  u8g2.drawLine(5, 18, 122, 18);
  u8g2.drawLine(5, 46, 122, 46);
  u8g2.setFont(u8g2_font_VCR_OSD_tr);
  u8g2.setCursor(4, 40);
  u8g2.print("SET:");
  ival = voltaj_akim * 100;
  sprintf(buffer, "%02d.%02d", ival / 100, ival % 100);
  u8g2.setCursor(50, 40);
  u8g2.print(buffer);
  u8g2.setCursor(112, 40);
  u8g2.print(F("A"));
  u8g2.sendBuffer();
}
Sayın @Gokrtl, anladığım kadarıyla kodlarınızda:
Encoder yoluyla üretilen sayac değişkenini yalnızca page = 'a' kısmında kullanıyorsunuz. page = 'i' kısmı, sistemin diğer okumalarından üretilen verileri yazdırıyor gibi. Encoder okumakla ilgili yaşadığımız sorun da bu sayac değerine bağlı olarak gelişiyor olmalı. Ki page = 'a' kısmında sorun olduğunu belirtmiştiniz. Buna binaen yukarıdaki kodlarda da göreceğiniz aşağıdaki değişiklikleri yaptım:

1- Sağ-sol buttonlara basıldığını takip ettiğiniz if-else bloğuna öncelikli olarak bu buttonlardan herhangi birinin basılmış olduğu kontrolü olarak: if (digitalRead(right_btn) + digitalRead(left_btn) >= 0) ifadesini ekledim. Problemin buradan kaynaklanmış olacağı kanaatindeyim. Ancak problemin çözümünde buttonların basıldığını yoklamak üzere başka bir çözüme bakmak gerekebilir. Şu an kendi bilgisayarım ve Arduino yanımda olmadığımdan kodu test edemiyorum.

2- İki buttondan birinin basılmış olduğu halde ikisinin değeri toplamı 1 yapacağından kodlar buttonlardan hangisinin basıldığını kontrol etmek üzere dallanacak ve kursor_konum değeri üretilecektir. Bu kısmı da daha yukarıda paylaştığım gibi kısa ve sade tutucak bir biçimde değiştirdim. if-else bloklarını gayet sade ve mantık hatasına yer vermeyecek şekilde tasarlamak gerekiyor!

3- sayac değerini, sayi değişkenlerine aktaran kısımda kursor_konum değişkeninin 4 farklı durumunu kontrol eden bir if-else bloğu yerine switch-case bloğu koyarak kodları daha basitleştirdim. Ancak Pico ve grafik ekran sizde bulunduğuna göre bu kısmı sizin test etmeniz gerekecek.
 
C++:
if (page == 'a') {
  u8g2.clearBuffer();
  if (digitalRead(right_btn) + digitalRead(left_btn) >= 0) {
    if (digitalRead(right_btn) == 1) {
      kursor_konum++;
      if (kursor_konum >= 3) {kursor_konum = 0;}
    }
    else if (digitalRead(left_btn) == 1) {
      kursor_konum--;
      if (kursor_konum <= 0) {kursor_konum = 3;}
    }
  }

  switch (kursor_konum) {
  case 0:
    u8g2.drawLine(52, 41, 59, 41);
    u8g2.drawLine(52, 42, 59, 42);
    sayi1 = sayac;
    break;
  case 1:
    u8g2.drawLine(64, 41, 71, 41);
    u8g2.drawLine(64, 42, 71, 42);
    sayi2 = sayac;
    break;
  case 2:
    u8g2.drawLine(88, 41, 95, 41);
    u8g2.drawLine(88, 42, 95, 42);
    sayi3 = sayac;
    break;
  case 3:
    u8g2.drawLine(100, 41, 107, 41);
    u8g2.drawLine(100, 42, 107, 42);
    sayi4 = sayac;
    break;
  }

  voltaj_akim = sayi1 * 10.0 + sayi2 * 1.0 + sayi3 * 0.1 + sayi4 * 0.01;
  //// Akım değerini ekrana yazdırma /////

  drawF(0, 0, 128, 64, 1, 1, 126, 62);
  u8g2.drawLine(5, 18, 122, 18);
  u8g2.drawLine(5, 46, 122, 46);
  u8g2.setFont(u8g2_font_VCR_OSD_tr);
  u8g2.setCursor(4, 40);
  u8g2.print("SET:");
  ival = voltaj_akim * 100;
  sprintf(buffer, "%02d.%02d", ival / 100, ival % 100);
  u8g2.setCursor(50, 40);
  u8g2.print(buffer);
  u8g2.setCursor(112, 40);
  u8g2.print(F("A"));
  u8g2.sendBuffer();
}
Sayın @Gokrtl, anladığım kadarıyla kodlarınızda:
Encoder yoluyla üretilen sayac değişkenini yalnızca page = 'a' kısmında kullanıyorsunuz. page = 'i' kısmı, sistemin diğer okumalarından üretilen verileri yazdırıyor gibi. Encoder okumakla ilgili yaşadığımız sorun da bu sayac değerine bağlı olarak gelişiyor olmalı. Ki page = 'a' kısmında sorun olduğunu belirtmiştiniz. Buna binaen yukarıdaki kodlarda da göreceğiniz aşağıdaki değişiklikleri yaptım:

1- Sağ-sol buttonlara basıldığını takip ettiğiniz if-else bloğuna öncelikli olarak bu buttonlardan herhangi birinin basılmış olduğu kontrolü olarak: if (digitalRead(right_btn) + digitalRead(left_btn) >= 0) ifadesini ekledim. Problemin buradan kaynaklanmış olacağı kanaatindeyim. Ancak problemin çözümünde buttonların basıldığını yoklamak üzere başka bir çözüme bakmak gerekebilir. Şu an kendi bilgisayarım ve Arduino yanımda olmadığımdan kodu test edemiyorum.

2- İki buttondan birinin basılmış olduğu halde ikisinin değeri toplamı 1 yapacağından kodlar buttonlardan hangisinin basıldığını kontrol etmek üzere dallanacak ve kursor_konum değeri üretilecektir. Bu kısmı da daha yukarıda paylaştığım gibi kısa ve sade tutucak bir biçimde değiştirdim. if-else bloklarını gayet sade ve mantık hatasına yer vermeyecek şekilde tasarlamak gerekiyor!

3- sayac değerini, sayi değişkenlerine aktaran kısımda kursor_konum değişkeninin 4 farklı durumunu kontrol eden bir if-else bloğu yerine switch-case bloğu koyarak kodları daha basitleştirdim. Ancak Pico ve grafik ekran sizde bulunduğuna göre bu kısmı sizin test etmeniz gerekecek.
Söylediğiniz yöntemleri uyguladım. Şimdilik sadece pals kaçırma sorunu var. Onun içinde 10K pullup dirençlerini küçülteceğim ama şuan yine dışarı çıkmam gerekli. Dönüşte bu işide halledeceğim. Bu gün akşama çok işleri halletmeyi düşünüyorum.
 
Hatta page = 'a' kısmında madem ki buttonlar basılarak kursor_konum değişmesi yahut encoder yoluyla sayac değişmesi bekleniyor şöyle bir yapı oluşturmak daha makul olabilir:

////Akım değerini ekrana yazdırma//// kısmı başlı başına bir fonksiyona dönüştürülür.

1. page= 'a' kısmına girildiğinde eldeki veriler fonksiyon çağırılarak ekrana yazdırılır,
2. kursor_konum ve/veya sayac değerlerinin değişmesi beklenir, gerçekleşmesi üzerine yeni voltaj_akim değeri üretilir,
3. 1. adıma dönülerek üretilen veriler ekrana yazdırılır. 'a' kısmı bir döngü halinde akmaya devam eder.
 
Hatta page = 'a' kısmında madem ki buttonlar basılarak kursor_konum değişmesi yahut encoder yoluyla sayac değişmesi bekleniyor şöyle bir yapı oluşturmak daha makul olabilir:

////Akım değerini ekrana yazdırma//// kısmı başlı başına bir fonksiyona dönüştürülür.

1. page= 'a' kısmına girildiğinde eldeki veriler fonksiyon çağırılarak ekrana yazdırılır,
2. kursor_konum ve/veya sayac değerlerinin değişmesi beklenir, gerçekleşmesi üzerine yeni voltaj_akim değeri üretilir,
3. 1. adıma dönülerek üretilen veriler ekrana yazdırılır. 'a' kısmı bir döngü halinde akmaya devam eder.
Ben normalde önce çalışan bir kod yapayım, sonra nasıl daha kısa ve işlevsel yaparım diye düşünerek ikikere iş yapmayı seviyorum. Kodlamaya tam anlamıyla hakim olmadığım için böylesi daha kolay oluyor benim için.
 
Ben normalde önce çalışan bir kod yapayım, sonra nasıl daha kısa ve işlevsel yaparım diye düşünerek ikikere iş yapmayı seviyorum. Kodlamaya tam anlamıyla hakim olmadığım için böylesi daha kolay oluyor benim için.
Aslında ben de bu şekilde gelişiyorum... Problemler ile uğraşarak. Ancak kodu en baştan sade yazmaya çalışmak hatta en temelinde bir akış diyagramı çıkararak yazmak en doğrusu sanırım.

Bu arada değişiklikleri denediniz mi, pals kaçırmadan başka sorun kalmadı demiştiniz. Yani bu page = 'a' kısmındaki sorun düzelmiş oldu mu?

Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
 
Aslında ben de bu şekilde gelişiyorum... Problemler ile uğraşarak. Ancak kodu en baştan sade yazmaya çalışmak hatta en temelinde bir akış diyagramı çıkararak yazmak en doğrusu sanırım.

Bu arada değişiklikleri denediniz mi, pals kaçırmadan başka sorun kalmadı demiştiniz. Yani bu page = 'a' kısmındaki sorun düzelmiş oldu mu?

Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
Evet page ='a' tarafındaki sorun düzeldi. Switch case yapısını da uyguladım. Sadece pals kaçırma var. Onunla da eve geçince ilgileneceğim.
 
Son düzenleme:
10k pullup dirençleri söküp yerine 4.7k taktım hiç değişiklik yok. Sonra dirençleri komple söküp pico üzerinden INPUT_PULLUP yaptım yine fark etmedi. Israr ve inatla pals kaçırıyor. Acaba 100nF kondansatörleride mi söksem?
 
10k pullup dirençleri söküp yerine 4.7k taktım hiç değişiklik yok. Sonra dirençleri komple söküp pico üzerinden INPUT_PULLUP yaptım yine fark etmedi. Israr ve inatla pals kaçırıyor. Acaba 100nF kondansatörleride mi söksem?
abi skopla bir baksana belki gerçekten puls üretiyorda gariban pico okuyor onları
 
10k pullup dirençleri söküp yerine 4.7k taktım hiç değişiklik yok. Sonra dirençleri komple söküp pico üzerinden INPUT_PULLUP yaptım yine fark etmedi. Israr ve inatla pals kaçırıyor. Acaba 100nF kondansatörleride mi söksem?
Sayac değişkeni atlayarak sayı üretiyor değil mi? Bahsettiğimiz pals kaçırma, encoder döndüğü halde sayaçta değişiklik yapmama değil yani?

Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
 
Sayac değişkeni atlayarak sayı üretiyor değil mi? Bahsettiğimiz pals kaçırma, encoder döndüğü halde sayaçta değişiklik yapmama değil yani?

Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
Çok değişik. Bazen bir tık çeviyorsun hiç işlem yapmıyor, bazen sağa çeviriyorsun, sol yazıyor, bazen tam tersi, bazen dört tık sağa çeviriyosun busefer de 1-2-1-2 yazıyor. Yani sabit bir sıkıntı yok. Hep farklı farklı.
 
Yukarıdaki soruyu sordum ve nasıl olabilir diye düşünürken rotary encoder pinlerinin farklı bağlanmasıyla mümkün olabilir mi dedim...
Biz normalde encoder pinlerinden A ve B pinini pullup yahut pulldown olarak MCU interrupt pinine; bu ikisinin common pinini ise diğerleri pullup iken GND'ye, pulldown iken +5 volta bağlıyoruz.

Eğer A ve B pini giriş ve common pini çıkış olursa, bir tık hareketinin tamamlandığı dört adımda bize sırasıyla şu çıktıları verecektir:
0 ânında: 0
1 ânında: Yalnız A
2 ânında: A+B
3 ânında: Yalnız B
Sonrasında tekrar 0 anına dönecek.

Logic yapılar konusunda hemen hiç bilgim olmamasına rağmen böyle bir bağlantı biçiminin encoder üzerinden hareket okumakta bir artı sağlama imkânını sizlere yeni bir soru olarak sormak istiyorum. Ne dersiniz kullanışlı olabilir mi?

Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
Bu şekilde okunduğunda çözünürlük artıyor, 4 katına çıkıyor yanlış hesaplamadıysam. iki pinde pin change interrup kullanılabilir. Kod biraz daha uzun oluyor ama yavaş çalışmıyordur.
 
Ben biraz daha yol katettim gibi...
Ancak dönüş hareketi yaparken arada button kendi kendine tetiklenmekte....
 

Ekler

  • Deneme.jpg
    Deneme.jpg
    146.8 KB · Görüntüleme: 71
Yeni deneme...
 

Ekler

  • Deneme.jpg
    Deneme.jpg
    126.5 KB · Görüntüleme: 72
Şu an pals kaçırma sorununu neredeyse tamamen hallettim. Yalnızca aşağıdaki iki sorun kaldı:
1- Ortalama %5 gibi bir oranla ters yön algılama söz konusu.
2- Bir de encoderi döndürürken meydana gelen bir button algılaması var. Bunun da ortalama %6 gibi gerçekleştiğini hesaplıyorum.
Bunların da elimde bulunan ve 3 yıl kadar önce kendi yaptığım modülden kaynaklandığını düşünüyorum.
Problemsiz olduğunu düşündüğüm kodlar şöyle:
Arduino IDE 1.8.13 Üzerinde Arduino UNO İçin Yazıldı:
int RE_B = 7;
int RE_A = 2;
int RE_Bt = 3;
String Yon = "BOS";
byte PinDT;
volatile int Sayac1 = 0;
volatile int Sayac = 0;
volatile bool ticked = 0;
volatile bool pushed = 0;

void setup() {
   pinMode(RE_A,INPUT);
   pinMode(RE_Bt,INPUT);
   pinMode(RE_B,INPUT);
   attachInterrupt(digitalPinToInterrupt(RE_A), Encoding, FALLING);
   attachInterrupt(digitalPinToInterrupt(RE_Bt), Bt_Pushed, FALLING);
   Serial.begin (115200);
   Serial.print("Sayac: ");
   Serial.print(Sayac);
   Serial.print("; Button: ");
   Serial.println(Sayac1);
}

void loop() {
  if (pushed + ticked >= 0) {
    if (pushed) {
      Sayac1++;
      Serial.print("Button: ");
      Serial.println(Sayac1);
      pushed = 0;
    }
    else if (ticked) {
      if (Yon == "SAG") {Sayac++;} else if (Yon == "SOL") {Sayac--;}
      Serial.print(Yon);
      Serial.print("; Sayac: ");
      Serial.println(Sayac);
      ticked = 0;
      Yon = "BOS";
    }
    if (pushed+ticked == 0) {IrqStart();}
  }
}

void Gecikme(volatile int Sure) {
  for (int a = 0; a<=Sure; a++) {delayMicroseconds(1000);}
}

void IrqStart() {
  attachInterrupt(digitalPinToInterrupt(RE_A), Encoding, FALLING);
  attachInterrupt(digitalPinToInterrupt(RE_Bt), Bt_Pushed, FALLING);
}

void IrqStop() {
  detachInterrupt(digitalPinToInterrupt(RE_A));
  detachInterrupt(digitalPinToInterrupt(RE_Bt));
}

void Encoding() {
  PinDT=digitalRead(RE_B);
  IrqStop();
  if (PinDT == 1) {Yon = "SAG";} else if (PinDT == 0) {Yon = "SOL";}
  ticked = 1;
  Gecikme(15);
}

void Bt_Pushed(){
  IrqStop();
  pushed = 1;
  Gecikme(25);
}
 
Son düzenleme:
Bu şekilde okunduğunda çözünürlük artıyor, 4 katına çıkıyor yanlış hesaplamadıysam. iki pinde pin change interrup kullanılabilir. Kod biraz daha uzun oluyor ama yavaş çalışmıyordur.
Bunu da bir süre çalışmak lazım sanırım...

Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
6,141
Mesajlar
104,842
Üyeler
2,553
Son üye
trojann

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