SimonDice: Placa ZumCore + Arduino + Fishertechnik

(Post en construccion)

 

Publicamos aqui la primera parte del proyecto SimonDice, en la que usamos una placa Zum Core, que fue programada totalemnte en lenguaje Arduino.

 

Codigo Fuente:

// simondice.ino
// Programa para generar la seceuncia del juego simon dice.
// Autores: Equipo de 8vo del Liceo Willow, Salinas, Uruguay.

// DEFINICION DE PINES
#define   BUZZER   7
// Botones
#define   ENTRADA_A  10
#define   ENTRADA_B  11
#define   ENTRADA_C  12
#define   ENTRADA_D  13
// Leds conectados
#define   SALIDA_A   2
#define   SALIDA_B   3
#define   SALIDA_C   4
#define   SALIDA_D   5

// DEFINICION DE OTRAS VARIABLES
int melodia[ ] = {262, 196, 196, 220, 196, 0, 247, 262};
int duracionNotas[] = {4, 8, 8, 4, 4, 4, 4, 4};
int nivelActual = 1;
int velocidad = 500;
const int NIVEL_MAX = 100;
int secuencia[NIVEL_MAX];
int secuenciaUsuario[NIVEL_MAX];

//#########################################
void setup(){
   // ENTRADAS
   pinMode(ENTRADA_D, INPUT);
   pinMode(ENTRADA_C, INPUT);
   pinMode(ENTRADA_B, INPUT);
   pinMode(ENTRADA_A, INPUT);

   // SALIDAS
   pinMode(SALIDA_A, OUTPUT);
   pinMode(SALIDA_B, OUTPUT);
   pinMode(SALIDA_C, OUTPUT);
   pinMode(SALIDA_D, OUTPUT);

   // APAGAR LEDS
   digitalWrite(SALIDA_A, LOW);
   digitalWrite(SALIDA_B, LOW);
   digitalWrite(SALIDA_C, LOW);
   digitalWrite(SALIDA_D, LOW);
}
//#########################################
// Lanza por el pin 7 (buzzer) unos tonos alamacenados en el
// array melodia[]
void melodiaError(){
   for(int i = 0; i < 8; i++){
      int duracionNota = 1000/duracionNotas[i];
      tone(BUZZER, melodia[i], duracionNota); // Corrección aquí
      int pausaEntreNotas = duracionNota * 1.30;
      delay(pausaEntreNotas);
      noTone(BUZZER);
   }
}

//#########################################
void secuenciaError(){
   // Primero: prender todas las luces para alertar !!
   digitalWrite(SALIDA_A, HIGH);
   digitalWrite(SALIDA_B, HIGH);
   digitalWrite(SALIDA_C, HIGH);
   digitalWrite(SALIDA_D, HIGH);
   delay(250);
   // Tonos de error
   melodiaError();
   nivelActual = 1;
   velocidad = 500; 
   // Apagar Leds  
   digitalWrite(SALIDA_A, LOW);
   digitalWrite(SALIDA_B, LOW);
   digitalWrite(SALIDA_C, LOW);
   digitalWrite(SALIDA_D, LOW);
   delay(250);
}

//#########################################
// Genera en el array secuencia[] los 100 niveles
// (cada nivel es una luz o secuencia mas ..)
void generaSecuencia(){
   randomSeed(millis());
   for(int i = 0; i < NIVEL_MAX; i++){
      secuencia[i] = random(2,6);
   }
}
//######################################### 
void muestraSecuencia(){
   // Apagar leds
   digitalWrite(SALIDA_A, LOW);
   digitalWrite(SALIDA_B, LOW);
   digitalWrite(SALIDA_C, LOW);
   digitalWrite(SALIDA_D, LOW);
   
   // Emitir Tono segun la "secuencia actual".
   for(int i = 0; i < nivelActual; i++){
      if( secuencia[i] == SALIDA_A ){
         tone(BUZZER, 200);
         delay(200);
         noTone(BUZZER);
      }
      if( secuencia[i] == SALIDA_B ){
         tone(BUZZER, 300);
         delay(200);
         noTone(BUZZER);
      }
      if( secuencia[i] == SALIDA_C ){
         tone(BUZZER, 400);
         delay(200);
         noTone(BUZZER);
      }
      if( secuencia[i] == SALIDA_D ){
         tone(BUZZER, 500);
         delay(200);
         noTone(BUZZER);
      }

      // prende el Led correspondiente a la "secuencia actual"
      digitalWrite(secuencia[i], HIGH);
      delay(velocidad);
      digitalWrite(secuencia[i], LOW);
      delay(200);
   }
}
//#########################################
// Avanza de nivel e incrementa la velocidad del juego
void secuenciaCorrecta(){
   if(nivelActual < NIVEL_MAX)
      nivelActual++;
   velocidad -= 50;
   delay(200);
}

//#########################################
void leeSecuencia(){
   int flag = 0;
   // Para toda la secuencia alamacenada ...
   for(int i = 0; i < nivelActual; i++){
      flag = 0;
      // Leer el boton que presione el usuario
      // y compararlo con la secuencia generada por Simon
      // Si es correcta, avanzar el nivel e incrementar la velocidad
      // Si no, Generar el error y comenzar de nuevo
      while(flag == 0){
         if(digitalRead(ENTRADA_D) == 1){
            digitalWrite(SALIDA_D, HIGH);
            tone(BUZZER, 500);
            delay(200);
            noTone(BUZZER);
            secuenciaUsuario[i] = SALIDA_D;
            flag = 1;
            delay(200);
            if(secuenciaUsuario[i] != secuencia[i]){
               secuenciaError();
               return;
            }
            digitalWrite(SALIDA_D, LOW);
         }
         if(digitalRead(ENTRADA_C) == 1){
            digitalWrite(SALIDA_C, HIGH);
            tone(BUZZER, 400);
            delay(200);
            noTone(BUZZER);
            secuenciaUsuario[i] = SALIDA_C;
            flag = 1;
            delay(200);
            if(secuenciaUsuario[i] != secuencia[i]){
               secuenciaError();
               return;
            }
            digitalWrite(SALIDA_C, LOW);
         }
         if(digitalRead(ENTRADA_B) == 1){
            digitalWrite(SALIDA_B, HIGH);
            tone(BUZZER, 300);
            delay(200);
            noTone(BUZZER);
            secuenciaUsuario[i] = SALIDA_B;
            flag = 1;
            delay(200);
            if(secuenciaUsuario[i] != secuencia[i]){
               secuenciaError();
               return;
            }
            digitalWrite(SALIDA_B, LOW);
         }
         if(digitalRead(ENTRADA_A) == 1){
            digitalWrite(SALIDA_A, HIGH);
            tone(BUZZER, 200);
            delay(200);
            noTone(BUZZER);
            secuenciaUsuario[i] = SALIDA_A;
            flag = 1;
            delay(200);
            if(secuenciaUsuario[i] != secuencia[i]){
               secuenciaError();
               return;
            }
            digitalWrite(SALIDA_A, LOW);
         }
      }
   }
   secuenciaCorrecta();
}

//#########################################
// CODIGO PRINCIPAL
void loop(){

    // Generar secuencia SOLAMENTE si es nivel 1
    if(nivelActual == 1){
        generaSecuencia();
    }

    // Con la secuencia generada, JUGAR ....
    muestraSecuencia();
    leeSecuencia();
}

//############    FIN PROGRAMA   ################# 

 

 

Proximamente publicaremos el circuito, descripciones y fotos del proyecto.

 

 

 

 

 

 

 

 

 

Leave a Reply

Your email address will not be published.