Клавиатура как устройство ввода игры?

Я пытался заставить матрицу кнопок работать, но у меня недостаточно опыта в программировании.

Я пытался читать, но я не знаю, как выполнить, так что некоторая помощь была бы очень признательна.

Я хочу, чтобы клавиатура работала как игровой контроллер. когда я нажимаю клавишу 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();
      }
   }
}

, 👍1

Обсуждение

Что вы подразумеваете под "игровым устройством ввода"? Вы хотите использовать его в качестве геймпада для вашего КОМПЬЮТЕРА? Или все дело только в светодиодах?, @chrisl

Сейчас я тестировал со светодиодами, код идентичен, digitalWrite(1, HIGH); затем digitalWrite(1, LOW); это можно легко обменять на джойстик.Нажимная кнопка 1 и джойстик.отпускная кнопка 1, @OpticalOpal

у вас есть вопрос? ... непонятно с какой проблемой вы столкнулись, @jsotola

извините, что было неясно. Вопрос: Как я могу использовать библиотеку Keypad.h, чтобы заставить мою клавиатуру нажимать одну строку кода, когда я нажимаю кнопку, и другую строку, когда я отпускаю кнопку?, @OpticalOpal


2 ответа


1

Как использовать библиотеку 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


2

Я написал пост об обработчиках клавиатуры. Я не хочу упоминать об этом, потому что мы не должны публиковать ответы "только по ссылке".

Это относится к библиотеке, доступной на 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