This is a better test program, I've cleaned things up, and added some more programs.
// TransistorCube -- Test Program
#include <avr/pgmspace.h> // allows use of PROGMEM to store patterns in flash
#define CUBESIZE 4
#define PLANESIZE CUBESIZE*CUBESIZE
#define PLANETIME 3333 // time each plane is displayed in us -> 100 Hz refresh
#define TIMECONST 5 // multiplies DisplayTime to get ms - why not =100?
/*
** Defining pins in array makes it easier to rearrange how cube is wired
** This cube uses 2 plane pins and one led pin to light up any single LED.
** Pins 2-13 are used to control the 12 RG and B anodes (the rear to forward 4 LED)
** 5 banks of 4 transistors that are controlled by 8 arduino pins sink the cathodes.
** Pins (14,15,16,17) control 4 transistors that select the row(wide), and on each row.
** Pins (18,19,0,1)4 control 1 of 4 sets of 4 transistors that select the level(height).
** First you have to turn on a row, then turn on a level to sink the LED.
**
** This cube uses NPN transistors. We send HIGH to sink a row or level,
** and we send HIGH to turn on a anode color/forward/back LED. send LOW turns LEDs off.
*/
int RGBColumnPin[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
int RowPin[] = {14, 15, 16, 17};
int LevelPin[] = {18, 19, 0, 1};
int RowLevelCount = 4;
int RGBColumnPinCount = 12;
// initialization
void setup()
{
int pin; // loop counter
// set up LED pins as output (active HIGH)
for (pin=0; pin<(RGBColumnPinCount); pin++) {
pinMode( RGBColumnPin[pin], OUTPUT );
}
// set up plane pin1 as outputs (active HIGH)
for (pin=0; pin<CUBESIZE; pin++) {
pinMode( RowPin[pin], OUTPUT );
}
// set up plane pin2 as outputs (active HIGH)
for (pin=0; pin<CUBESIZE; pin++) {
pinMode( LevelPin[pin], OUTPUT );
}
}
void loop(){
// comment out lines below to run just the specific test you want
// to run. comment all but one routine at a time for best results.
// You can also change values inside the programs for different testing.
loopFor();
loopRand();
loopRedWall();
loopFullOn();
}
// This bit of programming uses 3 loops to sequence all 192 LEDs
// one loop controls 1 LEDs anode pin, the 2 other loops control the cathode pin.
// You turn a pin HIGH, to light the LED (turn the anode HIGH, and turn 2
// transistors HIGH to sink one cathode line (4 RGB LEDs)
// Turning all pins LOW, turns all LEDs off.
void loopFor()
{
for(int thisRowPin = 0; thisRowPin < RowLevelCount; thisRowPin++){
for(int thisLevelPin = 0; thisLevelPin < RowLevelCount; thisLevelPin++){
for(int thisPin = 0; thisPin < RGBColumnPinCount; thisPin++){
planesOff();
digitalWrite(RGBColumnPin[thisPin],HIGH);
digitalWrite(RowPin[thisRowPin],HIGH);
digitalWrite(LevelPin[thisLevelPin],HIGH);
delay(100); // increase value to slow down
digitalWrite(RGBColumnPin[thisPin],LOW);
digitalWrite(RowPin[thisRowPin],LOW);
digitalWrite(LevelPin[thisLevelPin],LOW);
// delay(100); // if you want an off delay
}
}
}
}
void loopRand()
{
int randPin = random(12);
int randPlane1 = random(4);
int randPlane2 = random(4);
planesOff();
digitalWrite(RGBColumnPin[randPin],HIGH);
digitalWrite(RowPin[randPlane1],HIGH);
digitalWrite(LevelPin[randPlane2],HIGH);
delay(50);
digitalWrite(RGBColumnPin[randPin],LOW);
digitalWrite(RowPin[randPlane1],LOW);
digitalWrite(LevelPin[randPlane2],LOW);
}
void planesOff(){
for(int thisRowPin = 0; thisRowPin < RowLevelCount; thisRowPin++){
digitalWrite(RowPin[thisRowPin],LOW);
}
for(int thisLevelPin = 0; thisLevelPin < RowLevelCount; thisLevelPin++){
digitalWrite(LevelPin[thisLevelPin],LOW);
}
}
void loopRedWall()
{
for(int thisRowPin = 0; thisRowPin < RowLevelCount; thisRowPin++){
for(int thisPin = 0; thisPin < 4; thisPin++){
for(int thisLevelPin = 0; thisLevelPin < RowLevelCount; thisLevelPin++){
planesOff();
digitalWrite(RGBColumnPin[0],LOW);
digitalWrite(RGBColumnPin[1],HIGH);
digitalWrite(RGBColumnPin[2],LOW);
digitalWrite(RGBColumnPin[3],LOW);
digitalWrite(RGBColumnPin[4],HIGH);
digitalWrite(RGBColumnPin[5],LOW);
digitalWrite(RGBColumnPin[6],LOW);
digitalWrite(RGBColumnPin[7],HIGH);
digitalWrite(RGBColumnPin[8],LOW);
digitalWrite(RGBColumnPin[9],LOW);
digitalWrite(RGBColumnPin[10],HIGH);
digitalWrite(RGBColumnPin[11],LOW);
digitalWrite(RowPin[thisRowPin],HIGH);
digitalWrite(LevelPin[thisLevelPin],HIGH);
delay(5); // increase to slow down
digitalWrite(RGBColumnPin[0],LOW);
digitalWrite(RGBColumnPin[1],LOW);
digitalWrite(RGBColumnPin[2],LOW);
digitalWrite(RGBColumnPin[3],LOW);
digitalWrite(RGBColumnPin[4],LOW);
digitalWrite(RGBColumnPin[5],LOW);
digitalWrite(RGBColumnPin[6],LOW);
digitalWrite(RGBColumnPin[7],LOW);
digitalWrite(RGBColumnPin[8],LOW);
digitalWrite(RGBColumnPin[9],LOW);
digitalWrite(RGBColumnPin[10],LOW);
digitalWrite(RGBColumnPin[11],LOW);
digitalWrite(RowPin[thisRowPin],LOW);
digitalWrite(LevelPin[thisLevelPin],LOW);
// delay(100);
}
}
}
}
void loopFullOn()
// This program lights 12 LEDs ina line, and cycles through the row/levels
{
for(int thisRowPin = 0; thisRowPin < RowLevelCount; thisRowPin++){
// for(int thisPin = 0; thisPin < 4; thisPin++){
for(int thisLevelPin = 0; thisLevelPin < RowLevelCount; thisLevelPin++){
planesOff();
digitalWrite(RGBColumnPin[0],HIGH);
digitalWrite(RGBColumnPin[1],HIGH);
digitalWrite(RGBColumnPin[2],HIGH);
digitalWrite(RGBColumnPin[3],HIGH);
digitalWrite(RGBColumnPin[4],HIGH);
digitalWrite(RGBColumnPin[5],HIGH);
digitalWrite(RGBColumnPin[6],HIGH);
digitalWrite(RGBColumnPin[7],HIGH);
digitalWrite(RGBColumnPin[8],HIGH);
digitalWrite(RGBColumnPin[9],HIGH);
digitalWrite(RGBColumnPin[10],HIGH);
digitalWrite(RGBColumnPin[11],HIGH);
digitalWrite(RowPin[thisRowPin],HIGH);
digitalWrite(LevelPin[thisLevelPin],HIGH);
delay(100); //This controls speed, bigger is slower.
/* digitalWrite(RGBColumnPin[0],LOW);
digitalWrite(RGBColumnPin[1],LOW);
digitalWrite(RGBColumnPin[2],LOW);
digitalWrite(RGBColumnPin[3],LOW);
digitalWrite(RGBColumnPin[4],LOW);
digitalWrite(RGBColumnPin[5],LOW);
digitalWrite(RGBColumnPin[6],LOW);
digitalWrite(RGBColumnPin[7],LOW);
digitalWrite(RGBColumnPin[8],LOW);
digitalWrite(RGBColumnPin[9],LOW);
digitalWrite(RGBColumnPin[10],LOW);
digitalWrite(RGBColumnPin[11],LOW);
*/
digitalWrite(RowPin[thisRowPin],LOW);
digitalWrite(LevelPin[thisLevelPin],LOW);
// delay(100);
// }
}
}
}