#include <Wire.h>
#include <LiquidCrystal_I2C.h> //Libreria pantalla
#include <Keypad.h> //Libreria teclado
LiquidCrystal_I2C lcd(0x27, 20, 4);//Creamos el objeto lcd(direccion, columnas,filas)
const byte Filas = 4;//tamaño filas
const byte Columnas = 4; //tamñao columnas
char keyMap[Filas][Columnas] = { //se define el mapa del tecladomatricial
{'1', '2', '3', '+'},
{'4', '5', '6', '-'},
{'7', '8', '9', '*'},
{'*', '0', '#', '/'}
};
byte pinfilas[Filas] = {18,5,17,16}; // Conexión de los pines de las filas del teclado a la ESP32
byte pincolumnas[Columnas] = {4,0,2,15}; // Conexión de los pines de las columnas del teclado a la ESP32
Keypad teclado = Keypad(makeKeymap(keyMap), pinfilas, pincolumnas, Filas, Columnas);
String Numero1 = "";//Variables
String Numero2 = "";//Variables
char operacion; //Operador de + - * /
boolean Primernumero = true;
void setup() {
Serial.begin(9600);
lcd.init(); // inicializacion LCD
lcd.backlight();//Encender luz de LCD
lcd.setCursor(0, 0);//Posicion del cursos
lcd.print("Calculadora"); //se muestra en pantalla
delay(1000);//Tiempo de espera 1seg
lcd.clear();//limpiar
}
void loop() {
char key = teclado.getKey();//lee la tecla precionada en el teclado
if (key) {
lcd.clear();//Limpia pantalla
if (key == '+' || key == '-' || key == '*' || key == '/') { // Verifica la operacion de las teclas A=+, B=-, C=* y D=/
if (Numero1.length() > 0) { //Se compueba si a ingresado el primer numero
operacion = key;//alamacena el oprador +-*/
Primernumero = false;
lcd.print(Numero1);//Muesta el primer numero y operador en el LCD
lcd.print(operacion);
}
} else if (key == '#') { //La tecla # hace representacion al =
float resultado = calcularteResultado();//calcula el resultado llamado funcion
lcd.clear();//Limpia la LCD
lcd.print("Resultado:");//muestra reusltado
lcd.setCursor(0, 1);
lcd.print(resultado);//muestra el resultado calculado
// Reset
Numero1 = ""; //reinicia las variables para nueva operacion
Numero2 = "";
Primernumero = true;
} else { //esta tecla se ejecuta si se presionó una tecla que no es un operador ni '#
if (Primernumero) {//ingreso primer nuemro
Numero1 += key;//conecta la tecla precionada al primer numero
lcd.print(Numero1);//muestra en la LCD
} else {//Si no está ingresando el primer número, entonces está ingresando el segundo
Numero2 += key;//conecta la segunada tecla
lcd.print(Numero1);
lcd.print(operacion);
lcd.print(Numero2);
}
}
}
}
float calcularteResultado() {//se basa en los numeros y el operador
float num1 = Numero1.toFloat();//convierte el STRING a FLOAT
float num2 = Numero2.toFloat();
float resultado = 0.0; //variable resultado
switch (operacion) {
case '+': //A
resultado = num1 + num2;
break;
case '-': //B
resultado = num1 - num2;
break;
case '*'://C
resultado = num1 * num2;
break;
case '/'://D
if (num2 != 0) {
resultado = num1 / num2;
} else {
lcd.print("Error: Div by 0");
}
break;
}
return resultado;
}