// Juego con Keypad 2x2 en ESP32 versión 0.
#include <Arduino.h>
#ifdef ESP32
#include <WiFi.h>
#include "SPIFFS.h"
#else
#include <ESP8266WiFi.h>
#endif
//#include "AudioFileSourceSPIFFS.h"
//#include "AudioFileSourceID3.h"
//#include "AudioGeneratorMP3.h"
//#include "AudioOutputI2SNoDAC.h"
//AudioGeneratorMP3 *mp3;
//AudioFileSourceSPIFFS *file;
//AudioOutputI2SNoDAC *out;
#include "time.h"
#include <Keypad.h>
const byte ROWS = 2; //four rows
const byte COLS = 2; //four columns
char hexaKeys[ROWS][COLS] = {
{'A', 'B'},
{'C', 'D'}
};
int gpio[4] = {4, 15, 14, 19};
char* reprode[25] = {"1 violeta arriba", "2 amarillo izquierda", "3 verde derecha", "4 rojo abajo", "raro 5",
"raro 5", "/2-2galletitas.mp3", "/2-3tomarlaleche.mp3", "/2-4tomaragua.mp3", "/2-5milanesas.mp3"
, "/3-1musica.mp3", "/3-2juguetes.mp3", "/3-3irapasearenelauto.mp3", "/3-4iralapileta.mp3", "/3-5iraljardin.mp3",
"/4-1jugarconpapa.mp3", "/4-2jugarconelcelular.mp3", "/4-3jugarconagua.mp3", "/4-4hacerpis.mp3", "/4-5hacercaca.mp3",
"/5-1noquiero.mp3", "/5-2teamo.mp3", "/5-3si.mp3", "/5-4no.mp3", "/5-5ivo.mp3"
};
// CONFIG MINI WEMOS TESTEADO Y FUNCIONA MATRIZ:
byte rowPins[ROWS] = {13, 12}; // placa area izquierda LINEAS
byte colPins[COLS] = {2, 18}; // placa area derecha COLUMNAS
// -----------------------------------------------------------------------------
#define DO1 33
#define RE1 37
#define MI1 41
#define FA1 44
#define SOL1 49
#define LA1 55
#define SI1 62
#define DO2 65
#define RE2 73
#define MI2 82
#define FA2 87
#define SOL2 98
#define LA2 110
#define SI2 123
#define DO3 131
#define RE3 147
#define MI3 165
#define FA3 175
#define SOL3 196
#define LA3 220
#define SI3 247
#define DO4 262
#define RE4 294
#define MI4 330
#define FA4 349
#define SOL4 392
#define LA4 440
#define SI4 494
#define DO5 523
#define RE5 587
#define MI5 659
#define FA5 698
#define SOL5 784
#define LA5 880
#define SI5 988
#define DO6 1047
#define RE6 1175
#define MI6 1319
#define FA6 1397
#define SOL6 1568
#define LA6 1760
#define SI6 1976
#define DO7 2093
#define RE7 2349
#define MI7 2637
#define FA7 2794
#define SOL7 3136
#define LA7 3520
#define SI7 3951
#define DO8 4186
#define RE8 4699
int jugando = 0;
int flag = 0;
int r; int i=9;
int aleatorios[100]; //Array historico del Simon
int nivel = 0;
int tempor = 300;
int record = 0; int guardar = 1;
int chacode; int codenum;
char customKey;
// ###################################################################################
int min1 = 100; int max1=0;
int min2 = 100; int max2=0;
int min3 = 100; int max3=0;
int min4 = 100; int max4=0;
const int buzzer = 22; // Pin RX 3 salida de audio.
//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
void Tono(int frecuencia, int duracion) {
tone(buzzer, frecuencia);
delay(duracion);
noTone(buzzer);
delay(duracion);
}
void setup() { // ########################################################################################################
WiFi.mode(WIFI_OFF);
Serial.begin(115200);
delay(1000);
SPIFFS.begin();
Serial.println("<< setup >>");
delay(50);
for (int g=0; g<=4; g++) {
pinMode(gpio[g], OUTPUT); // led 1
delay(50);
}
Serial.println("<< pinmode >>");
delay(50);
//out = new AudioOutputI2SNoDAC();
//mp3 = new AudioGeneratorMP3();
randomSeed(analogRead(0));
//digitalWrite(LED_BUILTIN, HIGH);
Serial.println("<< saque builtin >>");
delay(50);
}
void resetear() {
Serial.println("<< reset >>");
delay(50);
// pinMode(LED_BUILTIN, OUTPUT);
for (int g=0; g<=4; g++) {
pinMode(gpio[g], OUTPUT); // led 1
delay(5);
}
for (int g=0; g<=4; g++) {
digitalWrite(gpio[g], LOW); // led 1
}
}
void color(int pos, int eltiempo, int silencio) { // (((((( color genera luz led y sonido correspondiente ))))))
digitalWrite(gpio[pos], HIGH);
Serial.print("color : ");
Serial.print(pos); // trae el MP3 de la posición matriz de codenum.
Serial.println(" :::::");
if (pos==0) { Tono(DO5,eltiempo/2);} // Luz Led 1 y sonido 1.
if (pos==1) { Tono(SOL4,eltiempo/2);}// Luz Led 2 y sonido 2.
if (pos==2) { Tono(MI4,eltiempo/2);} // Luz Led 3 y sonido 3.
if (pos==3) { Tono(DO4,eltiempo/2);} // Luz Led 4 y sonido 4.
for (int g=0; g<=4; g++) {
digitalWrite(gpio[g], LOW); // led 1
}
if (silencio == 1) {
delay(eltiempo/2);
} else {
delay(60);
}
}
void inicio() { // sonidos de BIENVENIDA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Serial.println("<< inicio >>");
for (int cx=0; cx <=3; cx++) {
color (cx, 100,1);
}
for (int cx=0; cx <=3; cx++) {
color (cx, 100,1);
}
// PlayMp3("/tecnica.mp3");
resetear();
i = 22;
Serial.println("<< tecnica >>");
delay(50);
Serial.println("<< lee >>");
// FIN sonidos de BIENVENIDA %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
while (i == 22) { // Menú principal (botones dicen puntaje último, record o comenzar a jugar)
customKey = customKeypad.getKey();
delay(50);
if (customKey) {
chacode = int(customKey); // devuelve el codigo ascii de las letras de la matriz : A: 65... B: 66 etc
codenum = chacode - 65; // resta 65 al código de la letra y así obtenemos 1, 2, 3, 4 de A, B, C, D
Serial.print(customKey);
Serial.print(" : ");
Serial.print(chacode);
Serial.print(" : ");
Serial.print(codenum);
Serial.print(" : ");
Serial.print(reprode[codenum]); // trae el MP3 de la posición matriz de codenum.
Serial.println(" <");
Serial.println("<< pulsacion >>");
delay(50);
if (codenum == 0) { // Dice record
// PlayMp3("/record.mp3");
// dicepuntos(record);
//resetear();
}
if (codenum == 1) { // Dice record
// PlayMp3("/puntaje.mp3");
// dicepuntos(guardar);
//resetear();
}
if (codenum == 2) { // Dice record
}
if (codenum == 3) { // Dice record
i=9;
}
}
}
}
void jugar() { // Comienza el juego Simon.
jugando = 1;
Serial.println("<< inicia jugar >>");
delay(50);
while (jugando == 1) { // bucle infinito hasta perder
srand(time(0));
aleatorios[nivel] = random(4); // Se genera un nuevo valor aleatorio al final del Array (nivel)
tempor -= 10; // se reduce el tiempo
delay (500);
for (int x=1; x<=nivel; x++) { // ------- TURNO PC - Recorre el array de 0 a nivel y muestra colores y sonidos
r = aleatorios[x];
color (r, tempor,1); // llama al procedimiento color que enciende las luces y genera los sonidos.
}
for (int x=1; x<=nivel; x++) { // ======= TURNO HUMANO = For para el humano de 0 a nivel
i = 9;
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
Serial.println("<< lee >>");
while (i == 9) { // Menú principal (botones dicen puntaje último, record o comenzar a jugar)
customKey = customKeypad.getKey();
delay(50);
if (customKey) {
chacode = int(customKey); // devuelve el codigo ascii de las letras de la matriz : A: 65... B: 66 etc
codenum = chacode - 65; // resta 65 al código de la letra y así obtenemos 1, 2, 3, 4 de A, B, C, D
Serial.print(customKey);
Serial.print(" : ");
Serial.print(chacode);
Serial.print(" : ");
Serial.print(codenum);
Serial.print(" : ");
Serial.print(reprode[codenum]); // trae el MP3 de la posición matriz de codenum.
Serial.println(" <");
i=codenum; //(tira de 0 a 3 en vez de 1 a 4)
}
}
if (i == aleatorios[x]) { // Si i (que representa el botón pulsado) es igual al elemento del array posición x (FOR)
color (i, 200,0); // enciende el led correspondiente y produce el sonido correcto.
i = 9; // usado como FLAG para que vuelva a entrar al while luego
} else { // <<<< PERDIÓ >>>>>>
// PlayMp3("/cramer.mp3"); // SONIDO Error. El usuario perdió.
Serial.println("<< perdio >>");
delay(50);
resetear();
if (nivel>record) { // !! rompió Record !!
for (int su=1; su <=10; su++) {
for (int cx=3; cx >=0; cx--) {
color (cx, 40,0); // Luces festejo
}
}
// PlayMp3("/nuevo.mp3");
// PlayMp3("/record.mp3");
Serial.println("<< nuevo record >>");
delay(50);
// dicepuntos(nivel); // Dice record
for (int su=1; su <=3; su++) {
for (int cx=3; cx >=0; cx--) {
color (cx, 40,0); // Luces festejo
}
}
Tono(DO5,50);
Tono(RE5,50);
Tono(MI5,50);
Tono(FA5,50);
Tono(SOL5,50);
Serial.println("<< pi pi pi pi >>");
delay(50);
for (int su=1; su <=3; su++) {
for (int cx=3; cx >=0; cx--) {
color (cx, 40,0); // Luces festejo
}
}
record = nivel;
} else {
// PlayMp3("/puntaje.mp3");
Serial.println("<< puntaje solo >>");
delay(50);
// dicepuntos(nivel);
}
guardar = nivel;
nivel = 0;
tempor = 300;
jugando = 0;
} // << Fin Perdió >>
} // ========= FIN TURNO HUMANO
delay(500);
nivel++;
}
}
void loop() {
inicio();
if (record > guardar) {
// PlayMp3("/record.mp3");
Serial.println("<< loop record >>");
delay(50);
// dicepuntos(record);
}
jugar();
}