Matrix Ansteuerung mittels Klasse in eigenem Tab

Hallo zusammen,

ich heiße Lukas und bin ganz neu hier im Forum. Zum Einstand habe ich gleich mal etwas Kniffliges mitgebracht :wink:

Ich habe ein größeres Projekt, dass soweit auch schon sehr gut funktioniert. Jetzt möchte ich das Ganze um mehrere Matrix Anzeigen erweitern, die jedoch alle unterschiedlich sind. Dazu möchte ich mit der Adafruit_NeoMatrix arbeiten. Damit das ganze jetzt aber nicht irgendwann unübersichtlich wird, hatte ich die Idee, alles, was mit der Matrix zu tun hat, in eine Klasse in einem eigenen Tab auszulagern. Ein super Vorhaben, wenn man sowohl mit Matrix, als auch mit externen Klassen noch nie gearbeitet hat :smiley:

Die Matrix Anzeigen sollen nun verschiedene (fest definierte) Dinge anzeigen können. Das sind sowohl Zahlen und Buchstaben als auch Symbole. Der Zielzustand soll sein, dass ich aus dem Hauptprogramm heraus den Aufruf „Matrix1.show(symbol3)“ starte und die Matrix dann das festgelegte Symbol an der festgelegten Stelle anzeigt.

Wie gehe ich dazu am besten vor? Klar, in der Matrix Klasse müssen die ganzen Methoden definiert werden. Ich müsste dann also in meiner Methode die Methode der Adafruit Bibliothek aufrufen. Funktioniert das problemlos? Wo richte ich die Matrix an sich ein und definiere sie? Kann ich das auch in der Klasse machen, oder muss das im Hauptprogramm geschehen? Bzw. was ist hier am sinnvollsten?

Die Daten der Matrix und der Port sind immer gleich und können fest einprogrammiert werden.

Ich freue mich auf Eure Antworten

Lukas

Mach mit einem kleinen Demo-Sketch nur die Ausgabe von "Hello World" oder was auch immer.
Mach dir nur mal eine Anzeige.
Dann bastelst eine Klasse für die Anzeige - im gleichen Tab.
Dann gibst die Klasse in einem separaten Tab.
Wenn das dann funktioniert, dann kannst du das in deinen großen Sketch rüberholen.

wenn ich das richtig verstehe du hast keine Ahnung aber bist dir sicher dass du es unbedingt brauchst.

das Lib hat genug um damit bequem zu arbeiten. Wäre es nicht sinnvoller zuerst den Projekt zu verwirklichen und dann nach Bedarf die Übersichtlichkeit zu verschaffen?

Aktueller Stand: Display funktioniert und zeigt das an, was es soll. Die Befehle für die Ansteuerung kommen aus einer Klasse (im selben Tab).

Jetzt macht das aktuell mit der Klasse überhaupt keinen Sinn, denn ich kann nur mit einem Objekt arbeiten.

# include <Adafruit_NeoMatrix.h>
# define Matrix1Pin 13
Adafruit_NeoMatrix Matrix1 = Adafruit_NeoMatrix(8, 32, Matrix1Pin,
                               NEO_MATRIX_TOP + NEO_MATRIX_RIGHT +
                               NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
                               NEO_GRB + NEO_KHZ800);

class MatrixFunktionen{
 public:
  void test1(){
  Matrix1.fillRect(0, 0, 8, 6, Matrix1.Color(255, 255, 0));
  }

....
  
  };


MatrixFunktionen matrix1;
MatrixFunktionen matrix2;


void setup()
{
  Matrix1.setBrightness(10);
  Matrix1.begin();

  
}
void loop() {
  
matrix1.test1();
Matrix1.show();
}

Hier kann ich jetzt nur mit Matrix1 arbeiten, denn nur sie wird im allgemeinen Teil definiert. Ich müsste mir also (korrigiert mich gerne) eine Matrix mit einer Klasse erstmal definieren.
Im Hauptcode erstelle ich dann ein Objekt, dass als erstes diese Funktion zur Definition aufruft. Als Ergebnis bekomme ich dann (im Konkreten Fall hier) Matrix1 zurück. Dieses Matrix1 müsste ich dann an jede aufgerufene Funktion übergeben, damit die Ansteuerung eben auch auf genau dieser funktioniert. Passt das so von meinem Verständnis?

Wenn ja, ist die große Frage: Wie setze ich das um?

es gibt auch nur eine Matrix1. Womit willst du sonst arbeiten?
Matrix1, matrix1, matrix2 ... nicht gerade geschickte Wahl der Objektbenennung.

Genau das ist ja die Frage. Wie erzeuge ich die verschiedenen Anzeigen?
Jede Anzeige muss ja erstmal "konfiguriert" werden. Kann ich das über eine Methode in der Klasse lösen?

In der Klasse heißt es z.B.

Matrix1.fillRect(0, 0, 8, 6, Matrix1.Color(255, 255, 0));

Dieses Matrix1 darf dort meines Erachtens nicht stehen, denn dann bin ich auf genau diese beschränkt. Aber wie bekomme ich das variabel, sodass ich mit verschiedenen Objekten (hinter jedem steckt eine Anzeige) auf die Methode zugreifen kann?

Nimm eine Referenz auf ein Objekt und wenn du das objekt anlegst übergibst du dem objekt die Referenz auf das Objekt. Versteht man nicht, gell? Benenne deine Objekte vernünftig!

Wenn das anzeigen sind, dann benenne deine anzeigen auch anzeigen.
Wenn es zwei Matrixen gibt, lege zwei Matrixen an.
Stell mal einen vollständing kompilierbaren Sketch ein der auch kompiliert. Kommentiere aus, was nicht kompilieren würde! Zeige zwei anzeigen!

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>


#define matrixWidth 16
#define matrixHeight  16
#define tilesX  2
#define tilesY  1

Adafruit_NeoMatrix matrix2 =  Adafruit_NeoMatrix(matrixWidth,matrixHeight, tilesX, tilesY, 4,  
  NEO_MATRIX_TOP   + NEO_MATRIX_RIGHT   + NEO_MATRIX_ROWS   + NEO_MATRIX_ZIGZAG +
  NEO_TILE_TOP + NEO_TILE_RIGHT + NEO_TILE_ROWS,
  NEO_GRB + NEO_KHZ800);
    
Adafruit_NeoMatrix matrix1 =  Adafruit_NeoMatrix(matrixWidth,matrixHeight, tilesX, tilesY, 2,  
  NEO_MATRIX_TOP   + NEO_MATRIX_RIGHT   + NEO_MATRIX_ROWS   + NEO_MATRIX_ZIGZAG +
  NEO_TILE_TOP + NEO_TILE_RIGHT + NEO_TILE_ROWS,
  NEO_GRB + NEO_KHZ800);

void setup() {

  // Start the serial interface
  Serial.begin(57600);
  
  matrix1.begin();
  matrix1.setTextWrap(false);
  matrix1.setBrightness(5);
  
  matrix2.begin();
  matrix2.setTextWrap(false);
  matrix2.setBrightness(5);

  uint16_t numLEDs1 = matrix1.numPixels();
  Serial.print("Number of LEDs in matrix1: ");
  Serial.print(numLEDs1);
  
  uint16_t numLEDs2 = matrix2.numPixels();
  Serial.print(" Number of LEDs in matrix2: ");
  Serial.print(numLEDs2);

Ein define ist an der Stelle nicht nötig.

constexpr byte Matrix1Pin {13};

Durchnummerieren von Variablen ist meistens ein grober Fehler!
Zu dem Zweck gibt es Arrays.

Welchen Sinn hat es hier über den CopyKonstruktor zu gehen?
Ja, der Aufruf wird weg optimiert (hoffentlich), aber Sinn sehe ich nicht.

Dieses tuts doch genauso gut:

Adafruit_NeoMatrix Matrix1 {8, 32, Matrix1Pin,
                               NEO_MATRIX_TOP + NEO_MATRIX_RIGHT +
                               NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
                               NEO_GRB + NEO_KHZ800};

Hallo zusammen

Das steht so im Beispiel Sketch, also habe ich das einfach verwendet :smile:

Für mich zum Verständnis: Warum wird bei sowas auf Arrays gesetzt? Am Ende kommt das gleiche Ergebnis dabei heraus, welchen Vorteil bieten Arrays und was kann beim durchnummerieren problematisch werden?

Gute Frage, auch das kommt aus dem Sketch.

Ich habe vor einigen Jahren in der Schule einmal etwas mit objektorientierter Programmierung zu tun gehabt, habe das danach aber nie wieder gebraucht.

Danke schon einmal für euren Input bisher. Ich gehe das Thema die Tage noch einmal an und überarbeite dieses Teilprojekt.

Viele Grüße
Lukas

über die Elemente eines Arrays kann man mit einer For Schleife iterieren und dann erspart man sich duplizierte Code Zeilen

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.