Button Matrix für Simulator

Ach schau.
Danke.

Einspruch.

https://www.mikrocontroller.net/topic/241792

Mal die Matrix ohne Dioden.
Da kann man ohne Probleme 2 Tasten erkennen. Wie sieht es aber bei 3 aus? Bei 3 Tasten kann man nicht immer erkennen welche Taste als 3. gedrückt wurde.

zB:
grafik

  • Taste 1 wird gedrückt. Pin 8 hat Verbindung mit Pin 1
  • Taste 9 wird gedrückt. Pin 6, 8 und 1 haben Verbindung untereinander. aus Logik der vorherigen Verbindung erkennt man die Verbindung von Pin 6 zu Pin 1 in einem Zweiten Moment.
  • Taste 0 wird gedrückt. Dann haben die Pin6, 8, 1, und 2 Verbindung. Den gleichen Effekt könnte die Taste 2 bewerkstelligen.

Also die dritte gedrückte Taste könnte die Taste 0 sowie auch die Taste 2 sein.

Das kann der TCA8418 auch nicht besser.

Sind Dioden in Serie zu den Tasten so erkennt man ob Taste 0 oder die Taste 2 weil der Stromfluß durch die Taste nur in eine Richtung möglich ist.

Grüße Uwe

Die klammer sorgt dafür das ich für die spalten und Zeilen eine fortlaufenden Zahl habe. da row und col bei mit 0 anfangen habe ich noch eine +1 bei row
z. B.
((0 + 1) + (0 * 6)) wäre 1
((4 + 1) + (3 * 6)) wäre 23

Da habe ich es so gemacht da ich zur hälfte den code mit chatgpt und zur anderen hälfte selber geschrieben habe. Ich wusste nicht wie ich es so mache das wenn Knopf 1 dann dpad hoch (1) wenn Knopf 2 dann dpad rechts (3) und wenn beide dpad recht-oben (2). Das was ich da habe macht was es soll deswegen hatte ich es gelassen

Ich weiß das ich zu viel zwischen Speicher aber das war nur zum testen. Da der code aktuell nicht geht. Mein code ist im EVA Prinzip. Die Eingang (Einlesen der Matrix) geht und auch die Ausgabe (Senden an pc). Meine Verarbeitung die sich um Knopf oder Schalter kümmert macht Probleme, die ich aber selber finden dürfte

Ja genaue ich nutze eine pro micro

Meiner sieht genau so aus

(0 + 1 + 0 * 6) ist 1 - immer
(4 + 1 + 3 * 6) ist 23 - ebenfalls

Ich plädiere dafür, das Code von diesem unsäglichen Ding als solcher gekennzeichnet wird.
Dann braucht man sich da nicht mehr drum kümmern.

Das die ROW/COL Kombination nacheinander gesetzt und abgefragt werden, geht das natürlich auch.
Passiert doch auch.
Ich versteh nicht, was Du damit für ein Problem hast.
Ich frage nacheinander alle 16 Tasten ab.
Speichere alle 16 Stati und wenn ich durch bin reagiere ich da drauf.
Beim nächsten Umlauf lösche ich alle Stati und lese alle 16 wieder aus.

Eben nicht.
Bei bestimmten Kombinationen von 3 Tasten werden 4 gedrückte Tasten erkannt. Es gibt keine Möglichkeit in meinem Beispiel zu erkennen welche der Tasten 0 und 2 gedrückt wurde.
Bitte kontrolliere nochmal meinen Beitrag.

Grüße Uwe

Uwe, mir ist es muessig.

Wenn ich auf auf einem COL LOW setze und alle anderen HIGH,
dann kann ich alle auf dem COL verbundenen ROW abfragen und bekomme die Tasten als LOW zurück, die gedrückt.
Und nur die tatsächlich gedrückten Tasten.
Nicht mehr und auch nicht weniger.

Ich weiß nicht, ob der Code das macht.
Aber vielleicht gibts ja jemanden, der das mal ausprobiert.



#include <Streaming.h>     // https://github.com/janelia-arduino/Streaming

constexpr byte rowPin[] {2, 3, 4, 5};
constexpr byte colPin[] {6, 7, 8, 9};
constexpr byte rows {sizeof(rowPin)};
constexpr byte cols {sizeof(colPin)};

byte tastenarray[rows * cols] = {false};

void setup()
{
  Serial.begin(115200);
  Serial << (F("\r\nStart...\r\n")) << endl;
  for (byte b = 0; b < rows; b++)
  {
    pinMode(rowPin[b], INPUT_PULLUP);
  }
  for (byte b = 0; b < cols; b++)
  {
    pinMode(colPin[b], OUTPUT);
    digitalWrite(colPin[b], HIGH);
  }
}

void  loop()

{
  for (byte c = 0; c < cols; c++)
  {
    digitalWrite(colPin[c], LOW);
    for (byte r = 0; r < rows; r++)
    {
      tastenarray[c * cols + r] = digitalRead(r);
    }
    digitalWrite(c, HIGH);
  }
  for (byte b = 1; b < sizeof(tastenarray) + 1; b++)
  {
    Serial << tastenarray[b - 1] << ' ';
    if (b % 4 == 0)
    {
      Serial << endl;
    }
  }
}

// Wahrheitstabelle - COL/ROW sind die Pinnummern.
/*
  COL   2 3 4 5
  ROW 6          - Taste 1, 5, 9,13
  ROW 7          - Taste 2, 6,10,14
  ROW 8          - Taste 3, 7,11,15
  ROW 9          - Taste 4, 8,12,16
*/

sollte wohl

digitalWrite(colPin[c], HIGH);

sein.

yupp