Hola, soy un estudiante en ingeniería informática de primer año y es la primera vez en mi vida que hago arduino y tengo un problema con un ejercicio práctico que trata de controlar con la consola 3 leds haciendo que cuando escribo:
‘A’ los tres leds se encienden
‘B’ los tres leds se encienden de forma rotativa. (En blucle hasta que entre en la consola otra letra)
‘C’ se apagan los leds.
El problema me viene cuando intento escribir la ‘B’ pues o solo me hace una secuencia o se convierte en un bucle haciendo que después no pueda cambiar a otra de las dos opciones.
He probado hacer los 3 casos con if, else if, else if y con switch (este es el que tengo en el código) haciendo que dentro del caso ‘B’ haga un bucle y me deje enviar otro valor al mismo tiempo pero como ya he explicado antes no me ha funcionado.
int option;
int entC=13;
int entB=12;
int entA=11;
void setup() {
Serial.begin(9600);
pinMode(entC,OUTPUT);
pinMode(entB,OUTPUT);
pinMode(entA,OUTPUT);
}
void loop() {
if(Serial.available()>0){
option=Serial.read();
switch (option) {
case 'A':
option=Serial.read();
digitalWrite(entA,HIGH);
digitalWrite(entB,HIGH);
digitalWrite(entC,HIGH);
Serial.println("ON");
break;
case 'C':
option=Serial.read();
digitalWrite(entA,LOW);
digitalWrite(entB,LOW);
digitalWrite(entC,LOW);
Serial.println("OFF");
break;
case 'B':
while (option == 'B'){
if (Serial.read()=='B'){
break;
}else{
digitalWrite(entA, HIGH);
digitalWrite(entB, LOW);
digitalWrite(entC, LOW);
delay(1000);
digitalWrite(entA, LOW);
digitalWrite(entB, HIGH);
digitalWrite(entC, LOW);
delay(1000);
digitalWrite(entA, LOW);
digitalWrite(entB, LOW);
digitalWrite(entC, HIGH);
delay(1000);
}break;}
}}}
No sé si me he explicado bien pero lo que intento conseguir es que al entrar 'B' en la consola se quede haciendo un bucle y poderlo parar entrando 'A' (que en este caso encendería todos los leds) o 'C' (que los apagaría todos).
Con este código lo que me pasa es que no se queda haciendo un bucle sino que acaba con el led que esta en entC=13 encendido después de haber hecho lo que está escrito en
Cada comando = 0 termina la secuencia pero no ocurre lo mismo con B que debe esperar algun comando del Monitor Serie.
El sistema es lento en reaccionar debido a los 3 delays o sea tiene 3 segundos de demora.
Muchas gracias, la verdad es que para hacer ese programa (aunque no lo creas) he estado más de dos horas y veía que no me llevaba a ninguna parte a demás de que no sabía en lo que estaba fallando.
Aunque tengo una duda sobre el código que me has pasado.
En la parte de
Cuando digitas algo en el monitor Serie y le das ENTER para ingresarlo, se envían dos caracteres más, un \r y un \n
Lo que hace ese código es descartarlos para que no afecten el control de tu programa.
\r es Retorno de carro o Carriage-return
\n es Nueva linea o Line-feed.
Si digitas A en realidad llegan 3 cosas : 'A' + '\r' + '\n'
quieres verlo coloca esto
if (Serial.available() > 0) {
Serial.println(option, HEX); // lo veras como Hexadecimal y entonces '\r'sera 0x0a y '\n' sera 0x0d
option = Serial.read();
Entonces tu crees que solo llega 'A' pero los otros dos caracteres complican el código porque para A y C detienen el proceso pero para B que queremos que siga no sirven.