Need help with sketch for button box

Helllo everybody,
I m new here so excuse me if I wrote a stupid things.

I decided to create a button box to my flight simulator stuff. I had never used arduino before so I don't really know how to make sketch for IDE to programme my button box.
I tried to use ready sketches from yt but they are not specified for my configuration.

I would be grateful if someone will help me write a sketch for my button box.
My time is limited in case of milkitary studies so I cannot do it myself.

Arduino Pro MIcro is used in my button box.
Button Box has got:
17 OFF-ON Switches
3 Rotatory encoders with button mode
1 potentiometer
5 push buttons

I upload my connection diagram and photo of the button box.
Thank you for your answers and help.
Matthew

Hello
Is your project limited to the Arduino Pro MIcro ?

Yeah, I soldered to Arduino Pro Micro.

Welcome aboard.

A little more about the button box and what you need it do would help. If you need help in design and or coding you should also say so.

I am really confused. Which information do you need? It has to work like this procject ---> MAKE THIS BUTTON BOX | 32 FUNCTION w ENCODERS - YouTube, but with my connection arrangement

Its cheap.

Warning: They use a key value of zero in the Keypad library. That value is reserved for "NO_KEY" so it should NOT be used as a key value.

Looks like they use these pins for the encoders:
Encoder 0: 0, 1 (OK because they don't use Serial1)
Encoder 1: 2, 3
Encoder 2: 4 (a.k.a A6), 5
Encoder 3: 6 (a.k.a A7), 7

The switches and buttons are in a Keypad matrix:
byte rowPins[NUMROWS] = {21, 20, 19, 18, 15};
byte colPins[NUMCOLS] = {14, 16, 10, 9, 8};
a.k.a:
byte rowPins[NUMROWS] = {A3, A2, A1, A0, SCLK};
byte colPins[NUMCOLS] = {MISO, MOSI, A10, A9, A8};

There are no A4 or A5 pins on the Micro so all available analog inputs are used. That leaves you no place to connect a potentiometer.

Hi @mikewhiskey00 .

I think the sketch on this link is a good start for you.

RV mineirin

Can someone make a special sketch for my configuration? Ofc not for free :slight_smile:

Modification of the existing sketch to match your pin use. Note that the example sketch has had the potentiometer support removed so that will have to be added back to allow the pot on A0 to do anything.

//BUTTON BOX
//USE w ProMicro
//AMSTUDIO 20.8.17
// Modified for @mikewhiskey00, 21-July-2021

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

#define ENABLE_PULLUPS
#define NUMROTARIES 3
#define NUMBUTTONS 25
#define NUMPOTS 1

#define NUMROWS 5
#define NUMCOLS 5
byte buttons[] =
{
  // We are using .kcode (the index, 0-24) instead of 
  // .kchar (the character from this table) so
  // these letters are unused and arbitrary as long as 
  // they are each unique and none of them are '\0'.
  "ABCDE"
  "FGHIJ"
  "KLMNO"
  "PQRST"
  "UVWXY"
};

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

rotariesdef rotaries[NUMROTARIES]
{
  {0, 1, 25, 26, 0},
  {2, 3, 27, 28, 0},
  {4, 5, 29, 30, 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] = {A2, A1, A0, 15, 14};
byte colPins[NUMCOLS] = {16, 10, 9, 8, 7};

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

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
                   JOYSTICK_TYPE_JOYSTICK, 32, 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:
            Joystick.setButton(buttbx.key[i].kcode, 1);
            break;

          case RELEASED:
            Joystick.setButton(buttbx.key[i].kcode, 0);
            break;

          case IDLE:
          case HOLD:
          default:
            break;
        }
      }
    }
  }
}


void rotary_init()
{
  for (int i = 0; i < NUMROTARIES; i++)
  {
#ifdef ENABLE_PULLUPS
    pinMode(rotaries[i].pin1, INPUT_PULLUP);
    pinMode(rotaries[i].pin2, INPUT_PULLUP);
#else
    pinMode(rotaries[i].pin1, INPUT);
    pinMode(rotaries[i].pin2, INPUT);
#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);
    }
  }
}