Изменение нескольких значений одним энкодером

byblik
Offline
Зарегистрирован: 29.10.2016

Подскажите пожалуйста новичку, как можно изменять несколькозначений одним энкодером, причем с разным шагом!

Для начала мне нужно создать переменные для этих значений? и переменные для "шагов"?

int MyValue1 = 25; 
int MyValue1 = 100;
int StemMyValue1 = 5; // шаг изменения первой переменной
int StepMyValue2 = 20; // шаг изменения второй переменной

 Как изменять их энкодером, переключаясь с помощью длиннного клика? Я не прошу готовый код, просто подскажите реализацию! Заранее спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, во-первых, если Вы не планируете ментяь размеры шагов в процессе работы программы, то добавьте в описание слово const.

А что касается "несколькозначений одним энкодером", напишите, пожалуйста, как Вы меняеет одно.  Одно значение Вы умеете менять?

byblik
Offline
Зарегистрирован: 29.10.2016

К сожалению, пока не могу с уверенностью сказать, что умею программировать, но уже нашел готовую функцию для обработки энкодера! Вот она: 

void doEncoderA(){
  if ( rotating ) delay (1);
  if( digitalRead(encoderPinA) != A_set ) {
    A_set = !A_set;
    if ( A_set && !B_set ) 
      encoderPos += stepChangeEncVal;
    rotating = false;
  }
}

void doEncoderB(){
  if ( rotating ) delay (1);
  if( digitalRead(encoderPinB) != B_set ) {
    B_set = !B_set;
    if( B_set && !A_set ) 
      encoderPos -= stepChangeEncVal;
    rotating = false;
  }
}

Она ведь мне подойдет? Верно?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я не знаю, что Вам подойдёт, т.к. не знаю, что Вам нужно. Просто, когда Вы спросили как менять несколько переменных, я думал, что одну-то Вы менять умеете.

Давайте, Вы сначала научитесь менять одну, а там посмотрим.

byblik
Offline
Зарегистрирован: 29.10.2016

уже умею! Не думал, что это настолько просто!

нашел готовый скетч:

/*
** Rotary Encoder Example
** Use the Sparkfun Rotary Encoder to vary brightness of LED
**
** Sample the encoder at 200Hz using the millis() function
*/

int brightness = 120;    // how bright the LED is, start at half brightness
int fadeAmount = 10;    // how many points to fade the LED by
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 12;  // pin 12
const int pin_B = 11;  // pin 11
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;

void setup()  {
  // declare pin 9 to be an output:
  pinMode(9, OUTPUT);
  pinMode(pin_A, INPUT);
  pinMode(pin_B, INPUT);
  currentTime = millis();
  loopTime = currentTime; 
} 

void loop()  {
  // get the current elapsed time
  currentTime = millis();
  if(currentTime >= (loopTime + 5)){
    // 5ms since last check of encoder = 200Hz  
    encoder_A = digitalRead(pin_A);    // Read encoder pins
    encoder_B = digitalRead(pin_B);   
    if((!encoder_A) && (encoder_A_prev)){
      // A has gone from high to low 
      if(encoder_B) {
        // B is high so clockwise
        // increase the brightness, dont go over 255
        if(brightness + fadeAmount <= 255) brightness += fadeAmount;               
      }   
      else {
        // B is low so counter-clockwise      
        // decrease the brightness, dont go below 0
        if(brightness - fadeAmount >= 0) brightness -= fadeAmount;               
      }   

    }   
    encoder_A_prev = encoder_A;     // Store value of A for next time    
    
    // set the brightness of pin 9:
    analogWrite(9, brightness);   
   
    loopTime = currentTime;  // Updates loopTime
  }
  // Other processing can be done here
                           
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

byblik пишет:

уже умею! Не думал, что это настолько просто!

нашел готовый скетч:

Вот и я говорю . Быть программистом просто. Главное найти готовый скетч. Так и Билл Гейц написал Винду. Он просто нашел готовый СКЕТЧ ВИНДЫ.

byblik
Offline
Зарегистрирован: 29.10.2016

 

есть правда вопрос насчет этой строчки скетча
if((!encoder_A) && (encoder_A_prev))

это значит, что если encoder_A равно 0 (нулю), а encoder_A_prev равно 1!

Разве это условие сработает, если в начале скетча стоит

unsigned char encoder_A_prev=0;

значок && ведь означает, что истынными должны быть все(!) условия! Разве нет?
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

если энкодер вращается то на конце вывода  будет это 1-1-1-0-0-0-1-1  

а вот на условии -1-0-  будет верно условие.

byblik
Offline
Зарегистрирован: 29.10.2016

На счет изменения нескольких переменных мне пришла в голову идея просто ввести в скетч несколько дополнительных строк вроде

boolean FlagСhangeValue_1 = false;
boolean FlagСhangeValue_2 = false;

и т.д. и сделать дополнительную проверку, когда какой флаг поднят, такую переменную и изменять! Переключать, какой флаг включить, можно например длительным нажатием кнопки!

Как Вам такая идея? Или можно как-то проще?

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Угу. У энкодера есть кнопка . Вот если нажать и крутить будет изменятся одна переменая. А если отпущена другая. А вот если 3 и более то надо щелкать по этой кнопке. 1 щелчек одна переменая 2 вторая 3 третья 4 снова 1 . А с диным и коротким нажатием это сложновато для вас.