Codeproblem Arduino Leonardo als Tastatur

Hallo Zusammen,

ich sehe vor Lauter Code den Wald nicht mehr...
Stehe gerade vor dem Problem, dass ich mit einem Arduino Leonardo eine USB Tastatur nachbauen will mit Makrotasten.

Habe zum einen den Befehl "Keyboard.press" als auch den Befehl "Keymap" mit im Quellcode.
Die Bibliotheken
#include <Keyboard.h>
#include <Keyboard_de_DE.h>

sind eingebunden.

Defaktum das Problem ist nun, dass die Tasten die ich definiere, entweder garnicht oder wenn komplett falsch dargestellt werdem.

Ich weiß dass ich den Fehler im ASCII Code suchen muss.

Weiß jemand, welchen ASCII ich Eintippen muss bei welchem Befehl (HEX, DEZ)?

Anbei der Code.

#include <Keyboard.h>
#include <Keyboard_de_DE.h>

//Zugbeeinflussung PZB90
int buttonStateFrei = 0;
int buttonStateWach = 0;
int buttonStateBef = 0;
//Federspeicherbremse
int buttonStateFBA = 0;
int buttonStateFBL = 0;
//Mg-Bremse
int buttonStateMg = 0;
//Fahrtrichtung
int buttonStateFV = 0;
int buttonStateFR = 0;
//Führeraum besetzt
int buttonStateFRI = 0;
int buttonStateFRO = 0;
//Hauptschalter ET
int buttonStateHSE = 0;
int buttonStateHSA = 0;
//Stromabnehmer ET
int buttonStateSTH = 0;
int buttonStateSTS = 0;
//Sand
int buttonStateSand = 0;
//SIFA
int buttonStateSifa = 0;

void setup() {
  pinMode(1, INPUT_PULLUP);   //PZB90 Frei
  pinMode(2, INPUT_PULLUP);   //PZB90 Wachsam
  pinMode(3, INPUT_PULLUP);   //PZB90 Befehl 40
  pinMode(4, INPUT_PULLUP);   //Federspeicherbremse Anlegen
  pinMode(5, INPUT_PULLUP);   //Federspeicherbremse Lösen
  pinMode(6, INPUT_PULLUP);   //Mg-Bremse
  pinMode(7, INPUT_PULLUP);   //Fahrtrichtung Vorwärts
  pinMode(8, INPUT_PULLUP);   //Fahrtrichtung Rückwärts
  pinMode(9, INPUT_PULLUP);   //Führerpult Aktivieren
  pinMode(10, INPUT_PULLUP);  //Führerpult Deaktivieren
  pinMode(11, INPUT_PULLUP);  //Hauptschalter Einlegen
  pinMode(12, INPUT_PULLUP);  //Hauptschalter Auslegen
  pinMode(13, INPUT_PULLUP);  //Stromabnehmer Heben
  pinMode(14, INPUT_PULLUP);  //Stromabnehmer Senken
  pinMode(15, INPUT_PULLUP);  //Sanden
  pinMode(16, INPUT_PULLUP);  //SIFA
  Keyboard.begin();
}

void loop() {
  buttonStateFrei = digitalRead(1);
  if (buttonStateFrei == LOW) {
    uint8_t keymap = 0x62; //Taste . (Punkt)
    Keyboard.end();
    Keyboard.begin(&keymap);
    Keyboard.press(0);
    Keyboard.end();
    Keyboard.begin(KeyboardLayout_de_DE);
    delay(100);
    Keyboard.releaseAll();
  }
 
  buttonStateWach = digitalRead(2);
  if (buttonStateWach == LOW) {
    uint8_t keymap = 0x63; //Taste - (Minus)
    Keyboard.end();
    Keyboard.begin(&keymap);
    Keyboard.press(0);
    Keyboard.end();
    Keyboard.begin(KeyboardLayout_de_DE);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateBef = digitalRead(3);
  if (buttonStateBef == LOW) {
    uint8_t keymap = 0x58; //Taste , (Komma)
    Keyboard.end();
    Keyboard.begin(&keymap);
    Keyboard.press(0);
    Keyboard.end();
    Keyboard.begin(KeyboardLayout_de_DE);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFBA = digitalRead(4);
  if (buttonStateFBA == LOW) {
    Keyboard.press(228);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFBL = digitalRead(5);
  if (buttonStateFBL == LOW) {
    Keyboard.press(252);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateMg = digitalRead(6);
  if (buttonStateMg == LOW) {
    Keyboard.press(109);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFV = digitalRead(7);
  if (buttonStateFV == LOW) {
    Keyboard.press(118);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFR = digitalRead(8);
  if (buttonStateFR == LOW) {
    Keyboard.press(114);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFRI = digitalRead(9);
  if (buttonStateFRI == LOW) {
    Keyboard.press(105);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFRO = digitalRead(10);
  if (buttonStateFRO == LOW) {
    Keyboard.press(111);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateHSE = digitalRead(11);
  if (buttonStateHSE == LOW) {
    Keyboard.press(104);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateHSA = digitalRead(12);
  if (buttonStateHSA == LOW) {
    Keyboard.press(110);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSTH = digitalRead(13);
  if (buttonStateSTH == LOW) {
    Keyboard.press(101);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSTS = digitalRead(14);
  if (buttonStateSTS == LOW) {
    Keyboard.press(99);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSand = digitalRead(15);
  if (buttonStateSand == LOW) {
    Keyboard.press(115);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSifa = digitalRead(16);
  if (buttonStateSifa == LOW) {
    Keyboard.press(20);
    delay(100);
    Keyboard.releaseAll();
  }
}

Vielen Dank für eure Hilfe!
Kevin

Kannst du mal Kommentare dazuschreiben ewas hier kommen soll?

#include <Keyboard.h>
#include <Keyboard_de_DE.h>

//Zugbeeinflussung PZB90
int buttonStateFrei = 0;
int buttonStateWach = 0;
int buttonStateBef = 0;
//Federspeicherbremse
int buttonStateFBA = 0;
int buttonStateFBL = 0;
//Mg-Bremse
int buttonStateMg = 0;
//Fahrtrichtung
int buttonStateFV = 0;
int buttonStateFR = 0;
//Führeraum besetzt
int buttonStateFRI = 0;
int buttonStateFRO = 0;
//Hauptschalter ET
int buttonStateHSE = 0;
int buttonStateHSA = 0;
//Stromabnehmer ET
int buttonStateSTH = 0;
int buttonStateSTS = 0;
//Sand
int buttonStateSand = 0;
//SIFA
int buttonStateSifa = 0;

void setup() {
  pinMode(1, INPUT_PULLUP);   //PZB90 Frei
  pinMode(2, INPUT_PULLUP);   //PZB90 Wachsam
  pinMode(3, INPUT_PULLUP);   //PZB90 Befehl 40
  pinMode(4, INPUT_PULLUP);   //Federspeicherbremse Anlegen
  pinMode(5, INPUT_PULLUP);   //Federspeicherbremse Lösen
  pinMode(6, INPUT_PULLUP);   //Mg-Bremse
  pinMode(7, INPUT_PULLUP);   //Fahrtrichtung Vorwärts
  pinMode(8, INPUT_PULLUP);   //Fahrtrichtung Rückwärts
  pinMode(9, INPUT_PULLUP);   //Führerpult Aktivieren
  pinMode(10, INPUT_PULLUP);  //Führerpult Deaktivieren
  pinMode(11, INPUT_PULLUP);  //Hauptschalter Einlegen
  pinMode(12, INPUT_PULLUP);  //Hauptschalter Auslegen
  pinMode(13, INPUT_PULLUP);  //Stromabnehmer Heben
  pinMode(14, INPUT_PULLUP);  //Stromabnehmer Senken
  pinMode(15, INPUT_PULLUP);  //Sanden
  pinMode(16, INPUT_PULLUP);  //SIFA
  Keyboard.begin();
}

void loop() {
  buttonStateFrei = digitalRead(1);
  if (buttonStateFrei == LOW) {
    uint8_t keymap = 46; //Taste . (Punkt)
    Keyboard.end();
    Keyboard.begin(&keymap);
    Keyboard.press(0);
    Keyboard.end();
    Keyboard.begin(KeyboardLayout_de_DE);
    delay(100);
    Keyboard.releaseAll();
  }
 
  buttonStateWach = digitalRead(2);
  if (buttonStateWach == LOW) {
    uint8_t keymap = 45; //Taste - (Minus)
    Keyboard.end();
    Keyboard.begin(&keymap);
    Keyboard.press(0);
    Keyboard.end();
    Keyboard.begin(KeyboardLayout_de_DE);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateBef = digitalRead(3);
  if (buttonStateBef == LOW) {
    uint8_t keymap = 44; //Taste , (Komma)
    Keyboard.end();
    Keyboard.begin(&keymap);
    Keyboard.press(0);
    Keyboard.end();
    Keyboard.begin(KeyboardLayout_de_DE);
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFBA = digitalRead(4);
  if (buttonStateFBA == LOW) {
    Keyboard.press(228); //Taste Ä
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFBL = digitalRead(5);
  if (buttonStateFBL == LOW) {
    Keyboard.press(252); //Taste Ü
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateMg = digitalRead(6);
  if (buttonStateMg == LOW) {
    Keyboard.press(109); //Taste M
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFV = digitalRead(7);
  if (buttonStateFV == LOW) {
    Keyboard.press(86); //Taste V
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFR = digitalRead(8);
  if (buttonStateFR == LOW) {
    Keyboard.press(114); //Taste R
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFRI = digitalRead(9);
  if (buttonStateFRI == LOW) {
    Keyboard.press(105); //Taste I
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFRO = digitalRead(10);
  if (buttonStateFRO == LOW) {
    Keyboard.press(111); //Taste O
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateHSE = digitalRead(11);
  if (buttonStateHSE == LOW) {
    Keyboard.press(104); //Taste H
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateHSA = digitalRead(12);
  if (buttonStateHSA == LOW) {
    Keyboard.press(110); //Taste N
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSTH = digitalRead(13);
  if (buttonStateSTH == LOW) {
    Keyboard.press(101); //Taste E
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSTS = digitalRead(14);
  if (buttonStateSTS == LOW) {
    Keyboard.press(99); //Taste C
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSand = digitalRead(15);
  if (buttonStateSand == LOW) {
    Keyboard.press(115); //Taste S
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSifa = digitalRead(16);
  if (buttonStateSifa == LOW) {
    Keyboard.press(20); //Taste LEER
    delay(100);
    Keyboard.releaseAll();
  }
}

Ersetze das mal durch

Keyboard.print("I");

Okey werde ich gleich umschreiben.
Was mache ich bei der Leertaste?

Einfach ein " "

Habe jetzt einige Korrekturen vorgenommen am Code.

#include <Keyboard.h>
#include <Keyboard_de_DE.h>

//Zugbeeinflussung PZB90
int buttonStateFrei = 0;
int buttonStateWach = 0;
int buttonStateBef = 0;
//Federspeicherbremse
int buttonStateFBA = 0;
int buttonStateFBL = 0;
//Mg-Bremse
int buttonStateMg = 0;
//Fahrtrichtung
int buttonStateFV = 0;
int buttonStateFR = 0;
//Führeraum besetzt
int buttonStateFRI = 0;
int buttonStateFRO = 0;
//Hauptschalter ET
int buttonStateHSE = 0;
int buttonStateHSA = 0;
//Stromabnehmer ET
int buttonStateSTH = 0;
int buttonStateSTS = 0;
//Sand
int buttonStateSand = 0;
//SIFA
int buttonStateSifa = 0;
//Türen
int buttonStateTL = 0;
int buttonStateTR = 0;
int buttonStateTZ = 0;
//Makrofon
int buttonStateMak = 0;


void setup() {
  pinMode(0, INPUT_PULLUP);   //PZB90 Frei
  pinMode(1, INPUT_PULLUP);   //PZB90 Wachsam
  pinMode(2, INPUT_PULLUP);   //PZB90 Befehl 40
  pinMode(3, INPUT_PULLUP);   //Federspeicherbremse Anlegen
  pinMode(4, INPUT_PULLUP);   //Federspeicherbremse Lösen
  pinMode(5, INPUT_PULLUP);   //Mg-Bremse
  pinMode(6, INPUT_PULLUP);   //Fahrtrichtung Vorwärts
  pinMode(7, INPUT_PULLUP);   //Fahrtrichtung Rückwärts
  pinMode(8, INPUT_PULLUP);   //Führerpult Aktivieren
  pinMode(9, INPUT_PULLUP);  //Führerpult Deaktivieren
  pinMode(10, INPUT_PULLUP);  //Hauptschalter Einlegen
  pinMode(11, INPUT_PULLUP);  //Hauptschalter Auslegen
  pinMode(12, INPUT_PULLUP);  //Stromabnehmer Heben
  pinMode(13, INPUT_PULLUP);  //Stromabnehmer Senken
  pinMode(14, INPUT_PULLUP);  //Sanden
  pinMode(15, INPUT_PULLUP);  //SIFA
  pinMode(16, INPUT_PULLUP);  //Tür Links
  pinMode(17, INPUT_PULLUP);  //Tür Rechts
  pinMode(18, INPUT_PULLUP);  //Tür Zu
  pinMode(19, INPUT_PULLUP);  //Tür Makrofon
  Keyboard.begin();
}

void loop() {
  buttonStateFrei = digitalRead(0);
  if (buttonStateFrei == LOW) {
    Keyboard.print("F"); //Taste F
    delay(100);
    Keyboard.releaseAll();
  }
 
  buttonStateWach = digitalRead(1);
  if (buttonStateWach == LOW) {
    Keyboard.print("."); //Taste . (Punkt)
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateBef = digitalRead(2);
  if (buttonStateBef == LOW) {
    Keyboard.print(","); //Taste , (Komma)
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFBA = digitalRead(3);
  if (buttonStateFBA == LOW) {
    Keyboard.print("A"); //Taste A
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFBL = digitalRead(4);
  if (buttonStateFBL == LOW) {
    Keyboard.print("U"); //Taste U
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateMg = digitalRead(5);
  if (buttonStateMg == LOW) {
    Keyboard.print("M"); //Taste M
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFV = digitalRead(6);
  if (buttonStateFV == LOW) {
    Keyboard.print("V"); //Taste V
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFR = digitalRead(7);
  if (buttonStateFR == LOW) {
    Keyboard.print("R"); //Taste R
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFRI = digitalRead(8);
  if (buttonStateFRI == LOW) {
    Keyboard.print("I"); //Taste I
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateFRO = digitalRead(9);
  if (buttonStateFRO == LOW) {
    Keyboard.print("O"); //Taste O
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateHSE = digitalRead(10);
  if (buttonStateHSE == LOW) {
    Keyboard.print("H"); //Taste H
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateHSA = digitalRead(11);
  if (buttonStateHSA == LOW) {
    Keyboard.print("N"); //Taste N
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSTH = digitalRead(12);
  if (buttonStateSTH == LOW) {
    Keyboard.print("E"); //Taste E
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSTS = digitalRead(13);
  if (buttonStateSTS == LOW) {
    Keyboard.print("C"); //Taste C
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSand = digitalRead(14);
  if (buttonStateSand == LOW) {
    Keyboard.print("S"); //Taste S
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateSifa = digitalRead(15);
  if (buttonStateSifa == LOW) {
    Keyboard.print("B"); //Taste B
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateTL = digitalRead(16);
  if (buttonStateTL == LOW) {
    Keyboard.print("L"); //Taste L
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateTR = digitalRead(17);
  if (buttonStateTR == LOW) {
    Keyboard.print("Q"); //Taste Q
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateTZ = digitalRead(18);
  if (buttonStateTZ == LOW) {
    Keyboard.print("Z"); //Taste Z
    delay(100);
    Keyboard.releaseAll();
  }

  buttonStateMak = digitalRead(19);
  if (buttonStateMak == LOW) {
    Keyboard.print("P"); //Taste P
    delay(100);
    Keyboard.releaseAll();
  }
}

Defaktum bleibt folgendes Problem.
Ich möchte die Pins A0-A5 als Input verwenden. Dies sollen dann die Pins 15-20 werden.
Quasi wie folgt:

A0 Pin 15
A1 Pin 16
A2 Pin 17
A3 Pin 18
A4 Pin 19
A5 Pin 20

Wie Löse ich das?

Normal deklarieren wie andere,man kann auch A0, A1 werwenden je nach laune

#include <Keyboard.h>

const byte _Pins[] = {1, 2, 3, 4, 5, 6 ,7, 8, 9, 10, 11, 12, 13, 14, A0, A1, A2, A3, A4, A5};
const char _Key[]  = {"F", ".", usw .....};
const byte pinCount = sizeof(_Pins); 

void setup() {
  for (byte i = 0; i < pinCount; i++) {
    pinMode(ledPins[i], INPUT_PULLUP);
  }
  Keyboard.begin();
}

void loop() {  
  for (byte i = 0; i < pinCount; i++) {
    if ( digitalRead(ledPins[i]) == LOW) {
      Keyboard.print(_Key[i]); 
  }  
  delay(100);
}

Ich habe es mal etwas vereinfacht. (und noch mal korrigiert, Danke michael_x)

Statt i sollte man _Pins[i] beim digitalRead verwenden und das pinMode auch anpassen ...
und ein Semikolon wegputzen

[Nachtrag] ...und jetzt noch _Pins in ledPins umbenennen :slight_smile:
Außerdem hast du ein
const char* _Keys[]

könntest aber auch statt "." nur einzelne Buchstaben '.' definieren und per print senden.

@wwerner,

habe mal eine Struktur angelegt, die das Erweitern/Anpassen noch etwas "verschönert" (zumindest subjektiv :wink: ):

#include <Keyboard.h>

struct macroType {
  byte Pin;
  char Key;
};

macroType macro[] = {
  {2, 'A'},
  {3, 'B'},
  {4, 'C'},
  {5, 'D'},
  {6, 'E'},
  {7, 'F'},
  {8, 'G'},
  {9, 'H'}
};
constexpr byte NoOfMacros = sizeof(macro) / sizeof(macro[0]);

void setup() {
  for (byte i = 0; i < NoOfMacros; i++) {
    pinMode(macro[i].Pin, INPUT_PULLUP);
  }
  Keyboard.begin();
}

void loop() {
  for (byte i = 0; i < NoOfMacros; i++) {
    if ( digitalRead(macro[i].Pin) == LOW) {
      Keyboard.print(macro[i].Key);
    }
    delay(100);
  }
} 

Zum Umschreiben und Testen in Wokwi musste ich es zwischenzeitlich leicht anpassen; für Interessierte hier

weggeklappt ...
/*

  Forum: https://forum.arduino.cc/t/codeproblem-arduino-leonardo-als-tastatur/1160391/9 
  Wokwi: https://wokwi.com/projects/373704069599168513

*/

//#include <Keyboard.h>
#define Keyboard Serial

struct macroType {
  byte Pin;
  char Key;
};

macroType macro[] = {
  {2, 'A'},
  {3, 'B'},
  {4, 'C'},
  {5, 'D'},
  {6, 'E'},
  {7, 'F'},
  {8, 'G'},
  {9, 'H'}
};
constexpr byte NoOfMacros = sizeof(macro) / sizeof(macro[0]);

void setup() {
  for (byte i = 0; i < NoOfMacros; i++) {
    pinMode(macro[i].Pin, INPUT_PULLUP);
  }
  Keyboard.begin(115200);
}

void loop() {
  for (byte i = 0; i < NoOfMacros; i++) {
    if ( digitalRead(macro[i].Pin) == LOW) {
      Keyboard.print(macro[i].Key);
     delay(200);
     }
  }
}  

Siehe hier https://wokwi.com/projects/373704069599168513

P.S.: Muss ggf. noch ein Keyboard.ReleaseAll(); hinter das delay(100); eingefügt werden?

[edit] Bei erneutem Rüberschauen würde ich sagen, dass das delay(100) (besser vielleicht sogar 200?) direkt hinter dem Keyboard.print() stehen muss. Habe ich bei Wokwi mal angepasst. Dann würde es zusammen mit dem ReleaseAll() so aussehen:

#include <Keyboard.h>

struct macroType {
  byte Pin;
  char Key;
};

macroType macro[] = {
  {2, 'A'},
  {3, 'B'},
  {4, 'C'},
  {5, 'D'},
  {6, 'E'},
  {7, 'F'},
  {8, 'G'},
  {9, 'H'}
};
constexpr byte NoOfMacros = sizeof(macro) / sizeof(macro[0]);

void setup() {
  for (byte i = 0; i < NoOfMacros; i++) {
    pinMode(macro[i].Pin, INPUT_PULLUP);
  }
  Keyboard.begin();
}

void loop() {
  for (byte i = 0; i < NoOfMacros; i++) {
    if ( digitalRead(macro[i].Pin) == LOW) {
      Keyboard.print(macro[i].Key);
      delay(200);
      Keyboard.ReleaseAll();
    }
  }
} 

Moin @kevin1897,

da Deine Anwendung offensichtlich eine ganze Anzahl Tasten benötigt und Du die Pins Deines Leonardo intensiv nutzt, wollte ich Dir hier noch eine Möglichkeit aufzeigen, 20 Tasten mit genau 9 Pins abfragen zu können.

Bei Bedarf lässt sich das mit entsprechender Verschaltung leicht noch weiter ausbauen.

Vielleicht hilft es Dir ja mal in Zukunft:

/*

   Forum: https://forum.arduino.cc/t/codeproblem-arduino-leonardo-als-tastatur/1160391/3
   Wokwi: https://wokwi.com/projects/374338338816616449
  
   Matrix-Tastatur für 4 Zeilen x 5 Spalten = 20 Tasten
   benötigt je einen Pin pro Zeile und Spalte = 9 Pins
 

*/


// Tastaturmatrix
int reihe[] = {5, 6, 7, 8};
int spalte[] = {13, 12, 11, 10, 9};
int col_scan;
int last_scan = -1;

constexpr int anzReihen  = sizeof(reihe)/sizeof(reihe[0]);
constexpr int anzSpalten = sizeof(spalte)/sizeof(spalte[0]);

void setup()
{
  Serial.begin(9600);
  for (int i = 0; i < anzReihen; i++)
  {
    //Initialisierung der Reihen-PINs
    pinMode(reihe[i], OUTPUT);
  }
for (int i = 0; i < anzSpalten; i++)
  {
    //Initialisierung der Spalten-PINs
    pinMode(spalte[i], INPUT);
    digitalWrite(spalte[i], HIGH);
  }
}

int Reihe;
int Spalte;

void loop()
{
  if (knopfGedrueckt(Reihe, Spalte)) {
    Aktion(Reihe, Spalte);
  }
}

boolean knopfGedrueckt(int &Reihe, int &Spalte) {
  //Suche nach gedrücktem Knopf
  static boolean tasteGedrueckt = false;
  static unsigned long letzterDruck = 0;
  if (tasteGedrueckt && millis()-letzterDruck < 300) {  // Diese 300 ms verhindern, dass 
                                                        // der Tastendruck "prellt" bzw.
                                                        // schnell mehrfach hintereinander
                                                        // ausgeführt wird
    return false;
  }
  tasteGedrueckt = false;
  for (int i = 0; i < anzReihen; i++)
  {
    if (tasteGedrueckt) break;
    for (int j = 0; j < anzReihen;j++){
      digitalWrite(reihe[j], HIGH);
    }  
    digitalWrite(reihe[i], LOW);
    for (int j = 0; j < anzSpalten; j++)
    {
      col_scan = digitalRead(spalte[j]);
      if (col_scan == LOW)
      {
        letzterDruck = millis();
        tasteGedrueckt = true;
        Reihe  = i;
        Spalte = j;
        break;
      }
    }
  }
  return tasteGedrueckt;
}


void Aktion(int i, int j)
{
  int tasterNr = i*anzSpalten+j+1;
  Serial.print("Taster Nr. ");
  Serial.print(tasterNr);
  Serial.print("\t");
  switch (tasterNr){
    case 1 : // Hier die Aktion für Taster 1
             Serial.println("Aktion für Taster 1");
        break;
    case 9 : // Hier die Aktion für Taster 9
             Serial.println("Aktion für Taster 9");
        break;
    case 16 : // Hier die Aktion für Taster 16
             Serial.println("Aktion für Taster 16");
        break;
    default: // und hier für alle eventuell nicht abgefangenen Tasternummern
             Serial.println("Hier ist noch keine Aktion hinterlegt ....");
        break;
  }
}

Zum Testen siehe: https://wokwi.com/projects/374338338816616449

oder um das Prinzip zu zeigen, erweitert auf 35 Tasten (7x5) mit 12 benötigten Pins
siehe: https://wokwi.com/projects/374340407045785601

// Tastaturmatrix
int reihe[] = {2, 3, 4, 5, 6, 7, 8};
int spalte[] = {13, 12, 11, 10, 9};

Optimal nutzen natürlich quadratische Matrizen (4x4, 5x5, 6x6, 7x7 usw.) die Anzahl der Pins aus.

Gruß
ec2021