Button box funktioniert nicht wie sie sollte

Hallo Arduino-Community,
ich wollte mir eine Button Box bauen da ich mehr Knöpfe und Schalter für Simracing brauche. Es hat fürs grobe gut funktioniert das Problem ist nur ich kann überhaupt nicht programmieren und bin eher neu in der Elektronik. Ich habe mir ein paar Videos angeschaut wie z.B. von Amstudio und habe es damit versucht, letztendlich funktioniert es zwar aber nicht wie es sollte, wenn ich etwas drücke werden immer mehrere Knöpfe betätigt. Das einzige was richtig funktioniert ist die Dreh Funktion der Rotary Encoders außer der, der zu RX und TX verbunden ist, es kann aber auch sein dass die Dreh Funktion von dem einen Encoder durchgeschmort ist. Jedenfalls brauch ich eure Hilfe ich weiß nicht mehr so richtig was ich verändern soll bzw. erkenne ich meinen Fehler nicht da ich noch neu in diesem Thema bin. schon vielen Dank im voraus.

[code]
//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 28
#define NUMROWS 6
#define NUMCOLS 6


byte buttons[NUMROWS][NUMCOLS] = {
  {0, 1, 2, 3, 4, 5},
  {6, 7, 8, 9, 10, 11},
  {11, 12, 13, 14, 15, 16},
  {17, 18, 19, 20, 21, 22},
  {23, 24, 25, 26, 27, 28},
  {29, 30, 31, 32, 33, 34}
};

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

rotariesdef rotaries[NUMROTARIES] {
  {0, 1, 24, 25, 0},
  {2, 3, 26, 27, 0},
  {4, 5, 28, 29, 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] = {13, 12, 11, 10, 9, 8};
byte colPins[NUMCOLS] = {A5, A4, A3, A2, A1, A0};

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

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
                   JOYSTICK_TYPE_JOYSTICK, 64, 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);
    };
  }
}
[/code]

Ich vermute einen Fehler in der Verdrahtung deiner Taster.
Leider kann ich die nicht prüfen, da deine Zeichnung nicht der Norm eines Schaltbildes entspricht. Da kann man kaum etwas draus erkennen.
Da solltest du noch mal nachbessern.

Ich hoffe man kann es so jetzt besser erkennen.

Ist es richtig, das Pin 11 zweimal verwendet wird?
Und Du verwendest die Pin 0-5 doppelt.
Ob das was wird, bezweifel ich.
Die einen brauchen einen PULLUP (der Encoder) die anderen nicht (die Matrix) - Wenn letztere mit dem Pullup auf HIGH gezogen wird, kommt da alles mögliche raus.

Also ich hab das mit dem Pin 11 jetzt berichtigt und danke für die Info Pin 0-5 benutze ich doppelt und das andere nur leider hab ich keine Ahnung wie ich das jetzt anders schreiben müsste weil das ist bzw. war nur ein Beispiel Code.

Was sind das für Encoder?
KY-40 auch unter HW-040 bekannt, gibt es in zwei Varianten. Einmal mit Widerstand für den Button und einmal ohne.
Da ist meisst R1 der, für den Button.
Die Button gehen nur direkt an einen Pin des ARDUINO.
Ich versuch mal zu zählen, was Du brauchst...

Oder sind die Encoder komplett roh auf dem Steckbrett / im Einbau?

Also sie haben keinen Wiederstand sie bleiben in der Position die man eingestellt hat und sie sind ganz einfach ohne Steckbrett an einem Holzbrett festgemacht und mit Kabel verbunden.

Sorry, aber für mich ist das nicht besser erkennbar.
Schau dir doch mal ein Schaltbild mit deinen Bauteilen im Web an und vergleiche.

Ok-
Das ist gut, dann passen die auch in die Matrix.
Ich hab auch den switchPlan verstanden, das sind 28 von 36 möglichen Buttons
Was nicht passt, ist Dein Plan.
Die Encoder hast Du falsch verdrahtet.
Ich gehe davon aus, das auf der linken Seite oben links der erste Encoder steckt und die beiden darunter dann 2 und 3.
Dort muss die Verkabelung anders sein.
Der MittelPin muss auf GND.
Der linke gehört jeweils auf 0, 2, 4, - der rechte auf 1,3,5.
ABER! Wenn Du Dir die serielle nicht versauen willst, dann verschiebe das.
Du hast von 7 abwärts frei.
Also: 5 nach 7 tauschen, 4 nach 6 ....

Dann muss das drehen der Rotary funktionieren:

#include <Joystick.h>

// Start Rotary-Encoder
#define ENABLE_PULLUPS
#define NUMROTARIES 3

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

rotariesdef rotaries[NUMROTARIES]
{
  {2, 3, 24, 25, 0},
  {4, 5, 26, 27, 0},
  {6, 7, 28, 29, 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

// Ende Rotary-Encoder

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

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

void loop()
{
  CheckAllEncoders();
}

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);
    };
  }
}

Wenn das geht, dann schau ich mal, was aus dem Keypad wird.

Also der erste ist auf jeden Fall durchgeschmort der zweite funktioniert wunderbar und beim dritten bin ich mir nicht sicher als ich ihn am Anfang betätigt habe ob es funktioniert hat oder nicht aber jetzt gibt er kein Signal. Ich kann es morgen nochmal (wenn ich dazu komme) mit neuen Encoder versuchen aber heute hab ich dafür keine zeit mehr

So es ist jetzt neu verlötet und es funktioniert wunderbar also schonmal danke dafür, jetzt nur noch den Rest. Wäre es möglich das du mir dafür auch den Code machst? Wenn es irgendwelche Verständnis Probleme gibt wegen meinem Plan einfach wieder fragen

Na schick! Dann hats ja geholfen, was ich gebaut habe....

Hm..
Ich sag mal so, ich bau Dir ggfls. was. Aber erstmal komplett unabhängig vom Drehencoder und ohne Garantie, das das funktioniert! Ich habe den Aufbau, die Hardware und die Anforderung nicht - also baue ich blind. Es wird auf Deine Mitarbeit ankommen.

Wenn Du Dich darauf einlässt schau ich mal.

Jap ich tue alles mögliche damit es am ende funktioniert

Dann wollen wir mal sehen, ob ich mich nicht ganz vertan habe.
Für den folgenden Sketch muss noch was vorbereitet werden.
Im Verzeichnis der Libraries musst Du nach der keypad lib suchen.
In der Keypad.h gibt es eine Zeile
#define LIST_MAX 10 // Max number of keys on the active list.
Die 10 musst Du auf Deine 36 erhöhen.
Dann sollte der hier Fehler- und warnungsfrei kompilieren und die Buttons sollten alle abfragbar sein.

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

const byte rows = 6;
const byte cols = 6;
const byte buttonNum = rows * cols;
byte rowPins[rows] = {13, 12, 11, 10, 9, 8};
byte colPins[cols] = {A5, A4, A3, A2, A1, A0};


byte buttons[rows][cols] =
{
  { 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, 25, 26, 27, 28, 29,},
  {30, 31, 32, 33, 34, 35,}
};

const bool isPress = HIGH; // Für Joystick


Keypad buttbox = Keypad( makeKeymap(buttons), rowPins, colPins, rows, cols);

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

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

void loop()
{
  CheckAllButtons();
}

void CheckAllButtons(void)
{
  if (buttbox.getKeys())
  {
    for (byte b = 0; b < buttonNum; b++)
    {
      if (buttbox.key[b].stateChanged)
      {
        switch (buttbox.key[b].kstate)
        {
          case PRESSED:
          case HOLD:
            Joystick.setButton(b, isPress);
            break;
          case RELEASED:
          case IDLE:
            Joystick.setButton(b, !isPress);
            break;
        }
      }
    }
  }
}

Das werde ich direkt testen wenn ich von der Arbeit zurück bin

Könntest du vielleicht nochmal genauer beschreiben wo ich hin muss weil ich finde grade wo ich die 10 bearbeiten kann. Moment ich glaube ich habs gefunden

Also...
Dein Arduino-Sketchbook-Ordner findest Du unter DATEI - VOREINSTELLUNGEN "Sketchbook-Speicherort"
Aufmachen mit dem Explorer.
Da drunter sollte sich ein Ordner "libraries" befinden.
Da drunter der keypad-Ordner.
Da drunter die keypad.h

Ich habs gefunden und konnte es bearbeiten und ich habe es jetzt getestet. Es ist so dass wenn ich einen Knopf drücke, mehrere buttons betätigt werden

Da fehlt mir jetzt jegliche Info zu, um irgendwas damit anzufangen.

Darum mal ganz ohne Joystick.
Du brauchst den Seriellen Monitor dafür:

#include <Keypad.h>
const byte rows = 6;
const byte cols = 6;

byte rowPins[rows] = {13, 12, 11, 10, 9, 8};
byte colPins[cols] = {A5, A4, A3, A2, A1, A0};
const byte btnNums = rows * cols;

int btns[rows][cols] =
{
  { 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, 25, 26, 27, 28, 29,},
  {30, 31, 32, 33, 34, 35,}
};


Keypad btnbox = Keypad( makeKeymap(btns), rowPins, colPins, rows, cols);


void setup()
{
  Serial.begin (115200);   // darauf achten, das der Sermon genau so eingestellt ist
  Serial.println(F("Start..."));
}

void loop()
{
  CheckAllButtons();
}

void CheckAllButtons(void)
{
  if (btnbox.getKeys())
  {
    for (byte b = 0; b < btnNums; b++)
    {
      if (btnbox.key[b].stateChanged)
      {
        Serial.print(F("Key: "));
        Serial.print(b);
        Serial.print(' ');
        switch (btnbox.key[b].kstate)
        {
          case PRESSED:
          case HOLD:
            Serial.println(1);
            break;
          case RELEASED:
          case IDLE:
            Serial.println(0);
            break;
        }
      }
    }
  }
}

Vielleicht bekomme ich aus den Ausgaben auf dem SerMon irgendwas raus...

22:00:55.957 -> Key: 4 1
22:00:56.003 -> Key: 4 1
22:00:56.003 -> Key: 4 1
22:00:56.003 -> Key: 4 1
22:00:56.049 -> Key: 4 1
22:00:56.049 -> Key: 4 1
22:00:56.049 -> Key: 4 1
22:00:56.049 -> Key: 4 1
22:00:56.095 -> Key: 4 1
22:00:56.095 -> Key: 4 1

Also das ist was dabei rauskommt nichts anderes und ich hab mal den Zeitstempel angemacht
also das mit Key:4 1 ist durchgängig das hört nicht auf
also ich kann mal versuchen es raus zu kopieren wie es aussieht wenn ich alle knöpfe mal getestet habe aber das wird sehr schwer