/*En el siguiente código se establecerá un protocolo de comunicación seríal entre nuestro Arduino
y una PC para intercambio de información con respecto a las funciones y tareas que Arduino desempeñará
detectar cual boton, de entre 3 botones, ha sido presionado primero e informarle a la PC sobre dicho
dato para saber que concursante responderá primero
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); // inicializa la interfaz I2C del LCD 16x2
// ****************** se declaran las variables a usar
int jugador1 = A0;
int jugador2 = A1;
int jugador3 = A2;
int jugador4 = A3;
int ganoSi = 12;
int ganoNo = 13;
int ledAzul = 8;
int ledAmarillo = 9;
int ledVerde = 10;
int ledRojo = 11;
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int estado1 = 0;
int estado2 = 0;
int estado3 = 0;
int estado4 = 0;
boolean g1;
boolean g2;
boolean g3;
boolean g4;
char confirmacion;
char noGano;
int x = 0;
int y;
int pregunta = 1;
int z = 0;
bool previoSi = true;
bool previoNo = true;
int salir = 0;
// ***************************** VOID SETUP *****************************
void setup() {
// *************** INICIALIZAR LA PANTALLA LCD ***************
Wire.begin();
lcd.init();
lcd.backlight(); // Coloca luz de fondo al LCD
lcd.clear(); // Borra el LCD
// sección para configurar pines a usar en nuestro arduino y habilitar la comunicación serial
pinMode(jugador1, INPUT);
pinMode(jugador2, INPUT);
pinMode(jugador3, INPUT);
pinMode(jugador4, INPUT);
pinMode(ganoSi, INPUT);
pinMode(ganoNo, INPUT);
pinMode(ledAzul, OUTPUT); //Define el Led del Jugador 1 (azul)
pinMode(ledAmarillo, OUTPUT);
pinMode(ledVerde, OUTPUT);
pinMode(ledRojo, OUTPUT);
//ganoSi = digitalRead(12);
//ganoNo = digitalRead(13);
//********************* iniciamos nuestro puerto serial
Serial.begin(9600);
while (!Serial) { //espera a que se conecte el puerto serial a la PC
}
}
// ***************************** VOID LOOP *****************************
void loop() {
// código principal donde se establecerán las funciones que realizará nuestro arduino
//Se realiza lectura de entradas a usar
estado1 = digitalRead(jugador1);
estado2 = digitalRead(jugador2);
estado3 = digitalRead(jugador3);
estado4 = digitalRead(jugador4);
// *********************** NUMERO DE PREGUNTAS *********************************
numeroPreguntas();
condicionesPrimarias();
pantallaPuntos();
ganador();
}
// **************************** FINAL DEL LOOP **************************
void numeroPreguntas() {
while (salir == 0) {
int actualSi = (digitalRead(ganoSi));
int actualNo = (digitalRead(ganoNo));
//contador = (digitalRead(ganoSi));
lcd.setCursor(0, 0);
lcd.print("Numero de preguntas?");
lcd.setCursor(0, 1);
lcd.print("OK-->'No'");
lcd.setCursor(10, 1);
lcd.print("Sel-->'Si'");
lcd.setCursor(9, 2);
//lcd.print(z);
if (actualSi == 1 && actualNo == 1) {
previoSi = false;
previoNo = false;
}
if (actualSi == 1) {
if (!previoSi) {
z++;
digitalWrite (8, HIGH);
digitalWrite (9, HIGH);
digitalWrite (10, HIGH);
digitalWrite (11, HIGH);
previoSi = false;
lcd.setCursor(9, 2);
lcd.print(z);
Serial.print(z);
delay(100);
digitalWrite (8, LOW);
digitalWrite (9, LOW);
digitalWrite (10, LOW);
digitalWrite (11, LOW);
}
}
else if (actualSi == 0) {
if (previoSi) {
previoSi = false;
}
}
if (actualNo == 1) {
if (!previoNo) {
previoNo = false;
lcd.clear();
lcd.setCursor(4, 1);
lcd.print(z);
lcd.print(" Preguntas");
Serial.print(z);
salir = 1;
delay(100);
lcd.clear();
}
}
else if (actualNo == 0) {
if (previoNo) {
previoNo = false;
}
}
}
}
// **************************** condiciones primarias ********************
void condicionesPrimarias() {
if ((pregunta <= z) && (salir == 1)) {
Serial.print("Pregunta ");
Serial.println(pregunta);
lcd.setCursor(0, 0);
lcd.print("* PREGUNTA");
lcd.setCursor(11, 0);
lcd.print(pregunta);
lcd.print(" de ");
lcd.print(z);
lcd.setCursor(19, 0);
lcd.print("*");
if (estado1 == HIGH) {
y = ledAzul;
x = a;
estadoColorAzul(); //Rutina su presionan boton Azul primero
a = x;
ledAzul = y;
pregunta = pregunta + 1;
}
if (estado2 == HIGH) {
y = ledAmarillo;
x = b;
estadoColorAmarillo(); //Rutina su presionan boton Amarillo primero
b = x;
ledAmarillo = y;
pregunta = pregunta + 1;
}
if (estado3 == HIGH) {
y = ledVerde;
x = c;
estadoColorVerde(); //Rutina su presionan boton verde primero
c = x;
ledVerde = y;
pregunta = pregunta + 1;
}
if (estado4 == HIGH) {
y = ledRojo;
x = d;
estadoColorRojo(); //Rutina su presionan boton Rojo primero
d = x;
ledRojo = y;
pregunta = pregunta + 1;
}
}
else {
salir = 2;
}
}
void pantallaPuntos() {
if (salir <= 1) {
lcd.setCursor(0, 2);
lcd.print("Azul=");
lcd.print(a);
lcd.print(" ");
lcd.setCursor(9, 2);
lcd.print("Verde=");
lcd.print(c);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print("Rojo=");
lcd.print(d);
lcd.print(" ");
lcd.setCursor(9, 3);
lcd.print("Amrillo=");
lcd.print(b);
lcd.print(" ");
}
}
// ******* RUTINAS DE COMPROBACION ***********
// **********************************JUGADOR AZUL (1) ****************************
void estadoColorAzul() {
if (estado1 == HIGH) {
digitalWrite(y, HIGH);
//delay(500);
Serial.print("Azul = ");// envío de parámetro de respuesta de jugador 1
Serial.println (x); // imprime en pantalla el valor actual del jugador 1
confirmarSiGano();
}
}
// **********************************JUGADOR AMARILLO (2) ***************************
void estadoColorAmarillo() {
if (estado2 == HIGH) {
digitalWrite(ledAmarillo, HIGH);
Serial.print("Amarillo = ");// envío de parámetro de respuesta de jugador 2
Serial.println (x); // imprime en pantalla el valor actual del jugador 2
confirmarSiGano();
}
}
// **********************************JUGADOR verde (3) ****************************
void estadoColorVerde() {
if (estado3 == HIGH) {
digitalWrite(ledVerde, HIGH); //delay(500);// retardo de medio segundo para evitar que las pulsaciones de los demás jugadores sean percibidas
Serial.print("Verde = "); // envío de parámetro de respuesta de jugador 2
Serial.println (x); // imprime en pantalla el valor actual del jugador 2
confirmarSiGano();
}
}
// **********************************JUGADOR ROJO (4)****************************
void estadoColorRojo() {
if (estado4 == HIGH) {
digitalWrite(ledRojo, HIGH);
Serial.print("Rojo = ");// envío de parámetro de respuesta de jugador 4
Serial.println (x); // imprime en pantalla el valor actual del jugador 4
confirmarSiGano();
}
}
void confirmarSiGano() {
//bucle de espera por confirmación para jugador 1
do { //verifica boton de reset
//delay(50);
ganoSi = digitalRead(12);
ganoNo = digitalRead(13);
if (ganoSi == HIGH) {
x = x + 5;
Serial.print("Total = ");// envío de parámetro de respuesta de jugador 1
Serial.println (x); // imprime en pantalla el valor actual del jugador 1
confirmacion = 'p';
noGano = 's';
Serial.println("Si GANÓ");
digitalWrite(y, LOW);
pantallaSiGano();
}
else if (ganoNo == HIGH) {
x = x - 2;
Serial.print("Total = ");// envío de parámetro de respuesta de jugador 1
Serial.println (x); // imprime en pantalla el valor actual del jugador 1
confirmacion = 'p';
noGano = 's';
Serial.println("No GANO");
digitalWrite(y, LOW);
pantallaNoGano();
}
else {
//lee del puerto la confirmación para el jugador 3
confirmacion = Serial.read();
}
}
while (confirmacion != 'p' || noGano != 's');
//al recibir confirmación por parte de la PC la variable "confirmacion" es borrada
confirmacion = ' ';
noGano = ' ';
}
void pantallaNoGano() {
int i = 0;
lcd.setCursor(0, 1);
lcd.print("O");
delay(50);
lcd.setCursor(0, 1);
lcd.print("IO");
delay(50);
lcd.setCursor(0, 1);
lcd.print("DIO");
delay(50);
lcd.setCursor(0, 1);
lcd.print("RDIO");
delay(50);
lcd.setCursor(0, 1);
lcd.print("ERDIO");
delay(50);
lcd.setCursor(0, 1);
lcd.print("PERDIO");
delay(50);
lcd.setCursor(0, 1);
lcd.print(" PERDIO");
delay(50);
//lcd.setCursor(0,1);
//lcd.print("O");
for (i = 0; i <= 13; i++) {
lcd.setCursor(i, 1);
//lcd.print(" ");
//delay(50);
lcd.print(" PERDIO");
delay(50);
//lcd.setCursor(0,1);
//lcd.print(" ");
}
lcd.setCursor(14, 1);
lcd.print(" PERDI");
delay(50);
lcd.setCursor(15, 1);
lcd.print(" PERD");
delay(50);
lcd.setCursor(16, 1);
lcd.print(" PER");
delay(50);
lcd.setCursor(17, 1);
lcd.print(" PE");
delay(50);
lcd.setCursor(18, 1);
lcd.print(" P");
delay(50);
lcd.setCursor(19, 1);
lcd.print(" ");
delay(50);
}
void pantallaSiGano() {
int i = 0;
lcd.setCursor(0, 1);
lcd.print("O");
delay(50);
lcd.setCursor(0, 1);
lcd.print("NO");
delay(50);
lcd.setCursor(0, 1);
lcd.print("ANO");
delay(50);
lcd.setCursor(0, 1);
lcd.print("GANO");
delay(50);
//lcd.setCursor(0,1);
//lcd.print("O");
for (i = 0; i <= 15; i++) {
lcd.setCursor(i, 1);
lcd.print(" GANO");
delay(50);
}
lcd.setCursor(16, 1);
lcd.print(" GAN");
delay(50);
lcd.setCursor(17, 1);
lcd.print(" GA");
delay(50);
lcd.setCursor(18, 1);
lcd.print(" G");
delay(50);
lcd.setCursor(19, 1);
lcd.print(" ");
delay(50);
}
void ganador() {
Serial.println(salir);
if (salir == 2) {
lcd.setCursor(0, 1);
lcd.print("ganador es el equipo");
if (a > b && a > c && a > d) {
lcd.setCursor(7, 2);
lcd.print("AZUL");
}
if (b > a && b > c && b > d) {
lcd.setCursor(7, 2);
lcd.print("AMARILLO");
}
if (c > a && c > b && c > d) {
lcd.setCursor(7, 2);
lcd.print("VERDE");
}
if (d > a && d > b && d > c) {
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,2);
lcd.print(" ");
lcd.setCursor(0,3);
lcd.print(" ");
lcd.setCursor(7, 2);
lcd.print("ROJO");
salirDelPrograma();
}
}
}
void salirDelPrograma() {
salir = 3;
}