Выбока из массива происходит криво (tinkercad_com)
- Войдите на сайт для отправки комментариев
Доброго времени суток!
Вот столкнулся с такой проблемкой.
Блок кнопок (подключены по резистивно-последовательной схеме) при нажатии определяется номер кнопки и по коду выбирается из массива значение.
При выборке первые де цифры правильные, а остальные заменяются на вторую цифру.
Схема и скетч тестируются на онлайн эмуляторе 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;
}