#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int ledPins[5] = {1, 2, 3, 4, 5};
const int buttonPins[5] = {12,6, 7, 8, 9};
const int startButtonPin = 13;
int currentNumber;
int inputBinary[5];
boolean StartBase32 = false;
boolean SimonMode = false;
const int StartSimon = 10;
int led[] = { 1,2, 3, 4, 5};
int boton[] = {12,6, 7, 8, 9};
const int zumbador = 11;
char* com[] = { "01324", "40231", "02413", "03241", "40312",
"14320", "13402", "12304", "41203", "10423"
};
int demora = 1000;
int w = -1;
int nivel = 1;
int b1, b2, b3, b4, b5;
String KOD, respuesta, A;
int num_led = sizeof(led) / sizeof(int);
int num_botones = sizeof(boton) / sizeof(int);
int num_codigos = sizeof(com) / sizeof(char*);
int longitud = strlen(com[0]);
boolean boton1EstabaArriba = true;
boolean boton2EstabaArriba = true;
boolean boton3EstabaArriba = true;
boolean boton4EstabaArriba = true;
boolean boton5EstabaArriba = true;
void setup() {
lcd.begin(16, 2);
lcd.print("Rojo: Simon");
lcd.setCursor(0, 1);
lcd.print("Azul: Base 32");
for (int i = 0; i < 5; i++) {
pinMode(ledPins[i], OUTPUT);
}
for (int i = 0; i < 5; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
//simon
for (byte i = 0; i < num_led; i++) {
pinMode(led[i], OUTPUT);
}
for (byte i = 0; i < num_botones; i++) {
pinMode(boton[i], INPUT_PULLUP);
}
pinMode(startButtonPin, INPUT_PULLUP);
pinMode(StartSimon, INPUT_PULLUP);
pinMode(zumbador, OUTPUT);
randomSeed(analogRead(A0));
}
void loop() {
if (!SimonMode && digitalRead(StartSimon) == LOW) {
delay(200);
lcd.clear();
lcd.print("Modo:simon dice!");
delay(2000);
lcd.clear();
lcd.print("NIVEL - " + String(nivel));
SimonMode = true;
}
if(SimonMode){
codigoSimon();
}
if (!StartBase32) {
if (digitalRead(startButtonPin) == LOW) {
delay(300);
lcd.clear();
lcd.print("Modo:Base 32!");
delay(1000);
StartBase32 = true;
newNumber();
}
return;
}
for (int i = 0; i < 5; i++) {
if (digitalRead(buttonPins[i]) == LOW) {
inputBinary[i] = !inputBinary[i];
digitalWrite(ledPins[i], inputBinary[i]);
delay(300);
}
}
int inputNumber = convertToDecimal(inputBinary);
if (inputNumber == currentNumber) {
lcd.clear();
lcd.print("Correcto!");
delay(1000);
newNumber();
} else if (inputNumber != currentNumber && allButtonsPressed()) {
lcd.clear();
lcd.print("Error!");
delay(1000);
resetGame();
lcd.clear();
lcd.print("Nivel: ");
lcd.print(currentNumber, DEC);
}
}
int convertToDecimal(int binaryArray[]) {
int decimalNumber = 0;
for (int i = 0; i < 5; i++) {
decimalNumber += binaryArray[i] * (1 << (4 - i));
}
return decimalNumber;
}
void newNumber() {
currentNumber = random(1, 32);
lcd.clear();
lcd.print("Nivel: ");
lcd.print(currentNumber, DEC);
resetGame();
}
void resetGame() {
for (int i = 0; i < 5; i++) {
inputBinary[i] = 0;
digitalWrite(ledPins[i], LOW);
}
}
bool allButtonsPressed() {
for (int i = 0; i < 5; i++) {
if (digitalRead(buttonPins[i]) == HIGH && inputBinary[i] == 0) {
return false;
}
}
return true;
}
void codigoSimon()
{
while (w == -1)
{
int x = random(0, num_codigos);
KOD = com[x];
b1 = 0; b2 = 0; b3 = 0; b4 = 0; b5 = 0;
w = 0;
}
while (w < longitud) {
A = KOD[w];
int a = A.toInt();
digitalWrite(led[a], HIGH);
tone(zumbador, 5 * led[a]);
delay(10);
noTone(zumbador);
delay(demora);
digitalWrite(led[a], LOW);
w++;
}
while (w >= longitud && w < 2 * longitud) {
boolean boton1EstaArriba = digitalRead(boton[0]);
boolean boton2EstaArriba = digitalRead(boton[1]);
boolean boton3EstaArriba = digitalRead(boton[2]);
boolean boton4EstaArriba = digitalRead(boton[3]);
boolean boton5EstaArriba = digitalRead(boton[4]);
if (b1 == 0 && boton1EstabaArriba && !boton1EstaArriba) {
delay(10);
boton1EstaArriba = digitalRead(boton[0]);
if (!boton1EstaArriba) {
tone(zumbador, 5 * led[0]);
delay(10);
noTone(zumbador);
respuesta += "0";
digitalWrite(led[0], HIGH);
b1 = 1;
w++;
}
}
boton1EstabaArriba = boton1EstaArriba;
if (b2 == 0 && boton2EstabaArriba && !boton2EstaArriba) {
delay(10);
boton2EstaArriba = digitalRead(boton[1]);
if (!boton2EstaArriba) {
tone(zumbador, 5 * led[1]);
delay(10);
noTone(zumbador);
respuesta += "1";
digitalWrite(led[1], HIGH);
b2 = 1;
w++;
}
}
boton2EstabaArriba = boton2EstaArriba;
if (b3 == 0 && boton3EstabaArriba && !boton3EstaArriba) {
delay(10);
boton3EstaArriba = digitalRead(boton[2]);
if (!boton3EstaArriba) {
tone(zumbador, 5 * led[2]);
delay(10);
noTone(zumbador);
respuesta += "2";
digitalWrite(led[2], HIGH);
b3 = 1;
w++;
}
}
boton3EstabaArriba = boton3EstaArriba;
if (b4 == 0 && boton4EstabaArriba && !boton4EstaArriba) {
delay(10);
boton4EstaArriba = digitalRead(boton[3]);
if (!boton4EstaArriba) {
tone(zumbador, 5 * led[3]);
delay(10);
noTone(zumbador);
respuesta += "3";
digitalWrite(led[3], HIGH);
b4 = 1;
w++;
}
}
boton4EstabaArriba = boton4EstaArriba;
if (b5 == 0 && boton5EstabaArriba && !boton5EstaArriba) {
delay(10);
boton5EstaArriba = digitalRead(boton[4]);
if (!boton5EstaArriba) {
tone(zumbador, 5 * led[4]);
delay(10);
noTone(zumbador);
respuesta += "4";
digitalWrite(led[4], HIGH);
b5 = 1;
w++;
}
}
boton5EstabaArriba = boton5EstaArriba;
if (w == 2 * longitud && respuesta == KOD) {
lcd.clear();
lcd.print("Correcto!");
nivel++;
delay(1000);
lcd.clear();
lcd.print("NIVEL - " + String(nivel));
demora = max(demora - 100, 100);
delay(1000);
for (byte i = 0; i < num_led; i++) {
digitalWrite(led[i], LOW);
}
delay(2000);
KOD = "";
respuesta = "";
w = -1;
} else if (w == 2 * longitud && respuesta != KOD) {
lcd.clear();
lcd.print("Incorrecto!");
tone(zumbador, 100);
delay(1000);
noTone(zumbador);
lcd.clear();
lcd.print("NIVEL - " + String(nivel));
for (byte i = 0; i < num_led; i++) {
digitalWrite(led[i], LOW);
}
delay(2000);
KOD = "";
respuesta = "";
w = -1;
}
}
}