Need Help For Button Box

Hello guys. I’m new and i need help. I want to use 3 on / off / on 3 way toggle and 2 on / off button. This code is suitable for 4 Rotary enc. and 25 keys. We can assign my on / off and on / off / on buttons to the 25-key section. In total: 4 Encoders, 2 On / Off Missle Sw., 3 On / Off / On and I want to assign the rest as normal buttons.

On / Off : In this code, when the ON button is pressed, it continuously sends 1. I want it to send 1 once when the On button is pressed.

On / Off / On: I want it to send 1 once when the On button is pressed. I want to assign two ON sections as different keys.How do I make changes to the Code? I want to finish buttonbox and play games as soon as possible. Thank you from now.

On / Off Like this: Red illuminated LED Toggle Switch With Missile Style Flick Cover Car Dash 12V TM|switch styles|switch switchswitch with led - AliExpress

And

On / Off / On Like this: New 5 x Mini Momentary (On)Off(On) Toggle Switch Model Railway SPDT 12V,silver|Switches| - AliExpress

I’m using this example:

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


#define ENABLE_PULLUPS
#define NUMROTARIES 4
#define NUMBUTTONS 25
#define NUMROWS 5
#define NUMCOLS 5


//define the symbols on the buttons of the keypads
byte buttons[NUMROWS][NUMCOLS] = {
  {1,2,3,4,5},
  {6,7,8,9,10},
  {11,12,13,14,15},
  {16,17,18,19,20},
  {21,22,23,24,25},
};



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

rotariesdef rotaries[NUMROTARIES] {
  {0,1,26,27,0},
  {2,3,28,29,0},
  {4,5,30,31,0},
  {6,7,32,33,0},
};



#define DIR_CCW 0x10
#define DIR_CW 0x20

#define R_START 0x0
#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},
};


byte rowPins[NUMROWS] = {21,20,19,18,15}; //connect to the row pinouts of the keypad
byte colPins[NUMCOLS] = {14,16,10,9,8}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);



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



void loop() {

  CheckAllEncoders();

  CheckAllButtons();

}


void CheckAllButtons(void) {
      if (buttbx.getKeys())
    {
       for (int i=0; i<LIST_MAX; i++)   // Scan the whole key list.
        {
            switch (buttbx.key[i].kstate) {  // Report active key state : IDLE, PRESSED, HOLD, or RELEASED
                    case PRESSED:
                    case HOLD:
                              Joystick.setButton(buttbx.key[i].kchar, 1);
                              break;
                    case RELEASED:
                    case IDLE:
                              Joystick.setButton(buttbx.key[i].kchar, 0);
                              break;
            }
               
         }
     }
}


/* Call this once in setup(). */
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
  }
}


/* Read input pins and process for events. Call this either from a
 * loop or an interrupt (eg pin change or timer).
 *
 * Returns 0 on no event, otherwise 0x80 or 0x40 depending on the direction.
 */
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);
    };
  }
}

Eien:
Hello guys. I'm new and i need help. I want to use 3 on / off / on 3 way toggle and 2 on / off button. How do I make changes to the Code?

The code changes needed are going to depend on what EXACTLY you want your new switches to do and how/where you intend to connect them. So far you haven't given any hint of this.

Steve

First of all, thank you for your answer. Sorry for the missing information. I’ve added a visual to show where the buttons are connected. This code is suitable for 4 Rotary enc. and 25 keys. We can assign my on / off and on / off / on buttons to the 25-key section. In total: 4 Encoders, 2 On / Off Missle Sw., 3 On / Off / On and I want to assign the rest as normal buttons.

On / Off : In this code, when the ON button is pressed, it continuously sends 1. I want it to send 1 once when the On button is pressed.

On / Off / On: I want it to send 1 once when the On button is pressed. I want to assign two ON sections as different keys.