Descuentos a estudiantes 

KIT CON ARDUINO "SIMON DICE"


 

22.50 Dólares USD

KIT-025

1 Arduino Uno Genérico

1 Cable USB

1 Protoboard ROB3001

1 Buzzer

4 Leds colores

4 Resistencias 220 ohms 1/2w

4 Interruptores 

20 Jumpers M-M ROB1009

#include "pitches.h"
//posiciones que ocuparan en los vectores
//los colores de los botones se corresponden con los de los leds.
#define LEDROJO 0
#define LEDAZUL 1
#define LEDVERDE 2
#define LEDAMARILLO 3
#define NUMLEDS 4 //Cantidad de leds y botones a usar, obviamente que tienen que coincidir.
#define TOTAL 32 //Nivel maximo que se puede alcanzar.
//pines de los botones y leds(rojo, azul, verde, amarillo) En ese orden!
int leds[NUMLEDS] = {2, 4, 6, 8};
int botones[NUMLEDS] = {3, 5, 7, 9};
int buzz = 10;
//vector que contendrá la secuencia de la partida actual
int partida[TOTAL], nivelActual = 0, nivelIndice = 0;
// variable que contendra el boton pulsado en determinada jugada.
int jugada = 0;
//mientras estamos en una partida, nuevoJuego es 0, es verdadero cuando se pierde o es la primer partida.
int nuevoJuego=1;
//variables para una cancion sola
// notes in the melody:
int melody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};
void setup()
{
int i;
//se definen los pines de salida y entrada,
for (i=0; i<NUMLEDS; i++)
{
pinMode(leds[i], OUTPUT);
pinMode(botones[i], INPUT);
}
// se define el pin de buzzer y abajo se genera una semilla para
//generar la partida, con valores aleatorios.
pinMode(buzz, OUTPUT);
randomSeed(analogRead(0));
Serial.begin(9600);
}
void loop()
{
//Si es un nuevoJuego, o sea, se reinicia el programa, o se acaba de perder.
if (nuevoJuego)
{
llenarPartida();
nivelActual=0;
nuevoJuego = 0;
ejecutarMelodia();
}
fxBarrido(30, 2);
mostrarPartida(nivelActual, 300);
//loop donde se leen los botones de una secuencia (jugada), y se compara con el valor
//en la posicion correspondiente del vector.
//se sale si no coinciden o si se alcanzo el nivel maximo... esto ultimo, imposible XD!
while (!nuevoJuego && nivelIndice<=nivelActual)
{
Serial.println("leyendo botones");
Serial.println(partida[nivelIndice]);
jugada = leerBotones();
Serial.println(jugada);
encender(jugada);
delay(250);
apagar(jugada);
//revisa si no perdiste, si no coincide la jugada con el valor en la partida, nuevoJuego=1
if (partida[nivelIndice] != jugada)
{
Serial.println("Game Over");
Serial.print("nivel ");
Serial.println(nivelActual);
nuevoJuego = 1;
fxBaliza(300, 4);
}
else
{
nivelIndice++;
delay(250);
}
}
nivelIndice = 0;
nivelActual++;
}
//enciende un solo led, al usar las constantes definidas arriba, podemos decir "encender(LEDVERDE)"
int encender(int led)
{
digitalWrite(leds[led], 1);
}
//lo mismo pero para apagar
int apagar(int led)
{
digitalWrite(leds[led], 0);
}
//lo mismo, pero para encender todos los leds declarados al comienzo.
void encenderTodos(){
int i;
for (i=0; i<NUMLEDS; i++)
{
digitalWrite(leds[i], 1);
}
}
//se entiende no?
void apagarTodos()
{
int i;
for (i=0; i<NUMLEDS; i++)
{
digitalWrite(leds[i], 0);
}
}
//Efecto de barrido con los leds, de izq a derecha y de vuelta.
//se le pasa la velocidad (demora),
//y la cant de veces que se repetira la animacion.
void fxBarrido(int demora, int repeticiones)
{
int i, j;
apagarTodos();
for (i=0; i<=repeticiones; i++)
{
for (j=0; j<NUMLEDS; j++)
{
encender(j);
if (j != 0)
{
apagar (j-1);
}
delay(demora);
}
for (j=NUMLEDS-2; j>=0; j--)
{
encender(j);
apagar(j+1);
delay(demora);
}
}
apagarTodos();
}
//efecto que se usa para el momento del Game Over.
void fxBaliza(int demora, int repeticiones)
{
int i;
for (i=0; i<=repeticiones; i++)
{
apagarTodos();
delay(demora);
encenderTodos();
delay(demora);
}
apagarTodos();
delay(demora);
}
//lleno el vector de la partida con valores aleatorios
void llenarPartida()
{
int i;
for (i=0; i<TOTAL; i++)
{
partida[i] = random(NUMLEDS);
}
}
//Muestra el contenido del vector partida, mediante los leds correspondientes
//demora se podria usar para subir la dificultad del juego, al mostrar mas rapido la secuencia.
void mostrarPartida(int hasta, int demora)
{
int i;
for (i=0; i<=hasta; i++)
{
delay(demora);
encender(partida[i]);
delay(demora);
apagar(partida[i]);
delay(demora);
}
}
//Lee los botones, el primero que se presione, devuelve el valor de ese boton
int leerBotones()
{
int flag = 0, btn;
while (!flag)
{
if(digitalRead(botones[LEDROJO]) && !flag)
{
flag = 1;
btn = LEDROJO;
}
if(digitalRead(botones[LEDVERDE]) && !flag)
{
flag = 1;
btn = LEDVERDE;
}
if(digitalRead(botones[LEDAZUL]) && !flag)
{
flag = 1;
btn = LEDAZUL;
}
if(digitalRead(botones[LEDAMARILLO]) && !flag)
{
flag = 1;
btn = LEDAMARILLO;
}
}
return btn;
}
void ejecutarMelodia()
{
// iterate over the notes of the melody:
for (int thisNote = 0; thisNote < 8; thisNote++)
{
// to calculate the note duration, take one second
// divided by the note type.
//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
int noteDuration = 1000 / noteDurations[thisNote];
tone(buzz, melody[thisNote], noteDuration);
// to distinguish the notes, set a minimum time between them.
// the note's duration + 30% seems to work well:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// stop the tone playing:
noTone(buzz);
}
}
None