Hola buenas tardes

Imprime el siguiente menú con opciones y haz que pregunte, en el primer caso, el nombre de usuario en
el monitor serial y que conteste “Hola nombreusuario”, y que en el cuarto caso, se despida con el nombre
“Adiós nombredeusuario. Fin del programa” y, por último, que salga para acabar el programa (cuando se
pulse una tecla u opción no realice nada). Ahora mismo no hace falta hacer nada en los otros casos.

  1. Saludo.
  2. Encender Luz.
  3. Evitar explosión.
  4. Fin.
    b) En el segundo caso, pregunta si se quiere encender la luz (led incorporado en Arduino), si contesta N o NO,
    apaga el led; si contesta S o SÍ, enciende el led.
    c) En el tercer caso debe pedir, guardar y luego imprimir el siguiente vector de LOST: 4 8 15 16 23 42 . Comprueba
    que cuando se introduce un número sea el correcto, si no, escribe BOOMM!.

Nosotros te ayudamos con dudas puntuales pero no hacemos el ejercicio. Si nos muestras que código llevas hecho hasta ahora te podremos ayudar.

Hola Víctor , no lo e empezado aun, estoy un poco bloqueado ahora mismo con el tema del vector, desde que lo tenga como yo creo que es .. lo paso por aquí a ver si pueden echarme un cable . Gracias.

Moderador:
Por favor, lee las Normas del foro y edita tu título haciéndolo mas corto y directo.
Las presentaciones y relatos para el mensaje mismo, no para el título.
Simple y concreto por favor.
Mira el punto 5 de las normas sobre cómo poner los títulos en este foro.

El vector que te pide simplemente es para guardar la clave, tendrás que crear dos array, uno para guardar la clave del enunciado y otro para guardar lo que recibas por el Serial.

int laclave[6] = { 4, 8, 15, 16, 23, 32 };
int clave[6];

Cuando entres al paso (3) el programa debe entrar en un estado en el lea los 6 números y cuando los haya leido comparar ambos array.

Hola buenas tardes Xerax por tu duda creo que estamos haciendo el mismo curso de robotica, el de ceac no? Si es así podríamos ponernos en contacto y ayudarnos en posibles dudas

hola pues la verdad es que si. por mi perfecto. Estoy programación y me esta costando .ya hiciste este ejercicio.?

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;
}

}
}

lo hice asi pero no me funciona..

No, estoy trabado bastante con ese, sabes como mandarnos mensajes por privado a través de esta plataforma o contactamos por correo

String cmd;
int icmd;
int estado=0;
int paso;
int laclave[6]={ 4, 8, 15, 16, 23, 42 };
int miclave[6];

void opciones() {
  Serial.println("1. Saludo.");
  Serial.println("2. Encender luz.");
  Serial.println("3. Evitar explosión.");
  Serial.println("4. Fin.");
}
void leerCadena() {
  while ( !Serial.available() );
  cmd = Serial.readString();
}
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  estado = 0;
  
}
void loop() {
  switch ( estado ) {
    case 0:
      opciones();
      leerCadena();
      icmd = cmd.toInt();
      switch ( icmd ) {
        case 1:
          Serial.print("Dime tu nombre:");
          estado = 1;
          break;
        case 2:
          Serial.print("Quieres encender la luz?");
          estado = 2;
          break;
        case 3:
          Serial.print("Dame la contraseña:");
          paso = 0;
          estado = 3;
          break;
        case 4:
          Serial.print("Fin de programa");
          estado = 4;
          break;
        default: break;  
      }
      break;
    case 1:
      leerCadena();
      Serial.print("Hola ");
      Serial.println(cmd);
      estado = 0;
      break;
    case 2:
      leerCadena();
      if ( cmd=="S" || cmd=="s" ) { digitalWrite(13, HIGH); estado=0; }
      else
      if ( cmd=="N" || cmd=="n" ) { digitalWrite(13, LOW); estado=0; }
      else {
        estado = 0;
      }
      break;
    case 3:  
      if ( paso < 6 ) {
        leerCadena();
        Serial.println(cmd);
        miclave[paso]=cmd.toInt();
        paso++;
      }
      else {
        for (int i=0; i<6; i++) {
          if ( laclave[i]!=miclave[i] ) {
            Serial.println("BOOOOM");
            estado=0;
            break;    
          }
        }
      }
      break;
    case 4:
      break;
  }
}

Me tengo que ir a trabajar, cuando tenga un rato describo el código.

1 Like

muchísimas gracias @victorjam

Bueno, estoy de vuelta.

Voy a comentar el código para que sea de ayuda y podaís entenderlo mejor.

String cmd;           // donde vamos a guardar la cadena leida.
int icmd;             // Una variable en la que vamos a guardar el valor entero de la cadena
int estado=0;         // Estado.
int paso;             // Paso.

/* La variable "estado" nos dirá donde estamos: si estamos en el menu principal, saludando,
encendiendo la luz, etc. */

/* La variable paso no servirá para ir guardando los valores que vayamos leyendo en el 
array */
 
/* La contraseña y la variable donde vamos a guardarla. */
int laclave[6]={ 4, 8, 15, 16, 23, 42 };
int miclave[6];

// Esta función es para reducir el número de veces que tengamos que pintar el menu 
// principal.
void opciones() {
  Serial.println("1. Saludo.");
  Serial.println("2. Encender luz.");
  Serial.println("3. Evitar explosión.");
  Serial.println("4. Fin.");
}

// Esta función hace la magia. En vez de leer caracter a caracter tenemos la funcion
// readString que lee una cadena del puerto serie. Así que cada vez que queramos leer
// algo por el puerto serie la llamamos y guardamos la cadena en la variable cmd.
void leerCadena() {
  while ( !Serial.available() ); // Esperamos mientras no haya datos en el puerto serie.
  cmd = Serial.readString(); // Leemos la cadena.
}

// configuración inicial.
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  estado = 0;
}

void loop() {
  // Comprobamos el estado en el que estamos y actuamos en consecuencia.
  switch ( estado ) {
    case 0: // Este es el menu principla.
      opciones(); // lo mostramos.
      leerCadena(); // Leemos la cadena y guardamos en la variable cmd.
      // Esperamos recibir un numero del 1 al 4. Asi que convertimos el valor a un
      // entero usando toInt. Si lo que recibimos no es un numero no pasar por dentro
      // del switch.
      icmd = cmd.toInt();
      // Segun el valor de la variable ejecutaremos la opción correspondiente del menu.
      // mandamos un mensaje de presentación y pasamos al estado correspondiente.
      switch ( icmd ) {
        case 1:
          Serial.print("Dime tu nombre:");
          estado = 1;
          break;
        case 2:
          Serial.print("Quieres encender la luz?");
          estado = 2;
          break;
        case 3:
          Serial.print("Dame la contraseña:");
          paso = 0; // En el estado "3" vamos a leer el array por lo tanto paso lo ponemos a 0.
          estado = 3;
          break;
        case 4:
          Serial.print("Fin de programa");
          estado = 4;
          break;
        default: break;  
      }
      break;

    case 1: // Opcion1.
      // Aquí tenemos que introducir el nombre, y luego simplemente responde "hola"+nombre
      // y cuando termine volvemos al menu principal
      leerCadena();
      Serial.print("Hola ");
      Serial.println(cmd);
      estado = 0;
      break;

    case 2: // Opcion 2.
      // Como ya hemos preguntado si queremos encender la luz, debemos leer la cadena y ver
      // si es S o N. Como no se especifica si recibimos otra cosa distinta simplemente 
      // volvemos al menu principal (estado 0).
      leerCadena();
      if ( cmd=="S" || cmd=="s" ) { digitalWrite(13, HIGH); estado=0; }
      else
      if ( cmd=="N" || cmd=="n" ) { digitalWrite(13, LOW); estado=0; }
      else {
        estado = 0;
      }
      break;
    case 3:  // Leer el array.
      // Tenemos que leer seis valores de clave. Por eso utilizamos paso, en cada paso
      // leemos una cadena, la convertimos a número y la guardamos, incrementamos el
      // paso.
      if ( paso < 6 ) {
        leerCadena();
        Serial.println(cmd);
        miclave[paso]=cmd.toInt();
        paso++;
      }
      else {
        // Ya hemos leido los seis pasos ahora tenemos que comparar con los de la clave
	// si alguno es distinto hará explosion y volveremos al estado 0.
        for (int i=0; i<6; i++) {
          if ( laclave[i]!=miclave[i] ) {
            Serial.println("BOOOOM");
            estado=0;
            break;    
          }
        }
      }
      break;
    case 4:
      // En el caso 4, no hacemos nada y aqui nos quedaremos ya que al no haber código
      // el arduino no hará nada aquí hasta que lo reiniciemos.
      break;
  }
}

El código es una pequeña máquina de estados. En una máquina de estados existen una serie de estados (valga la redundancia) en los que podemos estar, en nuestro caso son las opciones del menu (incluyendo el menú principal). En cada estado se realiza una acción determinada y puede ocurrir "algo" que nos haga ir a otro estado. En este caso lo que ocurre es que ha terminado de realizar la acción que se supone tiene que hacer y por lo tanto vuelve al menu principal. excepto en el estado 4 que es fin de programa que no hace nada y se queda ahi para siempre.

El código es mejorable, pero creo que es una buena partida para que entiendas el concepto. Sobre todo la parte del array que es donde tenías mas dudas.

1 Like

Moderador
Te envié un priviado y te he solicitado varias veces que hagas cambios en este post que aunque esta resuelto tiene faltas a las normas.
No dejes de hacerlo.
Respuestas si las tienes por privado.

Ok, perdón dime que tengo que hacer o cambiar y desde que pueda lo are.. Lo q lo are esta noche antes no puedo. Disculpe usted señor moderador por las molestias ocasionadas. Un cordial saludo

No hay problema. Ya te lo dije en el post.
Acorta el título algo directo y conciso.
Coloca los códigos como los que te han respondido.
Usando etiequetas.
Todo esta en las normas.
Te puse una guia de cómo hacerlo.
Nunca sanciono a alguien sin advertirle varias veces. Lamento tu caso pero corrige el hilo y sigamos adelante.
Suerte.

Gracias.

hola

si quieres pásame correo y hablamos por hay ..un saludo.

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