unsigned int contador = 0;
int T1 = 0;
int Fx = 1;
int Selector[8][8] = {
{0,1,1,1,1,1,1,1},
{1,0,1,1,1,1,1,1},
{1,1,0,1,1,1,1,1},
{1,1,1,0,1,1,1,1},
{1,1,1,1,0,1,1,1},
{1,1,1,1,1,0,1,1},
{1,1,1,1,1,1,0,1},
{1,1,1,1,1,1,1,0}
};
int matriz1[8][8] = {
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1}
};
int matriz2[8][8] = {
{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}
};
int dy[] = {1, 0, 1};
int dx[] = {-1, -1, 0};
int DS1 =2;
int lanzador1 = 3;
int CLOCK1 = 4;
int DS2 = 5;
int lanzador2 = 7;
int CLOCK2 = 6;
int fotograma=2;
void animacion(int numero);
void animacion(int numero){
for(int indice=7; indice>=0; indice--){
if(Selector[numero][indice]==0){
digitalWrite(DS1, LOW);
digitalWrite(CLOCK1, HIGH);
digitalWrite(CLOCK1, LOW);
digitalWrite(DS2, LOW);
digitalWrite(CLOCK2, HIGH);
digitalWrite(CLOCK2, LOW);
}else{
digitalWrite(DS1, HIGH);
digitalWrite(CLOCK1, HIGH);
digitalWrite(CLOCK1, LOW);
digitalWrite(DS1, LOW);
digitalWrite(DS2, HIGH);
digitalWrite(CLOCK2, HIGH);
digitalWrite(CLOCK2, LOW);
digitalWrite(DS2, LOW);
}
}
for(int indice=7; indice>=0; indice--){
if(matriz1[indice][numero]==0){
digitalWrite(DS1, LOW);
digitalWrite(CLOCK1, HIGH);
digitalWrite(CLOCK1, LOW);
}else{
digitalWrite(DS1, HIGH);
digitalWrite(CLOCK1, HIGH);
digitalWrite(CLOCK1, LOW);
digitalWrite(DS1, LOW);
}
if(matriz2[indice][numero]==0){
digitalWrite(DS2, LOW);
digitalWrite(CLOCK2, HIGH);
digitalWrite(CLOCK2, LOW);
}else{
digitalWrite(DS2, HIGH);
digitalWrite(CLOCK2, HIGH);
digitalWrite(CLOCK2, LOW);
digitalWrite(DS2, LOW);
}
}
}
enum tipo_estado {Sm1,Sm2,Sm3,Sm4,Sm5,Sm6,Sm7,Sm8,Sfx,Swait}; //Se define tipo dato
enum tipo_estado estado = Sm1;
enum state_type {SVisual,Supdate}; //Se define tipo dato
enum state_type state = SVisual;
void setup(){
Serial.begin(9600);
pinMode(DS1, OUTPUT);
pinMode(CLOCK1, OUTPUT);
pinMode(lanzador1, OUTPUT);
pinMode(DS2, OUTPUT);
pinMode(CLOCK2, OUTPUT);
pinMode(lanzador2, OUTPUT);
}
void loop(){
//logica de salida FM1
switch(state){
case SVisual:
break;
case Supdate:
//Primer angulo
for(int fila=7; fila>=0; fila--){
for(int columna=0; columna<=7; columna++){
if(matriz1[fila][columna]==1){
int izquierda = 0;
int derecha = 0;
int columna_izquierda = 0;
int fila_izquierda = 0;
int columna_derecha = 0;
int fila_derecha = 0;
int cambio= 0;
for(int direccion= 0; direccion<3; direccion++){
int y = fila;
int x = columna; //Guarda la pocision
y += dy[direccion]; //Cambia la pocision
x += dx[direccion];
if(x>=0 && y<=7){ //verifica la nueva posicion = valida
if(direccion == 0 && matriz1[y][x] == 0){
matriz1[fila][columna] = 0;
matriz1[y][x] = 1;
cambio = 1;
}
if(direccion == 1 && matriz1[y][x] == 0 && cambio == 0){
while(x>=0 && y<=7 && matriz1[y][x] == 0 ){
izquierda ++;
columna_izquierda = x;
fila_izquierda = y;
y += dy[direccion];
x += dx[direccion];
}
}
if (direccion == 2 && matriz1[y][x] == 0 && cambio == 0){
while(x>=0 && y<=7 && matriz1[y][x] == 0){
derecha ++;
columna_derecha = x;
fila_derecha = y;
y += dy[direccion];
x += dx[direccion];
}
}
}
}
if(derecha>izquierda){
matriz1[fila][columna] = 0;
matriz1[fila_derecha][columna_derecha] = 1;
}else if(izquierda>derecha){
matriz1[fila][columna] = 0;
matriz1[fila_izquierda][columna_izquierda] = 1;
}else if(izquierda=derecha && izquierda!= 0 && derecha!= 0){
matriz1[fila][columna] = 0;
matriz1[fila_izquierda][columna_izquierda] = 1;
}
}
}
}
//Primer angulo
for(int fila=7; fila>=0; fila--){
for(int columna=0; columna<=7; columna++){
if(matriz2[fila][columna]==1){
int izquierda = 0;
int derecha = 0;
int columna_izquierda = 0;
int fila_izquierda = 0;
int columna_derecha = 0;
int fila_derecha = 0;
int cambio= 0;
for(int direccion= 0; direccion<3; direccion++){
int y = fila;
int x = columna; //Guarda la pocision
y += dy[direccion]; //Cambia la pocision
x += dx[direccion];
if(x>=0 && y<=7){ //verifica la nueva posicion = valida
if(direccion == 0 && matriz2[y][x] == 0){
matriz2[fila][columna] = 0;
matriz2[y][x] = 1;
cambio = 1;
}
if(direccion == 1 && matriz2[y][x] == 0 && cambio == 0){
while(x>=0 && y<=7 && matriz2[y][x] == 0 ){
izquierda ++;
columna_izquierda = x;
fila_izquierda = y;
y += dy[direccion];
x += dx[direccion];
}
}
if (direccion == 2 && matriz2[y][x] == 0 && cambio == 0){
while(x>=0 && y<=7 && matriz2[y][x] == 0){
derecha ++;
columna_derecha = x;
fila_derecha = y;
y += dy[direccion];
x += dx[direccion];
}
}
}
}
if(derecha>izquierda){
matriz2[fila][columna] = 0;
matriz2[fila_derecha][columna_derecha] = 1;
}else if(izquierda>derecha){
matriz2[fila][columna] = 0;
matriz2[fila_izquierda][columna_izquierda] = 1;
}else if(izquierda=derecha && izquierda!= 0 && derecha!= 0){
matriz2[fila][columna] = 0;
matriz2[fila_izquierda][columna_izquierda] = 1;
}
}
}
}
if(matriz1[7][0]==1 && fotograma==0){
fotograma=2;
matriz1[7][0]= 0;
matriz2[0][7]= 1;
}
Serial.println("imagen generada");
Fx=1;
break;
}
//Sm1,Sm2,Sm3,Sm4,Sm5,Sm6,Sm7,Sm8,Sfx,Swait//
//logica de salida FM2
switch(estado){
case Sm1:
animacion(0);
digitalWrite(lanzador1, HIGH);
digitalWrite(lanzador1, LOW);
digitalWrite(lanzador2, HIGH);
digitalWrite(lanzador2, LOW);
break;
case Sm2:
animacion(1);
digitalWrite(lanzador1, HIGH);
digitalWrite(lanzador1, LOW);
digitalWrite(lanzador2, HIGH);
digitalWrite(lanzador2, LOW);
break;
case Sm3:
animacion(2);
digitalWrite(lanzador1, HIGH);
digitalWrite(lanzador1, LOW);
digitalWrite(lanzador2, HIGH);
digitalWrite(lanzador2, LOW);
break;
case Sm4:
animacion(3);
digitalWrite(lanzador1, HIGH);
digitalWrite(lanzador1, LOW);
digitalWrite(lanzador2, HIGH);
digitalWrite(lanzador2, LOW);
break;
case Sm5:
animacion(4);
digitalWrite(lanzador1, HIGH);
digitalWrite(lanzador1, LOW);
digitalWrite(lanzador2, HIGH);
digitalWrite(lanzador2, LOW);
break;
case Sm6:
animacion(5);
digitalWrite(lanzador1, HIGH);
digitalWrite(lanzador1, LOW);
digitalWrite(lanzador2, HIGH);
digitalWrite(lanzador2, LOW);
break;
case Sm7:
animacion(6);
digitalWrite(lanzador1, HIGH);
digitalWrite(lanzador1, LOW);
digitalWrite(lanzador2, HIGH);
digitalWrite(lanzador2, LOW);
break;
case Sm8:
animacion(7);
digitalWrite(lanzador1, HIGH);
digitalWrite(lanzador1, LOW);
digitalWrite(lanzador2, HIGH);
digitalWrite(lanzador2, LOW);
contador++;
break;
case Sfx:
if(contador==50){
contador=0;
Fx=0;
T1=1;
}
break;
case Swait:
break;
}
//logica de estado siguiente
switch(state){
case SVisual :
if(T1==1){
state=Supdate;
T1=0;
}else{
state=SVisual;
}
break;
case Supdate :
state=SVisual;
fotograma--;
break;
}
//logica de estado siguiente
switch(estado){
case Sm1 :
estado=Sm2;
break;
case Sm2 :
estado=Sm3;
break;
case Sm3 :
estado=Sm4;
break;
case Sm4 :
estado=Sm5;
break;
case Sm5 :
estado=Sm6;
break;
case Sm6 :
estado=Sm7;
break;
case Sm7 :
estado=Sm8;
break;
case Sm8 :
estado=Sfx;
break;
case Sfx :
estado=Swait;
break;
case Swait :
if(Fx==0){
estado=Swait;
}else{
estado=Sm1;
}
break;
}
}