Ограничение показаний энкодера

Denchik200401
Offline
Зарегистрирован: 17.07.2016

Имеется энкодер от магнитолы, подключенный к ардуино. С помощью энкодера увеличеватся число от 0 до 26. Реализовать ограничение получилось, но если, скажем, при 0 сделать 10 щелчков на уменьшение, то чтобы получить 1, нужно сделать 11 щелчков на увеличение. Как программно реализовать, чтобы не было этого? Заранее спасибо!

a_l_e_x_Z
Offline
Зарегистрирован: 09.11.2017

Насколько понимаю у вас переменная уходит в минус, поэтому нужно сделать ее беззнаковой
http://arduino.ru/Reference/UnsignedInt

sadman41
Offline
Зарегистрирован: 19.10.2016
Int chislo=3;

И крутите скоко хотите - ЭТОГО точно не будет.

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

В обработчике энкодера проверяйте свою переменную -
если она равна 0, то ничего не делать, если больше 0, то уменьшать.
И наоборот, на увеличение - если 26, игнорировать, если меньше 26 - увеличить.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ещё вариант - закольцовывать значения:

int encoderPos;

void encoderIncrement(int val)
{
  encoderPos += val;
  if(encoderPos < 0)
     encoderPos = 26;

  if(encoderPos > 26)
    encoderPos = 0;
}

encoderIncrement(-1);
encoderIncrement(1);
// и т.п.

 

b707
Offline
Зарегистрирован: 26.05.2017

Denchik200401 пишет:
Реализовать ограничение получилось, но если, скажем, при 0 сделать 10 щелчков на уменьшение, то чтобы получить 1, нужно сделать 11 щелчков на увеличение. Как программно реализовать, чтобы не было этого?

Это значит, что вы "организовали ограничение" неправильно. При правильном у вас значение не должно уходить ниже нуля - и значит при первом же щелчке энкодера обратно должно получаться 1, потом 2 и тд

Denchik200401
Offline
Зарегистрирован: 17.07.2016

А как правильно? Можете подсказать?

b707
Offline
Зарегистрирован: 26.05.2017

Denchik200401 пишет:
А как правильно? Можете подсказать?

в сообщениях #3 и #4

Denchik200401
Offline
Зарегистрирован: 17.07.2016

Код который был предложен не совсем верен. Мне нужно, чтобы число изменялось в границах от  0 до 26. Т.е. 0 1 2 3 4 5 6... и т.д. А не только 0 и 26

Denchik200401
Offline
Зарегистрирован: 17.07.2016
  long newLeft;
  newLeft = knobLeft.read();
  if(newLeft < 0)
     newLeft = 0;
     
  if(newLeft > 26)
    newLeft = 26;
  else{
    newLeft=newLeft;
    }

У меня получилось так, но присутствует проблема описанная в первом посте

Denchik200401
Offline
Зарегистрирован: 17.07.2016

Проблема решена. Всем спасибо!

 if (newLeft != positionLeft) {
    if(newLeft > positionLeft) { 
    count++;
    if(count >= 26) count=26; 
    }
    if(newLeft < positionLeft) {  
    count--;
    if (count <= 0) count = 0;
    }else {
      newLeft=newLeft;
    }