Rompecabezas con arduino y TV

Publicado el: 22 de junio de 2019
Principiante
Acerca de este proyecto
El objetivo es organizar las casillas num茅ricas del 1 al 15 que se muestran en la pantalla de un televisor y se controla con un HEX PAD.
arduino televisor juego
Publicidad
DETALLES

Este proyecto consiste en jugar el famoso juego del puzzle o rompecabezas cuyos n煤meros se visualizan e la pantalla de un televisor CRT conectado a un arduino y los movimientos de dichas casillas se controlan mediante un teclado hexadecimal.

Puzzle

 VIDEO DE FUNCIONAMIENTO

En ingles

LISTA DE MATERIALES

  • Arduino uno o equivalente
  • Teclado hexadecimal
  • Un televisor de rayos catodicos.
  • Cable de video RCA
  • 1 resistor de 1 k ohm.
  • 1 resistor de 470 ohms.
  • Cables de conexion.



DIAGRAMA ESQUEM脕TICO

Diagrama


CONECTAR ARDUINO AL TELEVISOR

Diagrama TV


Diagrama arduino al TV


Descargue esta libreria e importela al sketch.

Como se muestra en el diagrama, el resistor de 1k va conectado al pin 9 del arduino, el resistor de 470 ohms se conecta al pin 7 del arduino. Los extremos libres de los resistores se unen entre si, y esta union se conecta al cable RCA (se帽al de video) La se帽al de GND del cable RCA se conecta al GND del arduino.


El c贸digo se encuentra en la secci贸n de codificaci贸n de este articulo.

Teclado hexadecimal


Los numeros del (1 al 16) se almacenan en un array. El numero 16 representa la posici贸n vac铆a.

Para desordenar las casillas se presiona la tecla A.

Cuando se presiona alguna tecla, el programa verifica si hay una casilla vac铆a cerca de esa posici贸n. Por ejemplo, como se muestra en la figura, si se presiona la tecla '1', se verifican las casillas cercanas a ella, que son  la '2' y la '5'.







CODIFICACI脫N
Codigo arduino-

//Made by Jos茅 Luis Bejarano V谩squez
//www.sistemasymicros.comco

#include 
#include 
#include 
#include 
#include 

#include 
#include 

#include 

const byte ROWS=4;
const byte COLS=4;
char keys[ROWS][COLS] = {
 {'1','2','3','A'},
 {'4','5','6','B'},
 {'7','8','9','C'},
 {'*','0','#','D'}
};
byte rowPins[ROWS] = {13,6,5,4}; //Filas(pines del 9 al 6)
byte colPins[COLS] = {3,2,1,0}; //Columnas (pines del 5 al 2)
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

TVout tv;
//int cuenta;
  int puzzle[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int cX = 0;
int cY= 0;
byte width=20;
byte height=20;
byte color=1;
byte full=0;
byte azar;
byte i;
int temp;
int numero;
int modoJuego=false;
int intentos=0;
boolean ganado=false;
int cuenta=0;

unsigned long tiempo=0;
unsigned long inicio=0;


void revolver()
{
  tv.clear_screen();
  
  intentos=0;
  inicio = millis();
  
  dibujar_cuadros();
  
  for (i=0;i<=15;i++)

  {  
      randomSeed(analogRead(0));
      
      azar = random(0,16);  //Genera un n煤mero  aleatorio entre 0 y 16
    
      temp = puzzle[i];  
  
      puzzle[i] = puzzle[azar];
      
      puzzle[azar] = temp;
      
    
  }

}




void dibujar_cuadros()
{
  
    //Dibuja la primera fila
   tv.draw_rect(cX,cY+0,width,height,color,full);
   
   tv.draw_rect(cX+20,cY+0,width,height,color,full);

   tv.draw_rect(cX+40,cY+0,width,height,color,full);
  
   tv.draw_rect(cX+60,cY+0,width,height,color,full);
   
   //Dibuja la segunda fila
   
   tv.draw_rect(cX+0,cY+20,width,height,color,full);

   tv.draw_rect(cX+20,cY+20,width,height,color,full);

   tv.draw_rect(cX+40,cY+20,width,height,color,full);

   tv.draw_rect(cX+60,cY+20,width,height,color,full);
   
   //****** Dibuja la tercera fila
   tv.draw_rect(cX+0,cY+40,width,height,color,full);

   tv.draw_rect(cX+20,cY+40,width,height,color,full);

   tv.draw_rect(cX+40,cY+40,width,height,color,full);

   tv.draw_rect(cX+60,cY+40,width,height,color,full);
   
  //******** Dibuja la cuarta fila
   tv.draw_rect(cX+0,cY+60,width,height,color,full);

   tv.draw_rect(cX+20,cY+60,width,height,color,full);

   tv.draw_rect(cX+40,cY+60,width,height,color,full);

   tv.draw_rect(cX+60,cY+60,width,height,color,full);

}

void dibujar_pantalla()
{

if(puzzle[0]==16)
 {
   tv.print(6,6,'');
 } 
 else
 {
   tv.print(6,6,puzzle[0]);
 }
 
  
 if(puzzle[1]==16)
 {
   tv.print(26,6,'');
 } 
 else
 {
   tv.print(26,6,puzzle[1]);
 }
 
  if(puzzle[2]==16)
   {
     tv.print(46,6,'');
   } 
   else
   {
     tv.print(46,6,puzzle[2]);
   }
   
 if(puzzle[3]==16)
 {
   tv.print(66,6,'');
 } 
 else
 {
   tv.print(66,6,puzzle[3]);
 }

  
 if(puzzle[4]==16)
 {
   tv.print(6,26,'');
 } 
 else
 {
   tv.print(6,26,puzzle[4]);
 }

 if(puzzle[5]==16)
 {
   tv.print(26,26,'');
 } 
 else
 {
   tv.print(26,26,puzzle[5]);
 }

 if(puzzle[6]==16)
 {
   tv.print(46,26,'');
 } 
 else
 {
   tv.print(46,26,puzzle[6]);
 }

 if(puzzle[7]==16)
 {
   tv.print(66,26,'');
 } 
 else
 {
   tv.print(66,26,puzzle[7]);
 }

 
 if(puzzle[8]==16)
 {
   tv.print(6,46,'');
 } 
 else
 {
   tv.print(6,46,puzzle[8]);
 }

 if(puzzle[9]==16)
 {
   tv.print(26,46,'');
 } 
 else
 {
   tv.print(26,46,puzzle[9]);
 }


 if(puzzle[10]==16)
 {
   tv.print(46,46,'');
 } 
 else
 {
   tv.print(46,46,puzzle[10]);
 }


 if(puzzle[11]==16)
 {
   tv.print(66,46,'');
 } 
 else
 {
   tv.print(66,46,puzzle[11]);
 }

 
 if(puzzle[12]==16)
 {
   tv.print(6,66,'');
 } 
 else
 {
   tv.print(6,66,puzzle[12]);
 }


 if(puzzle[13]==16)
 {
   tv.print(26,66,'');
 } 
 else
 {
   tv.print(26,66,puzzle[13]);
 }


 if(puzzle[14]==16)
 {
   tv.print(46,66,'');
 } 
 else
 {
   tv.print(46,66,puzzle[14]);
 }


 if(puzzle[15]==16)
 {
   tv.print(66,66,'');
 } 
 else
 {
   tv.print(66,66,puzzle[15]);
 }
 
 
 
 tv.print(0,86,'intentos:');
 tv.print(56,86,intentos);  

}

int intercambiar(int posI,int posF)
{
      
  if(puzzle[posF]==16)
  {

    numero= puzzle[posI];
    puzzle[posI]=16;
    puzzle[posF]=numero;
  }
  
  
  tv.clear_screen();

  dibujar_cuadros();
    
  dibujar_pantalla();
  
  finalizar();
  
}

void finalizar()
{ if(puzzle[0]==1 && puzzle[1]==2 && puzzle[2]==3 && puzzle[3]==4 && puzzle[4]==5 && puzzle[5]==6 && puzzle[6]==7 && puzzle[7]==8 && puzzle[8]==9 && puzzle[9]==10 && puzzle[10]==11 && puzzle[11]==12 && puzzle[12]==13 && puzzle[13]==14 && puzzle[14]==15)
  
          
          {
            tv.clear_screen();
            tv.print(30,40,'GANASTE');
            tv.print(23,60,'intentos: ');
            tv.print(83,60,intentos);
            modoJuego=false;
            ganado=true;
            tiempo=millis();

          } 
        
  
}

void temporizador()
{
    
   if(modoJuego==true)
   {
    tiempo= millis()-inicio;  
    
  
   tv.print(78,86,millis());
    
   }
   
}

void setup()
{
  tv.begin(_NTSC,120,96);
  tv.select_font(font6x8);
  dibujar_cuadros();
  cuenta=0;
 } 
 
 void loop()
 {

   temporizador();
   
   char key = keypad.getKey();  
   
    if(key)
   {
     //Si el juego no ha comenzado
     if(modoJuego==false)
     {     
       if(key=='A')
       {
         revolver();
         modoJuego=true;
       }
     
     }
     else
     {
       
       
       switch(key)
       {
         
         case '1':
           intercambiar(0,1);
           intercambiar(0,4);
           break;
           
         case '2':
           intercambiar(1,0);
           intercambiar(1,2);           
           intercambiar(1,5);           
           break;

         case '3':
           intercambiar(2,1);
           intercambiar(2,3);
           intercambiar(2,6);           
           break;

         case 'A':  //The four
           
           static int count;

           count=count+1;

           if(count==2)
          {
            revolver();
          }
  
           intercambiar(3,2);
           intercambiar(3,7);                    
           break;

         case '4':  //The 5
           intercambiar(4,0);
           intercambiar(4,5);
           intercambiar(4,8);           
           break;

         case '5':  //The 6
           intercambiar(5,1);
           intercambiar(5,4);
           intercambiar(5,6);           
           intercambiar(5,9);           
           break;

         case '6':  //The 7
           intercambiar(6,2);
           intercambiar(6,5);
           intercambiar(6,7);           
           intercambiar(6,10);           
           break;

         case 'B':  //The 8
           intercambiar(7,3);
           intercambiar(7,6);
           intercambiar(7,11);                  
           break;

         case '7':  //The 9
           intercambiar(8,4);
           intercambiar(8,9);
           intercambiar(8,12); 
           break;

         case '8':  //The 10
           intercambiar(9,5);
           intercambiar(9,8);
           intercambiar(9,10);
           intercambiar(9,13);                     
           break;

         case '9':  //The 11
           intercambiar(10,6); 
           intercambiar(10,9); 
           intercambiar(10,11); 
           intercambiar(10,14);            
           break;

         case 'C':  //The 12
           intercambiar(11,7); 
           intercambiar(11,10); 
           intercambiar(11,15); 
           break;

         case '*':  //The 13
           intercambiar(12,8); 
           intercambiar(12,13);            
           break;

         case '0':  //The 14
           intercambiar(13,9); 
           intercambiar(13,12);    
           intercambiar(13,14);            
           break;

         case '#':  //The 15
           intercambiar(14,10); 
           intercambiar(14,13); 
           intercambiar(14,15);            
           break;

         case 'D':  //The 16
           intercambiar(15,11); 
           intercambiar(15,14);            
           break;
           
           
       }//Fin switch
       
      intentos++; 
       
     }  //Fin else
     
   }  //Fin If key

    
   if(ganado!=true)
     {
       
     dibujar_pantalla();
     
     }
   
  
   
 }  //End loop







Download me
Autor: sistemasymicros
25 proyectos 1 seguidores 0 siguiendo

Ingeniero en electronica, desarrollador de software. Desarrollo de proyectos con microcontroladores.

COMENTARIOS
Para publicar un comentario debes