Могу ли я прервать любое нажатие клавиши на этой клавиатуре?
Я учусь писать код прерывания кода. Я только что поэкспериментировал со своим первым игрушечным примером, который взял отсюда:
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-светодиод:
Могу ли я написать код таким образом, чтобы он прерывался при каждом нажатии любой из клавиш (и я все еще могу сказать, какая клавиша нажата)? Как бы я это сделал?
@Saqib Ali, 👍0
Обсуждение1 ответ
Нет, ты не можешь. Из-за того, что вам нужно вручную прокручивать каждую строку (или столбец, в зависимости от того, как вы держите голову в данный момент), чтобы прочитать, какие клавиши нажаты, невозможно связать кнопку с прерыванием.
Единственным возможным способом было бы использовать чип внешнего интерфейса клавиатуры (вы могли бы использовать свой собственный с другим Arduino), в котором есть средство сигнализации прерывания.
Почему я не могу сделать то, о чем упоминал Джсотола в комментарии выше?, @Saqib Ali
@SaqibAli, хотя это выполнимо, это больше проблем, чем того стоит ... но это может быть хорошим опытом обучения, @jsotola
Да, это может сработать, но, как говорит Джсотола, это того не стоит. Если у вас нет конкретной причины требовать прерывания, просто используйте опрос., @Majenko
"Не могу" - это слишком сильно сказано. Вы можете, если используете диоды, как говорит джсолтола. "Вы можете, если правильно проводите его с помощью диодов, но прерывания кодирования сложны и, вероятно, не стоят проблем" было бы более точным., @Duncan C
Я имею в виду, да, ты “можешь” поставить деревянные шины на свою машину. Это было бы глупо и контрпродуктивно, но вы “можете” в том же смысле., @Delta_G
Вы “можете” купить десятки мощных лазеров, чтобы разогреть сковороду для приготовления печенья. Это было бы круто, но ужасно дорого и трудно сделать. Но вы “можете” в том же смысле. На самом деле я думаю, что лазерные печенья, вероятно, лучшая идея., @Delta_G
- Использование millis() и micros() внутри процедуры прерывания
- Подсчет импульсов с прерыванием
- Устранение дребезга кнопки с помощью прерывания
- Программа arduino выдаёт ошибку expected //primary-expression before ')' token error: //expected ';' before '}' token E
- Почему необходимо использовать ключевое слово volatile для глобальных переменных при обработке прерываний в ардуино?
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Использование поворотных энкодеров с прерываниями смены контактов
- Arduino непрерывно считывает значение АЦП с помощью прерывания
вы можете использовать диоды, чтобы соединить все колонки с выводом прерывания ... держите все строки низко ... при нажатии любой кнопки генерируется прерывание ... прерывание активировало бы сканирование клавиатуры чтобы определить какая клавиша вызвала прерывание, @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