#include <Keypad.h>
#include <math.h>
#include <LiquidCrystal_I2C.h>
#define FILAS 4
#define COLUMNAS 4
byte pinesFilas[FILAS] = { 13, 12, 14, 27 };
byte pinesColumnas[COLUMNAS] = { 26, 25, 33, 32 };
char teclas[FILAS][COLUMNAS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' },
};
Keypad teclado(makeKeymap(teclas), pinesFilas, pinesColumnas, FILAS, COLUMNAS);
LiquidCrystal_I2C LCD (0x27, 20, 4);
int i = 0;
byte im = 0;
float Total1 = 0;
float Total2 = 0;
char signo = '1';
byte ima = 0;
String num[20] = {};
String mostrar;
byte Reinicio = 0;
void setup() {
Serial.begin(115200, SERIAL_8N1);
LCD.init();
LCD.backlight();
LCD.clear();
LCD.print("Bienvenido");
delay(1000);
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Cargando...");
delay(2000);
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("A: Rect a Polar");
LCD.setCursor(0, 1);
LCD.print("B: Polar a Rect");
delay(2000);
LCD.clear();
}
void loop() {
int i=0, j=0, r=0, m=0, a=0;
char real[7];
char imaginario[7];
char mod[7];
char ang[7];
float re, im, modulo, angulo;
bool imag=false, angu=false;
char hold, tecla;
char menu = teclado.getKey();
if (menu != '\0') {
if (menu == 'A') {
LCD.setCursor(0, 0);
LCD.print(menu);
hold=menu;
delay(1000);
LCD.clear();
while(hold !='#'){
tecla = teclado.getKey();
if (tecla != '\0'){
//impresion por pantalla
switch(tecla){
case 'A':
LCD.setCursor(i, 0);
LCD.print("+");
i++;
break;
case 'B':
LCD.setCursor(i, 0);
LCD.print("-");
if(i==0){
real[0]='-';
r++;
}
else{
imaginario[0]='-';
j++;
}
i++;
break;
case 'C':
LCD.setCursor(i, 0);
LCD.print("j");
imag=true;
i++;
break;
case '*':
LCD.setCursor(i, 0);
LCD.print(".");
if(imag){
imaginario[j]='.';
j++;
}
else{
real[r]='.';
r++;
}
i++;
break;
case 'D':
i--;
if(imag){
j--;
imaginario[j]=' ';
}
else{
r--;
real[r]=' ';
}
LCD.setCursor(i, 0);
LCD.print(" ");
break;
case '#':
hold=tecla;
LCD.clear();
re=atof(real);
im=atof(imaginario);
Serial.print("Real: ");
Serial.println(re);
Serial.print("Imaginario: ");
Serial.println(im);
break;
default:
LCD.setCursor(i, 0);
LCD.print(tecla);
//Guardado de números
if(imag){
imaginario[j]=tecla;
j++;
}
else{
real[r]=tecla;
r++;
}
i++;
}
}
}
modulo=sqrtf(sq(re)+sq(im));
angulo=atan((im/re));
angulo=degrees(angulo);
if( re>0.0 && im<0.0){
angulo=360+angulo;
}
if(re<0.0){
angulo=180+angulo;
}
Serial.print("Módulo: ");
Serial.println(modulo);
Serial.print("Ángulo: ");
Serial.println(angulo);
LCD.setCursor(0, 0);
LCD.print("Modulo: ");
LCD.setCursor(8, 0);
LCD.print(modulo);
LCD.setCursor(0, 1);
LCD.print("Angulo: ");
LCD.setCursor(8, 1);
LCD.print(angulo);
}
if (menu == 'B') {
LCD.setCursor(0, 0);
LCD.print(menu);
hold=menu;
delay(1000);
LCD.clear();
while(hold !='#'){
tecla = teclado.getKey();
if (tecla != '\0'){
//impresion por pantalla
switch(tecla){
case 'A':
break;
case 'B':
break;
case 'C':
LCD.setCursor(i, 0);
LCD.print("|");
angu=true;
i++;
break;
case '*':
LCD.setCursor(i, 0);
LCD.print(".");
if(angu){
ang[a]='.';
a++;
}
else{
mod[m]='.';
m++;
}
i++;
break;
case 'D':
i--;
if(angu){
a--;
ang[a]=' ';
}
else{
m--;
mod[m]=' ';
}
LCD.setCursor(i, 0);
LCD.print(" ");
break;
case '#':
hold=tecla;
LCD.clear();
modulo=atof(mod);
angulo=atof(ang);
Serial.print("Módulo: ");
Serial.println(modulo);
Serial.print("Ángulo: ");
Serial.println(angulo);
break;
default:
LCD.setCursor(i, 0);
LCD.print(tecla);
//Guardado de números
if(angu){
ang[a]=tecla;
a++;
}
else{
mod[m]=tecla;
m++;
}
i++;
}
}
}
re=modulo*cos(radians(angulo));
im=modulo*sin(radians(angulo));
Serial.print("Real: ");
Serial.println(re);
Serial.print("Imaginario: ");
Serial.println(im);
LCD.setCursor(0, 0);
LCD.print("Real: ");
LCD.setCursor(6, 0);
LCD.print(re);
LCD.setCursor(0, 1);
LCD.print("Imag: ");
LCD.setCursor(6, 1);
LCD.print(im);
}
}
}