Calculadora básica Arduino

Bien, esto es lo que tengo de momento. He añadido que los numeros puedan ser flotantes para abarcar un mayor número de posibilidades y las potencias. Ahora como reto personal estoy intentando hacer que pueda hacer raíces cuadradas, pero se me está complicando un poco y también las puedes obtener elevando a 1/2 osea que... tampoco vamos a enredar el rizo; si consigo hacer esto último subiré la solución también. Gracias a todos.

void setup()
{
  Serial.begin(9600);
  Serial.println("Introduce operacion: ");
}

void loop(){
  
  String operacion = "";
  int signo = 0;
  int suma;
  int resta;
  int multiplicacion;
  int division;
  int potencia;
  int root;
  String op1 = ""; 
  String op2 = "";
  float Resultado;
  int separador;
  float Operando1;
  float Operando2;
  
  
  
  if (Serial.available()>0){
 
    operacion = Serial.readStringUntil('\n');
    suma = operacion.indexOf('+');
    resta = operacion.indexOf('-');
    multiplicacion = operacion.indexOf('*');
    division = operacion.indexOf('/');
    potencia = operacion.indexOf('^');
    root = operacion.indexOf('t');
    
    
    int longitudOperacion = operacion.length();
    
    if (suma > 0){
      signo = 1;
      separador = suma;
      
    }
    
    if (resta > 0){
      signo = 2;
      separador = resta;
    }
    
    if (multiplicacion > 0){
      signo = 3;
      separador = multiplicacion;
    }
    
    if (division > 0){
      signo = 4;
      separador = division;
    }
    
    if (potencia > 0){
      signo = 5;
      separador = potencia;
    }
    
    op1 = operacion.substring(0, separador);
    op2 = operacion.substring(separador + 1, longitudOperacion);
    
    Operando1 = op1.toFloat();
    Operando2 = op2.toFloat();
    
    Serial.print(operacion);
    Serial.println(" = ");
    
    
    
    switch (signo){// open switch
      
      case 1:
      
      	Resultado = Operando1 + Operando2;
      	break;
      
      case 2:
      
      	Resultado = Operando1 - Operando2;
      	break;
      
      case 3:
      	
      	Resultado = Operando1 * Operando2;
      	break;
      
      case 4:
      	
      	Resultado = Operando1 / Operando2;
      	break;
      
      case 5:
      	
      	Resultado = pow(Operando1, Operando2);
      	break;
 
    }//close switch
    Serial.println(Resultado);
  }
        
}

Bien, me interesaba ver que lo entendieras y lo has hecho.
Espero ver la versión final, eh!

Saludos

Hola muy buenas, estoy intentando ahora hacer el mismo problema pero usando funciones para que quede un programa más limpio, pero se me está complicando el hacer una función que detecte la operación que el usuario quiere hacer; alguna idea? Esto es lo que tengo de momento

// VARIABLES

String operacion;
int suma;
int resta;
int multiplicacion;
int division;
int potencia;

// FUNCIONES
int detectaOperacion(String operacion1)
{
  suma = operacion1.indexOf('+');
  resta = operacion1.indexOf('-');
  multiplicacion = operacion1.indexOf('*');
  division = operacion1.indexOf('/');
  potencia = operacion1.indexOf('^');
}

void setup()
{
  Serial.begin(9600);
  Serial.println("Introduce operacion: ");
}

void loop()
{
  if (Serial.available()>0){
    operacion = Serial.readStringUntil('/n');
    detectaOperacion(operacion);
  }
}

Pero claro, en la función detectaOperacion() introducimos una variable tipo String y yo quiero que me devuelva una variable tipo int y claro esto es incoherente; debería intentar plantearlo de otro modo? en vez de intentar "reciclar" el código anterior?

¿Por qué es incoherente?
sizeof(), por ej., acepta una cadena como parámetro y devuelve un entero.

Agrega a la función los if() que le dan valor a la variable signo.

if (suma > 0){
      signo = 1;
}
// y los que siguen

Luego de los if()

return signo;

que es lo que te falta y hace que la función retorne ese valor

Saludos

Agrego: signo declárala dentro de la función ya que no la vas a necesitar fuera de ésta.

He hecho esto de momento

// VARIABLES
String operacion;
String op1;
String op2;
int suma;
int resta;
int multiplicacion;
int division;
int potencia;
int signo;
int separador;
float operando1;
float operando2;

// FUNCIONES

int detectaseparador(String operacion1)
{
  suma = operacion.indexOf('+');
  resta = operacion.indexOf('-');
  multiplicacion = operacion.indexOf('*');
  division = operacion.indexOf('/');
  potencia = operacion.indexOf('^');
  
  if (suma>0)
  {
    separador = suma;
  }
  if (resta>0)
  {
    separador = resta;
  }
  if (multiplicacion>0)
  {
    separador = multiplicacion;
  }
  if (division>0)
  {
    separador = division; 
  }
  if (potencia>0)
  {
    separador = potencia;
  }
      
  return separador;
}

void setup()
{
  Serial.begin(9600);
  Serial.println("Introduce operacion: ");
}

void loop()
{
  if (Serial.available()>0){
    operacion = Serial.readStringUntil('/n');
    detectaseparador(operacion);
    
    op1 = operacion.substring(0, separador);
    op2 = operacion.substring(separador + 1);
    operando1 = op1.toFloat;
    operando2 = op2.toFloat;
  }
}

Pero no se me ocurre ninguna forma óptima de implementarlo, porque he hecho una función para poder convertir lo introducido por teclado a números flotantes pero si ahora por ejemplo quiero introducir la parte de detectaOperacion() tendría que repetir parte del código ya hecho. Estube pensando en hacer eso y después hacer una función para cada operación pero no sé... Me parece que sería desperdiciar mucha memoria no? Alguna idea de una implementación más óptima?

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