#include <Arduino.h>
// En este ejercicio se realizará una calculadora. Tendrá un menú que permitirá realizar sumas, restas y divisiones con números enteros.
// Además ni el resultado ni los operandos podrán superar el número 255, este se presentará en la terminal y en un conjunto de 8 leds
// conectados a la placa
// Primero, se deben declarar las variables que vamos a utilizar.
bool menu = 0; //Con esta variable se pretende manejar el menú, cuando su valor en "0" entraremos a la parte de programa que maneja
//el menú, cuando sea "1", se pasa a realizar las operaciones.
int8_t m = 0; // Variable para controlar el número de repeticiones (for) del menú.
uint8_t ope1 = 0;// Inicializo las variables de tipo entero que vamos a utilizar para todas las operaciones. Con "uint8_t" estoy defini-
// endo un entero de 8 bits sin signo, es decir, solo se permiten valores positivos (unsigned).
uint8_t ope2 = 0;
uint8_t result = 0;
long control = 0; // Con esta variable controlaremos que los valores no superen el 255.
String mensajes [] = {
"Ingrese el primer número", "Ingrese el segundo número", "Resultado"
};
bool volver = 0; // Variable para volver al menú después de una operación.
uint8_t operacion = 0;// Esta variable me servirá para llevar al usuario a la operación que desea. La utilizaré en los casos de la
// sentencia "Switch".
// Definición de pines para los leds
#define led1 15
#define led2 2
#define led3 0
#define led4 4
#define led5 16
#define led6 17
#define led7 5
#define led8 18
void setup() {
Serial.begin(9600);// Velocidad de trasmisión en baudios, 'encendido' de la terminal serie, se deja en 9600 por comodidad,
// ya que a esa velocidad trabaja por defecto el terminal. Ver proyecto "Comunicación_Serie" si se quiere cambiar
// la velocidad
pinMode(led1, OUTPUT); /*Configuramos los pines como salida*/
pinMode(led2, OUTPUT);pinMode(led3, OUTPUT);pinMode(led4, OUTPUT);pinMode(led5, OUTPUT);pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);pinMode(led8, OUTPUT);
}
//.....................................//
void loop() {
// Menú, nos interesa que solo se repita una vez, por lo que utilizamos "for"
inicio:// Etiqueta para volver al menú.
for (m=0; m<1; m++){
// ^Estado incial || ^Codición para número de repeticiones || ^Incremento
Serial.println("Bienvenido a Calculator 3000. Por favor seleccione la operación a realizar ingresando el número correspondiente, seguido de la tecla enter");
Serial.println("1. Suma");
Serial.println("2. Resta");
Serial.println("3. Multiplicación");
Serial.println("4. División"); // Esto es lo que el usuario verá, luego pasamos a la parte de manejo del menú.
};
while (!menu) { // Con este while manejaremos el menú.
operacion = 0; // Necesitamos que la variable vuelva a "0" para evitar que el dato ingresado en la repetición anterior genere problemas.
operacion = Serial.parseInt();// Esperamos el Input del usuario.
if ((operacion > 0) && (operacion < 5)){// Condición para detectar errores en la digitación de los usuarios. si se cumple
// sale del while y pasa a la operación seleccionada.
menu = 1;
Serial.read();
} else if(Serial.available()) {// En caso de que se digite un número que no represente una operación, se muestra un mensaje de error
// y se vuelve a solicitar el "Input".
delay(500);
Serial.println("Ud. ha introducido un número incorrecto, por favor intentelo de nuevo");
Serial.read();
}
}
//..............................................//
// Operaciones//
continuacion_suma:// Etiqueta para continuar sumando
switch (operacion)
{
case 1: // Suma
Serial.read(); // Limpiamos el buffer para evitar problemas con otros datos introducidos anteriormente.
Serial.println("Ud. se encuentra en Suma");
Serial.println(mensajes[0]); // Utilizamos un array para imprimir el mesaje requiriendo el primer número.
while(!Serial.available()){// Esperamos a que se introduzca el primer número.
control = 0; // Utilizaremos la variable "control" para asegurar que no se introduzacan numeros mayores a 255,
// si se da el caso aparecerá un mensaje de error y volveremos al comienzo de la operación.
control = Serial.parseInt();
}
if (control > 255){// La condición para detectar si el dato es mayor que 255.
delay(1000);
Serial.println("Ud. ha introducido un número mayor a 255, lo cual no es permitido, por favor vuelva a introducir los datos");
Serial.read();
goto continuacion_suma;
}
ope1 = control;
Serial.println(ope1);// Imprimimos en pantalla el primer número
Serial.read();// Limpiamos el buffer para evitar problemas con otros datos introducidos anteriormente.
Serial.println(mensajes[1]);// Requerimos el segundo número
while(!Serial.available()){// Esperamos a que se introduzca el primer número.
control = 0; // Utilizaremos la variable "control" para asegurar que no se introduzacan numeros mayores a 255,
// si se da el caso aparecerá un mensaje de error y volveremos al comienzo de la operación.
control = Serial.parseInt();
}
if (control > 255){// La condición para detectar si el dato es mayor que 255.
delay(1000);
Serial.println("Ud. ha introducido un número mayor a 255, lo cual no es permitido, por favor vuelva a introducir los datos");
Serial.read();
goto continuacion_suma;
}
ope2 = control;
Serial.println(ope2);// Imprimimos en pantalla el segundo número.
control = 0;
control = ope1 + ope2;
if (control > 255){// La condición para detectar si el resultado es mayor que 255.
delay(1000);
Serial.println("La operación da como resultado un número mayor a 255, lo cual no es permitido, por favor vuelva a introducir los datos");
Serial.read();
goto continuacion_suma;
}
result = ope1 + ope2; //Realizamos la operación.
// Intrucciones para encender los leds de acuerdo al resultado de la operación.
digitalWrite(led1, bitRead(result, 0));digitalWrite(led2, bitRead(result, 1));digitalWrite(led3, bitRead(result, 2));
// ^ Función que devuelve el estado de un bit dentro de un byte de información, solo funciona con números.
// la estructrura es "bitRead(número a leer, posición o bit a leer)"
digitalWrite(led4, bitRead(result, 3));digitalWrite(led5, bitRead(result, 4));digitalWrite(led6, bitRead(result, 5));
digitalWrite(led7, bitRead(result, 6));digitalWrite(led8, bitRead(result, 7));
delay (1000);
Serial.println(mensajes[2]);
// Imprimimos el resultado en terminal.
Serial.print(ope1); Serial.print(" + "); Serial.print(ope2); Serial.print(" = "); Serial.println(result);
while (Serial.available()) // Con esta instrucción buscamos darle la posibilidad al usuario de volver al menú o continuar
// realizando sumas.
{
Serial.println("Presione '1' seguido de enter si desea volver al menú, de lo contrario presione '0' seguido de enter");
Serial.setTimeout(3000); volver = Serial.parseInt();
// ^ Aumentamos el tiempo en el que el terminal recibe datos, para darle tiempo al usuario a decidir lo que quiere
// hacer. Si se acaba el tiempo la variable "volver" toma el toma el valor '0'
if (volver == 0) // Si la variable "volver" posee valor 0, continuaremos sumando.
{
Serial.println("Ud. continúa en Suma");
Serial.read();// Limpiamos el buffer para evitar problemas con otros datos introducidos anteriormente.
delay(1000);
goto continuacion_suma;// Utilizamos una etiqueta para volver al punto donde nos interesa.
} else if(volver == 1) // Si la variable "volver" toma el valor '1', volvemos al menú.
{
menu = 0;
Serial.println("Volviendo al menú");
Serial.read();// Limpiamos el buffer para evitar problemas con otros datos introducidos anteriormente.
delay(2000);
goto inicio; // Utilizamos una etiqueta para volver al punto donde nos interesa.
}
}
break;
//Resta
continuacion_resta:
case 2:
Serial.read(); // Limpiamos el buffer para evitar problemas con otros datos introducidos anteriormente.
Serial.println("Ud. se encuentra en Resta");
Serial.println(mensajes[0]); // Utilizamos un array para imprimir el mesaje requiriendo el primer número.
while(!Serial.available()){// Esperamos a que se introduzca el primer número.
control = 0; // Utilizaremos la variable "control" para asegurar que no se introduzacan numeros mayores a 255,
// si se da el caso aparecerá un mensaje de error y volveremos al comienzo de la operación.
control = Serial.parseInt();
}
if (control > 255){// La condición para detectar si el dato es mayor que 255.
delay(1000);
Serial.println("Ud. ha introducido un número mayor a 255, lo cual no es permitido, por favor vuelva a introducir los datos");
Serial.read();
goto continuacion_resta;
}
ope1 = control;
Serial.println(ope1);// Imprimimos en pantalla el primer número
Serial.read();// Limpiamos el buffer para evitar problemas con otros datos introducidos anteriormente.
Serial.println(mensajes[1]);// Requerimos el segundo número
while(!Serial.available()){// Esperamos a que se introduzca el primer número.
control = 0; // Utilizaremos la variable "control" para asegurar que no se introduzacan numeros mayores a 255,
// si se da el caso aparecerá un mensaje de error y volveremos al comienzo de la operación.
control = Serial.parseInt();
}
if (control > 255){// La condición para detectar si el dato es mayor que 255.
delay(1000);
Serial.println("Ud. ha introducido un número mayor a 255, lo cual no es permitido, por favor vuelva a introducir los datos");
Serial.read();
goto continuacion_resta;
}
ope2 = control;
Serial.println(ope2);// Imprimimos en pantalla el segundo número.
control = 0;
control = ope1 - ope2;
if (control < 0 ){// La condición para detectar si el resultado es mayor que 255.
delay(1000);
Serial.println("La operación da como resultado un número menor a 0, lo cual no es permitido, por favor vuelva a introducir los datos");
Serial.read();
goto continuacion_suma;
}
result = ope1 - ope2; //Realizamos la operación.
// Intrucciones para encender los leds de acuerdo al resultado de la operación.
digitalWrite(led1, bitRead(result, 0));digitalWrite(led2, bitRead(result, 1));digitalWrite(led3, bitRead(result, 2));
digitalWrite(led4, bitRead(result, 3));digitalWrite(led5, bitRead(result, 4));digitalWrite(led6, bitRead(result, 5));
digitalWrite(led7, bitRead(result, 6));digitalWrite(led8, bitRead(result, 7));
delay (1000);
Serial.println(mensajes[2]);
// Imprimimos el resultado en terminal.
Serial.print(ope1); Serial.print(" - "); Serial.print(ope2); Serial.print(" = "); Serial.println(result);
while (Serial.available()) // Con esta instrucción buscamos darle la posibilidad al usuario de volver al menú o continuar
// realizando restas.
{
Serial.println("Presione '1' seguido de enter si desea volver al menú, de lo contrario presione '0' seguido de enter");
Serial.setTimeout(3000); volver = Serial.parseInt();
// ^ Aumentamos el tiempo en el que el terminal recibe datos, para darle tiempo al usuario a decidir lo que quiere
// hacer. Si se acaba el tiempo la variable "volver" toma el toma el valor '0'
if (volver == 0) // Si la variable "volver" posee valor 0, continuaremos restando.
{
Serial.println("Ud. continúa en Resta");
Serial.read();// Limpiamos el buffer para evitar problemas con otros datos introducidos anteriormente.
delay(1000);
goto continuacion_resta;// Utilizamos una etiqueta para volver al punto donde nos interesa.
} else if(volver == 1) // Si la variable "volver" toma el valor '1', volvemos al menú.
{
menu = 0;
Serial.println("Volviendo al menú");
Serial.read();// Limpiamos el buffer para evitar problemas con otros datos introducidos anteriormente.
delay(2000);
goto inicio; // Utilizamos una etiqueta para volver al punto donde nos interesa.
}
}
break;
//Multiplicación
continuacion_multi:
case 3:
Serial.read(); // Limpiamos el buffer para evitar problemas con otros datos introducidos anteriormente.
Serial.println("Ud. se encuentra en Multiplicación");
Serial.println(mensajes[0]); // Utilizamos un array para imprimir el mesaje requiriendo el primer número.
while(!Serial.available()){// Esperamos a que se introduzca el primer número.
control = 0; // Utilizaremos la variable "control" para asegurar que no se introduzacan numeros mayores a 255,
// si se da el caso aparecerá un mensaje de error y volveremos al comienzo de la operación.
control = Serial.parseInt();
}
if (control > 255){// La condición para detectar si el dato es mayor que 255.
delay(1000);
Serial.println("Ud. ha introducido un número mayor a 255, lo cual no es permitido, por favor vuelva a introducir los datos");
Serial.read();
goto continuacion_multi;
}
ope1 = control;
Serial.println(ope1);// Imprimimos en pantalla el primer número
Serial.read();// Limpiamos el buffer para evitar problemas con otros datos introducidos anteriormente.
Serial.println(mensajes[1]);// Requerimos el segundo número
while(!Serial.available()){// Esperamos a que se introduzca el primer número.
control = 0; // Utilizaremos la variable "control" para asegurar que no se introduzacan numeros mayores a 255,
// si se da el caso aparecerá un mensaje de error y volveremos al comienzo de la operación.
control = Serial.parseInt();
}
if (control > 255){// La condición para detectar si el dato es mayor que 255.
delay(1000);
Serial.println("Ud. ha introducido un número mayor a 255, lo cual no es permitido, por favor vuelva a introducir los datos");
Serial.read();
goto continuacion_multi;
}
ope2 = control;
Serial.println(ope2);// Imprimimos en pantalla el segundo número.
control = 0;
control = ope1 * ope2;
if (control > 255){// La condición para detectar si el resultado es mayor que 255.
delay(1000);
Serial.println("La operación da como resultado un número mayor a 255, lo cual no es permitido, por favor vuelva a introducir los datos");
Serial.read();
goto continuacion_suma;
}
result = ope1 * ope2; //Realizamos la operación.
// Intrucciones para encender los leds de acuerdo al resultado de la operación.
digitalWrite(led1, bitRead(result, 0));digitalWrite(led2, bitRead(result, 1));digitalWrite(led3, bitRead(result, 2));
digitalWrite(led4, bitRead(result, 3));digitalWrite(led5, bitRead(result, 4));digitalWrite(led6, bitRead(result, 5));
digitalWrite(led7, bitRead(result, 6));digitalWrite(led8, bitRead(result, 7));
delay (1000);
Serial.println(mensajes[2]);
// Imprimimos el resultado en terminal.
Serial.print(ope1); Serial.print(" * "); Serial.print(ope2); Serial.print(" = "); Serial.println(result);
while (Serial.available()) // Con esta instrucción buscamos darle la posibilidad al usuario de volver al menú o continuar
// realizando multiplicaciones.
{
Serial.println("Presione '1' seguido de enter si desea volver al menú, de lo contrario presione '0' seguido de enter");
Serial.setTimeout(3000); volver = Serial.parseInt();
// ^ Aumentamos el tiempo en el que el terminal recibe datos, para darle tiempo al usuario a decidir lo que quiere
// hacer. Si se acaba el tiempo la variable "volver" toma el toma el valor '0'
if (volver == 0) // Si la variable "volver" posee valor 0, continuaremos Multiplicando.
{
Serial.println("Ud. continúa en Multiplicación");
Serial.read();// Limpiamos el buffer para evitar problemas con otros datos introducidos anteriormente.
delay(1000);
goto continuacion_multi;// Utilizamos una etiqueta para volver al punto donde nos interesa.
} else if(volver == 1) // Si la variable "volver" toma el valor '1', volvemos al menú.
{
menu = 0;
Serial.println("Volviendo al menú");
Serial.read();// Limpiamos el buffer para evitar problemas con otros datos introducidos anteriormente.
delay(2000);
goto inicio; // Utilizamos una etiqueta para volver al punto donde nos interesa.
}
}
break;
// División
continuacion_divi:
case 4:
Serial.read(); // Limpiamos el buffer para evitar problemas con otros datos introducidos anteriormente.
Serial.println("Ud. se encuentra en División");
Serial.println(mensajes[0]); // Utilizamos un array para imprimir el mesaje requiriendo el primer número.
while(!Serial.available()){// Esperamos a que se introduzca el primer número.
control = 0; // Utilizaremos la variable "control" para asegurar que no se introduzacan numeros mayores a 255,
// si se da el caso aparecerá un mensaje de error y volveremos al comienzo de la operación.
control = Serial.parseInt();
}
if (control > 255){// La condición para detectar si el dato es mayor que 255.
delay(1000);
Serial.println("Ud. ha introducido un número mayor a 255, lo cual no es permitido, por favor vuelva a introducir los datos");
Serial.read();
goto continuacion_divi;
}
ope1 = control;
Serial.println(ope1);// Imprimimos en pantalla el primer número
Serial.read();// Limpiamos el buffer para evitar problemas con otros datos introducidos anteriormente.
Serial.println(mensajes[1]);// Requerimos el segundo número
while(!Serial.available()){// Esperamos a que se introduzca el primer número.
control = 0; // Utilizaremos la variable "control" para asegurar que no se introduzacan numeros mayores a 255,
// si se da el caso aparecerá un mensaje de error y volveremos al comienzo de la operación.
control = Serial.parseInt();
}
if (control > 255){// La condición para detectar si el dato es mayor que 255.
delay(1000);
Serial.println("Ud. ha introducido un número mayor a 255, lo cual no es permitido, por favor vuelva a introducir los datos");
Serial.read();
goto continuacion_divi;
}
ope2 = control;
Serial.println(ope2);// Imprimimos en pantalla el segundo número.
result = ope1 / ope2; //Realizamos la operación.
// Intrucciones para encender los leds de acuerdo al resultado de la operación.
digitalWrite(led1, bitRead(result, 0));digitalWrite(led2, bitRead(result, 1));digitalWrite(led3, bitRead(result, 2));
digitalWrite(led4, bitRead(result, 3));digitalWrite(led5, bitRead(result, 4));digitalWrite(led6, bitRead(result, 5));
digitalWrite(led7, bitRead(result, 6));digitalWrite(led8, bitRead(result, 7));
delay (1000);
Serial.println(mensajes[2]);
// Imprimimos el resultado en terminal.
Serial.print(ope1); Serial.print(" / "); Serial.print(ope2); Serial.print(" = "); Serial.println(result);
while (Serial.available()) // Con esta instrucción buscamos darle la posibilidad al usuario de volver al menú o continuar
// realizando divisiones.
{
Serial.println("Presione '1' seguido de enter si desea volver al menú, de lo contrario presione '0' seguido de enter");
Serial.setTimeout(3000); volver = Serial.parseInt();
// ^ Aumentamos el tiempo en el que el terminal recibe datos, para darle tiempo al usuario a decidir lo que quiere
// hacer. Si se acaba el tiempo la variable "volver" toma el toma el valor '0'
if (volver == 0) // Si la variable "volver" posee valor 0, continuaremos Dividiendo.
{
Serial.println("Ud. continúa en División");
Serial.read();// Limpiamos el buffer para evitar problemas con otros datos introducidos anteriormente.
delay(1000);
goto continuacion_divi;// Utilizamos una etiqueta para volver al punto donde nos interesa.
} else if(volver == 1) // Si la variable "volver" toma el valor '1', volvemos al menú.
{
menu = 0;
Serial.println("Volviendo al menú");
Serial.read();// Limpiamos el buffer para evitar problemas con otros datos introducidos anteriormente.
delay(2000);
goto inicio; // Utilizamos una etiqueta para volver al punto donde nos interesa.
}
}
break;
default: // Importante para evitar errores, aunque ningún valor diferente de 1,2,3,4 debería permitirnos salir del menú.
Serial.println("Se ha detectado un problema. Volviendo al menú");
menu = 0;
break;
}
} 7. = 128
6. = 64
5. = 32
4. = 16
3. = 8
2. = 4
1. = 2
0. = 1