Могу ли я прервать любое нажатие клавиши на этой клавиатуре?

Я учусь писать код прерывания кода. Я только что поэкспериментировал со своим первым игрушечным примером, который взял отсюда:

const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}

void loop() {
  digitalWrite(ledPin, state);
}

void blink() {
  state = !state;
}

Теперь я пытаюсь включить прерывания в свой собственный проект. У меня есть схема , которая выглядит следующим образом , используя Arduino Uno Wifi Rev2, мембранную матричную клавиатуру 3x4, зуммер, несколько резисторов и RGB-светодиод:

Могу ли я написать код таким образом, чтобы он прерывался при каждом нажатии любой из клавиш (и я все еще могу сказать, какая клавиша нажата)? Как бы я это сделал?

, 👍0

Обсуждение

вы можете использовать диоды, чтобы соединить все колонки с выводом прерывания ... держите все строки низко ... при нажатии любой кнопки генерируется прерывание ... прерывание активировало бы сканирование клавиатуры чтобы определить какая клавиша вызвала прерывание, @jsotola

Uno WiFi Rev 2 поддерживает внешнее прерывание на каждом выводе, но здесь это бесполезно, @Juraj

Прерывание отлично подходит для подсчета вещей, но использование человеческого ввода через прерывание может привести к некоторому действительно запутанному коду. Вы должны начать защищать от того, что может быть повреждено, потому что вход находится в середине какой-то другой части, которая действует на вход. Классический пример-нажатие кнопки. Эта строка, если(buttonState != oldButtonState && buttonState == LOW) просто хорошо в большинстве кода. Но если вы используете прерывание, чтобы прочитать кнопку и установить buttonState, то эта строка-огромная ошибка., @Delta_G

смотрите схему здесь ...https://arduinoprosto.ru/q/34054/multiple-buttons-on-single-interrupt-how-to-debounce ... поскольку вы используете Uno WiFi, вам не нужен отдельный вывод прерывания ... просто опустите все строки низко ... нажатие любой клавиши приведет к прерыванию на выводах столбцов, @jsotola

Прерывания предназначены для вещей, которые происходят слишком быстро для выборки с обычным кодом. Это не включает человека, нажимающего кнопку. Прерывания НЕ являются лекарством от того, что вы закодировали какую-то другую часть кода с помощью блокирующих функций, таких как задержка. Сначала это кажется хорошей идеей, но вы быстро обнаружите, что было бы гораздо проще просто написать неблокирующий код для вещей., @Delta_G


1 ответ


1

Нет, ты не можешь. Из-за того, что вам нужно вручную прокручивать каждую строку (или столбец, в зависимости от того, как вы держите голову в данный момент), чтобы прочитать, какие клавиши нажаты, невозможно связать кнопку с прерыванием.

Единственным возможным способом было бы использовать чип внешнего интерфейса клавиатуры (вы могли бы использовать свой собственный с другим Arduino), в котором есть средство сигнализации прерывания.

,

Почему я не могу сделать то, о чем упоминал Джсотола в комментарии выше?, @Saqib Ali

@SaqibAli, хотя это выполнимо, это больше проблем, чем того стоит ... но это может быть хорошим опытом обучения, @jsotola

Да, это может сработать, но, как говорит Джсотола, это того не стоит. Если у вас нет конкретной причины требовать прерывания, просто используйте опрос., @Majenko

"Не могу" - это слишком сильно сказано. Вы можете, если используете диоды, как говорит джсолтола. "Вы можете, если правильно проводите его с помощью диодов, но прерывания кодирования сложны и, вероятно, не стоят проблем" было бы более точным., @Duncan C

Я имею в виду, да, ты “можешь” поставить деревянные шины на свою машину. Это было бы глупо и контрпродуктивно, но вы “можете” в том же смысле., @Delta_G

Вы “можете” купить десятки мощных лазеров, чтобы разогреть сковороду для приготовления печенья. Это было бы круто, но ужасно дорого и трудно сделать. Но вы “можете” в том же смысле. На самом деле я думаю, что лазерные печенья, вероятно, лучшая идея., @Delta_G