Adafruit 16x32 LED-Matrix interaktiv machen

Ich habe an einem Arduino-UNO eine Adafruit 16x32 angeschlossen und ein wenig mit den Beispiel-Sketches gespielt. Leider habe ich nicht herausgefunden, wie ich einfachste Objekte auf Knopfdruck ändern kann.
Ich möchte etwas größeres bauen, halte es der einfachheit aber erstmal simpel.

Hier der Sketch:

#include <Adafruit_GFX.h>   // Core graphics library
#include <RGBmatrixPanel.h> // Hardware-specific library

// Definition der Eingänge
int But1 = 10; //Nachtlicht
int But2 = 11; //Blinklicht

int But1an;
int But2an;

int Z1; //Z steht für Zahl oder Ziffer
int Z2;

int Gesammt;

#define CLK 8
#define LAT A3
#define OE  9
#define A   A0
#define B   A1
#define C   A2
RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false);
  
  int muster0[1];
  int muster1[1];
  int muster2[1];
  int muster3[1];

  
/*
Button1 = 1
Button2 = 2

0 = Schwarz
1 = Roter (draw) Kreis
2 = Blaues (fill) Viereck / gelber Hintergrund
3 = Lila (draw) Viereck / orange Hintergrund

*/

void setup ()

{
  pinMode(But1, INPUT);
  pinMode(But2, INPUT);
  
    matrix.begin();

  muster0[1];
  {
  matrix.fillScreen(matrix.Color333(0, 0, 0));
  }
  muster1[1];
  {
  matrix.fillScreen(matrix.Color333(0, 0, 0));
  matrix.drawCircle(14, 7, 7, matrix.Color333(7, 7, 7));
  }
  muster2[1];
  {
  matrix.fillScreen(matrix.Color333(7, 7, 0));
  matrix.fillRect(4, 4, 12, 12, matrix.Color333(0, 0, 7));
  }
  muster3[1];
  {
  matrix.fillScreen(matrix.Color333(4, 1, 0));
  matrix.drawRect(3, 3, 30, 14, matrix.Color333(7, 0, 7));
  }

}
void loop ()
{

// Eingänge werden gelesen.
  But1an = digitalRead(But1);
  But2an = digitalRead(But2);

// Gelesene Daten werden umgerechnet.
  if (But1an == HIGH){Z1 = 1;  }
  if (But1an == LOW){Z1 = 0;  }
  if (But2an == HIGH){Z2 = 2;  }
  if (But2an == LOW){Z2 = 0;  }

  Gesammt = (Z1 + Z2);
  delay(100);

  if (Gesammt == 0)
  {
    muster0[1];
    delay(100);
  }
  
  if (Gesammt == 1)
  {
    muster1[1];
    delay(100);
  }  
  
  if (Gesammt == 2)
  {
    muster2[1];
    delay(100);
  } 
  
  if (Gesammt == 3)
  {
    muster3[1];
    delay(100);
  } 
}

Wie im Sketch zu sehen ist die Matrix wie auf der Adafruit-Seite angegeben angeschlossen und zwei Buttons sind auf den Pins 10 und 11.
Wie bringe ich den Uno jetzt dazu, auf Knopfdruck das Bild zu ändern?

Du hast mehrere Probleme:

"int muster0[1];" definiert ein Array mit der Größe 1 (also ist es gar kein Array). Die Zählung beginnt bei 0.

Ich weiß nicht was Du mit diesem Kode machen willst:

muster0[1];
  {
  matrix.fillScreen(matrix.Color333(0, 0, 0));
  }

Du bist mit "muster0[1];" außerhalb des Index des Arrays.

Hast Du pullup oder pulldown Widerstände an den Tastern?

Grüße Uwe

Ich mach mal rückwärts:

  • Das sind (glaub ich) Pulldownwiederstände, nach diesem Beispiel.
    -Mit dem Code wollte ich ein bestimmtes Muster abrufen. Ich weis, er steht an der falschen stelle. Ich sollte nicht ins Forum schreiben, wenn ich übermüdet bin. Im grunde möchte ich eine kleine Animation (bestehend aus 2-3 Bildern) abspielen lassen, solange der entsprechende Button gedrückt ist. Ich weis, die Zählung beginnt bei null und eigentlich müsste die Zeile ungefähr so aussehen:
muster0[0] =  { matrix.fillScreen(matrix.Color333(0, 0, 0));
  }

Und im Loop wird eine Animation dann bewerkstelligt mit:

  if (Gesammt == 1)
  {
   for (int i = 0; i < 1; i++);
    muster1[i];
    delay(100);
  }
for (int i = 0; i < 1; i++);
    muster1[i];
    delay(100);

Das macht nicht was du meinst. Du willst wohl das hier:

for (int i = 0; i < 1; i++)
{
    muster1[i];
    delay(100);
}

Allerdings wird das selbst so nur einmal ausgeführt. Da i nur einmal < 1 ist

Wenn das eine Funktionsdefinition sein soll dann geht das anders. Eine Funktion hat keinen Index. Mann könnte allerdings, falls man klare Ideen mit Pointern auf Funktionen hat, damit arbeiten.

Eine Funktion definiert man AUßERHALB von anderen Funktionen.

Grüße Uwe

Zur Zeit sieht mein Code so aus:

#include <Adafruit_GFX.h>   // Core graphics library
#include <RGBmatrixPanel.h> // Hardware-specific library

// Definition der Eingänge
#define CLK 8
#define LAT A3
#define OE  9
#define A   A0
#define B   A1
#define C   A2
RGBmatrixPanel matrix(A, B, C, CLK, LAT, OE, false);

int Button1 = 10; 
int Button2 = 11; 
int Button3 = 12; 
int Button4 = 13; 
int Button1an;
int Button2an;
int Button3an;
int Button4an;
int Button5an;
int Z1;
int Z2;
int Z3;
int Z4;
int Gesammt;

int muster0[1];
int muster1[1];
int muster2[2];
int muster3[2];
  
void setup ()

{  
  pinMode(Button1, INPUT);
  pinMode(Button2, INPUT);
  pinMode(Button3, INPUT);
  pinMode(Button4, INPUT);
  
  muster0[0];
  {
    matrix.begin(),
    matrix.fillScreen(matrix.Color333(0, 0, 0));
  }
  muster1[0];
  {
    matrix.begin(),
    matrix.fillScreen(matrix.Color333(0, 0, 0)),
    matrix.drawRect(0, 0, 32, 16, matrix.Color333(7, 0, 0)),
    matrix.drawRect(1, 1, 30, 14, matrix.Color333(7, 0, 0));
  }
  muster2[0];
  {
    matrix.begin(),
    matrix.fillScreen(matrix.Color333(0, 0, 0)),
    matrix.fillTriangle(0, 0, 0, 15, 32, 8, matrix.Color333(7, 7, 0));
  }
  muster2[1];
  {
    matrix.begin(),
    matrix.fillTriangle(0, 0, 0, 15, 32, 8, matrix.Color333(0, 0, 0));
  }
  muster3[0];
  {
    matrix.begin(),
    matrix.fillScreen(matrix.Color333(0, 0, 0)),
    matrix.drawRect(0, 0, 32, 16, matrix.Color333(7, 0, 0)),
    matrix.drawRect(1, 1, 30, 14, matrix.Color333(7, 0, 0)),
    matrix.fillRect(10, 5, 12, 6, matrix.Color333(7, 7, 7));
  }
  muster3[1];
  {
    matrix.begin(),
    matrix.fillScreen(matrix.Color333(0, 0, 0)),
    matrix.drawRect(0, 0, 32, 16, matrix.Color333(7, 0, 0)),
    matrix.drawRect(1, 1, 30, 14, matrix.Color333(7, 0, 0)),
    matrix.fillRect(10, 5, 12, 6, matrix.Color333(0, 7, 0));
  }
}
void loop ()
{

// Eingänge werden gelesen.
  Button1an = digitalRead(Button1);
  Button2an = digitalRead(Button2);
  Button3an = digitalRead(Button3);
  Button4an = digitalRead(Button4);
 
// Gelesene Daten werden umgerechnet.
  if (Button1an == HIGH){Z1 = 1;  }
  if (Button1an == LOW){Z1 = 0;  }
  if (Button2an == HIGH){Z2 = 2;  }
  if (Button2an == LOW){Z2 = 0;  }
  if (Button3an == HIGH){Z3 = 4;  }
  if (Button3an == LOW){Z3 = 0;  }
  if (Button4an == HIGH){Z4 = 8;  }
  if (Button4an == LOW){Z4 = 0;  }
  Gesammt = (Z1 + Z2 + Z3 + Z4);
  delay(100);

    if (Gesammt == 0)
  {
  for (int i = 0; i < 1; i++)
  {
  muster0[i];
  delay(100);
  }}

    if (Gesammt == 1)
  {
  for (int i = 0; i < 1; i++)
  {
  muster1[i];
  delay(100);
  }}
    if (Gesammt == 2)
  {
  for (int i = 0; i < 2; i++)
  {
  muster2[i];
  delay(500);
  }} 
    if (Gesammt == 3)
  {
  for (int i = 0; i < 2; i++)
  {
  muster3[i];
  delay(500);
  }} 
}

Aus einen mir unbekannten Grund wird der Loop nicht wiederholt und das letzte Bild angezeigt.
@ uwefed: Danke für den Link, das werde ich jetzt mal durchstöbern :smiley:

Das funktioniert nicht weil Du die Funktionen falsch definierst. Schau mal den Link an und lerne es.
Grüße Uwe