El Código
​
//---------------------------------------------------------------
// Constantes publicas para las notas
//---------------------------------------------------------------
#define Nota_B0 31
#define Nota_C1 33
#define Nota_CS1 35
#define Nota_D1 37
#define Nota_DS1 39
#define Nota_E1 41
#define Nota_F1 44
#define Nota_FS1 46
#define Nota_G1 49
#define Nota_GS1 52
#define Nota_A1 55
#define Nota_AS1 58
#define Nota_B1 62
#define Nota_C2 65
#define Nota_CS2 69
#define Nota_D2 73
#define Nota_DS2 78
#define Nota_E2 82
#define Nota_F2 87
#define Nota_FS2 93
#define Nota_G2 98
#define Nota_GS2 104
#define Nota_A2 110
#define Nota_AS2 117
#define Nota_B2 123
#define Nota_C3 131
#define Nota_CS3 139
#define Nota_D3 147
#define Nota_DS3 156
#define Nota_E3 165
#define Nota_F3 175
#define Nota_FS3 185
#define Nota_G3 196
#define Nota_GS3 208
#define Nota_A3 220
#define Nota_AS3 233
#define Nota_B3 247
#define Nota_C4 262
#define Nota_CS4 277
#define Nota_D4 294
#define Nota_DS4 311
#define Nota_E4 330
#define Nota_F4 349
#define Nota_FS4 370
#define Nota_G4 392
#define Nota_GS4 415
#define Nota_A4 440
#define Nota_AS4 466
#define Nota_B4 494
#define Nota_C5 523
#define Nota_CS5 554
#define Nota_D5 587
#define Nota_DS5 622
#define Nota_E5 659
#define Nota_F5 698
#define Nota_FS5 740
#define Nota_G5 784
#define Nota_GS5 831
#define Nota_A5 880
#define Nota_AS5 932
#define Nota_B5 988
#define Nota_C6 1047
#define Nota_CS6 1109
#define Nota_D6 1175
#define Nota_DS6 1245
#define Nota_E6 1319
#define Nota_F6 1397
#define Nota_FS6 1480
#define Nota_G6 1568
#define Nota_GS6 1661
#define Nota_A6 1760
#define Nota_AS6 1865
#define Nota_B6 1976
#define Nota_C7 2093
#define Nota_CS7 2217
#define Nota_D7 2349
#define Nota_DS7 2489
#define Nota_E7 2637
#define Nota_F7 2794
#define Nota_FS7 2960
#define Nota_G7 3136
#define Nota_GS7 3322
#define Nota_A7 3520
#define Nota_AS7 3729
#define Nota_B7 3951
#define Nota_C8 4186
#define Nota_CS8 4435
#define Nota_D8 4699
#define Nota_DS8 4978
//---------------------------------------------------------------
#define EleccionOFF 0 // Se utiliza para controlar los LED
//---------------------------------------------------------------
#define NingunaEleccion 0 // Se utiliza para comprobar los botones
//---------------------------------------------------------------
#define EleccionRojo (1 << 0)
//---------------------------------------------------------------
#define EleccionVerde (1 << 1)
//---------------------------------------------------------------
#define EleccionAzul (1 << 2)
//---------------------------------------------------------------
#define EleccionAmarillo (1 << 3)
//---------------------------------------------------------------
#define LedRojo 2
//---------------------------------------------------------------
#define LedVerde 7
//---------------------------------------------------------------
#define LedAzul 3
//---------------------------------------------------------------
#define LedAmarillo 4
//---------------------------------------------------------------
// Definiciones de pin de botones
//---------------------------------------------------------------
#define BotonRojo 9
//---------------------------------------------------------------
#define BotonVerde 12
//---------------------------------------------------------------
#define BotonAzul 10
//---------------------------------------------------------------
#define BotonAmarillo 11
//---------------------------------------------------------------
// Definiciones de pin de zumbador
//---------------------------------------------------------------
#define BUZZER1 6
//---------------------------------------------------------------
#define BUZZER2 5
//---------------------------------------------------------------
// Definir parametros del juego
//---------------------------------------------------------------
#define RondasParaGanar 13 // Número de rondas para recordar con éxito antes de ganar. 13 es factible.
//---------------------------------------------------------------
#define LimiteTiempo 3000 // Cantidad de tiempo para presionar un botón antes de que termine el juego. 3000 ms = 3 seg
//---------------------------------------------------------------
#define ModoMemoria 0
//---------------------------------------------------------------
#define ModoBatalla 1
//---------------------------------------------------------------
#define ModoBeeGrees 2
//---------------------------------------------------------------
// Variables de estado del juego
//---------------------------------------------------------------
byte ModoJuego = ModoMemoria; // Por defecto, vamos a jugar al juego de memoria
//---------------------------------------------------------------
byte JuegoMesa[32];// Contiene la combinación de botones a medida que avanzamos
//---------------------------------------------------------------
byte RoundJuego = 0; // Cuenta el número de rondas con las que el jugador ha conseguido
//---------------------------------------------------------------
void setup()
//---------------------------------------------------------------
{
//---------------------------------------------------------------
// Configuración de entradas / salidas de hardware. Estos pines se definen en el archivo de encabezado de versiones de hardware
//---------------------------------------------------------------
// Habilitar pull ups en entradas
//---------------------------------------------------------------
pinMode(BotonRojo, INPUT_PULLUP);
//---------------------------------------------------------------
pinMode(BotonVerde, INPUT_PULLUP);
//---------------------------------------------------------------
pinMode(BotonAzul, INPUT_PULLUP);
//---------------------------------------------------------------
pinMode(BotonAmarillo, INPUT_PULLUP);
//---------------------------------------------------------------
pinMode(LedRojo, OUTPUT);
//---------------------------------------------------------------
pinMode(LedVerde, OUTPUT);
//---------------------------------------------------------------
pinMode(LedAzul, OUTPUT);
//---------------------------------------------------------------
pinMode(LedAmarillo, OUTPUT);
//---------------------------------------------------------------
pinMode(BUZZER1, OUTPUT);
//---------------------------------------------------------------
pinMode(BUZZER2, OUTPUT);
//---------------------------------------------------------------
//Comprobación del modo
//---------------------------------------------------------------
ModoJuego = ModoMemoria; //Por defecto, vamos a jugar al juego de memoria
//---------------------------------------------------------------
// Compruebe si se presiona el botón inferior derecho
//---------------------------------------------------------------
if (VerificaBoton() == EleccionAmarillo) TocarCancionBeeGrees();
//---------------------------------------------------------------
// Compruebe si se ha pulsado el botón superior derecho
//---------------------------------------------------------------
if (VerificaBoton() == EleccionVerde)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
ModoJuego = ModoBatalla; //Pon el juego en modo batalla
//---------------------------------------------------------------
// Enciende el LED superior derecho (verde)
//---------------------------------------------------------------
ConjuntoLeds(EleccionVerde);
//---------------------------------------------------------------
TonoSonido(EleccionVerde, 150);
//---------------------------------------------------------------
ConjuntoLeds(EleccionRojo | EleccionAzul | EleccionAmarillo); // Encienda los otros Leds hasta que suelte el botón
//---------------------------------------------------------------
while (VerificaBoton() != NingunaEleccion) ; //Espere a que el usuario deje de pulsar el botón
//---------------------------------------------------------------
// Ahora no hagas nada. El modo de batalla será mantenido en la rutina principal
}
//---------------------------------------------------------------
TocarPitidos(); // Una vez finalizada la configuración, saluda al mundo
//---------------------------------------------------------------
}
//---------------------------------------------------------------
void loop()
//---------------------------------------------------------------
{
//---------------------------------------------------------------
ModoParpadeo(); // Parpadea mientras espera que el usuario presione un botón
//---------------------------------------------------------------
// Indicar el inicio del juego
//---------------------------------------------------------------
ConjuntoLeds(EleccionRojo | EleccionVerde | EleccionAzul | EleccionAmarillo); //Encender todos los Leds
//---------------------------------------------------------------
delay(1000);
//---------------------------------------------------------------
ConjuntoLeds(EleccionOFF); // Apague los Leds
//---------------------------------------------------------------
delay(250);
//---------------------------------------------------------------
if (ModoJuego == ModoMemoria)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
// Juega al juego de memoria y maneja el resultado
//---------------------------------------------------------------
if (JugarSimonDice() == true)
//---------------------------------------------------------------
TocarPitidos(); //Jugador ganado, jugar tonos ganadores
//---------------------------------------------------------------
else
//---------------------------------------------------------------
Perdedor(); // Jugador perdido, jugar los tonos perdedores
//---------------------------------------------------------------
}
//---------------------------------------------------------------
if (ModoJuego == ModoBatalla)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
JugarBatalla(); //Juegue hasta que alguien pierda
//---------------------------------------------------------------
Perdedor(); // Jugador perdido, jugar los tonos perdedores
//---------------------------------------------------------------
}
//---------------------------------------------------------------
}
//---------------------------------------------------------------
// Las siguientes funciones están relacionadas sólo con el juego
// Juega el juego de memoria regular
// Devuelve 0 si el jugador pierde, o 1 si el jugador gana
//---------------------------------------------------------------
boolean JugarSimonDice(void)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
randomSeed(millis()); // Sembrar el generador aleatorio con una cantidad aleatoria de millis ()
//---------------------------------------------------------------
RoundJuego = 0; // Restablecer el juego al principio
//---------------------------------------------------------------
while (RoundJuego < RondasParaGanar)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
AgregarMovimientos(); // Añadir un botón a los movimientos actuales, luego reproducirlos
//---------------------------------------------------------------
JugarMovimientos(); // Reproducir el tablero de juego actual
//---------------------------------------------------------------
// Luego, pida al jugador que repita la secuencia.
//---------------------------------------------------------------
for (byte MovimientoActual = 0 ; MovimientoActual < RoundJuego ; MovimientoActual++)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
byte Eleccion = EsperarBoton(); // Vea el botón que el usuario presiona
//---------------------------------------------------------------
if ( Eleccion == 0) return false; // Si el tiempo de espera excedido, el jugador pierde
//---------------------------------------------------------------
if ( Eleccion != JuegoMesa[ MovimientoActual]) return false; // Si la elección es incorrecta, el jugador pierde
//---------------------------------------------------------------
}
//---------------------------------------------------------------
delay(1000); // Jugador correcto, retraso antes de jugar movimientos
//---------------------------------------------------------------
}
//---------------------------------------------------------------
return true; // Jugador lo hizo a través de todas las rondas para ganar!
//---------------------------------------------------------------
}
//---------------------------------------------------------------
// Juega el modo especial de batalla de 2 jugadores
// Un jugador comienza presionando un botón y luego entregándolo al otro jugador
// Este jugador repite el botón y añade uno, luego pasa atrás.
// Esta función devuelve cuando alguien pierde
//---------------------------------------------------------------
boolean JugarBatalla(void)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
RoundJuego = 0; //Restablecer el marco de juego de nuevo a un marco
//---------------------------------------------------------------
while (1) // Bucle hasta que alguien falla
//---------------------------------------------------------------
{
//---------------------------------------------------------------
byte NuevoBoton = EsperarBoton(); // Espere a que el usuario introduzca el siguiente movimiento
//---------------------------------------------------------------
JuegoMesa[RoundJuego++] = NuevoBoton; // Añadir este nuevo botón a la matriz de juego
//---------------------------------------------------------------
// Luego, pida al jugador que repita la secuencia.
//---------------------------------------------------------------
for (byte MovimientoActual = 0 ; MovimientoActual < RoundJuego ; MovimientoActual++)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
byte Eleccion = EsperarBoton();
//---------------------------------------------------------------
if ( Eleccion == 0) return false; // Si el tiempo de espera expiró, el jugador pierde.
//---------------------------------------------------------------
if ( Eleccion != JuegoMesa[ MovimientoActual]) return false; // Si la elección es incorrecta, el jugador pierde.
//---------------------------------------------------------------
}
//---------------------------------------------------------------
delay(100); // Dar al usuario un extra de 100ms para entregar el juego al otro jugador
//---------------------------------------------------------------
}
//---------------------------------------------------------------
return true; // Nunca deberíamos llegar aquí
//---------------------------------------------------------------
}
//---------------------------------------------------------------
// Reproduce el contenido actual de los movimientos del juego
//---------------------------------------------------------------
void JugarMovimientos(void)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
for (byte MovimientoActual = 0 ; MovimientoActual < RoundJuego ; MovimientoActual++)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
TonoSonido(JuegoMesa[ MovimientoActual], 150);
//---------------------------------------------------------------
// Espera un poco de tiempo entre la reproducción del botón
// Acortar esto para que el juego sea más difícil
//---------------------------------------------------------------
delay(150); // 150 funciona bien. 75 se pone rápido.
//---------------------------------------------------------------
}
//---------------------------------------------------------------
}
//---------------------------------------------------------------
// Agrega un nuevo botón aleatorio a la secuencia del juego, muestreando el temporizador
//---------------------------------------------------------------
void AgregarMovimientos(void)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
byte NuevoBoton = random(0, 4); // Min (incluido), máx (excluido)
//---------------------------------------------------------------
// Tenemos que convertir este número, 0 a 3, a Eleccions
//---------------------------------------------------------------
if (NuevoBoton == 0) NuevoBoton = EleccionRojo;
//---------------------------------------------------------------
else if (NuevoBoton == 1) NuevoBoton = EleccionVerde;
//---------------------------------------------------------------
else if (NuevoBoton == 2) NuevoBoton = EleccionAzul;
//---------------------------------------------------------------
else if (NuevoBoton == 3) NuevoBoton = EleccionAmarillo;
//---------------------------------------------------------------
JuegoMesa[RoundJuego++] = NuevoBoton; // Añadir este nuevo botón a la matriz de juego
//---------------------------------------------------------------
}
//---------------------------------------------------------------
// Las siguientes funciones controlan el hardware
// Enciende un LED determinado
// Pasa un byte que se compone de EleccionRojo, EleccionAmarillo, etc
//---------------------------------------------------------------
void ConjuntoLeds(byte Leds)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
if ((Leds & EleccionRojo) != 0)
//---------------------------------------------------------------
digitalWrite(LedRojo, HIGH);
//---------------------------------------------------------------
else
//---------------------------------------------------------------
digitalWrite(LedRojo, LOW);
//---------------------------------------------------------------
//---------------------------------------------------------------
if ((Leds & EleccionVerde) != 0)
//---------------------------------------------------------------
digitalWrite(LedVerde, HIGH);
//---------------------------------------------------------------
else
//---------------------------------------------------------------
digitalWrite(LedVerde, LOW);
//---------------------------------------------------------------
//---------------------------------------------------------------
if ((Leds & EleccionAzul) != 0)
//---------------------------------------------------------------
digitalWrite(LedAzul, HIGH);
//---------------------------------------------------------------
else
//---------------------------------------------------------------
digitalWrite(LedAzul, LOW);
//---------------------------------------------------------------
//---------------------------------------------------------------
if ((Leds & EleccionAmarillo) != 0)
//---------------------------------------------------------------
digitalWrite(LedAmarillo, HIGH);
//---------------------------------------------------------------
else
//---------------------------------------------------------------
digitalWrite(LedAmarillo, LOW);
//---------------------------------------------------------------
}
//---------------------------------------------------------------
// Esperar a que se presione un botón.
// Devuelve uno de los colores del LED (LedRojo, etc.) si tiene éxito, 0 si se ha agotado el tiempo
//---------------------------------------------------------------
byte EsperarBoton(void)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
long TiempoInicio = millis(); // Recuerde el momento en que iniciamos el ciclo
//---------------------------------------------------------------
//---------------------------------------------------------------
while ( (millis() - TiempoInicio) < LimiteTiempo) // Bucle hasta que haya pasado demasiado tiempo
//---------------------------------------------------------------
{
//---------------------------------------------------------------
byte Boton = VerificaBoton();
//---------------------------------------------------------------
//---------------------------------------------------------------
if (Boton != NingunaEleccion)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
TonoSonido(Boton, 150); // Reproduzca el botón que acaba de pulsar el usuario
//---------------------------------------------------------------
//---------------------------------------------------------------
while (VerificaBoton() != NingunaEleccion) ; // Ahora vamos a esperar a que el usuario suelte el botón
//---------------------------------------------------------------
delay(10); // Esto ayuda con el rebote y los golpes dobles accidentales
//---------------------------------------------------------------
//---------------------------------------------------------------
return Boton;
//---------------------------------------------------------------
}
//---------------------------------------------------------------
}
//---------------------------------------------------------------
return NingunaEleccion; // Si llegamos aquí, ¡nos hemos agotado!
//---------------------------------------------------------------
}
//---------------------------------------------------------------
// Devuelve un bit '1' en la posición correspondiente a EleccionRojo, EleccionVerde, etc.
//---------------------------------------------------------------
byte VerificaBoton(void)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
if (digitalRead(BotonRojo) == 0) return (EleccionRojo);
//---------------------------------------------------------------
else if (digitalRead(BotonVerde) == 0) return (EleccionVerde);
//---------------------------------------------------------------
else if (digitalRead(BotonAzul) == 0) return (EleccionAzul);
//---------------------------------------------------------------
else if (digitalRead(BotonAmarillo) == 0) return (EleccionAmarillo);
//---------------------------------------------------------------
return (NingunaEleccion); // Si no se pulsa ningún botón, devolver ninguno
//---------------------------------------------------------------
}
//---------------------------------------------------------------
// Enciende un LED y el tono de reproducción
// Rojo, superior izquierda: 440Hz - 2.272ms - 1.136ms pulso
// Verde, superior derecha: 880Hz - 1.136ms - 0.568ms pulso
// Azul, abajo a la izquierda: 587.33Hz - 1.702ms - 0.851ms pulso
// Amarillo, abajo a la derecha: 784Hz - 1.276ms - 0.638ms pulso
//---------------------------------------------------------------
void TonoSonido(byte Cual, int LongitudZumbido)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
ConjuntoLeds(Cual); // Activar un LED determinado
//---------------------------------------------------------------
// Reproduce el sonido asociado con el LED
//---------------------------------------------------------------
switch (Cual)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
case EleccionRojo:
//---------------------------------------------------------------
SonidoBuzzer(LongitudZumbido, 1136);
//---------------------------------------------------------------
break;
//---------------------------------------------------------------
case EleccionVerde:
//---------------------------------------------------------------
SonidoBuzzer(LongitudZumbido, 568);
//---------------------------------------------------------------
break;
//---------------------------------------------------------------
case EleccionAzul:
//---------------------------------------------------------------
SonidoBuzzer(LongitudZumbido, 851);
//---------------------------------------------------------------
break;
//---------------------------------------------------------------
case EleccionAmarillo:
//---------------------------------------------------------------
SonidoBuzzer(LongitudZumbido, 638);
//---------------------------------------------------------------
break;
//---------------------------------------------------------------
}
//---------------------------------------------------------------
ConjuntoLeds(EleccionOFF); //Apague todos los Leds
//---------------------------------------------------------------
}
//---------------------------------------------------------------
// Cambia el buzzer cada DemoraZumbido, para una duración de LongitudZumbido.
//---------------------------------------------------------------
void SonidoBuzzer(int LongitudZumbido, int DemoraZumbido)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
// Convertir el tiempo total de reproducción de milisegundos a microsegundos
//---------------------------------------------------------------
long LongitudZumbidoMicroSegundo = LongitudZumbido * (long)1000;
//---------------------------------------------------------------
// Loop hasta que el tiempo de reproducción restante sea menor que un solo DemoraZumbido
//---------------------------------------------------------------
while (LongitudZumbidoMicroSegundo > (DemoraZumbido * 2))
//---------------------------------------------------------------
{
//---------------------------------------------------------------
LongitudZumbidoMicroSegundo -= DemoraZumbido * 2; // Disminuir el tiempo de reproducción restante
//---------------------------------------------------------------
// Conmutar el zumbador a varias velocidades
//---------------------------------------------------------------
digitalWrite(BUZZER1, LOW);
//---------------------------------------------------------------
digitalWrite(BUZZER2, HIGH);
//---------------------------------------------------------------
delayMicroseconds(DemoraZumbido);
//---------------------------------------------------------------
digitalWrite(BUZZER1, HIGH);
//---------------------------------------------------------------
digitalWrite(BUZZER2, LOW);
//---------------------------------------------------------------
delayMicroseconds(DemoraZumbido);
//---------------------------------------------------------------
}
//---------------------------------------------------------------
}
//---------------------------------------------------------------
// Reproducir el sonido ganador y las luces
//---------------------------------------------------------------
void TocarPitidos(void)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
ConjuntoLeds(EleccionVerde | EleccionAzul);
//---------------------------------------------------------------
SonidoGanador();
//---------------------------------------------------------------
ConjuntoLeds(EleccionRojo | EleccionAmarillo);
//---------------------------------------------------------------
SonidoGanador();
//---------------------------------------------------------------
ConjuntoLeds(EleccionVerde | EleccionAzul);
//---------------------------------------------------------------
SonidoGanador();
//---------------------------------------------------------------
ConjuntoLeds(EleccionRojo | EleccionAmarillo);
//---------------------------------------------------------------
//---------------------------------------------------------------
SonidoGanador();
//---------------------------------------------------------------
}
//---------------------------------------------------------------
// Reproducir el sonido ganador
// Esto es solo un sonido (molesto) único que surgió, no hay magia
//---------------------------------------------------------------
void SonidoGanador(void)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
// Conmutar el zumbador a varias velocidades
//---------------------------------------------------------------
for (byte x = 250 ; x > 70 ; x--)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
for (byte y = 0 ; y < 3 ; y++)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
digitalWrite(BUZZER2, HIGH);
//---------------------------------------------------------------
digitalWrite(BUZZER1, LOW);
//---------------------------------------------------------------
delayMicroseconds(x);
//---------------------------------------------------------------
digitalWrite(BUZZER2, LOW);
//---------------------------------------------------------------
digitalWrite(BUZZER1, HIGH);
//---------------------------------------------------------------
delayMicroseconds(x);
//---------------------------------------------------------------
}
//---------------------------------------------------------------
}
//---------------------------------------------------------------
}
//---------------------------------------------------------------
// Reproducir el sonido perdedor / luces
//---------------------------------------------------------------
void Perdedor(void)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
ConjuntoLeds(EleccionRojo | EleccionVerde);
//---------------------------------------------------------------
SonidoBuzzer(255, 1500);
//---------------------------------------------------------------
ConjuntoLeds(EleccionAzul | EleccionAmarillo);
//---------------------------------------------------------------
SonidoBuzzer(255, 1500);
//---------------------------------------------------------------
ConjuntoLeds(EleccionRojo | EleccionVerde);
//---------------------------------------------------------------
SonidoBuzzer(255, 1500);
//---------------------------------------------------------------
ConjuntoLeds(EleccionAzul | EleccionAmarillo);
//---------------------------------------------------------------
SonidoBuzzer(255, 1500);
//---------------------------------------------------------------
}
//---------------------------------------------------------------
// Mostrar una pantalla de "modo de atracción" mientras espera que el usuario presione el botón.
//---------------------------------------------------------------
void ModoParpadeo(void)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
while (1)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
ConjuntoLeds(EleccionRojo);
//---------------------------------------------------------------
delay(100);
//---------------------------------------------------------------
if (VerificaBoton() != NingunaEleccion) return;
//---------------------------------------------------------------
ConjuntoLeds(EleccionAzul);
//---------------------------------------------------------------
delay(100);
//---------------------------------------------------------------
if (VerificaBoton() != NingunaEleccion) return;
//---------------------------------------------------------------
ConjuntoLeds(EleccionVerde);
//---------------------------------------------------------------
delay(100);
//---------------------------------------------------------------
if (VerificaBoton() != NingunaEleccion) return;
//---------------------------------------------------------------
ConjuntoLeds(EleccionAmarillo);
//---------------------------------------------------------------
delay(100);
//---------------------------------------------------------------
if (VerificaBoton() != NingunaEleccion) return;
//---------------------------------------------------------------
}
//---------------------------------------------------------------
}
//---------------------------------------------------------------
// Las siguientes funciones están relacionadas con Beegees Easter Egg only
// Notas en la melodía. Cada nota es sobre una nota 1/8, "0" s son descansos.
//---------------------------------------------------------------
int Melodia[] = {
//---------------------------------------------------------------
Nota_G4, Nota_A4, 0, Nota_C5, 0, 0, Nota_G4, 0, 0, 0,
//---------------------------------------------------------------
Nota_E4, 0, Nota_D4, Nota_E4, Nota_G4, 0,
//---------------------------------------------------------------
Nota_D4, Nota_E4, 0, Nota_G4, 0, 0,
//---------------------------------------------------------------
Nota_D4, 0, Nota_E4, 0, Nota_G4, 0, Nota_A4, 0, Nota_C5, 0
//---------------------------------------------------------------
};
//---------------------------------------------------------------
int DuracionNota = 115; // Esto básicamente establece el tempo, 115 es casi correcto para un disco groove :)
//---------------------------------------------------------------
int LedNumero = 0; // Mantiene la pista de qué LED estamos encendidos durante el loop beegees
//---------------------------------------------------------------
// No hagas nada más que tocar bad beegees music
// Esta función se activa cuando el usuario mantiene pulsado el botón inferior derecho durante el encendido
//---------------------------------------------------------------
void TocarCancionBeeGrees()
//---------------------------------------------------------------
{
//---------------------------------------------------------------
// Enciende el LED derecho inferior (amarillo)
//---------------------------------------------------------------
ConjuntoLeds(EleccionAmarillo);
//---------------------------------------------------------------
TonoSonido(EleccionAmarillo, 150);
//---------------------------------------------------------------
ConjuntoLeds(EleccionRojo | EleccionVerde | EleccionAzul); // Encienda los otros Leds hasta que suelte el botón
//---------------------------------------------------------------
while (VerificaBoton() != NingunaEleccion) ; //Espere a que el usuario deje de pulsar el botón
//---------------------------------------------------------------
ConjuntoLeds(NingunaEleccion); //Apague los Leds
//---------------------------------------------------------------
delay(1000); // Espere un segundo antes de tocar la canción
//---------------------------------------------------------------
digitalWrite(BUZZER1, LOW); // Configure el lado "BUZZER1" del zumbador para que permanezca bajo, mientras tocamos el tono en el otro pino.
//---------------------------------------------------------------
while (VerificaBoton() == NingunaEleccion) // Reproducir canción hasta que pulse un botón
//---------------------------------------------------------------
{
//---------------------------------------------------------------
// itera sobre las notas de la melodía:
//---------------------------------------------------------------
for (int EstaNota = 0; EstaNota < 32; EstaNota++) {
//---------------------------------------------------------------
CambioLed();
//---------------------------------------------------------------
tone(BUZZER2, Melodia[EstaNota], DuracionNota);
//---------------------------------------------------------------
// para distinguir las notas, establezca un tiempo mínimo entre ellas.
//---------------------------------------------------------------
// la duración de la nota + 30% parece funcionar bien:
//---------------------------------------------------------------
int PausaEntreNotas = DuracionNota * 1.30;
//---------------------------------------------------------------
delay(PausaEntreNotas);
//---------------------------------------------------------------
// detener la reproducción de tono:
//---------------------------------------------------------------
noTone(BUZZER2);
//---------------------------------------------------------------
}
//---------------------------------------------------------------
}
//---------------------------------------------------------------
}
//---------------------------------------------------------------
// Cada vez que se llama a esta función, la tabla se mueve al siguiente LED
//---------------------------------------------------------------
void CambioLed(void)
//---------------------------------------------------------------
{
//---------------------------------------------------------------
ConjuntoLeds(1 << LedNumero); // Cambiar el LED
//---------------------------------------------------------------
LedNumero++; // Ir al siguiente LED
//---------------------------------------------------------------
if (LedNumero > 3) LedNumero = 0; // Envuelva el contador si es necesario
//---------------------------------------------------------------
}
//---------------------------------------------------------------
Simón Dice, Versión 2
Juego de memoria, el conocido, Simón Dice.
​
Materiales para el proyecto:
​
Arduino Uno.
2 Buzzer.
4 Pulsadores.
4 Resistencias de 220 ohm.
1 Led Rojo.
1 Led Verde.
1 Led Amarillo
1 Led Azul.
Conexión:
​Pin 6 del Arduino al Buzzer.
​Pin 5 del Arduino al Buzzer.
​Pin 2 del Arduino al Led Rojo Aviso.
​Pin 3 del Arduino al Led Azul Aviso.
​Pin 4 del Arduino al Led Amarillo Aviso.
​Pin 7 del Arduino al Led Verde Aviso.
​Pin 9 del Arduino al Pulsador del Led Rojo Aviso.
​Pin 10 del Arduino al Pulsador del Led Azul Aviso.
​Pin 11 del Arduino al Pulsador del Led Amarillo Aviso.
​Pin 12 del Arduino al Pulsador del Led Verde Aviso.
​
​
​
​
​






