Error al sumar, aparece un 48 que no se de donde sale

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 :grinning:

Prueba:
key -= '0'; //Convertimos el char key en un int

En key tienes el código ASCII de la tecla pulsada.
Entonces '0' = 48, '1' = 49, etc..
Por eso obtienes un 48 cuando tu esperas 0.
Lo resuelves fácilmente así

if(isdigit(key)) { 
  key -= 48;  // equivale a key = key - 48

(es equivalente a lo que propone @odometer )

Por cierto, no es correcto el uso de atoi(), se usa para convertir un string numérico en el valor entero que representa, y tu tienes una variable char.

Muchas gracias, me queda una duda, cuando presiono "A" me devuelve "A", cuando presiono los números en cualquier otra parte del código, me devuelve los números con normalidad, porque en esa parte específicamente me devuelve el código ASCII?

Porque

if(isdigit(key)) {   // *** 

  key -= 48;  // equivale a key = key - 48

Si key contiene el código ASCII de un caracter numérico (un dígito) entonces se hace la resta para obtener el número que representa.
Si no es un dígito no hace la conversión.

Oka, ya entiendo, muchas gracias :grinning:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.