Problems with declaring multiple variables

Hello, I am new to this forum so forgive me if there is anything I've left out here.

I am trying to run a simple sketch that runs a 4x4x4 LED cube I created using the arduino Mega2560. The cube consists of 16 anode columns and 4 cathode layers similar to:

The columns are activated by ditial I/O (22-37) and layers (50-53).

I have created a sketch that works fine by declaring each pin to a variable like so:

int led22 = 22;
int led23 = 23;
int led24 = 24;

etc...

But when I try to run it using this code, It doesn't seem to work at all:

int led[] = {22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37};
int ground[] = {50,51,52,53};

void setup() {                
  pinMode(led[22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37], OUTPUT); 
  pinMode(ground[50,51,52,53], OUTPUT);     
  digitalWrite(ground[50], LOW);
  digitalWrite(ground[51], HIGH);
  digitalWrite(ground[52], HIGH);
  digitalWrite(ground[53], HIGH);
}

void loop() {
  digitalWrite(led[22], HIGH); 
  delay(250);   
  digitalWrite(led[22], LOW); 
  delay(250); 
   digitalWrite(led[23], HIGH); 
  delay(250);   
  digitalWrite(led[23], LOW); 
  delay(250); 
   digitalWrite(led[24], HIGH); 
  delay(250);   
  digitalWrite(led[24], LOW); 
  delay(250); 
   digitalWrite(led[25], HIGH); 
  delay(250);   
  digitalWrite(led[25], LOW); 
  delay(250); 
   digitalWrite(led[26], HIGH); 
  delay(250);   
  digitalWrite(led[26], LOW); 
  delay(250); 
   digitalWrite(led[27], HIGH); 
  delay(250);   
  digitalWrite(led[27], LOW); 
  delay(250); 
   digitalWrite(led[28], HIGH); 
  delay(250);   
  digitalWrite(led[28], LOW); 
  delay(250); 
   digitalWrite(led[29], HIGH); 
  delay(250);   
  digitalWrite(led[29], LOW); 
  delay(250); 
   digitalWrite(led[30], HIGH); 
  delay(250);   
  digitalWrite(led[30], LOW); 
  delay(250); 
   digitalWrite(led[31], HIGH); 
  delay(250);   
  digitalWrite(led[31], LOW); 
  delay(250); 
   digitalWrite(led[32], HIGH); 
  delay(250);   
  digitalWrite(led[32], LOW); 
  delay(250);  
 digitalWrite(led[33], HIGH); 
  delay(250);   
  digitalWrite(led[33], LOW); 
  delay(250);   
   digitalWrite(led[34], HIGH); 
  delay(250);   
  digitalWrite(led[34], LOW); 
  delay(250); 
   digitalWrite(led[35], HIGH); 
  delay(250);   
  digitalWrite(led[35], LOW); 
  delay(250); 
   digitalWrite(led[36], HIGH); 
  delay(250);   
  digitalWrite(led[36], LOW); 
  delay(250); 
   digitalWrite(led[37], HIGH); 
  delay(250);   
  digitalWrite(led[37], LOW); 
  delay(250); 
}

Any idea what could be going wrong here?

pinMode(led[22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37], OUTPUT); 
  pinMode(ground[50,51,52,53], OUTPUT);

You can't do that. Either do a lot of individual pinMode() calls or use a loop.

#define NLEDS (sizeof(led) / sizeof(led[0]))
...
for (int i = 0; i < NLEDS; i++)
   pinMode (led[i], OUTPUT);

Rob

Thank you! :slight_smile:

Okay so I have changed the code and it still doesn't seem to work.

Is this correct?

int led[] = {22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37};
int ground[] = {50,51,52,53};

void setup() {                
  
 for (int i = 22; i < 38; i++){
   pinMode(led[i], OUTPUT);
 }
 for (int x = 50; x < 54; x++){
   pinMode(ground[x], OUTPUT);
 }
    
  digitalWrite(ground[50], LOW);
  digitalWrite(ground[51], HIGH);
  digitalWrite(ground[52], HIGH);
  digitalWrite(ground[53], HIGH);
}

void loop() {
  digitalWrite(led[22], HIGH); 
  delay(250);   
  digitalWrite(led[22], LOW); 
  delay(250); 
   digitalWrite(led[23], HIGH); 
  delay(250);   
  digitalWrite(led[23], LOW); 
  delay(250); 
   digitalWrite(led[24], HIGH); 
  delay(250);   
  digitalWrite(led[24], LOW); 
  delay(250); 
   digitalWrite(led[25], HIGH); 
  delay(250);   
  digitalWrite(led[25], LOW); 
  delay(250); 
   digitalWrite(led[26], HIGH); 
  delay(250);   
  digitalWrite(led[26], LOW); 
  delay(250); 
   digitalWrite(led[27], HIGH); 
  delay(250);   
  digitalWrite(led[27], LOW); 
  delay(250); 
   digitalWrite(led[28], HIGH); 
  delay(250);   
  digitalWrite(led[28], LOW); 
  delay(250); 
   digitalWrite(led[29], HIGH); 
  delay(250);   
  digitalWrite(led[29], LOW); 
  delay(250); 
   digitalWrite(led[30], HIGH); 
  delay(250);   
  digitalWrite(led[30], LOW); 
  delay(250); 
   digitalWrite(led[31], HIGH); 
  delay(250);   
  digitalWrite(led[31], LOW); 
  delay(250); 
   digitalWrite(led[32], HIGH); 
  delay(250);   
  digitalWrite(led[32], LOW); 
  delay(250);  
 digitalWrite(led[33], HIGH); 
  delay(250);   
  digitalWrite(led[33], LOW); 
  delay(250);   
   digitalWrite(led[34], HIGH); 
  delay(250);   
  digitalWrite(led[34], LOW); 
  delay(250); 
   digitalWrite(led[35], HIGH); 
  delay(250);   
  digitalWrite(led[35], LOW); 
  delay(250); 
   digitalWrite(led[36], HIGH); 
  delay(250);   
  digitalWrite(led[36], LOW); 
  delay(250); 
   digitalWrite(led[37], HIGH); 
  delay(250);   
  digitalWrite(led[37], LOW); 
  delay(250); 
   
}

Your arrays have much less than 38 and 54 numbers in them.

Have a look at http://arduino.cc/en/Reference/Array. Or google 'c array'.

int ground[] = {50,51,52,53};

...

 for (int x = 50; x < 54; x++){
   pinMode(ground[x], OUTPUT);
 }

You are confused here between the number of items in the array, and the contents of it. Your ground array has 4 elements, so:

 for (int x = 0; x < 4; x++){
   pinMode(ground[x], OUTPUT);
 }

Better follow the suggestions posted above.

Pleeeease replace that horrible code in loop()

for (int i = 22; i < 38; i++) {
  digitalWrite(i, HIGH); 
  delay(250);   
  digitalWrite(i, LOW); 
  delay(250); 
}

or

for (int i = 0; i < NLEDS; i++) {
  digitalWrite(led[i], HIGH); 
  delay(250);   
  digitalWrite(led[i], LOW); 
  delay(250); 
}

Rob

Everything is working fine now

I thought the numbers in the loop were referring to the actual numbers in the array, not their positions. Thanks for helping out a newbie!

i would like to add that for a sleaker program and a challenge you might like to use a multi dimensional array
like int
led[rows][colloms][depth]
with this the array values will act as coördinates rather then just a pin number

fruit for thought