Matrix button box, one key press recognized as four keys pressed sametime

I'm trying to do matrix button box in this sample code with less buttons:

the code sketch and wiring scheme:

Imgur

This is what i'm trying to do:

I've done this setup but when I press one key it recognized as four key pressed sametime. I think it's must be related rows and cols. I'm just a beginner in arduino world. I'll really appreciate if someone help.

I've tried changing rows and cols size in the code and changing rows and cols pins eachother but none of them is worked.

//BUTTON BOX 
//USE w ProMicro
//Tested in WIN10 + Assetto Corsa
//AMSTUDIO
//20.8.17

#include <Keypad.h>
#include <Joystick.h>

#define ENABLE_PULLUPS
#define NUMROTARIES 3
#define NUMBUTTONS 18
#define NUMROWS 3
#define NUMCOLS 6
#define LIST_MAX 18


byte buttons[NUMROWS][NUMCOLS] = {
  {1,2,3,4,5,6},
  {7,8,9,10,11,12},
  {13,14,15,16,17,18},

};

struct rotariesdef {
  byte pin1;
  byte pin2;
  int ccwchar;
  int cwchar;
  volatile unsigned char state;
};

rotariesdef rotaries[NUMROTARIES] {
  {0,1,19,20,0},
  {2,3,21,22,0},
  {4,5,23,24,0},
};

#define DIR_CCW 0x10
#define DIR_CW 0x20
#define R_START 0x0

#ifdef HALF_STEP
#define R_CCW_BEGIN 0x1
#define R_CW_BEGIN 0x2
#define R_START_M 0x3
#define R_CW_BEGIN_M 0x4
#define R_CCW_BEGIN_M 0x5
const unsigned char ttable[6][4] = {
  // R_START (00)
  {R_START_M,            R_CW_BEGIN,     R_CCW_BEGIN,  R_START},
  // R_CCW_BEGIN
  {R_START_M | DIR_CCW, R_START,        R_CCW_BEGIN,  R_START},
  // R_CW_BEGIN
  {R_START_M | DIR_CW,  R_CW_BEGIN,     R_START,      R_START},
  // R_START_M (11)
  {R_START_M,            R_CCW_BEGIN_M,  R_CW_BEGIN_M, R_START},
  // R_CW_BEGIN_M
  {R_START_M,            R_START_M,      R_CW_BEGIN_M, R_START | DIR_CW},
  // R_CCW_BEGIN_M
  {R_START_M,            R_CCW_BEGIN_M,  R_START_M,    R_START | DIR_CCW},
};
#else
#define R_CW_FINAL 0x1
#define R_CW_BEGIN 0x2
#define R_CW_NEXT 0x3
#define R_CCW_BEGIN 0x4
#define R_CCW_FINAL 0x5
#define R_CCW_NEXT 0x6

const unsigned char ttable[7][4] = {
  // R_START
  {R_START,    R_CW_BEGIN,  R_CCW_BEGIN, R_START},
  // R_CW_FINAL
  {R_CW_NEXT,  R_START,     R_CW_FINAL,  R_START | DIR_CW},
  // R_CW_BEGIN
  {R_CW_NEXT,  R_CW_BEGIN,  R_START,     R_START},
  // R_CW_NEXT
  {R_CW_NEXT,  R_CW_BEGIN,  R_CW_FINAL,  R_START},
  // R_CCW_BEGIN
  {R_CCW_NEXT, R_START,     R_CCW_BEGIN, R_START},
  // R_CCW_FINAL
  {R_CCW_NEXT, R_CCW_FINAL, R_START,     R_START | DIR_CCW},
  // R_CCW_NEXT
  {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START},
};
#endif

byte rowPins[NUMROWS] = {21,20,19}; 
byte colPins[NUMCOLS] = {14,16,10,9,8,7}; 

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

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, 
  JOYSTICK_TYPE_JOYSTICK, 25, 0,
  false, false, false, false, false, false,
  false, false, false, false, false);

void setup() {
  Joystick.begin();
  rotary_init();}

void loop() { 

  CheckAllEncoders();

  CheckAllButtons();

}

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


void rotary_init() {
  for (int i=0;i<NUMROTARIES;i++) {
    pinMode(rotaries[i].pin1, INPUT);
    pinMode(rotaries[i].pin2, INPUT);
    #ifdef ENABLE_PULLUPS
      digitalWrite(rotaries[i].pin1, HIGH);
      digitalWrite(rotaries[i].pin2, HIGH);
    #endif
  }
}


unsigned char rotary_process(int _i) {
   unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1);
  rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate];
  return (rotaries[_i].state & 0x30);
}

void CheckAllEncoders(void) {
  for (int i=0;i<NUMROTARIES;i++) {
    unsigned char result = rotary_process(i);
    if (result == DIR_CCW) {
      Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
    };
    if (result == DIR_CW) {
      Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
    };
  }
}

Posting INO code via a link, will get about 10% of the help available.
e.g. I cant see it, so I’m out.

Next time, please post your code inline </> if you can, or at least, link to a text (.c) or other file that can be opened on devices without the IDE loaded. (mobile devices)

lastchancename:
Posting INO code via a link, will get about 10% of the help available.
e.g. I cant see it, so I’m out.

Next time, please post your code inline </> if you can, or at least, link to a text (.c) or other file that can be opened on devices without the IDE loaded. (mobile devices)

Sorry for that, I've edit the post, code added.

Thanks - and good luck!

The Keypad library uses the value 0 to mean NO_KEY so you should not use that as a key code. Start your button numbering at 1.

byte buttons[NUMROWS][NUMCOLS] = {
  {0,1,2,3,4},
  {5,6,7,8,9},
  {10,11,12,13,14},
  {15,16,17,18,19},
  {20,21,22,23},
};

Your 5th row only has 4 columns.

I don't see the declartion of "LIST_MAX" anywhere.

As JW pointed out - check your button implementation...
... the button ‘number’ isn’t what’s on the key cap, it’s just an index that refers uniquely to each button (!)

johnwasser:
The Keypad library uses the value 0 to mean NO_KEY so you should not use that as a key code. Start your button numbering at 1.

byte buttons[NUMROWS][NUMCOLS] = {

{0,1,2,3,4},
  {5,6,7,8,9},
  {10,11,12,13,14},
  {15,16,17,18,19},
  {20,21,22,23},
};



Your 5th row only has 4 columns.

I don't see the declartion of "LIST_MAX" anywhere.

Dear John,

I've changed the layout to 3x6 matrix and designed as your comment. First 5 button and rotaries working well, the other ones still recognized as four keys pressed sametime. Code at the first post edited. Could you please check?

ercan412:
I've changed the layout to 3x6 matrix and designed as your comment. First 5 button and rotaries working well, the other ones still recognized as four keys pressed sametime. Code at the first post edited. Could you please check?

Is there a pattern to WHICH for buttons get for each of buttons 6 through 18?
I don't see any obvious coding errors so I suspect there is a wiring problem.