jueves, 9 de enero de 2020

PROGRAMA SIMON DICE:
// Declaramos los pins de salida para los LED
  const int led_rojo = 2;         
  const int led_azul = 3;
  const int led_amarillo = 4;
  const int led_verde = 5;
  
 // Declaramos el pin para el zumbador piezoelectrico
  const int zumbador = 13;  
  
 // Declaramos los pins de salida para los botones
  const int boton_rojo = 6;      
  const int boton_azul = 7;
  const int boton_amarillo = 8; 
  const int boton_verde = 9;   
 
 // Declaramos alguna variables
  long sequence[20];             // Array que alberga la secuencia
  int contador = 0;              // Contador
  long input = 5;                // Indicador de boton pulsado
  int wait = 500;                // Retraso segun la secuencia se incrementa
  int puntuacion_maxima = 20;    // Puntuación máxima donde acaba el juego 
 
 // Declaramos algunas variables para los efectos musicales
  int length = 15;                  // Numero de notas de la melodia
  char notes[] = "ccggaagffeeddc "; // Notas de la melodia (cada letra es una nota distinta)
  int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 };  // Duracion de cada tono en un array
  int tempo = 100;  //Tempo de la melodia
 
 
  
  void setup() {
 // Configuramos los pines de los leds y del zumbador como salidas
  pinMode(led_rojo, OUTPUT);      
  pinMode(led_verde, OUTPUT); 
  pinMode(led_amarillo, OUTPUT); 
  pinMode(led_azul, OUTPUT); 
  pinMode(zumbador, OUTPUT);
    
 // Configuramos los pines de los botones como entradas
  pinMode(boton_rojo, INPUT);    
  pinMode(boton_verde, INPUT);
  pinMode(boton_amarillo, INPUT);
  pinMode(boton_azul, INPUT);
    
 // Iniciamos las resistencias PullUp internas para los botones
  digitalWrite(boton_rojo, HIGH);
  digitalWrite(boton_verde, HIGH);
  digitalWrite(boton_amarillo, HIGH);
  digitalWrite(boton_azul, HIGH);
    
  // Hacemos que suene la melodia al arrancar el Arduino    
  felicitacion();
  }
  
 
 
  void loop() {
  mostrar_secuencia();  // Reproduce la sequencia
  leer_secuencia();     // Lee la sequencia
  delay(1000);          // Espera 1 segundo
  }
  
  
  
 // Funcion para definir las notas y sus frecuencias
  void playNote(char note, int duration) {
  char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
  int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
 
  for (int i = 0; i < 8; i++) {
     if (names[i] == note) {
       playtone(tones[i], duration);
     }
  }
  }
 
 
 
 // Funcion para definir las notas segun la duración y el tono
  void playtone(int tone, int duration) {
    for (long i = 0; i < duration * 1000L; i += tone *2) {
      digitalWrite(zumbador, HIGH);
      delayMicroseconds(tone);
      digitalWrite(zumbador, LOW);
      delayMicroseconds(tone);
    }
  }
     
  
 
 // Funciones para encender los leds y reproducir el tono correspondiente
  void flash_rojo() {
  digitalWrite(led_rojo, HIGH);
  playtone(2273,wait);            
  digitalWrite(led_rojo, LOW);
  }
  
  void flash_azul() {
  digitalWrite(led_azul, HIGH);
  playtone(1700,wait);            
  digitalWrite(led_azul, LOW);
  }
  
  void flash_amarillo() {
  digitalWrite(led_amarillo, HIGH);
  playtone(1275,wait);             
  digitalWrite(led_amarillo, LOW);
  } 
  
  void flash_verde() {
  digitalWrite(led_verde, HIGH);
  playtone(1136,wait);             
  digitalWrite(led_verde, LOW);
  }
  
  
 
 // Funcion para mostrar que botón se tenia que pulsar en caso de error del jugador
  void mostrar_boton_correcto(long led) {
    switch (led) {
        case 0:
          flash_rojo();
          break;
        case 1:
          flash_verde();
          break;
        case 2:
          flash_amarillo();
          break;
        case 3:
          flash_azul();
          break;
      }
      delay(50);
  }
 
 
 
 // Función que reproduce la canción al arrancar el arduino y para el juego cuando se llega a la puntuacion maxima
  void felicitacion() {
  digitalWrite(led_rojo, HIGH);       
  digitalWrite(led_verde, HIGH);
  digitalWrite(led_amarillo, HIGH);
  digitalWrite(led_azul, HIGH);
   
  for (int i = 0; i < length; i++) {
   if (notes[i] == ' ') {
     delay(beats[i] * tempo); // rest
   } else {
     playNote(notes[i], beats[i] * tempo);
   }
   delay(tempo / 2); 
  }
   
  delay(1000);   
  digitalWrite(led_rojo, LOW);      
  digitalWrite(led_verde, LOW);
  digitalWrite(led_amarillo, LOW);
  digitalWrite(led_azul, LOW);
  resetcontador();                    
  }
    
 // Reseteamos contadores
  void resetcontador() {
  contador = 0;
  wait = 500;
  }
 
  
  
 // Funcion para crear y reproducir los patrones
  void mostrar_secuencia() {
 
 // Con esto hacemos que la función Random sea aun mas aleatoria
  randomSeed(analogRead(8));
    
  sequence[contador] = random(4);       
    for (int i = 0; i < contador; i++) {  
      mostrar_boton_correcto(sequence[i]);             
    }
  wait = 500 - (contador * 15);        
  contador++;                          
  }
 
 
 
  // Funcion para leer los botones que pulsa el jugador
 void leer_secuencia() {
   for (int i=1; i < contador; i++) {              
      while (input==5){                          
        if (digitalRead(boton_rojo) == LOW) {    
          input = 0;
        }
        if (digitalRead(boton_verde) == LOW) {  
          input = 1;
        }
        if (digitalRead(boton_amarillo) == LOW) {
          input = 2;
        }
        if (digitalRead(boton_azul) == LOW) {   
          input = 3;
        }
      }
    
  if (sequence[i-1] == input) {              
        mostrar_boton_correcto(input);                           
        if (i == puntuacion_maxima) {                        
          felicitacion();                        
        }
      }
        else {
          playtone(4545,1500);                  
          delay(500);
          mostrar_boton_correcto(sequence[i-1]);                 
          mostrar_boton_correcto(sequence[i-1]);                 
          mostrar_boton_correcto(sequence[i-1]);
          delay(1000);
          felicitacion();
          resetcontador();                          
      } 
    input = 5;                                   
    }
  }  

No hay comentarios:

Publicar un comentario