Arduino mega 2560 LED-Cube 5x5x5

Hallo,

vor kurzem hab ich mir ein Arduino Mega 2560 gekauft und gemerkt, dass man mit Arduino viele coole Sachen machen kann.
Ich hab dann versucht 3x3x3 LED-Cube zu bauen und es ohne Probleme geschafft zu programmieren. Dann wurde es interessanter und ich versuchte 5x5x5 LED-Cube zu bauen, am anfangt nutzte ich zuerst programmier Technik von 3x3x3 LED-Cube (9 Säulen und 3 Ebenen) und merkte es ist aufwändiger und verbraucht viel Speicher also hab ich mich umgestellt auf Multiplex und nutzte es auch. Zuerst war es noch gut aber dann versuchte ich Buchstaben zu programmieren, und ja die ersten Effekte klappten noch gut aber jetzt komm ich an den Punkt wo ich einfach eure persönlich Meinung wissen will.
Hier ist mein Code und ich würde gerne wissen ob ich es irgendwie anders schreiben kann, und wie ich die Buchstaben von links nach recht bewegen kann (wenn es äußerst abgebildet ist und dann in Uhrzeigerrichtung sich bewegt)?
Code:

#include <TimerOne.h>

//LED-Ebenen////////////////////////////////////////////////////////////////////
int E1 = A0;
int E2 = A1;
int E3 = A2;
int E4 = A3;
int E5 = A4;

//Umkehrung von HIGH und LOW/////////////////////////////////////////////////////
int An = LOW;                // Die Umkehrung ist nötig da wir durch die 
int Aus = HIGH;              // Verstärkerschaltung eine umgekehrte Logik erhalten

//Erstellung der Arrays der LED Säulen.///////////////////////////////
int LEDs[25] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24};




//Erstellung des 3-Dimensionalen Arrays//////////////////////////////////////////////////////////

int Matrix[5][5][5] =      {  {{ 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 }},
                               
                              {{ 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 }},        
                             
                              {{ 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 }},
    
                              {{ 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 }},
       
                              {{ 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 },
                               { 0, 0, 0, 0, 0 }}};                        

////////////////////////////////////////////////////////////////////////////
      
      
      
      
               
void setup() { 
  
randomSeed(analogRead(5));  

// Intitialisierung der Ausgänge////////////////////////////////////////////
  for(int i = 0; i < 25; i++)
    pinMode(LEDs[i], OUTPUT); // Alle Pins des Arrays als Ausgang

//////////////////////////////////////////////////////////////////////////////
pinMode (E1, OUTPUT);        //Ebenen
pinMode (E2, OUTPUT);
pinMode (E3, OUTPUT);
pinMode (E4, OUTPUT);
pinMode (E5, OUTPUT);  
//Interrupt//////////////////////////////////////////////////////////////////
                                    //Springt automatisch in die Multiplex Routine
Timer1.initialize(2000);            //Um eine sichere darstellung der Animation zu
Timer1.attachInterrupt( MUX );      //gewährleisten.
                                    //Wert ist in Mikrosekunden angegeben.  
}





void loop (){
  
  //LetterW
Matrix[0][0][0] = 1;
Matrix[0][0][4] = 1;
Matrix[1][0][0] = 1;
Matrix[1][0][4] = 1;
Matrix[2][0][4] = 1;
Matrix[2][0][0] = 1;
Matrix[3][0][4] = 1;
Matrix[3][0][0] = 1;
Matrix[3][0][2] = 1;
Matrix[4][0][3] = 1;
Matrix[4][0][1] = 1;
delay(100);
Reset();

Matrix[0][1][0] = 1;
Matrix[0][1][4] = 1;
Matrix[1][1][0] = 1;
Matrix[1][1][4] = 1;
Matrix[2][1][4] = 1;
Matrix[2][1][0] = 1;
Matrix[3][1][4] = 1;
Matrix[3][1][0] = 1;
Matrix[3][1][2] = 1;
Matrix[4][1][3] = 1;
Matrix[4][1][1] = 1;
delay(100);
Reset();

Matrix[0][2][0] = 1;
Matrix[0][2][4] = 1;
Matrix[1][2][0] = 1;
Matrix[1][2][4] = 1;
Matrix[2][2][4] = 1;
Matrix[2][2][0] = 1;
Matrix[3][2][4] = 1;
Matrix[3][2][0] = 1;
Matrix[3][2][2] = 1;
Matrix[4][2][3] = 1;
Matrix[4][2][1] = 1;
delay(100);
Reset();


Matrix[0][4][0] = 1;
Matrix[0][0][4] = 1;
Matrix[1][4][0] = 1;
Matrix[1][0][4] = 1;
Matrix[2][0][4] = 1;
Matrix[2][4][0] = 1;
Matrix[3][0][4] = 1;
Matrix[3][4][0] = 1;
Matrix[3][2][2] = 1;
Matrix[4][1][3] = 1;
Matrix[4][3][1] = 1;
delay(100);
Reset();

Bezüglich Speicherverbrauch: wenn du Zahlen von 0-255 hast, dann verwende keine ints. Die haben zwei Byte. Dafür reicht der Datentyp "byte".

Dann solltest du Variablen die nie geändert werden (deine Pin Definitioen und das "LEDs" Array) als "const" definieren:
const int E1 = A0;

Es sei denn man speichert die Adresse eines consts in einem Pointer, merkt der Compiler dann i.d.R. dass die Variablen nie verändert werden und schreibt sie nicht ins RAM.

Ich hoffe Du hast Transistoren und Widerstände verwendet um die LED am Arduino anzuschließen.
Grüße Uwe

Guten Abend,

ut mir leid, dass ich mich so spät melde.Okay, die Veränderungen hab ich mit byte und const int soweit gemacht.

Ja, ich verwende Transistoren und Widerstände, sonst schadet es den LEDs.

Ich würde gerne paar Fragen zu den Codes stellen. Mein Versuch ist es, einen Buchstaben am äußeren Rand zu bewegen.
Wenn der Buchstabe A abgebildet wird, soll er von links nach rechts laufen und dann um den Würfel einen Kreis machen.Die einzelne Säulen kann ich ohne Probleme bewegen, aber den ganzen Buchstaben schaffe ich nicht, kann mir da jemand evtl. helfen?

Hier ist der Code

void LetterA(){
Matrix[0][1][0] = 1;
Matrix[1][2][0] = 1;
Matrix[1][0][0] = 1;
Matrix[2][2][0] = 1;
Matrix[2][0][0] = 1;
Matrix[2][1][0] = 1;
Matrix[3][2][0] = 1;
Matrix[3][0][0] = 1;
Matrix[4][2][0] = 1;
Matrix[4][0][0] = 1;
}


void Drehung(){

LetterA();
int TestArray[16];
int i=0;
for (int x=0; x< 5; x++){
for (int z= 0; z< 5; z++)  
Matrix[z][x][0] = 1;
delay(1000);
TestArray[i]=Matrix[z][x][0];
i++;

}

for(int y=0; y<5; y++){
for (int z= 0; z< 5; z++)
Matrix[z][4][y] = 1; 
TestArray[i]=Matrix[z][4][y];
i++;
delay(1000);}

for (int x=4; x> 0; x--){
for (int z= 0; z< 5; z++)
Matrix[z][x][4] = 1;
TestArray[i]=Matrix[z][4][y];
i++;
delay(1000);}

for(int y=4; y> 0; y--){
for (int z= 0; z< 5; z++)
Matrix[z][0][y] = 1;
delay(1000);
TestArray[i]=Matrix[z][4][y];
i++;
}
}