#include <LiquidCrystal.h>
#include <Keypad.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // Configura los pines del LCD
int ledR = 12; // Pin del LED rojo
int ledG = 13; // Pin del LED verde
int ledB = 14; // Pin del LED azul
const byte ROWS = 4; // Cuatro filas
const byte COLS = 4; // Cuatro columnas
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {A0, A1, A2, A3}; // Conecta las filas a estos pines
byte colPins[COLS] = {8, 9, 10, 11}; // Conecta las columnas a estos pines
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
enum GameState {
WAITING,
DISPLAY_NUMBERS,
WINNER,
LOSE,
EXIT
};
GameState game_state = WAITING;
unsigned long display_timer = 0;
unsigned long message_timer = 0;
int numeros [3];
void setup() {
lcd.begin(16, 2); // Inicializa el LCD (16 caracteres por 2 filas)
lcd.setCursor(0, 0);
lcd.print("Presiona # para");
lcd.setCursor(0, 1);
lcd.print("iniciar");
pinMode(ledR, OUTPUT);
pinMode(ledG, OUTPUT);
pinMode(ledB, OUTPUT);
// Inicializa la semilla aleatoria utilizando el tiempo actual
randomSeed(millis());
}
int generar_numero_aleatorio() {
return random(0, 10);
}
void display_numbers() {
if (millis() - display_timer < 4000) {
lcd.setCursor(0, 0);
lcd.print("Numeros: " + String(numeros[0]) + " " + String(numeros[1]) + " " + String(numeros[2]));
} else {
if (numeros[0] == numeros[1] && numeros[1] == numeros[2]) {
game_state = WINNER;
display_timer = millis();
// Enciende el LED RGB en verde
digitalWrite(ledR, LOW);
digitalWrite(ledG, HIGH);
digitalWrite(ledB, LOW);
} else {
game_state = LOSE;
display_timer = millis();
// Enciende el LED RGB en rojo
digitalWrite(ledR, HIGH);
digitalWrite(ledG, LOW);
digitalWrite(ledB, LOW);
}
lcd.clear();
}
}
void display_result() {
if (game_state == WINNER || game_state == LOSE) {
if (millis() - display_timer < 4000) {
if (game_state == WINNER) {
lcd.setCursor(0, 0);
lcd.print("¡GANADOR!");
} else if (game_state == LOSE) {
lcd.setCursor(0, 0);
lcd.print("Lo sentimos.");
lcd.setCursor(0, 1);
lcd.print("Sigue intentando");
}
} else {
game_state = WAITING;
display_timer = millis();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("# Nuevo intento");
lcd.setCursor(0, 1);
lcd.print("* Salir");
// Apaga el LED RGB
digitalWrite(ledR, LOW);
digitalWrite(ledG, LOW);
digitalWrite(ledB, LOW);
}
}
}
void loop() {
char opcion;
if (game_state == WAITING) {
opcion = keypad.getKey();
if (opcion == '#') {
lcd.clear();
for (int i = 0; i < 3; ++i) {
numeros[i] = generar_numero_aleatorio();
}
game_state = DISPLAY_NUMBERS;
display_timer = millis();
} else if (opcion == '*') {
game_state = EXIT;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hasta pronto.");
lcd.setCursor(0, 1);
lcd.print("Diego Mendoza");
display_timer = millis();
}
} else if (game_state == DISPLAY_NUMBERS) {
display_numbers();
} else if (game_state == WINNER || game_state == LOSE) {
display_result();
opcion = keypad.getKey();
if (opcion == '*') {
game_state = WAITING;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Hasta pronto.");
lcd.setCursor(0, 1);
lcd.print("Diego Mendoza");
display_timer = millis();
// Apaga el LED RGB
digitalWrite(ledR, LOW);
digitalWrite(ledG, LOW);
digitalWrite(ledB, LOW);
}
} else if (game_state == EXIT && millis() - display_timer > 4000) {
lcd.clear();
}
}