Button Box

This is my first project with Arduino. I am using an Arduino Pro micro. I googled how to build the button box and it had code on it which I copied an pasted. Everytime I run it, I keep getting errors related to the joystick. I am not sure if I need to include the joystick pieces in there since I do not have a joystick. I only have buttons, switches, and rotary switches. The errors I am getting is “Joystick_ does not name a type, did you mean Joystick?” I have tried googling things, etc and just cannot figure out what to do. I did not realize this would be so difficult otherwise I may have just bought one instead of making one.

Here is what I have. Any help is appreciated

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

#define ENABLE_PULLUPS
#define NUMROTARIES 4  //Number of rotary encoders
#define NUMBUTTONS 21 //Number of buttons
#define NUMROWS 5 // Number of Rows in Matrix
#define NUMCOLS 5 // Number of Columns in Matrix

// Define Arduino Pins for Rows/Cols
//A0-A3 = pins 18-21
byte rowPins[NUMROWS] = {21, 20, 19, 18, 15};
byte colPins[NUMCOLS] = {14, 16, 10, 9, 8};

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, 24},
};

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

// 32 positions?
rotariesdef rotaries[NUMROTARIES] {
  {0, 1, 26, 27, 0},
  {2, 3, 28, 29, 0},
  {4, 5, 30, 31, 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

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:
          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 r) {
  unsigned char pinstate = (digitalRead(rotaries[r].pin2) << 1) | digitalRead(rotaries[r].pin1);
  rotaries[r].state = ttable[rotaries[r].state & 0xf][pinstate];
  return (rotaries[r].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);
    };
  }
}

Start by reading the guidelines on posting on the forum. They are the stickies at the top of every section.

Use tools auto format
Use select all copy for forum or add code tags by hitting the <>icon before posting your code. This will give you more chance of a good response. You can edit your post to add code tags

I browsed the guidelines. I have no idea what tools auto format means. I figured out the code tags. Hopefully this is good now. Thanks.

Good job,
In the ide of arduino (where you write your sketch) there is a tools option at the top of the page which, if you click on and then auto format it will adjust your code to a standard spacing and make it easier to read. Well done on the code tags

Also on the ide there is a button on the bottom right to copy errors as there is a lot more information than you posted. Click on this and then paste the result into code tags

Ok so I'm getting different errors using the online editor vs. the IDE. I edited the program in my first post after I auto formatted it. Here is the error I am getting now

Arduino: 1.8.13 (Windows 10), Board: "Arduino Micro"

C:\Users\danag\Downloads\button_box_2\button_box.ino: In function 'void setup()':

button_box:95:6: error: redefinition of 'void setup()'

void setup() {

^~~~~

C:\Users\danag\Downloads\button_box_2\button_box_2.ino:1:6: note: 'void setup()' previously defined here

void setup() {

^~~~~

C:\Users\danag\Downloads\button_box_2\button_box.ino: In function 'void loop()':

button_box:100:6: error: redefinition of 'void loop()'

void loop() {

^~~~

C:\Users\danag\Downloads\button_box_2\button_box_2.ino:6:6: note: 'void loop()' previously defined here

void loop() {

^~~~

exit status 1

redefinition of 'void setup()'

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

dana0724:
I edited the program in my first post after I auto formatted it.

But we can't see what changes you made...

The errors indicate you have this twice:

void setup(){
...
}

and this twice
void loop(){
...
}

You can't have two functions with the same name.

I will look at that. So I was trying to use both the IDE and the online editor. On one I had the correct joystick program downloaded and on the other one I have the void setup, void loop twice. Once I downloaded the joystick program on the online editor, that one compiled and I was able to upload to the chip and everything works perfectly now. One the IDE version I need to delete the voice setup and void loop repeats and hopefully that will fix that one. Thanks for the help