Last active
August 9, 2020 19:09
-
-
Save ImanCol/2dd04de4de5303bc2131fe57fda70d62 to your computer and use it in GitHub Desktop.
Zirrfa DIY Cubo LED 8x8x8 ARDUINO
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*//Arduino_3DCube_Control | |
//Command must be at 38400 baud | |
0xAD //Abrir menu para puerto de Serie para Arduino | |
0xf2 //Abrir Comando para introducir animacion | |
0xED //Salir completamente del modo Arduino | |
//serial data show ARDUINO,display command data 65,Each time data 64 COUNT+0xF2 | |
*/ | |
#include <stdio.h> | |
#define LAYER_COUNT 8 | |
#define COLUMN_COUNT 64 | |
double test[] = {0, 7, 9, 14, 18, 21, 27, 28, 35, 36, 42, 45, 49, 54, 56, 63}; //Crea una animacion de prueba | |
//ABECEDARIO | |
double A[] = {0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 19, 24, 27, 32, 35, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54}; | |
double B[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 19, 22, 24, 27, 30, 32, 35, 38, 40, 41, 42, 43, 44, 45, 46,}; | |
double C[] = {0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 17, 21, 22, 24, 25, 29, 30, 32, 33, 37, 38, 40, 41, 45, 46}; | |
double D[] = {0, 1, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 17, 21, 22, 24, 25, 29, 30, 32, 33, 37, 38, 40, 41, 42, 43, 44, 45, 46}; | |
double E[] = {0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 22, 24, 25, 27, 29, 30, 32, 33, 37, 38, 40, 41, 45, 46}; | |
//(INCOMPLETOS) | |
double F[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double G[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double H[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double I[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double J[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double K[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double L[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double M[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double N[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double O[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double P[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double Q[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double R[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double S[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double T[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double U[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double V[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double W[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double X[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double Y[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
double Z[] = {7, 6, 5, 13, 12, 11, 19, 18, 26, 25, 32, 24, 40, 41, 42, 43, 51, 52, 53, 62, 63, 61}; | |
//FIN ABECEDARIO | |
//NUMEROS | |
double _0 [] = {1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 16, 28, 22, 24, 27, 30, 32, 34, 38, 40, 41, 42, 43, 44, 45, 46, 49, 50, 51, 52, 53}; | |
double _1 [] = {6, 9, 14, 16, 14, 18, 19, 20, 24, 22, 24, 25, 26, 27, 28, 29, 30, 38, 46}; | |
double _2 [] = {9, 10, 14, 15, 16, 17, 18, 21, 22, 23, 24, 25, 28, 29, 30, 31, 32, 33, 35, 36, 38, 39, 40, 41, 42, 43, 46, 47, 49, 50, 54, 55}; | |
double _3 [] = {8, 9, 11, 12, 14, 15, 16, 17, 19, 20, 22, 23, 24, 25, 27, 28, 30, 31, 32, 33, 35, 36, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55}; | |
double _4 [] = {3, 4, 10, 11, 12, 17, 18, 20, 24, 25, 28, 30, 32, 33, 34, 35, 36, 37, 38, 40, 41, 42, 43, 44, 45, 46, 52, 54}; | |
double _5 [] = {0, 1, 2, 5, 8, 9, 10, 13, 14, 16, 18, 22, 24, 26, 30, 32, 34, 35, 36, 37, 38, 400, 43, 44, 45}; | |
double _6 [] = {2, 3, 4, 5, 9, 10, 11, 12, 13, 14, 16, 17, 19, 22, 24, 27, 30, 32, 35, 38, 43, 44, 45, 46, 52, 23}; | |
double _7 [] = {0, 1, 8, 9, 16, 20, 21, 22, 24, 27, 28, 29, 30, 32, 33, 34, 35, 40, 41, 42}; | |
double _8 [] = {1, 2, 4, 5, 8, 9, 10, 11, 12, 13, 14, 16, 19, 22, 24, 27, 30, 33, 34, 35, 36, 37, 38, 41, 42, 4, 45}; | |
double _9 [] = {1, 2, 8, 9, 10, 11, 14, 16, 19, 22, 24, 27, 29, 30, 32, 33, 34, 3, 36, 37, 41, 42, 43, 44}; | |
//FIN NUMEROS | |
//VARIABLES | |
byte NUMBER, n, a, as, f, i, j, s, t, x, y; /*Variables publicas en 0. Se asigna junto a los valores que se usaran durante el programa. | |
n = Se guarda un numero del 0 al 9; | |
NUMBER = Se guarda el valor del numero a reproducir, | |
ABC = se guarda el valor de la letra a reproducir. | |
a=veces que repite la animacione | |
as=veces que repite las animaciones | |
f=veces que se repite el frame | |
i=iteracion/repeticion | |
j=tiempo | |
s=cantidad en of | |
t=tiempo | |
x=eje x | |
y=eje y | |
*/ | |
byte ANIM; | |
double *ABC_123; | |
byte ABC_123_size; | |
byte ROW; | |
//FIN VARIABLES | |
//AJUSTES | |
byte frame = 3; //modifica la cantidad de veces que repite los frames | |
byte tiempo = 3000; //modifica el tiempo global de los frame de animacion. | |
byte animaciones = 2; //modifica la cantidad de frame/veces que reproduce las animaciones. | |
byte animacion = 2; //modifica la cantidad de frame/veces que reproduce la animacion antes de pasar al siguiente. | |
//FIN AJUSTES | |
//CONFIGURACION | |
void setup() | |
{ | |
delay(1000); //TIEMPO DE ESPERA ANTES DE CONFIGURAR | |
Serial.begin(38400); //CONFIGURA LA VELOCIDAD DE BAUDIOS PARA TRANSMITIR LOS DATOS | |
for (i = 0; i < 70; i++) | |
{ | |
Serial.write(0xAD); | |
} | |
} | |
//FIN CONFIGURACION | |
//BUCLE | |
void loop() | |
{ | |
byte pCube[64]; | |
t = tiempo; | |
for (as = 0; as < animaciones; as++) //Veces que repite la cadena de animacion | |
{ | |
//rise(pCube); | |
DemoALL_ON(pCube); //enciende todos los leds | |
DemoALL_OFF(pCube); //apaga todos los leds | |
Animaciones(pCube); | |
DemoALL_OFF(pCube); //apaga todos los leds | |
} | |
for (j = 0; j < 70; j++) | |
{ | |
// Serial.write(0xED); | |
} | |
while (1); | |
} | |
//FIN BUCLE | |
//ANIMACION DEL USUARIO | |
void Animaciones(byte *pCube) { | |
a = animacion; | |
while (a--) | |
{ | |
//EJEMPLO | |
//0 | |
ABC_123 = (_0); //letra o numero para animar | |
ABC_123_size = sizeof(_0) / sizeof(_0[0]); //BUSCA LA LONGITUD DE LOS LED Y LOS INSERTA EN UNA VARIABLE. ITINERA LAS CANTDAD QUE GENERE PARA ENCENDER LOS LEDS | |
ROW = 0x80;//Fila en que se ejecuta la animacion. | |
LED(pCube); //Imprime los datos en el Cubo | |
//funUP(pCube);//Sube la animación 7 escalones | |
funDOWN(pCube); //Baja la animacion 7 escalones | |
wait(); //Espera | |
LED_off(pCube); //Apaga todos los LED | |
//FIN EJEMPLO | |
//Inserte Aqui sus Animaciones | |
//1 | |
ABC_123 = (_1); | |
ABC_123_size = sizeof(_1) / sizeof(_1[0]); | |
ROW = 0x80; | |
LED(pCube); | |
funDOWN(pCube); | |
wait(); | |
LED_off(pCube); | |
//2 | |
ABC_123 = (_2); | |
ABC_123_size = sizeof(_2) / sizeof(_2[0]); | |
ROW = 0x80; | |
LED(pCube); | |
funDOWN(pCube); | |
wait(); | |
LED_off(pCube); | |
//3 | |
ABC_123 = (_3); | |
ABC_123_size = sizeof(_3) / sizeof(_3[0]); | |
ROW = 0x80; | |
LED(pCube); | |
funDOWN(pCube); | |
wait(); | |
LED_off(pCube); | |
//4 | |
ABC_123 = (_4); | |
ABC_123_size = sizeof(_4) / sizeof(_4[0]); | |
ROW = 0x80; | |
LED(pCube); | |
funDOWN(pCube); | |
wait(); //Espera | |
LED_off(pCube); | |
//5 | |
ABC_123 = (_5); | |
ABC_123_size = sizeof(_5) / sizeof(_5[0]); | |
ROW = 0x80; | |
LED(pCube); | |
funDOWN(pCube); | |
wait(); | |
LED_off(pCube); | |
//6 | |
ABC_123 = (_6); | |
ABC_123_size = sizeof(_6) / sizeof(_6[0]); | |
ROW = 0x80; | |
LED(pCube); | |
funDOWN(pCube); | |
wait(); //Espera | |
LED_off(pCube); | |
//7 | |
ABC_123 = (_7); | |
ABC_123_size = sizeof(_7) / sizeof(_7[0]); | |
ROW = 0x80; | |
LED(pCube); | |
funDOWN(pCube); | |
wait(); | |
LED_off(pCube); | |
//8 | |
ABC_123 = (_8); | |
ABC_123_size = sizeof(_8) / sizeof(_8[0]); | |
ROW = 0x80; | |
LED(pCube); | |
funDOWN(pCube); | |
wait(); //Espera | |
LED_off(pCube); | |
//9 | |
ABC_123 = (_9); | |
ABC_123_size = sizeof(_9) / sizeof(_9[0]); | |
ROW = 0x80; | |
LED(pCube); | |
funDOWN(pCube); | |
wait(); | |
LED_off(pCube); | |
//Fin de las animaciones | |
} | |
} | |
//FIN ANIMACION DE USUARIO | |
//ANIMACION ENCIENDE TODOS LOS LEDS | |
void DemoALL_ON(byte *pCube) | |
{ | |
byte i, j; | |
j = 0x80; | |
while (j--) | |
{ | |
for (i = 0; i < 64; i++) | |
{ | |
pCube[i] = 0xff; | |
} | |
funPrintCube(pCube); | |
} | |
} | |
//ANIMACION APAGA TODOS LOS LEDS | |
void DemoALL_OFF(byte *pCube) | |
{ | |
byte i, j; | |
j = 0x80; | |
while (j--) | |
{ | |
for (i = 0; i < 64; i++) | |
{ | |
pCube[i] = 0x00; | |
} | |
funPrintCube(pCube); | |
} | |
} | |
//FIN ANIMACION APAGA TODOS LOS LEDS | |
//TIEMPO DE ESPERA | |
byte wait() | |
{ | |
delay(t); | |
} | |
//FIN TIEMPO DE ESPERA | |
//APAGA ANIMACION | |
byte LED_off(byte *pCube) | |
{ | |
for (i = 0; i < 64; i++) | |
pCube[i] = 0x00; | |
funPrintCube(pCube); | |
} | |
//FIN APAGA ANIMACION | |
//ANIMACION EJECUTA LA ANIMACION DEL USUARIO | |
byte LED(byte *pCube) | |
{ | |
//Serial.println(ABC_123_size); //Imprime longitud de la cantidad de elementos de la animación en la consola. | |
for (s = 0; s < ABC_123_size; s++) //Enciende los LED en posicion Y | |
pCube[(int)(ABC_123[(int)(s)])] |= ROW; // inserta el parametro de los LED en la lista = Posicion de Altura en Hexadecimal | |
funPrintCube(pCube); //ENVIA EL RESULTADO A LA FUNCION funPintCube | |
} | |
//FIN ANIMACION EJECUTA LA ANIMACION DEL USUARIO | |
//FUNCION COMUNICACION CON EL CUBO | |
void funPrintCube(byte *p) | |
{ | |
Serial.write(0xf2); | |
Serial.write(p, 64); //IMPRIME LA ANIMACION RESULTANTE | |
} | |
//FIN FUNCION COMUNICACION CON EL CUBO | |
//ANIMACION SUBE LA ANIMACION 7 ESCALONES | |
byte funUP(byte *pCube) | |
{ | |
for (j = 0; j < 7; j++) //Reproduce 7 veces antes de salir | |
{ | |
for (i = 0; i < 64; i++) | |
pCube[i] <<= 1; | |
funPrintCube(pCube); | |
delay(t); | |
} | |
} | |
//FIN ANIMACION SUBE LA ANIMACION 7 ESCALONES | |
//ANIMACION BAJA LA ANIMACION 7 ESCALONES | |
byte funDOWN(byte *pCube) | |
{ | |
for (j = 0; j < 7; j++) //Reproduce 7 veces antes de salir | |
{ | |
for (i = 0; i < 64; i++) | |
pCube[i] >>= 1; | |
funPrintCube(pCube); | |
delay(t); | |
} | |
} | |
//FIN ANIMACION BAJA LA ANIMACION 7 ESCALONES | |
//ANIMACION GENERA UNA CASCADA INVERTIDA | |
void rise(byte *pCube) | |
{ | |
j = 0x80; //Tiempo de la animacion | |
while (j--) | |
{ | |
for (i = 0; i < COLUMN_COUNT; i++) | |
{ | |
pCube[i] <<= 1; // PUEDES CAMBIARLO POR pCube[i] >>= 1; PARA QUE LA CASCADA SEA HACIA ABAJO. DEBERAS CAMBIAR LA POSICION DE LA ANIMACION POR 0x80 PARA QUE LA ANIMACION EMPIEZE DESDE ARRIBA | |
} | |
for (i = 0; i < random(4); i++) | |
{ | |
x = random(8); //elige al hazar la columna en x | |
y = random(8); //elige al hazar la columna en y | |
pCube[funGetColumn(x, y)] |= 0x01; //POSICION DE LA ANIMACION | |
} | |
funPrintCube(pCube); | |
delay(0x40); | |
} | |
} | |
//FIN ANIMACION GENERA UNA CASCADA INVERTIDA | |
//FUNCION CASCADA INVERTIDA | |
byte funGetColumn(byte x, byte y) | |
{ | |
return (8 * y + x); //DEVUELVE EL RESULTADO DE LA OPERACION | |
} | |
//FIN FUNCION CASCADA INVERTIDA |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment