Änderung button box

hallo. ich habe mir eine button box für simracing gebaut. code und anleitung habe ich gekauft. anstatt wie beschrieben eine 5x5 matrix mit einfachen button, würd ich gerne einen druckschalter mit led verbauen, der mit der led von einem zweiten schalter verbunden ist. der druckschalter sollte dann als zündung belegt werden, so das ich den drücke, dann geht die led an, und beim zweiten button geht die led auch an. das ist dann der startknopf für den motor.
der druckschalter sollte in beiden positionen das gleiche signal senden, da es ingame nicht anderst funktioniert. sonst müsste ich immer 2x drücken und dann ist das mit der led hinfällig. wenn pins gebraucht werden kann ich die matrix auch auf 4x5 oder 4x4 ändern, ich brauch sowieso nicht 25 buttons. ich verwende ein arduino pro micro.
ist das überhaupt realisierbar und könnte mir bitte jemand helfen? ich hab leider gar keine ahnung vom code schreiben und steig da so gar nicht durch.

vielen dank

//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 4
#defin
#define NUMROWS 5
#define NUMCOLS 5


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

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 },
  { 6, 7, 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

byte rowPins[NUMROWS] = { 21, 20, 19, 18, 15 };
byte colPins[NUMCOLS] = { 14, 16, 10, 9, 8 };

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

Screenshot 2024-08-12 205027
Screenshot 2024-08-12 205033

Vor dem Code schreiben kommt das Code beschreiben. Aus Deiner Erklärung werde ich nicht schlau, geht das noch verständlicher?

Was ist für dich ein "Drucktaster"
ist das ein Taster dessen Kontakt nur so lange geschlossen ist so lang eman den Taster herunterdrückt
oder ist für dich ein - ich nenne es jetzt "Schaltelement" -
Erstes mal runterdrücken =>Kontakt ist geschlossen
Zweites mal runterdrücken => Kontakt ist geöffnet
drittes mal runterdrücken =>Kontakt ist geschlossen
viertes mal runterdrücken => Kontakt ist geöffnet
usw. usf.
Außerdem solltest du in der ganzen Beschreibung jedes mal
Den jeweiligen Taster explizit nennen.

Ich meine das so Beispielhafter Text:
Wenn ich Taster-1 drücke dann soll LED1 eingeschaltet werden
Wenn ich Taster-2 drücke dann soll LED2 und LED3 ausgeschaltet werden
usw

Falls es sich technisch bei den Schalter um den selben handelt wie in der Matrix kannst du die Matrix doch einfach nachbauen. Brauchst sogar weniger Kabel und musst den Code nur leicht anpassen.

Aus einer 5x4 Matrix machst du ein 2x2 Matrix.

Gruß

Pucki

Vielen dank.
Ja ich meine damit einen schalter. Ein button der einrastet.
Button 1 ist rastend mit led, button 2 ist ein taster mit led.
Mein ziel ist button1 1x drücken - led1 und led 2 gehen an. Erneut drücken beide gehen aus. Button2 ist kein problem der ist ja in der matrix integriert und led2 kann ich unabhängig von button2 anschliessen.
Button1 sollte in beiden stellungen jeweils das selbe signal 1x senden.
So könnte ich ingame die zündung belegen, button1 drücken > led1 & 2 gehen an, zündung an > button 1 drücken > led 1 & 2 gehen aus, zündung aus.
Wenn ich button1 einfach in der matrix anschliesse muss ich ihn ja immer 2x drücken um die zündung wieder aus zu machen.
Ich hoffe man verstehts jetzt.
Hier noch der link zum button

Îch würde den Schalter extern anklemmen, also auserhalb der Matrix.

Und dann einfach ihn Abfragen und darauf hin den Rest via Software machen.

Schau dir mal das Prinzip einer Matrix an. !!!
Da kann man kein Schalter einbauen der über die Matrix abgefragt wird. Du kannst ihn Körperlich einbauen, und den Taster weglassen, DAS geht. Aber Abfragen musst du ihn immer extra. !!!

Gruß

Pucki

Moin @f_s_5_4 ,

Du hast geschrieben:

Wenn ich button1 einfach in der matrix anschliesse muss ich ihn ja immer 2x drücken um die zündung wieder aus zu machen.

Das gilt auch für einen Schalter... Er muss auch für jeden Umschaltvorgang einmal betätigt werden. Insofern bringt ein Umbau keine Vereinfachung.

Den Effekt eines Schalters an einem digitalen Eingang kann man mit einem Taster einfach in Software nachbilden. Dazu merkt man sich den aktuell zu simulierenden Status (EIN oder AUS). Mit jeder Tastenbetätigung schaltet man im Code den Status um, aus AUS wird EIN und dann wieder AUS, EIN,...usw

Wenn ich Deine Beschreibung richtig verstanden habe, sollte das mit wenigen Zeilen machbar sein

Gruß
ec2021

P.S.: Der Code und die von Dir gepostete Schaltung zeigen Folgendes:

  • Es sind vier Rotary Encoder und 20 Taster verbaut. Letztere werden auf die Zahlen 0 bis 19 abgebildet.
  • Die Tasterfunktionen der Rotary Encoder werden zusätzlich in der Matrix ausgewertet. Ihnen sind die Werte 20 bis 23 zugeordnet.
  • Bei Betätigung eines Tasters wird - ebenso wie beim Drehen eines Rotary Encoders - dies an die Funktion setButton() der Joystick-Library umgesetzt. Dabei benutzt der erste Drehencoder bei Drehung gegen den Uhrzeigersinn den Wert 24, im Uhrzeigersinn 25. Den weiteren Encodern sind die Werte (26, 27), (28,29) und (30,31) zugeordnet.
  • Diese Werte entsprechen den in der Joystick-Library simulierten 32 "Knöpfen" 0 .. 31.

LEDs sind derzeit nicht integriert.

Für eine weitere Hilfe fehlt nun die Zuordnung der simulierten Joystick-Buttons zu den Funktionen des Spiels.

Frage: Geht es Dir nur um eine geänderte Eingabemöglichkeit oder willst Du bestimmte reale Funktionen nachbilden, z.B. den Kippschalter eines realen Fahr-/Flugzeugs? Bistabile Schalter können im Gegensatz zu Tastern nicht so einfach in einer Matrix abgehandelt werden wie Taster, bei denen zur gleichen Zeit maximal nur einer betätigt wird (Stichwort Keyboard Ghosting).

Ich habe Deine "ButtonBox" mal bei Wokwi nachempfunden, allerdings mit einer extrem "verschlankten" und angepassten Joystick-Library (die letztlich nur die Nummer der gedrückten Taste ausgibt sowie deren Zustand "Pressed" oder "Released". Die Pins der Matrix entsprechen Deinem Code. Die Encoder habe ich an die Anschlüsse A0 .. A7 (anstatt 0 ... 7) angeschlossen, um die serielle Ausgabe auf den Pins 0 und 1 zu erhalten.

Da die bei Wokwi vorhandenen Rotary Encoder zwar auch eine Buttonfunktion, allerdings gegen GND, haben, lassen sich diese nicht so einfach in der Matrix auswerten. Stattdessen habe ich vier extra Buttons (schwarz) spendiert.

Hier kann man nachvollziehen, welcher Code bei welcher Taste bzw. Encoderdrehung ausgelöst wird.

https://wokwi.com/projects/406121408721209345

Bis auf die Pins der Encoder ist alles wie in Deinem Code geblieben.

Jetzt wäre es noch interessant, welche dieser Tasten Deine ButtonBox auf jeden Fall realisieren soll ...

Nachtrag:

Hier https://wokwi.com/projects/406127235095478273 eine Version mit zwei Leds, die über die blaue und rote Taste gesteuert werden. Blau: "Zündung Ein/Aus", Rot: "Motor starten". Ob das die richtigen Tasten im Spiel sind, weiß ich nicht, aber es zeigt das Prinzip.

Hier der Sketch und die Wokwi-Verdrahtung
/*
   Forum: https://forum.arduino.cc/t/anderung-button-box/1291200
   Wokwi: https://wokwi.com/projects/406127235095478273

*/


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

#define ENABLE_PULLUPS
#define NUMROTARIES 4
//#defin
#define NUMROWS 5
#define NUMCOLS 5

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

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 },
  { 6, 7, 30, 31, 0 },
  };
*/
rotariesdef rotaries[NUMROTARIES] {
  { A0, A1, 24, 25, 0 },
  { A2, A3, 26, 27, 0 },
  { A4, A5, 28, 29, 0 },
  { A6, A7, 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

byte rowPins[NUMROWS] = { 21, 20, 19, 18, 15 };
byte colPins[NUMCOLS] = { 14, 16, 10, 9, 8 };

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

// Für die LED Steuerung
const byte led1Pin = 12;
const byte led2Pin = 11;

// Die den Button zugeordneten Werte, die zum "Zündung an" (button1)
//                                    und zum "Motor starten" (button2)
const byte button1 = 0;  // Bei Wokwi BLAU
const byte button2 = 1;  // Bei Wokwi ROT

byte button1State = HIGH;  // Ledstatus, der beim nächsten Tastendruck button1 gesetzt werden soll



void setup() {
  Joystick.begin();
  rotary_init();
  pinMode(led1Pin, OUTPUT);
  pinMode(led2Pin, OUTPUT);
  setLed1(LOW);
  setLed2(LOW);
}

void loop() {

  CheckAllEncoders();

  CheckAllButtons();
}

void setLed1(byte state) {
  digitalWrite(led1Pin, state);
}

void setLed2(byte state) {
  digitalWrite(led2Pin, state);
}

void setLeds(byte state) {
  setLed1(state);
  setLed2(state);
}

void handleLeds(byte kchar) {
  switch (kchar) {
    case button1:
      Serial.print("ZÜNDUNG ");
      Serial.println((button1State == HIGH) ? "Ein" : "Aus");
      setLeds(button1State);
      button1State = !button1State;
      break;
    case button2:
      if (button1State) {
        Serial.println("Die Zündung ist aus!");
      } else {
        Serial.println("Motor wird gestarted");
      }
      setLeds(LOW);
      button1State = HIGH;
      break;
  }
}

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:
            handleLeds(buttbx.key[i].kchar);
          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);
    };
  }
}

Die genutzten Tasten lassen sich durch die Werte

const byte button1 = 0;  // Bei Wokwi BLAU
const byte button2 = 1;  // Bei Wokwi ROT

anpassen.

Es ist zu beachten, dass Dein Originalcode

  • einmal sendet, wenn die Taste gedrückt wird (PRESSED)
  • und ein zweites Mal, wenn man sie etwas länger hält (HOLD) sowie
  • zweimal sendet, wenn die Taste gelöst wird (RELEASED und IDLE).

Das habe ich so beibehalten!

Viel Erfolg
ec2021

nein ich möchte eine reale funktion nachbilden, einfach mit dem verlinkten schalter statt einem kippschalter. der muss auch nicht in der matrix sein, die kann man auch verkleinern um pins frei zu haben. 4x4 reicht vollkommen. und die leds der schalter müssen auch nicht über arduino gesteuert werden, ich kann die auch an einem netzteil anschliessen.

Vielleicht wäre es hilfreich, wenn Du mal ein Foto oder eine Abbildung Deiner Buttonbox posten, der man entnehmen, wie das Ganze aussieht bzw. aussehen soll und welchem Joystick-Button die Taster/Schalter zugeordnet sein sollen?

Grundsätzlich ist das alles kein Problem, wenn die o.a. Informationen vorliegen.

Zwei LEDs lassen sich locker noch vom Controller ansteuern.

Bisher verstehe ich, dass

  • 16 Tasten genügen (4x4 Matrix)
  • keine Dreh-Encoder eingesetzt werden (?)
  • zusätzlich ein Schalter mit integrierter Led verwendet werden soll
  • eine weitere Led verwendet werden soll

Bedeutet

  • 8 Pins für die Matrix
  • 1 Pin für den Schalter
  • 2 Pins für die LEDs

Soweit korrekt?

Ich sollte freitag alles geliefert bekommen, dann bau ich es mal zusammen und mach ein foto. Ist wohl am einfachsten.
Encoder muss ich noch schauen wieviele ich verbauen kann. Ich mach das am wochenende mal.

Vielen dank für deine hilfe

Ja, es ist besser weiterzumachen, wenn Du Dir darüber im Klaren bist, welche Bedienelemente Du tatsächlich verbauen willst.

Es wäre günstig, wenn Du Deine Auswahl postest, bevor Du alles fertig baust, um prüfen zu können, dass Verdrahtung und Software zueinander passen.

so ich habe jetzt alles beisammen.


die durchgestrichenen buttons sind irrelevant, die verwende ich für andere dinge



druckschalter mit led 1, gekennzeichnet mit 4

bei den kippschaltern ist ein fehler auf der skizze, da kommen 3 stück. also eine 4x5 matrix. damit wären 3 pins frei, da ja nur 3 encoder verwendet und nicht wie in der anleitung 4.

ich hoffe es ist soweit klar was ich meine.

zur sicherheit:
3 encoder, 4x5 matrix mit 19 tastern, 1 druckschalter mit led

schalter 4 soll gedrückt werden, led1 und led2 sollen angehen, signal senden um zündung zu belegen, schalter 4 erneut drücken sollen beide led aus gehen und selbes signal soll am pc ankommen um zündung auszuschalten. das game ist für taster ausgelegt, deshalb müsste es 2mal dasselbe signal ankommen.

vielen dank für deine hilfe

sorry ich konnte nicht alle bilder in einem post hinzufügen


taster, auf der skizze als 1 gekennzeichent


encoder mit taster, gekennzeichnet mit 2


kippschalter federnd, gekennzeichnet mit 5


Screenshot 2024-08-16 233918
taster mit led2, gekennzeichnet mit 3

Frage: Federn die "Kippschalter" von alleine in die Mittelstellung zurück, wenn man sie loslässt?

Wenn ja: Sind beiden Schaltstellungen unterschiedliche Funktionen zugeordnet? Welche?

Ja die federn alleine zurück und ja da werden verschieden dinge belegt. Was weiss ich noch nicht.

https://arduino-projekte.webnode.at/meine-libraries/16er-tastatur-mit-i2c/

Schau dir mal die ZEICHNUNG an in den Projekt.

Wenn du eine Taste in der Matrix leer lässt passiert fast nix. Nur das deren Wert (wenn gedrückt wäre) niemals ausgelösst wird. Du musst halt nur den Kabel um den fehlenden Taster herum legen, damit die Matrix selbst bestehen bleibt.

Wenn du nun anstelle der TASTE ein Schalter einbaust, und den EXTERN also nicht über die Matrix abfragst, geht das problemlos. Genauso wie du die LED im Schalter extern ansteuern musst.

Also wenn SCHALTER HIGH dann Digital-Pin der LED auch auf HIGH.

Du kannst aus einer Matrix jedezeit eine Taste entfernen, deren Wert ist dann auf Ewigkeiten LOW. Bestes Beispiel: Eine PC-Tastatur. Wenn da eine Taste nicht funktioniert, juckt das den MC der die Taste in ein Signal umwandelt auch nicht.

Das ist eigentlich alles.

Gruß

Pucki

Ok.

Du kannst die "Kipptaster" so einsetzen, dass der mittlere Anschluss z.B. an einer Zeile und die äußeren an separaten Spalten angeschlossen werden.

Die Zeilen sind in dem von Dir geposteten Anschlussdiagramm mit roten, die Spalten mit blauen Linien dargestellt.

Ja das ist alles klar. Mit all den tasten in der matrix komm ich klar. Ich weiss nur bei dem schalter nicht wie ich den code ändern muss und wie ich die led steuern kann