Hola, tengo un problema estoy tratando de usar un teclado conectado a un Arduino, pero necesito que las salidas sean decimales, por lo que hice el siguiente código:
#include <Key.h>
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display
const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'},
};
byte rowPins[ROWS] = { 11, 10, 9, 8 }; //connect to the row pinouts of the keypad
byte colPins[COLS] = { 7, 6, 5, 4 }; //connect to the column pinouts of the keypad
float SPA = 1.01;
float N_SPA = 0.0;
int N_SPAint = 0;
int N_SPAdec = 0;
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
char key;
int dato;
void setup()
{
pinMode(13,OUTPUT);
digitalWrite(13,LOW);
lcd.init();
lcd.backlight();
}
void loop()
{
N_SPA = 0.0; // Nuevo Setpoint
N_SPAint = 0; //Parte entera del nuevo Setpoint
N_SPAdec = 0; //Parte decimal del nuevo Setpoint
lcd.setCursor(0,0);
lcd.print("Contorlador A");
lcd.setCursor(0,1);
lcd.print("Setpoint: " + String(SPA) + " bares");
lcd.setCursor(0,2);
lcd.print("Presion: " + String(2.5) + " bares" );
key = keypad.getKey();
if (key)
{
if(key == 'A')
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Actualizar Setpoint:");
int car = 0; //definimos el entero car que corresponde a la cantidad de caracteres que se han ingresado del nuevo Setpoint
while(car != 4) // el Setpoint siempre tendra 4 caracteres 2 enteros y 2 decimales
{
key = keypad.getKey();
if(isdigit(key))
{
atoi(key); //Convertimos el char key en un int
if(car >= 2) // Esta es la parte decimal del nuevo Setpoint, lo hice así para poder ponerlo digito por digito en la LCD
{
N_SPAdec = N_SPAdec*10 + key; //Multiplica el valor anterior de N_SPAdec por 10 y le suma la nueva entrada
digitalWrite(13,HIGH);
lcd.setCursor(0,3);
lcd.print(String(N_SPAint) + "." + String(N_SPAdec));
car += 1;
}
else
{
N_SPAint = N_SPAint*10 + key; //Multiplica el valor anterior de N_SPAint por 10 y le suma la nueva entrada
digitalWrite(13,HIGH);
lcd.setCursor(0,3);
lcd.print(N_SPAint);
car += 1;
}
}
}
N_SPA = N_SPAint + N_SPAdec*0.01; //Guardamos el nuevo Setpoint
if(N_SPA < 13.00) //Comprobamos que no exceda el maximo
{
SPA = N_SPA;
lcd.setCursor(0,3);
lcd.print(SPA);
delay(1000);
lcd.clear();
}
else
{
lcd.setCursor(0,3);
lcd.print("Valor excede maximo");
delay(1000);
lcd.clear();
}
}
}
}
El problema ocurre en las líneas 71 y 80, a pesar de haber definido N_SPAint = 0 y N_SPAdec = 0, pareciera que el código los toma como N_SPAint = 48 y N_SPAdec = 48 (o al menos eso es lo que a mi me parece que pasa), la verdad no veo porque ocurre, agradecería si me pudieran ayudar