// Importar las librerías LiquidCrystal I2C y Wire
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Iniciar la librería
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pulsadores conectados a los puertos digitales
const int btnOK = 2; // Pulsador OK
const int btnUp = 3; // Pulsador para subir
const int btnDown = 4; // Pulsador para bajar
// Constantes para configuración de interfaz
const String opcion = "Incorrecta";
// === CONFIGURACIÓN DE PREGUNTAS ===
// Se definen el valor de las respuestas en el orden que se presentarán.
// 0 = Opción A, 1 = Opción B, 2 = Opción C
int respuestasCorrectas[] = {
0, // Pregunta 1: Opción A es correcta
2, // Pregunta 2: Opción C es correcta
1, // Pregunta 3: Opción B es correcta
0, // Pregunta 4: Opción A es correcta
2 // Pregunta 5: Opción C es correcta
// Se pueden agregar más preguntas
};
// Se calcula y obtiene la cantidad de preguntas
int totalPreguntas = sizeof(respuestasCorrectas) / sizeof(respuestasCorrectas[0]);
// Variables del sistema
String opciones[] = {"A", "B", "C"}; // Vector que contiene todos los elementos del menú
int opcionActual = 0;
int preguntaActual = 0;
int puntaje = 0;
bool esperandoRespuesta = true;
bool juegoTerminado = false;
// Código de caracteres para formar la flecha que indicará la selección
byte flecha[] = {B00000,B00100,B00110,B11111,B00110,B00100,B00000,B00000};
// Prototipos de funciones
void mostrarInicio();
void mostrarPreguntaActual();
void reiniciarJuego();
void siguientePregunta();
void mostrarMenu();
void procesarRespuesta();
void mostrarCorrecto();
void mostrarIncorrecto();
void mostrarResultadoFinal();
void setup() {
// Configuración de pulsadores
pinMode(btnUp, INPUT_PULLUP);
pinMode(btnDown, INPUT_PULLUP);
pinMode(btnOK, INPUT_PULLUP);
// Inicializar LCD
lcd.init();
lcd.backlight();
lcd.createChar(0, flecha);
// Mostrar mensaje de inicio
mostrarInicio();
delay(3000);
// Mostrar primera pregunta
mostrarPreguntaActual();
}
void loop() {
if (juegoTerminado) {
// Si el juego terminó, solo esperar reset
if (digitalRead(btnOK) == LOW) {
delay(200);
reiniciarJuego();
}
return;
}
if (!esperandoRespuesta) {
// Si ya respondió, esperar a avanzar a siguiente pregunta
if (digitalRead(btnOK) == LOW) {
delay(200);
siguientePregunta();
}
return;
}
// Leer pulsadores para navegación
if (digitalRead(btnUp) == LOW) {
delay(200); // Anti-rebote
opcionActual--;
if (opcionActual < 0) {
opcionActual = 2; // Volver a opción C
}
mostrarMenu();
}
if (digitalRead(btnDown) == LOW) {
delay(200); // Anti-rebote
opcionActual++;
if (opcionActual > 2) {
opcionActual = 0; // Volver a opción A
}
mostrarMenu();
}
if (digitalRead(btnOK) == LOW) {
delay(200); // Anti-rebote
procesarRespuesta();
}
}
// Mostrar mensaje de inicio
void mostrarInicio() {
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("QUIZ ARDUINO");
lcd.setCursor(3, 1);
delay(1000);
lcd.print("Cargando");
for(int i=0; i<3; i++){
delay(1000);
lcd.print(".");
}
//lcd.print("Preguntas: " + String(totalPreguntas));
}
// Mostrar información de la pregunta actual
void mostrarPreguntaActual() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Elige la opcion");
lcd.setCursor(3, 1);
lcd.print(opcion);
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Pregunta " + String(preguntaActual + 1) + "/" + String(totalPreguntas));
//lcd.setCursor(0, 1);
//lcd.print("Puntaje: " + String(puntaje));
delay(2000);
mostrarMenu();
esperandoRespuesta = true;
}
// Función para mostrar el menú de opciones
void mostrarMenu() {
lcd.clear();
if (opcionActual == 0) {
// Mostrar A y B
lcd.setCursor(0, 0);
lcd.write(byte(0)); // Flecha
lcd.print(" Opcion A");
lcd.setCursor(0, 1);
lcd.print(" Opcion B");
} else if (opcionActual == 1) {
// Mostrar A y B, con flecha en B
lcd.setCursor(0, 0);
lcd.print(" Opcion A");
lcd.setCursor(0, 1);
lcd.write(byte(0)); // Flecha
lcd.print(" Opcion B");
} else { // opcionActual == 2
// Mostrar B y C, con flecha en C
lcd.setCursor(0, 0);
lcd.print(" Opcion B");
lcd.setCursor(0, 1);
lcd.write(byte(0)); // Flecha
lcd.print(" Opcion C");
}
}
// Procesar la respuesta del estudiante
void procesarRespuesta() {
int respuestaEstudiante = opcionActual; // 0, 1, o 2
bool esCorrecta = false;
if (respuestaEstudiante == respuestasCorrectas[preguntaActual]) {
esCorrecta = true;
}
if (esCorrecta) {
puntaje++;
mostrarCorrecto();
} else {
mostrarIncorrecto();
}
esperandoRespuesta = false;
}
// Mostrar mensaje de respuesta correcta
void mostrarCorrecto() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("CORRECTO!");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Puntaje: " + String(puntaje));
lcd.setCursor(0, 1);
lcd.print("Presiona OK");
delay(1000);
}
// Mostrar mensaje de respuesta incorrecta
void mostrarIncorrecto() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("INCORRECTO");
delay(2000);
/* Descomentar para brindar retroalimentación mostrando la opción correcta
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tu respuesta: " + opciones[opcionActual]);
lcd.setCursor(0, 1);
String respuestaCorr = opciones[respuestasCorrectas[preguntaActual]];
lcd.print("Correcta: " + respuestaCorr);
delay(3000);
*/
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Presiona OK");
delay(2000);
}
// Avanzar a la siguiente pregunta
void siguientePregunta() {
preguntaActual++;
if (preguntaActual >= totalPreguntas) {
// Juego terminado
mostrarResultadoFinal();
juegoTerminado = true;
} else {
// Siguiente pregunta
opcionActual = 0; // Reset selección a opción A
mostrarPreguntaActual();
}
}
// Mostrar resultado final
void mostrarResultadoFinal() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("QUIZ TERMINADO");
lcd.setCursor(0, 1);
lcd.print("Aciertos: " + String(puntaje) + "/" + String(totalPreguntas));
delay(3000);
// Mostrar porcentaje y retroalimentación
int porcentaje = (puntaje * 100) / totalPreguntas;
lcd.clear();
lcd.setCursor(0, 0);
if (porcentaje >= 80) {
lcd.print("EXCELENTE!");
} else if (porcentaje >= 60) {
lcd.print("BIEN HECHO!");
} else {
lcd.print("DEBES PRACTICAR");
}
lcd.setCursor(0, 1);
lcd.print("Porcentaje: " + String(porcentaje) + "%");
delay(3000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Presiona OK para");
lcd.setCursor(0, 1);
lcd.print("reiniciar");
}
// Reiniciar el juego
void reiniciarJuego() {
preguntaActual = 0;
puntaje = 0;
opcionActual = 0;
esperandoRespuesta = true;
juegoTerminado = false;
mostrarInicio();
delay(2000);
mostrarPreguntaActual();
}OK
Up
Down