Skip to content

Instantly share code, notes, and snippets.

@ImanCol
Last active August 9, 2020 19:09
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ImanCol/2dd04de4de5303bc2131fe57fda70d62 to your computer and use it in GitHub Desktop.
Save ImanCol/2dd04de4de5303bc2131fe57fda70d62 to your computer and use it in GitHub Desktop.
Zirrfa DIY Cubo LED 8x8x8 ARDUINO
/*//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