Переиспользование кнопок

Итак есть девайс подключаемый к ПК (джойстик) с множеством кнопок, подключённые в виде матрицы к ардуино, и есть фиксируемый тумблер. Суть в том, что мне надо при одном положении тумблера чтобы эти кнопки выполняли одно действие, а при другом другое
Есть пара вопросов:

  1. как инициализировать эти кнопки? т.е мне надо прочитать в каком положении тумблер, а после сделать инициализацию кнопок?
  2. Как прочитать есть ли сигнал с тумблера (вернее в каком он положении)? я не знаю как это сделать когда он подключен ввиде матрицы
    код который сейчас имеется, собственно тут просто зажигается каждая кнопка (1 действие на 1 кнопку):
  {0,1,2,3,4,5,6},
  {7,8,9,10,11,12,13},
  {14,15,16,17,18,19}
  
};

//BUTTON MATRIX PART 2
byte rowPins[NUMROWS] = {9,A2,A3}; 
byte colPins[NUMCOLS] = {A0,A1,10,14,15,16,2}; 

Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);

void setup() {
  Joystick.begin();
  rotary_init();
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
}

void loop() {

  CheckAllButtons();
 
}

void CheckAllButtons(void) { 
      if (buttbx.getKeys())
    {
       for (int i=0; i<LIST_MAX; i++)   
        {
           if ( buttbx.key[i].stateChanged )   
            {
            Serial.println(buttbx.getKeys());
            switch (buttbx.key[i].kstate) { 
                    case PRESSED:
                              Joystick.setButton(buttbx.key[i].kchar, 1);
                              break;
                    case HOLD:
                              Joystick.setButton(buttbx.key[i].kchar, 1);
                              break;
                    case RELEASED:
                    case IDLE:
                              Joystick.setButton(buttbx.key[i].kchar, 0);
                              break;
            }
           }   
         }
     } ```

Тумблер в виде матрицы? Да вы знаете толк в извращениях

2 лайка

дык а что такого, у меня есть девайс где 6 тумблеров и 3 галетника так подключены) диоды в нужно месте и все прекрасно работает)
тут конечно я может и найду место где подключить напрямую, но все же хотелось бы узнать как его прочитать в матрице

Так же, как и кнопку в матрице

как я понял библиотека возвращает state change , а тумблер имеет постоянное состояние

Если проверять библиотекой, то просто завести флаг, который устанавливать в момент смены состояния. Но по мне так это изврат ))

как по мне то изврат использовать чужую библиотеку, хотя там может быть и чтение простого состояния, но тс об этом не знает

Без схемы - это отвлечённый разговор.
А так, использовать оператор if. Если тумблер ВКЛ. то нажатие кнопки(ок) означает одно, а если ВЫКЛ - другое

image
вот упрощенная схема

1 лайк

Полностью согласен.
В моем представлении того, что описал ТС это реализуется так:

  1. Если тумблер в положении “1”, то переходим в режим “ONE”
  2. Если тумблер в положении “2”, то переходим в режим “TWO”

Реализуется это элементарно:

Данные разведки
#define switch_pin  5

enum mode : uint8_t {
  ONE, 
  TWO,
  UNKNOWN_MODE
};

mode CUR_MODE = UNKNOWN_MODE;

void setup() {

  pinMode (switch_pin, INPUT);
  if (digitalRead(switch_pin)) {
     CUR_MODE = ONE;
  } else {
     CUR_MODE = TWO;
  }
}

void loop() {

  switch (CUR_MODE) {
    case ONE:
      // обрабатываем нажатия клавишь для первого режима
      break;
    case TWO:
      // обрабатываем нажатия клавишь для второго режима
      break;
    default:
      // ничего не делаем
  }
}

Но это всего лишь мои догадки…

в винде при определении девайса должно отобразиться 4ре кнопки (без тумблера)

хороший пример (скажу честно до этого додумался легко), но я не могу понять как мне определить switch_pin

Ээээ…
Никто кроме вас этого не может знать. В случае, что я предложил - это пин, куда подключен “тумблер” ))

но он подключен сразу к двум) схему я приложил выше

или это будет массив пинов?

А зачем такое соединение? Что оно “изображает”?
Для двухпозиционного переключателя достаточно одного пина. И коммутировать его на VCC или GND.
Зачем вы пины между собой соединяете?

матрица, чтобы больше кнопок влезло (так можно около 100 кнопок подключить), но в целом для тумблера можно сделать исключение… но опять же повторюсь было бы интересно как узнать что пин A0 и A1 замкнуты

Очень просто: Подаете сначала на А0 высокий уровень, с А1 читаете состояние. Потом на А0 ставите низкий уровень и опять читаете А1. Если первое состояние равно инверсному второму - значит пины соединены.

Может быть есть и более простой способ…

Чушь какая-то. У вас же всего один переключатель на два положения, зачем ему 100500 вариантов?
К тому же используете 3 пина, хотя можно всего один. В чем выгода?

это упрощенный вариант. выгода матрицы в том что например на 16 пинов можно посадить 64 кнопки ( ну или 32 двух позиционных тумблера), т.е на один пиш приходится 8 кнопок… т.е 1 тумблер на один пин это роскошь))) вот пример подключения, но тут чисто кнопки, у меня нечто похожее просто где то тублера стоят (но это другой мой уже готовый девайс)
LEDmatrix_schem