Arduino Rotary Enkoder Switch Sorunu

Gokrtl

Gökhan Kartal (TeknoDay)
Staff member
Katılım
27 Şubat 2019
Mesajlar
12,715
Aşağıdaki kodda bir türlü switch butonunu okuyamıyorum.
Çeşitli kombinasyonlar deneyip switch butonunu okuyunca bu sefer de enkoderi sağa-sola çevirdiğim de saymıyor.
24 saattir bununla uğraşıyorum çözemedim.

Kod:
void loop() {

  n = digitalRead(encoder0PinA);
  if ((encoder0PinALast == LOW) && (n == HIGH)) {
    if (digitalRead(encoder0PinB) == LOW) {
      encoder0Pos = 1;
      rot = 1;
    } else {
      rot = 0;
      encoder0Pos = 0;
    }
    Serial.print (encoder0Pos);
    Serial.println();

    if (encoder0Pos == 0) {
      if (!digitalRead(encoder0SW)) {
        Serial.println("Birdeyim: ");
        Serial.print("Buton DEĞERİ: ");
        Serial.println(button);
        Serial.print("Enkoder DEĞERİ: ");
        Serial.println(encoder0Pos);
        if (button == 0) {
          button = 1;
          myGLCD.clrScr();
          myGLCD.setFont(SmallFont);
          myGLCD.drawBitmap(0, 0, ok, 8, 8);
          myGLCD.print("ISI AYARI", 4, 1);
          myGLCD.print("KARISTIRMA", 4, 16);
          delay(300);
        }
      }
    }
  }
  encoder0PinALast = n;
}
 
İki sorun var sanki, pin okumalarında debounce yok, bir de okunan bilgiyi hem seri hem de LCD'ye yazdırma yapıyorsun ve uzun süren bu işlem sırasında oluşan bütün enkoder hareketlerini kaçırıyorsun.

Eğer arka planda seri bağlantıya ve LCD'ye birşeyler yazdırmak gibi uzun süren işler yapacaksan, enkoder okuma işini bir kesmede yapman lazım. enkoder durumunda bir değişiklik varsa da kesmede bir flag set edip ana döngüde bu flag'a göre buton durumunu görüntüleyebilirsin.
 
Hem çocuk, hem ingilizce biliyor, hem enkoder ile menü yapabiliyor. Müsadenizle ben kendimi bi yerden atacağım :katil2:


İki sorun var sanki, pin okumalarında debounce yok, bir de okunan bilgiyi hem seri hem de LCD'ye yazdırma yapıyorsun ve uzun süren bu işlem sırasında oluşan bütün enkoder hareketlerini kaçırıyorsun.

Eğer arka planda seri bağlantıya ve LCD'ye birşeyler yazdırmak gibi uzun süren işler yapacaksan, enkoder okuma işini bir kesmede yapman lazım. enkoder durumunda bir değişiklik varsa da kesmede bir flag set edip ana döngüde bu flag'a göre buton durumunu görüntüleyebilirsin.
Şu çocuğun kodlarına bir bakayım abi.
Enkoder kodlama olayını düzgünce anlatan birini bulamadım. O yüzden kodlama konusunda sıkıntı çekiyorum.
 
O çocuğun kodu onun işine yarıyor olabilir, ama senin program farklı, senin işine aynen yaramayabilir. Önemli olan ne yapılması gerektiğini anlamak ve sonra da senin koda uygun bir şekilde onu yapmak.
 
O çocuğun kodu onun işine yarıyor olabilir, ama senin program farklı, senin işine aynen yaramayabilir. Önemli olan ne yapılması gerektiğini anlamak ve sonra da senin koda uygun bir şekilde onu yapmak.
Abi şunun kodlarını buldum, direk yükledim, çalıştırdım.

Sonra menü sistemini cihazıma göre değiştirdim.
20210810_184105.jpg


Şimdi de işlevselliğini ayarlamaya çalışıyorum ama kodlama çok karışık. Ordan oraya, ordan oraya göndermiş durmuş.
Benim kod bilgisi de iyi olmadığı için içinden çıkamıyorum.

Kod:
   //////////////////////////////////////////////
  //       Arduino Rotary Encoder Menu        //
 //                 v1.0                     //
//           http://www.educ8s.tv           //
/////////////////////////////////////////////

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <ClickEncoder.h>
#include <TimerOne.h>

int menuitem = 1;
int frame = 1;
int page = 1;
int lastMenuItem = 1;

String menuItem1 = "Contrast";
String menuItem2 = "Volume";
String menuItem3 = "Language";
String menuItem4 = "Difficulty";
String menuItem5 = "Light: ON";
String menuItem6 = "Reset";

boolean backlight = true;
int contrast=60;
int volume = 50;

String language[3] = { "EN", "ES", "EL" };
int selectedLanguage = 0;

String difficulty[2] = { "EASY", "HARD" };
int selectedDifficulty = 0;

boolean up = false;
boolean down = false;
boolean middle = false;

ClickEncoder *encoder;
int16_t last, value;

Adafruit_PCD8544 display = Adafruit_PCD8544( 5, 4, 3); //Download the latest Adafruit Library in order to use this constructor

void setup() {

  pinMode(7,OUTPUT);
  turnBacklightOn();
 
  encoder = new ClickEncoder(A1, A0, A2);
  encoder->setAccelerationEnabled(false);
 
  display.begin();    
  display.clearDisplay();
  setContrast();

  Timer1.initialize(1000);
  Timer1.attachInterrupt(timerIsr);
 
  last = encoder->getValue();
}

void loop() {

  drawMenu();

  readRotaryEncoder();

   ClickEncoder::Button b = encoder->getButton();
   if (b != ClickEncoder::Open) {
   switch (b) {
      case ClickEncoder::Clicked:
         middle=true;
        break;
    }
  }  
 
  if (up && page == 1 ) {
   
    up = false;
    if(menuitem==2 && frame ==2)
    {
      frame--;
    }

     if(menuitem==4 && frame ==4)
    {
      frame--;
    }
      if(menuitem==3 && frame ==3)
    {
      frame--;
    }
    lastMenuItem = menuitem;
    menuitem--;
    if (menuitem==0)
    {
      menuitem=1;
    }
  }else if (up && page == 2 && menuitem==1 ) {
    up = false;
    contrast--;
    setContrast();
  }
  else if (up && page == 2 && menuitem==2 ) {
    up = false;
    volume--;
  }
  else if (up && page == 2 && menuitem==3 ) {
    up = false;
    selectedLanguage--;
    if(selectedLanguage == -1)
    {
      selectedLanguage = 2;
    }
  }
    else if (up && page == 2 && menuitem==4 ) {
    up = false;
    selectedDifficulty--;
    if(selectedDifficulty == -1)
    {
      selectedDifficulty = 1;
    }
  }

  if (down && page == 1) //We have turned the Rotary Encoder Clockwise
  {

    down = false;
    if(menuitem==3 && lastMenuItem == 2)
    {
      frame ++;
    }else  if(menuitem==4 && lastMenuItem == 3)
    {
      frame ++;
    }
     else  if(menuitem==5 && lastMenuItem == 4 && frame!=4)
    {
      frame ++;
    }
    lastMenuItem = menuitem;
    menuitem++;
    if (menuitem==7)
    {
      menuitem--;
    }
 
  }else if (down && page == 2 && menuitem==1) {
    down = false;
    contrast++;
    setContrast();
  }
  else if (down && page == 2 && menuitem==2) {
    down = false;
    volume++;
  }
   else if (down && page == 2 && menuitem==3 ) {
    down = false;
    selectedLanguage++;
    if(selectedLanguage == 3)
    {
      selectedLanguage = 0;
    }
  }
  else if (down && page == 2 && menuitem==4 ) {
    down = false;
    selectedDifficulty++;
    if(selectedDifficulty == 2)
    {
      selectedDifficulty = 0;
    }
  }
 
  if (middle) //Middle Button is Pressed
  {
    middle = false;
 
    if (page == 1 && menuitem==5) // Backlight Control
    {
      if (backlight)
      {
        backlight = false;
        menuItem5 = "Light: OFF";
        turnBacklightOff();
        }
      else
      {
        backlight = true;
        menuItem5 = "Light: ON";
        turnBacklightOn();
       }
    }

    if(page == 1 && menuitem ==6)// Reset
    {
      resetDefaults();
    }


    else if (page == 1 && menuitem<=4) {
      page=2;
     }
      else if (page == 2)
     {
      page=1;
     }
   }  
  }
 
  void drawMenu()
  {
   
  if (page==1)
  {  
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print("MAIN MENU");
    display.drawFastHLine(0,10,83,BLACK);

    if(menuitem==1 && frame ==1)
    {  
      displayMenuItem(menuItem1, 15,true);
      displayMenuItem(menuItem2, 25,false);
      displayMenuItem(menuItem3, 35,false);
    }
    else if(menuitem == 2 && frame == 1)
    {
      displayMenuItem(menuItem1, 15,false);
      displayMenuItem(menuItem2, 25,true);
      displayMenuItem(menuItem3, 35,false);
    }
    else if(menuitem == 3 && frame == 1)
    {
      displayMenuItem(menuItem1, 15,false);
      displayMenuItem(menuItem2, 25,false);
      displayMenuItem(menuItem3, 35,true);
    }
     else if(menuitem == 4 && frame == 2)
    {
      displayMenuItem(menuItem2, 15,false);
      displayMenuItem(menuItem3, 25,false);
      displayMenuItem(menuItem4, 35,true);
    }

      else if(menuitem == 3 && frame == 2)
    {
      displayMenuItem(menuItem2, 15,false);
      displayMenuItem(menuItem3, 25,true);
      displayMenuItem(menuItem4, 35,false);
    }
    else if(menuitem == 2 && frame == 2)
    {
      displayMenuItem(menuItem2, 15,true);
      displayMenuItem(menuItem3, 25,false);
      displayMenuItem(menuItem4, 35,false);
    }
   
    else if(menuitem == 5 && frame == 3)
    {
      displayMenuItem(menuItem3, 15,false);
      displayMenuItem(menuItem4, 25,false);
      displayMenuItem(menuItem5, 35,true);
    }

    else if(menuitem == 6 && frame == 4)
    {
      displayMenuItem(menuItem4, 15,false);
      displayMenuItem(menuItem5, 25,false);
      displayMenuItem(menuItem6, 35,true);
    }
   
      else if(menuitem == 5 && frame == 4)
    {
      displayMenuItem(menuItem4, 15,false);
      displayMenuItem(menuItem5, 25,true);
      displayMenuItem(menuItem6, 35,false);
    }
      else if(menuitem == 4 && frame == 4)
    {
      displayMenuItem(menuItem4, 15,true);
      displayMenuItem(menuItem5, 25,false);
      displayMenuItem(menuItem6, 35,false);
    }
    else if(menuitem == 3 && frame == 3)
    {
      displayMenuItem(menuItem3, 15,true);
      displayMenuItem(menuItem4, 25,false);
      displayMenuItem(menuItem5, 35,false);
    }
        else if(menuitem == 2 && frame == 2)
    {
      displayMenuItem(menuItem2, 15,true);
      displayMenuItem(menuItem3, 25,false);
      displayMenuItem(menuItem4, 35,false);
    }
    else if(menuitem == 4 && frame == 3)
    {
      displayMenuItem(menuItem3, 15,false);
      displayMenuItem(menuItem4, 25,true);
      displayMenuItem(menuItem5, 35,false);
    }  
    display.display();
  }
  else if (page==2 && menuitem == 1)
  {  
   displayIntMenuPage(menuItem1, contrast);
  }

  else if (page==2 && menuitem == 2)
  {
   displayIntMenuPage(menuItem2, volume);
  }
   else if (page==2 && menuitem == 3)
  {
   displayStringMenuPage(menuItem3, language[selectedLanguage]);
  }
  else if (page==2 && menuitem == 4)
  {
   displayStringMenuPage(menuItem4, difficulty[selectedDifficulty]);
  }
  else if (page==2 && menuitem == 4)
  {
   displayStringMenuPage(menuItem4, difficulty[selectedDifficulty]);
  }
 
  }

  void resetDefaults()
  {
    contrast = 60;
    volume = 50;
    selectedLanguage = 0;
    selectedDifficulty = 0;
    setContrast();
    backlight = true;
    menuItem5 = "Light: ON";
    turnBacklightOn();
  }

  void setContrast()
  {
    display.setContrast(contrast);
    display.display();
  }

  void turnBacklightOn()
  {
    digitalWrite(7,LOW);
  }

    void turnBacklightOff()
  {
    digitalWrite(7,HIGH);
  }

  void timerIsr() {
  encoder->service();
}

void displayIntMenuPage(String menuItem, int value)
{
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print(menuItem);
    display.drawFastHLine(0,10,83,BLACK);
    display.setCursor(5, 15);
    display.print("Value");
    display.setTextSize(2);
    display.setCursor(5, 25);
    display.print(value);
    display.setTextSize(2);
    display.display();
}

void displayStringMenuPage(String menuItem, String value)
{
    display.setTextSize(1);
    display.clearDisplay();
    display.setTextColor(BLACK, WHITE);
    display.setCursor(15, 0);
    display.print(menuItem);
    display.drawFastHLine(0,10,83,BLACK);
    display.setCursor(5, 15);
    display.print("Value");
    display.setTextSize(2);
    display.setCursor(5, 25);
    display.print(value);
    display.setTextSize(2);
    display.display();
}

void displayMenuItem(String item, int position, boolean selected)
{
    if(selected)
    {
      display.setTextColor(WHITE, BLACK);
    }else
    {
      display.setTextColor(BLACK, WHITE);
    }
    display.setCursor(0, position);
    display.print(">"+item);
}

void readRotaryEncoder()
{
  value += encoder->getValue();
 
  if (value/2 > last) {
    last = value/2;
    down = true;
    delay(150);
  }else   if (value/2 < last) {
    last = value/2;
    up = true;
    delay(150);
  }
}
 
Olucak olucak. 2 seneye kadar bitiricem projeyi :katil1:

20210811_015744.jpg
 
Yav koskoca Adfruit'sin insan bir tane satır silecek kod koymaz mı?
Satır silmek için 48 tane boşluk koydum :katil2:
display.print(" ");
 

Forum istatistikleri

Konular
8,318
Mesajlar
136,652
Üyeler
3,295
Son üye
lejjjyo

Son kaynaklar

Son profil mesajları

mechanic ayhanarican mechanic wrote on ayhanarican's profile.
https://www.allmystery.de almanca biliyorsan burada araştır. Yapay zekada çeviriyor gerçi.
Almanların matematik bilgisi daha iyi oluyor.
“Kendi yolunu çizen kişi, kimsenin izinden gitmez.” – Nietzsche
Kim İslâm’da güzel bir çığır açarsa (güzel bir alışkanlık başlatırsa), onun sevabı ve kendisinden sonra ona uyanların sevapları, onların sevaplarından hiçbir şey eksilmeksizin ona da yazılır.
erdemtr55 taydin erdemtr55 wrote on taydin's profile.
Merhaba Taydin bey,
Gruba spms serisi yapıcak mısınız?
ben 3 sargılı toroid ile 2 adet flyback sürücek bir devre yapmayı düşünüyorum.size soracak sorularım vardı?
Mutluluğun resmi illa güzel çizilmiş tablo olmak zorunda değil.Bazen basit bir çizgi,doğru bir renk,yada küçük bir detay
Back
Top