Cientificosaficionados.com

Los foros de los científicos aficionados de la red.
Fecha actual Mar Jun 19, 2018 4:05 am

Todos los horarios son UTC [ DST ]




Nuevo tema Responder al tema  [ 1 mensaje ] 
Autor Mensaje
NotaPublicado: Vie Mar 16, 2018 7:34 pm 
Desconectado

Registrado: Vie Nov 13, 2009 4:27 am
Mensajes: 446
País: mexico
Ciudad: acapulco
Saludos conforeros, les presento uno de los proyectos que armamos con mi hijo de 9 años, para la Feria de las Ciencias de su escuela, es una tabla para jugar a "quién oprime primero gana", tiene dos botones de usuario controlados por interrupción, un botón maestro, pantalla LDC 16x2, Arduino Leonardo, bocina y la fuente es una ATX económica, el resto es MDF de 15 mm.

La mecánica es que el Arduino saluda en pantalla, da las instrucciones y empieza a flashear leds rojos, cuando encienden los leds verdes es momento de presionar, el primero que lo hace gana el juego, si te adelantas y presionas con los leds en rojo, le das el triunfo al contrario.

Así quedó la vista:
https://www.facebook.com/photo.php?fbid=10156447550342859&set=gm.1677773572306250&type=3&theater&ifg=1

y este es el programa:
#include <LiquidCrystal.h>
// pines para el LCD rs = 12, en = 11, d4 = 10, d5 = 9, d6 = 8, d7 = 7

LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
const byte BtnMst = 13, Btn1 = 3, Btn2 = 2, LedV = 4, LedR = 5, Bocina = 6;
byte botonmaestro = 1;
long nTics = 0;
long nTiempo = 0; //variable para almacenar millis()
volatile unsigned int nFlag = 0;

void setup() {
pinMode(Btn1, INPUT_PULLUP); //boton 2
pinMode(Btn2, INPUT_PULLUP); //boton 1
pinMode(LedV, OUTPUT); //Led verde
pinMode(LedR, OUTPUT); //Led rojo
pinMode(Bocina, OUTPUT); //Bocina
pinMode(BtnMst, INPUT_PULLUP); //boton maestro
attachInterrupt(digitalPinToInterrupt(Btn1), Boton1, FALLING); // Interrupción 0 (INT0) por el pin digital 3 que activa la ISR en cada flanco de bajada
attachInterrupt(digitalPinToInterrupt(Btn2), Boton2, FALLING); // Interrupción 1 (INT1) por el pin digital 2 que activa la ISR en cada flanco de bajada
lcd.begin(16, 2);
randomSeed(analogRead(0));
}

void loop() {
//noInterrupts();
digitalWrite(LedV, LOW);
digitalWrite(LedR, LOW);
nTics = random(1, 11);
nFlag = 0;
botonmaestro = 1;
Imprime("Hola Liceo Kids.", "Oprime p/iniciar");
delay(1000);
while (botonmaestro == 1) {
botonmaestro = digitalRead(BtnMst); // detiene ejecucion hasta apretar boton maestro
}
// botonmaestro = 1; // reinicia la variable a estado "no oprimido"
Imprime(" Manitas Listas ", "que ya iniciamos");
for (int nCiclo = 0; nCiclo < 3; nCiclo++) { //toca tres veces la bocina para prepar a los jugadores
tone(Bocina, 1000, 100);
delay(1000);
}
//interrupts();
for (int nCiclo2 = 0; nCiclo2 < nTics; nCiclo2++) { //enciende n veces los leds rojos
Imprime(" Led en Rojo. ", " No Presionar ");
digitalWrite(LedR, HIGH);
tone(Bocina, 1000, 100);
delay(1000);
digitalWrite(LedR, LOW);
if (nFlag != 0) { //si presionan botones mientras están los leds en rojo
break; // sale del ciclo porque no hace falta esperar
}
}
if (nFlag != 0) { //si presionaron botones con led rojo
Adelantado(); // declara perdedor a jugador nFlag por adelantarse
botonmaestro = 1;
while (botonmaestro == 1) { //detiene la ejecucion hasta que opriman boton maestro
botonmaestro = digitalRead(BtnMst);
}
} else { // si no oprimieron con leds en rojo
while (nFlag == 0) { // detiene ejecucion, tocando la bocina, hasta que opriman un boton
Imprime(" Led en Verde ", "Presiona Ahora!");
digitalWrite(LedV, HIGH);
tone(Bocina, 1000, 100);
delay(250);
digitalWrite(LedV, LOW);
}
Imprime("!Jugador Gana,", "oprimio primero!");
lcd.setCursor(9,0);
lcd.print(nFlag);
botonmaestro = 1;
digitalWrite(LedV, HIGH);
while (botonmaestro == 1) { // detiene ejecucion hasta presionar boton maestro.
botonmaestro = digitalRead(BtnMst);
}
}
}

void Boton1() {
if (millis() > nTiempo + 250) { //debounce
nFlag = 1; // Bandera guarda boton 1
nTiempo = millis();
}
}

void Boton2(){
if (millis() > nTiempo + 250) { //debounce
nFlag = 2; // Bandera guarda boton 2
nTiempo = millis();
}
}

void Adelantado(){
Imprime("Jugador pierde", "por adelantarse.");
lcd.setCursor(7,0);
lcd.print(nFlag);
for (int nCiclo = 0; nCiclo < 3; nCiclo++) { //enciende y apaga 3 veces los leds rojos tocando un beep
digitalWrite(LedR, HIGH);
tone(Bocina, 1000, 100);
delay(250);
digitalWrite(LedR, LOW);
}
}

void Imprime(String Texto1, String Texto2){
lcd.clear();
lcd.print(Texto1);
lcd.setCursor(0,1);
lcd.print(Texto2);
}

_________________
Creo en la evidencia, creeré cualquier cosa, sin importar cuán extraña o ridícula sea, siempre que haya evidencias de ello, cuanto más extraña o ridícula sea, sin embargo, más sólidas tendrán que ser las evidencias.


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 1 mensaje ] 

Todos los horarios son UTC [ DST ]


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com