Выбока из массива происходит криво (tinkercad_com)

Нет ответов
MikeAsur
Offline
Зарегистрирован: 25.06.2018

Доброго времени суток!

Вот столкнулся с такой проблемкой.

Блок кнопок (подключены по резистивно-последовательной схеме) при нажатии определяется номер кнопки и по коду выбирается из массива значение.

При выборке первые де цифры правильные, а остальные заменяются на вторую цифру.

Схема и скетч тестируются на онлайн эмуляторе tinkercad_com.

Подскажите это в коде косяк или эмулятор глючит?

Вот такой массив:

int iMassCull [4]={1723,2862,7531,4756};

Вот результат выборки:

Key pressed: 4

data : 4777

all keys are not pressed

Key pressed: 2

data : 2888

all keys are not pressed

Key pressed: 1

data : 1777

all keys are not pressed

Key pressed: 3

data : 7555

all keys are not pressed

Key pressed: 4

data : 4777

all keys are not pressed

Key pressed: 4

data : 4777

all keys are not pressed

Key pressed: 3

data : 7555

all keys are not pressed

Key pressed: 2

data : 2888

all keys are not pressed

Key pressed: 1

data : 1777

all keys are not pressed

Сам код:

int pinIn     = A0;
int keyValue  =  0; // Состояние покоя
int iMassCull [4]={1723,2862,7531,4756}; 
void setup() {
  pinMode(pinIn, INPUT);
  Serial.begin(9600);
}

void loop() {
  int newKeyValue = GetKeyValue(); // Получаем актуальное состояние кнопок с коррекцией дребезга

  if (keyValue != newKeyValue) {  // Если новое значение не совпадает со старым - реагируем на него
    keyValue = newKeyValue;       // Актуализируем переменную хранения состояния
    if (keyValue > 0) {           // Если значение больше 0, значит кнопка нажата
      Serial.println("Key pressed: " + String(keyValue));
      Serial.println ("data : "+String(iMassCull [keyValue-1]));
    }
    else {                        // Если 0, то состояние покоя
      Serial.println("all keys are not pressed");
    }
  }
}

int GetKeyValue() {         // Функция устраняющая дребезг
  static int   count;
  static int   oldKeyValue; // Переменная для хранения предыдущего значения состояния кнопок
  static int   innerKeyValue;
  int actualKeyValue = analogRead(pinIn);  // Получаем актуальное состояние

  actualKeyValue = ((actualKeyValue - 128) >> 8) + 1;   // Для 4 кнопок

  if (innerKeyValue != actualKeyValue) {  // Пришло значение отличное от предыдущего
    count = 0;                            // Все обнуляем и начинаем считать заново
    innerKeyValue = actualKeyValue;       // Запоминаем новое значение
  }
  else {
    count += 1;                           // Увеличиваем счетчик
  }

  if ((count >= 10) && (actualKeyValue != oldKeyValue)) { // Счетчик преодолел барьер, можно иницировать смену состояний
    oldKeyValue = actualKeyValue;         // Присваиваем новое значение
  }
  return    oldKeyValue;
}