// Usar 0x3F para mis displays.
// Comienza preguntando el nivel de dificultad.
// Hace 10 preguntas en ese nivel de dificultad.
// Al terminar las 10, vuelve a preguntar el nivel de dificultad.
// Inicio declaraciones Teclado.
#include <Keypad.h>
const byte ROW_NUM = 4; //four rows
const byte COLUMN_NUM = 4; //four columns
char keys[ROW_NUM][COLUMN_NUM] = {
{'1','2','3', 'A'},
{'4','5','6', 'B'},
{'7','8','9', 'C'},
{'*','0','#', 'D'}
};
byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );
// Fin declaraciones Teclado.
// Inicio declaraciones Display dirección 0x3F y 16 columnas x 2 filas
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//Crear el objeto lcd dirección 0x3F y 16 columnas x 2 filas
LiquidCrystal_I2C lcd(0x27, 16, 2); // 0x3F para mis displays.
// Make custom characters:
const byte a_tilde[] = {
B00010,
B00100,
B00000,
B01110,
B00001,
B01111,
B10001,
B01111
};
const byte e_tilde[] = {
B00001,
B00010,
B00000,
B01110,
B10001,
B11111,
B10000,
B01110
};
const byte i_tilde[] = {
B00010,
B00100,
B00000,
B01100,
B00100,
B00100,
B00100,
B01110
};
#define LCD_A_TILDE 0
#define LCD_E_TILDE 1
#define LCD_I_TILDE 2
// Fin declaraciones Display.
enum tipo_estado {menu_inicial, menu_pregunta, menu_final};
// estado_actual = tipo_estado::menu_inicial;
tipo_estado estado_actual = menu_inicial;
String numero_ingresado_string;
unsigned int numero_ingresado = 0;
int signo_ingresado = 1;
byte ubicacion_digito_ingresado = 0;
char tela_oprimida = ' ';
byte nivel_seleccionado;
byte indice_nivel = 0;
byte respuestas_correctas = 0;
int numeros_cuentas[20];
char operaciones_cuentas[20];
int resultado = 0;
////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
// Inicializar el LCD
lcd.init();
//Encender la luz de fondo.
lcd.backlight();
// Create new characters:
lcd.createChar(LCD_A_TILDE, a_tilde);
lcd.createChar(LCD_E_TILDE, e_tilde);
lcd.createChar(LCD_I_TILDE, i_tilde);
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(A0, INPUT);
numero_ingresado_string.reserve(16);
Entra_en_estado_menu_inicial();
}
void loop() {
// put your main code here, to run repeatedly:
maneja_estados();
//Serial.println(leer_teclado());
}
void maneja_estados()
{
switch(estado_actual) {
// Menú inicial:
case menu_inicial:
tela_oprimida = keypad.getKey();
delay(50);
if(tela_oprimida) {
if (isDigit(tela_oprimida)) {
numero_ingresado_string += tela_oprimida;
// lcd.setCursor(ubicacion_digito_ingresado,1);
ubicacion_digito_ingresado++;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(numero_ingresado_string);
}
else if (tela_oprimida == 'A' && ubicacion_digito_ingresado > 0) { // Borra último caracter.
ubicacion_digito_ingresado--;
numero_ingresado_string.remove(ubicacion_digito_ingresado);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(numero_ingresado_string);
}
else if (tela_oprimida == '#' && numero_ingresado_string != "") {
numero_ingresado = numero_ingresado_string.toInt();
if(numero_ingresado >= 1 && numero_ingresado <= 10) {
nivel_seleccionado = numero_ingresado;
estado_actual = menu_pregunta;
Entra_en_estado_menu_pregunta();
}
else {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Dije entre 0 y 10");
lcd.setCursor(0,1);
lcd.print("Toca cualquiera");
numero_ingresado_string = "";
while(!keypad.getKey()) {} // Pausa hasta que se toque una tecla.
//delay(3000);
Entra_en_estado_menu_inicial();
}
}
else {
//ERRRORRRRR
}
}
break;
// Menú pregunta:
case menu_pregunta:
tela_oprimida = keypad.getKey();
delay(50);
if(tela_oprimida) {
if (isDigit(tela_oprimida)) {
numero_ingresado_string += tela_oprimida;
//lcd.setCursor(ubicacion_digito_ingresado,0);
ubicacion_digito_ingresado++;
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(numero_ingresado_string);
}
else if (tela_oprimida == 'A' && ubicacion_digito_ingresado > 0) { // Borra último caracter.
ubicacion_digito_ingresado--;
numero_ingresado_string.remove(ubicacion_digito_ingresado);
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(numero_ingresado_string);
}
else if (tela_oprimida == 'B') {
signo_ingresado = signo_ingresado * (-1);
if(signo_ingresado == -1) {
numero_ingresado_string = "-" + numero_ingresado_string;
ubicacion_digito_ingresado++;
}
else if(numero_ingresado_string.charAt(0) == '-') {
numero_ingresado_string.remove(0,1);
ubicacion_digito_ingresado--;
}
//lcd.setCursor(ubicacion_digito_ingresado,0);
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(numero_ingresado_string);
}
else if (tela_oprimida == '#' && numero_ingresado_string != "") { // Verifica el resultado.
numero_ingresado = numero_ingresado_string.toInt();
signo_ingresado = 1; // Resetea el signo.
if(numero_ingresado == resultado) {
respuestas_correctas++;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("CORRECTO, genia!");
lcd.setCursor(0,1);
lcd.print("Toca cualquiera");
while(!keypad.getKey()) {} // Pausa hasta que se toque una tecla.
}
else {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("INCORRECTO, buuh");
lcd.setCursor(0,1);
lcd.print("Era: ");
lcd.setCursor(5,1);
lcd.print(resultado);
while(!keypad.getKey()) {} // Pausa hasta que se toque una tecla.
}
if(indice_nivel < 10) {
estado_actual = menu_pregunta;
Entra_en_estado_menu_pregunta();
}
else{
estado_actual = menu_final;
Entra_en_estado_menu_final();
}
}
else {
//ERRRORRRRR
}
}
break;
case menu_final:
break;
}
}
// Acciones de los estados y condiciones de transiciones.
void Estado_inicial()
{
// if (currentInput == Input::Forward)
// changeState(State::PosicionB);
}
// Salidas asociadas a las transiciones
void Entra_en_estado_menu_inicial()
{
randomSeed(analogRead(A0));
indice_nivel = 0;
respuestas_correctas = 0;
numero_ingresado_string = "";
ubicacion_digito_ingresado = 0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Hola Cata, eleg");
lcd.setCursor(15,0);
lcd.write(byte(LCD_I_TILDE));
lcd.setCursor(0,1);
lcd.print("un nivel (1-10):");
}
void Entra_en_estado_menu_pregunta()
{
byte i;
String string_numero = "";
byte posicion_cursor = 0;
char char_texto_linea_display[17];
indice_nivel++;
numero_ingresado_string = "";
ubicacion_digito_ingresado = 0;
resultado = 0;
switch(nivel_seleccionado) {
case 1: // Suma dos números entre 0 y 10.
numeros_cuentas[0] = random(11);
operaciones_cuentas[0] = NULL;
resultado = numeros_cuentas[0];
for(i=1;i<2;i++) {
numeros_cuentas[i] = random(11);
operaciones_cuentas[i] = '+';
resultado = resultado + numeros_cuentas[i];
}
numeros_cuentas[i] = -1; // Marca el final.
operaciones_cuentas[i] = NULL; // Marca el final.
break;
case 2: // Suma dos números entre 0 y 20.
numeros_cuentas[0] = random(21);
operaciones_cuentas[0] = NULL;
resultado = numeros_cuentas[0];
for(i=1;i<2;i++) {
numeros_cuentas[i] = random(21);
operaciones_cuentas[i] = '+';
resultado = resultado + numeros_cuentas[i];
}
numeros_cuentas[i] = -1;
operaciones_cuentas[i] = NULL;
break;
case 3: // Suma o resta dos números entre 0 y 5.
numeros_cuentas[0] = random(6);
operaciones_cuentas[0] = NULL;
resultado = numeros_cuentas[0];
for(i=1;i<2;i++) {
numeros_cuentas[i] = random(6);
operaciones_cuentas[i] = operacion_al_azar(2);
if(operaciones_cuentas[i] == '+')
resultado = resultado + numeros_cuentas[i];
else if(operaciones_cuentas[i] == '-')
resultado = resultado - numeros_cuentas[i];
}
numeros_cuentas[i] = -1;
operaciones_cuentas[i] = NULL;
break;
case 4: // Suma o resta dos números entre 0 y 10.
numeros_cuentas[0] = random(11);
operaciones_cuentas[0] = NULL;
resultado = numeros_cuentas[0];
for(i=1;i<2;i++) {
numeros_cuentas[i] = random(11);
operaciones_cuentas[i] = operacion_al_azar(2);
if(operaciones_cuentas[i] == '+')
resultado = resultado + numeros_cuentas[i];
else if(operaciones_cuentas[i] == '-')
resultado = resultado - numeros_cuentas[i];
}
numeros_cuentas[i] = -1;
operaciones_cuentas[i] = NULL;
break;
case 5: // Suma dos números entre 0 y 199.
numeros_cuentas[0] = random(200);
operaciones_cuentas[0] = NULL;
resultado = numeros_cuentas[0];
for(i=1;i<2;i++) {
numeros_cuentas[i] = random(200);
operaciones_cuentas[i] = '+';
resultado = resultado + numeros_cuentas[i];
}
numeros_cuentas[i] = -1;
operaciones_cuentas[i] = NULL;
break;
case 6: // Suma o resta dos números entre 0 y 199.
numeros_cuentas[0] = random(200);
operaciones_cuentas[0] = NULL;
resultado = numeros_cuentas[0];
for(i=1;i<2;i++) {
numeros_cuentas[i] = random(200);
operaciones_cuentas[i] = operacion_al_azar(2);
if(operaciones_cuentas[i] == '+')
resultado = resultado + numeros_cuentas[i];
else if(operaciones_cuentas[i] == '-')
resultado = resultado - numeros_cuentas[i];
}
numeros_cuentas[i] = -1;
operaciones_cuentas[i] = NULL;
break;
case 7: // Suma o resta dos números entre 0 y 999.
numeros_cuentas[0] = random(1000);
operaciones_cuentas[0] = NULL;
resultado = numeros_cuentas[0];
for(i=1;i<2;i++) {
numeros_cuentas[i] = random(1000);
operaciones_cuentas[i] = operacion_al_azar(2);
if(operaciones_cuentas[i] == '+')
resultado = resultado + numeros_cuentas[i];
else if(operaciones_cuentas[i] == '-')
resultado = resultado - numeros_cuentas[i];
}
numeros_cuentas[i] = -1;
operaciones_cuentas[i] = NULL;
break;
case 8: // Suma o resta tres números entre 0 y 199.
numeros_cuentas[0] = random(200);
operaciones_cuentas[0] = NULL;
resultado = numeros_cuentas[0];
for(i=1;i<3;i++) {
numeros_cuentas[i] = random(200);
operaciones_cuentas[i] = operacion_al_azar(2);
if(operaciones_cuentas[i] == '+')
resultado = resultado + numeros_cuentas[i];
else if(operaciones_cuentas[i] == '-')
resultado = resultado - numeros_cuentas[i];
}
numeros_cuentas[i] = -1;
operaciones_cuentas[i] = NULL;
break;
case 9: // Multipica dos números entre 0 y 10.
numeros_cuentas[0] = random(11);
operaciones_cuentas[0] = NULL;
resultado = numeros_cuentas[0];
for(i=1;i<2;i++) {
numeros_cuentas[i] = random(11);
operaciones_cuentas[i] = '*';
resultado = resultado * numeros_cuentas[i];
}
numeros_cuentas[i] = -1;
operaciones_cuentas[i] = NULL;
break;
case 10: // Multipica dos números entre 0 y 20.
numeros_cuentas[0] = random(21);
operaciones_cuentas[0] = NULL;
resultado = numeros_cuentas[0];
for(i=1;i<2;i++) {
numeros_cuentas[i] = random(21);
operaciones_cuentas[i] = '*';
resultado = resultado * numeros_cuentas[i];
}
numeros_cuentas[i] = -1;
operaciones_cuentas[i] = NULL;
break;
/* case 10: // Suma, resta o multiplica tres números entre 0 y 20.
numeros_cuentas[0] = random(21);
operaciones_cuentas[0] = NULL;
resultado = numeros_cuentas[0];
for(i=1;i<2;i++) {
numeros_cuentas[i] = random(21);
operaciones_cuentas[i] = operacion_al_azar(2);
if(operaciones_cuentas[i] == '+')
resultado = resultado + numeros_cuentas[i];
else if(operaciones_cuentas[i] == '-')
resultado = resultado - numeros_cuentas[i];
else if(operaciones_cuentas[i] == '*')
resultado = resultado * numeros_cuentas[i];
}
numeros_cuentas[i] = -1;
operaciones_cuentas[i] = NULL;
break;
*/
}
lcd.clear();
lcd.setCursor(0,0);
sprintf(char_texto_linea_display, "%d) %d", indice_nivel, numeros_cuentas[0]); // Muchos dicen que usar sprintf es lento, pero acá no me importa.
for(i=1;numeros_cuentas[i] != -1;i++) {
sprintf(char_texto_linea_display, "%s%c%d", char_texto_linea_display, operaciones_cuentas[i], numeros_cuentas[i]);
}
sprintf(char_texto_linea_display, "%s=", char_texto_linea_display);
lcd.print(char_texto_linea_display);
/*
lcd.print(indice_nivel);
lcd.print(")");
for(i=0;numeros_cuentas[i] != -1;i++) {
if(operaciones_cuentas[i] != NULL) {
posicion_cursor += string_numero.length();
lcd.setCursor(posicion_cursor,0);
lcd.print(operaciones_cuentas[i]);
posicion_cursor++;
// Serial.println(operaciones_cuentas[i]);
}
string_numero = String(numeros_cuentas[i]);
lcd.setCursor(posicion_cursor,0);
lcd.print(numeros_cuentas[i]);
// Serial.println(numeros_cuentas[i]);
}
*/
}
void Entra_en_estado_menu_final()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Hiciste bien:");
lcd.setCursor(0,1);
lcd.print(respuestas_correctas);
lcd.setCursor(3,1);
lcd.print("cuenta/s !!");
while(!keypad.getKey()) {} // Pausa hasta que se toque una tecla.
estado_actual = menu_inicial;
Entra_en_estado_menu_inicial();
}
char operacion_al_azar(byte operaciones)
{
char operacion = 0;
switch(operaciones) {
case 1:
operacion = '+';
break;
case 2:
operacion = random(operaciones);
if(operacion == 0)
operacion = '+';
else
operacion = '-';
break;
case 3:
operacion = random(operaciones);
if(operacion == 0)
operacion = '+';
else if(operacion == 1)
operacion = '-';
else
operacion = '*';
break;
}
return operacion;
}