Button Box Schematic

Hi
I recently made a topic about an LED Latching Button and after getting some guidance, I made a schematic of the final button box I want to make. This is a schematic of the button matrix I want to make. (Sorry for the messiness)

I made this purely off an example in the video below (which was very helpful) so I expect errors.
Video

Parts I will be using:
Push Buttons
Rocker Toggle Switches
Rotary Encoders
Latching LED Push Button
Arduino Pro Micro
Wiring

Thanks in advance!

Do you have a question?

You did try hard to produce schematics. If You use more logic symbols instead of physical representation it had been more clear to read. Pin designations are preferable for all helpers not having the same controller available.
The rocker switches will mix with the other switches. Pressing several buttons at the same time will also produce ghost button signals.

Yes, I just wanted to know if the wiring is correct. I just leveled up so I can now insert the code and libraries. I also forgot to mention that I am very new to coding and wiring so any help is appreciated.

wim_s_button_box_code.ino (6.9 KB)

Using these libraries
ArduinoJoystickLibrary-master (1).zip (30.7 KB)
keypad.zip (18.5 KB)

Thanks! I am a bit confused when you say logic symbols, what do you mean by that? For the pin designations, how would I display that? If you can, can you please provide an example so I could possibly remake my schematic. The video does mention ghosting but it says its not that big of a problem if you don't press several buttons at the same time which I won't be doing.

Please post code here, autoformatted in the IDE and using code tags, </>. Many helpers don't download files filling up their computers. Other helpers use none Pc equipment and can't download .ino files.
Zip stuff is not attractive either....

Sorry, I am new around here and still learning.

Here is the code

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

//DEFINITIONS
#define ENABLE_PULLUPS
#define NUMROTARIES 3 //replace "?" with number of rotary encoders you are using
#define NUMBUTTONS 13 //replace "?"with number of buttong you are using
#define NUMROWS 3 //replace "?" with number of rows you have
#define NUMCOLS 6 //replace "?" with number of columns you have

//BUTTON MATRIX
//first change number of rows and columns to match your button matrix,
//then replace all "?" with numbers (starting from 0)
byte buttons[NUMROWS][NUMCOLS] = {
  {0, 1, 2, 3, 4, 5},
  {6, 7, 8, 9, 10, 11},
  {12, 13, 14, 15, 16, 17}



};

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

//ROTARY ENCODERS
//each line controls a different rotary encoder
//the first two numbers refer to the pins the encoder is connected to
//the second two are the buttons each click of the encoder wil press
//do NOT exceed 31 for the final button number
rotariesdef rotaries[NUMROTARIES] {
  {0, 1, 22, 23, 0}, //rotary 1
  {2, 3, 24, 25, 0}, //rotary 2
  {4, 5, 26, 27, 0}, //rotary 3


};

#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

//BUTTON MATRIX PART 2
byte rowPins[NUMROWS] = {8, 7, 6}; //change "?" to the pins the rows of your button matrix are connected to
byte colPins[NUMCOLS] = {A0, A1, A2, A3, A9, A10}; //change "?" to the pins the rows of your button matrix are connected to

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

//JOYSTICK SETTINGS
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
                   JOYSTICK_TYPE_JOYSTICK,
                   32, //number of buttons
                   0, //number of hat switches
                   //Set as many axis to "true" as you have potentiometers for
                   false, // y axis
                   false, // x axis
                   false, // z axis
                   false, // rx axis
                   false, // ry axis
                   false, // rz axis
                   false, // rudder
                   false, // throttle
                   false, // accelerator
                   false, // brake
                   false); // steering wheel

const int numReadings = 20;

int readings[numReadings];      // the readings from the analog input
int index = 0;              // the index of the current reading
int total = 0;                  // the running total
int currentOutputLevel = 0;

//POTENTIOMETERS PART 1
//add all the axis' which are enabled above
int zAxis_ = 0;
int RxAxis_ = 0;


//POTENTIOMETERS  PART 2
//Which pins are your potentiometers connected to?
int potentiometerPin1 = ?; //Change "?" to the pin your potentiometer is connected to
int potentiometerPin2 = ?;
const bool initAutoSendState = true;


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

void loop() {

  CheckAllEncoders();
  CheckAllButtons();
  CheckAllPotentiometers();

}

//POTENTIOMETERS PART 3
//change the details to match teh details above for each potentiometer you are using
void CheckAllPotentiometers() {

  //potentiometer 1
  currentOutputLevel = getAverageOutput(potentiometerPin1);
  zAxis_ = map(currentOutputLevel, 0, 1023, 0, 255);
  Joystick.setZAxis(zAxis_);

  //potentiometer 2
  currentOutputLevel = getAverageOutput(potentiometerPin2);
  RxAxis_ = map(currentOutputLevel, 0, 1023, 0, 255);
  Joystick.setRxAxis(RxAxis_);


}

int getAverageOutput(int pinToRead) {
  index = 0;
  total = 0;

  while (index < numReadings) {
    readings[index] = analogRead(pinToRead);
    total = total + readings[index];
    index = index + 1;
    //delay (1);
  }
  return total / numReadings;
}


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) {
  //Serial.print("Processing rotary: ");
  //Serial.println(_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) {
  Serial.println("Checking rotaries");
  for (int i = 0; i < NUMROTARIES; i++) {
    unsigned char result = rotary_process(i);
    if (result == DIR_CCW) {
      Serial.print("Rotary ");
      Serial.print(i);
      Serial.println(" <<< Going CCW");
      Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);
    };
    if (result == DIR_CW) {
      Serial.print("Rotary ");
      Serial.print(i);
      Serial.println(" >>> Going CW");
      Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);
    };
  }
  Serial.println("Done checking");
}

These are the unzipped Libraries
Keypad.h (5.6 KB)
Joystick.h (7.6 KB)

I am pretty sure that the code is correct since the video did a great job explaining, I am more concerned about the wiring and if it will work.

They're already zero - don't write code you don't have to.

Edit: in fact, you don't need the readings array at all in the code you've posted.

I didn't write this code, it was a base code which I just edited. Is it ok if I just leave it as is or do I have to remove that part?

Often pen and paper works well enough.
Sorry but I don't have any quick example to post.
A symbol for a button could look like _/ _.... Circuits like a rectangular box, the connected wire and the pin designation inside the box. Pin numbers are almost useless. It's the logical function of the pin that has a meaning.
Look around a little. There are plenty of drawings as examples.

An earlier reply... Did You consider it?

What happens when You activate just one button?
Please put some Serial.print in the code gossiping what's happening in the various main functions like CheckAllEncoders();
CheckAllButtons();
CheckAllPotentiometers();

Use serial monitor in the IDE.

You can leave it, but try to understand why it's a bad idea to waste scant resources.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.