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.
Saludo.
Encender Luz.
Evitar explosión.
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!.
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
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.");
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.
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.