Creación de menú por consola

Buenos días,
Soy nuevo en esto de la programación y me surgen problemas con un programa muy sencillo. Este se trata de la creación de un menú por consola que posee 4 opciones: 1. Saludo/ 2. Encender luces/ 3. Evitar explosión / 4. Fin del programa.
Una vez seleccionas los diferentes apartados debe hacer una serie de cosas:
1- Debe preguntarte el nombre, después debes escribirlo y te tiene que contestar Hola y el nombre que has introducido. Va unido al 4 ya que debe guardar este nombre y al darle al 4 debe decir "Adios" + nombre.
2 - Debe preguntar si queremos encender el led integrado en la placa y responder con un si o un no.
3 - Debes introducir una serie de números que aparecen en pantalla en el orden correcto y si fallas la bomba explota y muestra por pantalla un Boom mientras que si lo escribes correctamente sigue pidiendo los números hasta que haya finalizado el vector.

Tengo problemas ya que me muestra por pantalla el menú y al introducir la elección del menú (con un Switch), tarda mucho en mostrarme los diferentes casos o en otras ocasiones me guarda información antes de que aparezca por pantalla la opción que yo quiero.

Adjunto código. Muchas gracias de antemano.

void setup() {
 Serial.begin(9600);
 pinMode(LED_BUILTIN, OUTPUT);
 
 Serial.println("1. Saludo.");
 Serial.println("2. Encender luz.");
 Serial.println("3. Evitar explosión.");
 Serial.println("4. Fin.");
 //nombre = String();
 
}

int valor ()  //función que devuelve entero
 {
   while (Serial.available()==0);//bloquea hasta que escriba
   delay (10);  //tiempo para que lleguen todos los caracteres al buffer
   int x = 0;  //inicialización de la salida
   String inString = ""; //almacenamiento externo del buffer
   while (Serial.available() > 0) //mientras haya caracteres en el buffer Serial
   {
   int inChar = Serial.read(); //lee caracter
   if (isDigit(inChar))  //si es un dígito, no carácter nulo...
     {     
     inString = inString + (char)inChar;  //convierte byte entrante a char y suma este al String: 
     }
   if (inChar == '\n') // si es el último caracter (nulo)
     {
     x = inString.toInt(); //conviértelo a entero
     }
   }
 return x; //devuelve entero si hay, sino 0.
 }
String frase () //función que devuelve cadena
 {
   while (Serial.available()==0);  //bloquea hasta que escriba
   delay (20); //da tiempo para que lleguen todos los caracteres al buffer 
   String inString = ""; //almacenamiento externo del buffer
   while (Serial.available() > 0) //mientras haya caracteres en el buffer Serial
   {
   int inChar = Serial.read(); //lee carácter
   if (inChar == '\n' || inChar == '\r' )  //si último caracter (nulo) o retorno
   {inString = inString;} //quitarlo para que haya no doble salto línea o retorno 
   else {inString = inString + (char)inChar;} //añádelo a la cadena
   }
 return inString;  //devuelve frase
 }


void loop() {
 int x, encendido;
 x = valor();
 x = Serial.read();
 String nombre;
 nombre = frase();
 while(Serial.available() == 0) { }

 switch(x){
   
   case 1:
   {
     Serial.println("¿Cuál es tu nombre?.");
     while(Serial.available()==0){}
     delay(1000);
     nombre =Serial.readString();
     while(Serial.available() == 0){}
     delay(1000);
     Serial.println("Hola" + nombre);
     break;
   } 
   case 2: 
     {
     Serial.println("¿Quiere encender la luz?");
     //if (Serial.available() > 0) {
     encendido = Serial.read();
     if (encendido == 'S') {
     digitalWrite(LED_BUILTIN, HIGH);
     }
     if (encendido == 'N') {
     digitalWrite(LED_BUILTIN, LOW);
     }
     
     break;
     }
   case 3:
   { 
     Serial.println("Para desactivar la bomba debes meter los siguientes numeros: 4, 8, 15, 16, 23, 42");
     Serial.println("Introduzca numero: ");
     int cadena [] = {4,8,15,16,23,42};
     int micadena [6];
     for (int i=0; i<6; i++){
     micadena[i]= valor();
     if(micadena[i]==cadena[i]){
       Serial.println("Siguiente numero: ");
     }else{
       Serial.println("BOOOOM!!!!!");
       break;  
     }
     
     }
     break;
   }
       
    
   case 4:
    {
     Serial.print("Adios "); Serial.print(nombre); Serial.print(". Fin del programa.");
    
     break;
    }
   }
}

Por favor edita tu post y pon el código como corresponde (ver Normas del foro, punto 7)

A "vuelo de pájaro" el primer error que encuento es este

void loop() {
  int x, encendido;
  x = valor();
  x = Serial.read();

Asignas a x lo devuelto por valor() e inmediatamente le asignas lo leido del puerto serie (que probablemente sea -1 porque teóricamente el buffer está vacío luego de la lectura hecha por valor() ). Una de las 2 no tiene sentido, intuyo que la 2da.
Me extraña que siquiera te aparezca algo en el display.

Moderador
Hola, bienvenido al foro Arduino en Español
Los títulos no deben llevar la palabra Ayuda, edita.
Además el título debe ser indicativo de lo que preguntas. Lo que has puesto no dice nada
"Necesito ayuda con un programa sencillo"
Perdona pero un programa sencillo es Blink que prende 1 led a tiempos diferentes.
Este es un programa para crear un menú asi que ya tienes algo para ponerle, mas adecuado.

Además, el código debe postearse usando etiquetas de código. Edita!

Normas del foro

Disculpar mi error con las normas y los métodos para postear. Gracias por vuestra ayuda. De momento sigo sin poder realizarlo. Pero seguiré intentándolo. :slight_smile:

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