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.







