Как остановить цикл "Выбор позиции в меню". ENKODER_OLED_MENU

Igoreck
Offline
Зарегистрирован: 01.03.2017
Коплектующие:
1. Энкодер с кнопкой от автомагнитоллы
2. OLED дисплей модуль 0.96" I2C 128x64
3. Arduino Nano
 
 
В нижеприведенном коде при вызове энкодером функции
 
void Menu()
 
курсор бегает по кругу, не могу остановить.
 
#include <OLED_I2C.h>
   OLED  myOLED(SDA, SCL, 1);
   extern uint8_t SmallFont[];
 
   volatile int encoderPin1 = 2;      
   volatile int encoderPin2 = 3;      
   volatile int MSB ;
   volatile int LSB ;
   volatile int encoded = 0 ;
   volatile int lastEncoded = 0;
   volatile int sum  ;                
   volatile int i = 0;
   volatile int a = 0;
   volatile int b = 0;
   volatile int c = 0;
   volatile int encoderValue = 0;
      
void setup(){
      Serial.begin (9600);
      myOLED.begin();
      myOLED.clrScr();
      myOLED.setFont(SmallFont);
      
      pinMode(encoderPin1, INPUT);
      pinMode(encoderPin2, INPUT);
      pinMode(4, INPUT);    // Kнопка "Mеню"
      pinMode(13, OUTPUT); 
      
      digitalWrite(encoderPin1, HIGH);
      digitalWrite(encoderPin2, HIGH);
      digitalWrite(4, HIGH);
      
      attachInterrupt(0, updateEncoder, CHANGE);
      attachInterrupt(1, updateEncoder, CHANGE);
}
void loop(){
    MainScreen();
    if(!digitalRead(4)){
      delay(200);Menu();
      }
    if(c==1){
      c=0;Serial.println(encoderValue);
      }
}                     
void updateEncoder(){  
  MSB = digitalRead(encoderPin1);
  LSB = digitalRead(encoderPin2);
  encoded = (MSB << 1) |LSB; 
  sum  = (lastEncoded << 2) | encoded;
    if(encoded==0b0000){
      if(a==0){
        encoderValue = encoderValue+i; c=1; a=1; b=0;
        }
      }
    if(encoded==0b0011){
      if(b==0){
        encoderValue = encoderValue+i; c=1; b=1; a=0;
        }
      }
    if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011){
        digitalWrite(13, HIGH);
        i=1;
      }
    if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000){
        digitalWrite(13, LOW);
        i=-1;
      } 
  lastEncoded = encoded;
}
void MainScreen() {
  myOLED.clrScr();
  myOLED.print("MainScreen", CENTER, 20);
  myOLED.printNumI(encoderValue, CENTER, 40);
  myOLED.update();
}
void Menu(){
  byte menuPos = 1;
  for (i=0; i<=500; i++){
    
   //***************************** Выбор позиции в меню ***********************          
                if(!encoded --){                
                       menuPos = menuPos + 1;
                        }
                       if(menuPos > 4){
                          menuPos = 1;
                        } 
                       
                if(!encoded ++){
                       menuPos = menuPos - 1;
                        }                     
                      if(menuPos < 1){
                      menuPos = 4;
                        }

        switch(menuPos){
  //***************  устанавливаем курсор согласно позиции в меню  ***************
            case 1:
              myOLED.clrScr();             
              myOLED.print(">", 0, 0);              
              myOLED.print("Alarm", 10, 0);         
              myOLED.print("Time", 10, 10);         
              myOLED.print("Setting", 10, 20);      
              myOLED.print("back", 10, 40);  
            if (menuPos == 1 && !digitalRead(4)) MenuSetAlarm();    
               break;                              
            case 2:
              myOLED.clrScr();                             
              myOLED.print(">", 0, 10);             
              myOLED.print("Alarm", 10, 0);        
              myOLED.print("Time", 10, 10); 
              myOLED.print("Setting", 10, 20);     
              myOLED.print("back", 10, 40);   
              if (menuPos == 2 && !digitalRead(4)) MenuSetTime();
               break;
            case 3:
              myOLED.clrScr();                      
              myOLED.print(">", 0, 20);             
              myOLED.print("Alarm", 10, 0);         
              myOLED.print("Time", 10, 10);         
              myOLED.print("Setting", 10, 20);        
              myOLED.print("back", 10, 40);   
              if (menuPos == 3 && !digitalRead(4)) MenuSetting();
               break;      
            case 4:
              myOLED.clrScr();             
              myOLED.print(">", 0, 40);     
              myOLED.print("Alarm", 10, 0);   
              myOLED.print("Time", 10, 10);  
              myOLED.print("Setting", 10, 20);      
              myOLED.print("back", 10, 40);   
            }    
          myOLED.update();     
      if (!digitalRead(4) && menuPos == 4){break;}
         } 
  delay (150);     
}
void MenuSetTime(){  
    for (i=0; i<=500; i++){
    myOLED.clrScr();            
    myOLED.print("MenuSetTime", CENTER, 20);
    myOLED.update();
    if(!digitalRead(4)){break;}
  }
}
void MenuSetAlarm(){
  for (i=0; i<=500; i++){
  myOLED.clrScr();            
  myOLED.print("MenuSetAlarm", CENTER, 20);
  myOLED.update();
  if(!digitalRead(4)){break;}
  }
}
void MenuSetting(){
  for (i=0; i<=500; i++){
  myOLED.clrScr();            
  myOLED.print("MenuSetting", CENTER, 20);
  myOLED.update();
  if(!digitalRead(4)){break;}
  }
}

 

 
Сама функция энкодера отрабатывает отлично, кстати взято из этого форума благо добрым людям.
Тут уважаемый один форумчанин объяснил на пальцах цитирую:
меню с энкодером это тоже самое что и меню с кнопками, просто когда энкодер вращается в лево присваиваем какой нибудь bool left=true, когда вправо bool right=true. Когда он не двигается все ЛОЖЬ. это будет аналогично нажатию на кнопки left и rigtht.
конец цитаты.
 
Но я так и не смог понять как это правильно оформить в коде.
Прошу Вас, может кто знает.
Как при однократном такте поворота ручки энкодера, в лево или в право, курсор в коде переходил на одну позицию.
 
Пожайлуста поправте меня в коде!
vvadim
Offline
Зарегистрирован: 23.05.2012

я делаю так

val = encoded;
    if(val > val_old)
    {
      .......
      val_old = val;
     }

 

Igoreck
Offline
Зарегистрирован: 01.03.2017

Помедленней я записываю!

Поясните - что, куда, в место чего, в какой строке и функции?

 

Igoreck
Offline
Зарегистрирован: 01.03.2017

Спасибо разобрался.

Тема закрыта!