Клавиатура как устройство ввода игры?
Я пытался заставить матрицу кнопок работать, но у меня недостаточно опыта в программировании.
Я пытался читать, но я не знаю, как выполнить, так что некоторая помощь была бы очень признательна.
Я хочу, чтобы клавиатура работала как игровой контроллер. когда я нажимаю клавишу 1 на клавиатуре, я хочу, чтобы индикатор чтения загорелся и погас только тогда, когда я отпущу кнопку. код был скопирован из "mstanley" на форуме arduino.
Вопрос: Как использовать библиотеку Keypad.h, чтобы заставить клавиатуру нажать одну строку кода, когда я нажимаю кнопку, и другую строку, когда я отпускаю кнопку.
Я тестировал со светодиодами, код идентичен, digitalWrite(1, HIGH); затем digitalWrite(1, LOW); это можно легко обменять на joystic.Пресс-баттон 1 и Джойстик.ReleaseButton 1
#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {9,8,7,6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5,4,3,2}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
char holdKey;
unsigned long t_hold;
void setup()
{
Serial.begin(9600);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
void loop(){
char key = keypad.getKey();
if (key){
holdKey = key;
Serial.println(key);
}
if (keypad.getState() == HOLD) {
if ((millis() - t_hold) > 100 ) {
switch (holdKey) {
case '1':
digitalWrite(11, HIGH);
delay(200);
digitalWrite(11, LOW);
break;
case '2':
digitalWrite(12, HIGH);
delay(200);
digitalWrite(12, LOW);
break;
case '3':
digitalWrite(13, HIGH);
delay(200);
digitalWrite(13, LOW);
}
t_hold = millis();
}
}
}
@OpticalOpal, 👍1
Обсуждение2 ответа
Как использовать библиотеку Keypad.h, чтобы заставить клавиатуру нажимать одну строку кода при нажатии кнопки и другую строку при отпускании кнопки
Правка 1:
void loop() {
char key = keypad.getKey();
if (key != NO_KEY) {
Serial.println(key);
}
if (keypad.isPressed('*'))
{
randomr = random(10, 2000);
Serial.println(randomr);
}
}
По ссылке: https://playground.arduino.cc/Code/Keypad/ вы можете найти все функции, поддерживаемые библиотекой клавиатур.
Одной из важных функций является
KeyState getState()
Он возвращает текущее состояние любого из ключей. Поддерживаются четыре состояния: БЕЗДЕЙСТВИЕ, НАЖАТИЕ, ОТПУСКАНИЕи УДЕРЖАНИЕ.
Следовательно, вы можете использовать эту функцию для ключей, которые вас интересуют.
Кроме того, если полезно, рассмотрите также и эту функцию.
setHoldTime(unsigned int time)
Установите количество миллисекунд, в течение которых пользователь должен будет удерживать кнопку до тех пор, пока не будет активировано состояние УДЕРЖАНИЯ.
Вы можете найти библиотеку keypad.h в действии здесь. Я мотивирую вас также попробовать код с помощью этого онлайн-эмулятора Arduino
у вас уже есть встроенная функция, определенная для получения статуса нажатия клавиши
void loop() {
char key = keypad.getKey();
if (key != NO_KEY) {
Serial.println(key);
}
}
У меня есть плохо сделанный скриншот для того же самого для вашей краткой справки.
Оригинальный эмулятор Arduino ссылка: (вы можете играть с логикой)
https://wokwi.com/playground/keypad
Раскрытиеинформации: Мы работаем над wokwi.com, для создания интересных инструментов и библиотек для сообщества Arduino https://github.com/wokwi
для более бесплатной демонстрации библиотек:
https://github.com/wokwi/arduino-libraries
Привет! Спасибо вам за ваш ответ. мне известно о команде KeyState getState (), но я не понимаю, как реализовать ее в коде. я не нашел примера, который показал бы, что он делает то, что я ищу. в kombination с командой keyStateChanged() я чувствую, что это определенно должно быть возможно., @OpticalOpal
@OpticalOpal Я вернусь к вам с примером, @ArduinoFan
Я написал пост об обработчиках клавиатуры. Я не хочу упоминать об этом, потому что мы не должны публиковать ответы "только по ссылке".
Это относится к библиотеке, доступной на GitHub, которая обрабатывает клавиатурные панели. В частности, у вас может быть функция обратного вызова как для нажатия, так и для нажатия, для нескольких клавиш.
Как использовать библиотеку Keypad.h, чтобы заставить нажатие на клавиатуре запускать одну строку кода при нажатии кнопки и другую строку при отпускании кнопки.
Похоже, это то, что вы хотите сделать.
Пример кода:
/*
*
* Пример использования Keypad_Matrix с матрицей клавиатуры 4x4.
*
*/
#include <Keypad_Matrix.h>
const byte ROWS = 4;
const byte COLS = 4;
// как на клавиатуре расположены
const char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'},
};
const byte rowPins[ROWS] = {6, 7, 8, 9}; //подключение к выводам строк клавиатуры
const byte colPins[COLS] = {2, 3, 4, 5}; //подключение к выводам столбцов
// Создать клавиатуру
Keypad_Matrix kpd = Keypad_Matrix( makeKeymap (keys), rowPins, colPins, ROWS, COLS );
void keyDown (const char which)
{
Serial.print (F("Key down: "));
Serial.println (which);
}
void setup()
{
Serial.begin (115200);
Serial.println ("Starting.");
kpd.begin ();
kpd.setKeyDownHandler (keyDown);
}
void loop()
{
kpd.scan ();
// делайте другие вещи здесь
}
Вы также можете использовать setKeyUpHandler
для выполнения другой функции при отпускании клавиши. Вы также можете вызвать IsKeyDown
, чтобы узнать, не нажата ли клавиша (например. при нажатии клавиши A клавиша B также нажата?).
Обратите внимание, что (как указано в связанном сообщении) вам нужно использовать диоды, чтобы перестать нажимать ложные (призрачные) клавиши, если одновременно нажимается более двух клавиш.
Привет! Спасибо вам за ответ!, @OpticalOpal
- Не удается заставить клавиатуру использовать Keyboard.write на Arduino Uno
- Как использовать SPI на Arduino?
- Нажать клавишу Windows, используя «keyboard.press();»
- Как подключить вывод INT MPU 6050?
- Улучшенное циклическое переключение цветов RGB.
- Проблема с загрузкой моего скетча на Ардуино
- Отправка мультимедийных клавиш клавиатуры с помощью библиотеки клавиатур
- Распиновка аналога Arduino Pro Micro
Что вы подразумеваете под "игровым устройством ввода"? Вы хотите использовать его в качестве геймпада для вашего КОМПЬЮТЕРА? Или все дело только в светодиодах?, @chrisl
Сейчас я тестировал со светодиодами, код идентичен, digitalWrite(1, HIGH); затем digitalWrite(1, LOW); это можно легко обменять на джойстик.Нажимная кнопка 1 и джойстик.отпускная кнопка 1, @OpticalOpal
у вас есть вопрос? ... непонятно с какой проблемой вы столкнулись, @jsotola
извините, что было неясно. Вопрос: Как я могу использовать библиотеку Keypad.h, чтобы заставить мою клавиатуру нажимать одну строку кода, когда я нажимаю кнопку, и другую строку, когда я отпускаю кнопку?, @OpticalOpal