Problema con while

Buenas tardes a todos! vengo por aqui a saltearme una duda aver si pueden ayudarme, estoy iniciando en esto de la programacion en arduino haciendo un auto controlado por bt, el auto se mueve mediante botones, enciende luces y puede seguir funcionando… ahora el problema es cuando yo le digo que con ‘X’ tiene que hacer tal funcion la cumple, pero me es imposible volver a salir, que estoy haciendo mal? desde ya muchas gracias a todos!

int izqA = 5; 
int izqB = 6; 
int derA = 10; 
int derB = 9; 
int LedFront = 13;
int LedBack = 11;
int Corneta = 3;

int vel = 210;            // Velocidad de los motores (0-255)
int vel2 = 105;            // Velocidad de los motores (0-255)
int estado = 'u';         // inicia detenido

int VelocidadMotor1 = 12; // ENA - PWM
int VelocidadMotor2 = 8; // ENB

int infraPin = 4; // izquierdo - pin del infrarrojos utilizado como entrada digital
int infraPin1=2; // derecho
int valorInfra = 0; // Valor inicial de la lectura digital del infrarrojos
int valorInfra1 = 0;


void setup()  { 
 Serial.begin(9600);    // inicia el puerto serial para comunicacion con el Bluetooth
 pinMode(derA, OUTPUT);
 pinMode(derB, OUTPUT);
 pinMode(izqA, OUTPUT);
 pinMode(izqB, OUTPUT);
 pinMode(LedFront, OUTPUT);
 pinMode(LedBack, OUTPUT);
 pinMode(Corneta, OUTPUT);
pinMode(infraPin, INPUT);
pinMode(infraPin1, INPUT);
pinMode(VelocidadMotor1, OUTPUT);
pinMode(VelocidadMotor2, OUTPUT);

analogWrite(VelocidadMotor1, 255); //motor izquierdo PWM
analogWrite(VelocidadMotor2, 255); //motor derecho PWM

digitalWrite(izqA, LOW);
digitalWrite(izqB, LOW);
digitalWrite(derA, LOW);
digitalWrite(derB, LOW);
}

void loop()  { 

 
 if(Serial.available()>0){        // lee el bluetooth y almacena en estado
     estado = Serial.read();
 }
 if(estado=='F'){           // Boton desplazar al Frente
     analogWrite(derB, 0);     
     analogWrite(izqB, 0); 
     analogWrite(derA, vel);  
     analogWrite(izqA, vel);   
}
 if(estado=='I'){           // Boton desplazar diagonal izquierda
     analogWrite(derB, 0);     
     analogWrite(izqB, 0); 
     analogWrite(derA, vel);  
     analogWrite(izqA, vel2);   
}
 if(estado=='G'){           // Boton desplazar diagonal derecha
     analogWrite(derB, 0);     
     analogWrite(izqB, 0); 
     analogWrite(derA, vel2);  
     analogWrite(izqA, vel);    
 }
 if(estado=='L'){          // Boton IZQ 
     analogWrite(derB, 0);     
     analogWrite(izqB, 0); 
     analogWrite(derA, 0);  
     analogWrite(izqA, vel);      
 }
 if(estado=='S'){         // Boton Parar
     analogWrite(derB, 0);     
     analogWrite(izqB, 0); 
     analogWrite(derA, 0);    
     analogWrite(izqA, 0); 
 }
 if(estado=='R'){          // Boton DER
      analogWrite(derB, 0);     
      analogWrite(izqB, 0);
      analogWrite(izqA, 0);
      analogWrite(derA, vel);  
 } 
 
 if(estado=='B'){          // Boton Reversa
      analogWrite(derA, 0);    
      analogWrite(izqA, 0);
      analogWrite(derB, vel);  
      analogWrite(izqB, vel);    
 } 
 
 if(estado=='H'){          // Boton Reversa diagonal derecha
      analogWrite(derA, 0);    
      analogWrite(izqA, 0);
      analogWrite(derB, vel2);  
      analogWrite(izqB, vel);   
 } 
 
 if(estado=='J'){          // Boton Reversa diagonal izquierda
      analogWrite(derA, 0);    
      analogWrite(izqA, 0);
      analogWrite(derB, vel);  
      analogWrite(izqB, vel2); 
 }
   if(estado=='W'){          // Luces delanteras encendidas
      digitalWrite(LedFront, HIGH);
 }
   if(estado=='w'){          // Luces delanteras apagadas
      digitalWrite(LedFront, LOW);
 }    
   if(estado=='U'){          // Luces traseras encendidas
      digitalWrite(LedBack, HIGH);
 }
   if(estado=='u'){          // Luces traseras apagadas
      digitalWrite(LedBack, LOW);
 }
     if(estado=='V'){          // Corneta on
      digitalWrite(Corneta, HIGH);
 }
   if(estado=='v'){          // Corneta off
      digitalWrite(Corneta, LOW);
 }
 if (estado =='U'){          // Boton ON se mueve sensando distancia 

 }
 if  (estado=='D'){          // Boton OFF, detiene los motores no hace nada 
 }
 

if (estado=='X') {

while (estado=='X') {
 
 valorInfra = digitalRead(infraPin); // valor entrada que lee el infrarrojo izquierdo
valorInfra1 = digitalRead(infraPin1); // valor entrada que lee el infrarrojo derecho



 if(valorInfra == 0 && valorInfra1 == 0){ // hacia delante

digitalWrite(izqA, HIGH);
digitalWrite(derA, HIGH);
delay(0);
digitalWrite(izqA, LOW);
digitalWrite(derA,LOW);
delay(0);

}
if(valorInfra == 0 && valorInfra1 == 1){ // Gira hacia la derecha
digitalWrite(izqA, LOW);
digitalWrite(derA,LOW);
delay(0);
digitalWrite(izqA, HIGH);
digitalWrite(derA,LOW);
delay(0);

}
if(valorInfra == 1 && valorInfra1 == 0){ // Gira hacia la izquierda
digitalWrite(izqA,LOW);
digitalWrite(derA, LOW);
delay(0);
digitalWrite(izqA,LOW);
digitalWrite(derA, HIGH);
delay(0);

}
if(valorInfra == 1 && valorInfra1 == 1){ // STOP

digitalWrite(izqA, LOW);
digitalWrite(izqB, LOW);
digitalWrite(derB, LOW);
digitalWrite(derA, LOW);
break;

}
}
}

}

Lee las Normas del foro
Luego ve a More (abajo a la derecha), click, luego Modify y estas en modo EDICION.
Si tienes que editar un código → Selecciona todo el código y click en </> arriba del emoticon.
**Si tienes que editar un enlace → Selecciona el enlace. Copialo al portapapeles. Click en el eslabón (ver abajo) y sigue los pasos que habras visto al leer las normas. **

Tags.jpg

Por cierto sobre tu problema, el while evalua el estado de una variable que no cambia dentro del mismo while, y por lo tanto nunca puede salir. No corresponde ese While ahi, en lugar de eso va un if() simple.

Como dice msoffredi el problema viene porque no actualizas esa variable, entras en el While y estado va a ser X siempre, así que creas un bucle infinito.

Yo lo que haría es leer el puerto serie mediante la interrupción serie, de esta manera cada vez que le llegue algo al arduíno desde el BT saltará la interrupción y si actualizará la variable estado, saliendo de ese bucle while cuando le llegue otro valor diferente.

msoffredi:
Por cierto sobre tu problema, el while evalua el estado de una variable que no cambia dentro del mismo while, y por lo tanto nunca puede salir. No corresponde ese While ahi, en lugar de eso va un if() simple.

es que si pongo solamente un if no me realiza la accion que es el seguidor de linea. solo lo hace si pongo el while.

Danicap:
Como dice msoffredi el problema viene porque no actualizas esa variable, entras en el While y estado va a ser X siempre, así que creas un bucle infinito.

Yo lo que haría es leer el puerto serie mediante la interrupción serie, de esta manera cada vez que le llegue algo al arduíno desde el BT saltará la interrupción y si actualizará la variable estado, saliendo de ese bucle while cuando le llegue otro valor diferente.

voy a probar si me sale lo que dices, gracias!

Danicap:
Como dice msoffredi el problema viene porque no actualizas esa variable, entras en el While y estado va a ser X siempre, así que creas un bucle infinito.

Yo lo que haría es leer el puerto serie mediante la interrupción serie, de esta manera cada vez que le llegue algo al arduíno desde el BT saltará la interrupción y si actualizará la variable estado, saliendo de ese bucle while cuando le llegue otro valor diferente.

no logro dar con el objetivo. no se si estoy ubicando bien el comando al final de todo el if(),

int izqA = 5; 
int izqB = 6; 
int derA = 10; 
int derB = 9; 
int LedFront = 13;
int LedBack = 11;
int Corneta = 3;

int vel = 210;            // Velocidad de los motores (0-255)
int vel2 = 105;            // Velocidad de los motores (0-255)
int estado = 'u';         // inicia detenido

int VelocidadMotor1 = 12; // ENA - PWM
int VelocidadMotor2 = 8; // ENB

int infraPin = 4; // izquierdo - pin del infrarrojos utilizado como entrada digital
int infraPin1=2; // derecho
int valorInfra = 0; // Valor inicial de la lectura digital del infrarrojos
int valorInfra1 = 0;


void setup()  { 
  Serial.begin(9600);    // inicia el puerto serial para comunicacion con el Bluetooth
  pinMode(derA, OUTPUT);
  pinMode(derB, OUTPUT);
  pinMode(izqA, OUTPUT);
  pinMode(izqB, OUTPUT);
  pinMode(LedFront, OUTPUT);
  pinMode(LedBack, OUTPUT);
  pinMode(Corneta, OUTPUT);
 pinMode(infraPin, INPUT);
 pinMode(infraPin1, INPUT);
 pinMode(VelocidadMotor1, OUTPUT);
 pinMode(VelocidadMotor2, OUTPUT);

 analogWrite(VelocidadMotor1, 255); //motor izquierdo PWM
 analogWrite(VelocidadMotor2, 255); //motor derecho PWM

 digitalWrite(izqA, LOW);
 digitalWrite(izqB, LOW);
 digitalWrite(derA, LOW);
 digitalWrite(derB, LOW);
}
 
void loop()  { 

  
  if(Serial.available()>0){        // lee el bluetooth y almacena en estado
      estado = Serial.read();
  }
  if(estado=='F'){           // Boton desplazar al Frente
      analogWrite(derB, 0);     
      analogWrite(izqB, 0); 
      analogWrite(derA, vel);  
      analogWrite(izqA, vel);   
 }
  if(estado=='I'){           // Boton desplazar diagonal izquierda
      analogWrite(derB, 0);     
      analogWrite(izqB, 0); 
      analogWrite(derA, vel);  
      analogWrite(izqA, vel2);   
 }
  if(estado=='G'){           // Boton desplazar diagonal derecha
      analogWrite(derB, 0);     
      analogWrite(izqB, 0); 
      analogWrite(derA, vel2);  
      analogWrite(izqA, vel);    
  }
  if(estado=='L'){          // Boton IZQ 
      analogWrite(derB, 0);     
      analogWrite(izqB, 0); 
      analogWrite(derA, 0);  
      analogWrite(izqA, vel);      
  }
  if(estado=='S'){         // Boton Parar
      analogWrite(derB, 0);     
      analogWrite(izqB, 0); 
      analogWrite(derA, 0);    
      analogWrite(izqA, 0); 
  }
  if(estado=='R'){          // Boton DER
       analogWrite(derB, 0);     
       analogWrite(izqB, 0);
       analogWrite(izqA, 0);
       analogWrite(derA, vel);  
  } 
  
  if(estado=='B'){          // Boton Reversa
       analogWrite(derA, 0);    
       analogWrite(izqA, 0);
       analogWrite(derB, vel);  
       analogWrite(izqB, vel);    
  } 
  
  if(estado=='H'){          // Boton Reversa diagonal derecha
       analogWrite(derA, 0);    
       analogWrite(izqA, 0);
       analogWrite(derB, vel2);  
       analogWrite(izqB, vel);   
  } 
  
  if(estado=='J'){          // Boton Reversa diagonal izquierda
       analogWrite(derA, 0);    
       analogWrite(izqA, 0);
       analogWrite(derB, vel);  
       analogWrite(izqB, vel2); 
  }
    if(estado=='W'){          // Luces delanteras encendidas
       digitalWrite(LedFront, HIGH);
  }
    if(estado=='w'){          // Luces delanteras apagadas
       digitalWrite(LedFront, LOW);
  }    
    if(estado=='U'){          // Luces traseras encendidas
       digitalWrite(LedBack, HIGH);
  }
    if(estado=='u'){          // Luces traseras apagadas
       digitalWrite(LedBack, LOW);
  }
      if(estado=='V'){          // Corneta on
       digitalWrite(Corneta, HIGH);
  }
    if(estado=='v'){          // Corneta off
       digitalWrite(Corneta, LOW);
  }
  if (estado =='U'){          // Boton ON se mueve sensando distancia 
 
  }
  if  (estado=='D'){          // Boton OFF, detiene los motores no hace nada 
  }
  

 
 
while (estado=='X') {
  
  valorInfra = digitalRead(infraPin); // valor entrada que lee el infrarrojo izquierdo
 valorInfra1 = digitalRead(infraPin1); // valor entrada que lee el infrarrojo derecho
 


  if(valorInfra == 0 && valorInfra1 == 0){ // hacia delante

 digitalWrite(izqA, HIGH);
 digitalWrite(derA, HIGH);
 delay(0);
 digitalWrite(izqA, LOW);
 digitalWrite(derA,LOW);
 delay(0);

}
 if(valorInfra == 0 && valorInfra1 == 1){ // Gira hacia la derecha
 digitalWrite(izqA, LOW);
 digitalWrite(derA,LOW);
 delay(0);
 digitalWrite(izqA, HIGH);
 digitalWrite(derA,LOW);
 delay(0);

}
 if(valorInfra == 1 && valorInfra1 == 0){ // Gira hacia la izquierda
 digitalWrite(izqA,LOW);
 digitalWrite(derA, LOW);
 delay(0);
 digitalWrite(izqA,LOW);
 digitalWrite(derA, HIGH);
 delay(0);

}
 if(valorInfra == 1 && valorInfra1 == 1){ // STOP

 digitalWrite(izqA, LOW);
 digitalWrite(izqB, LOW);
 digitalWrite(derB, LOW);
 digitalWrite(derA, LOW);
break;

 }
  if(Serial.available()>0){        // lee el bluetooth y almacena en estado
      estado = Serial.read();
  }
}

}

El problema esta en que TU crees que una vez que presionas X permanece en ese valor hasta que presiones otra tecla, el tema es que no es así.
Hace poco me pasó eso.
Verifica poniendo un Serial.println(estado);
cuando lees la entrada Serie.

Verás que solo se mantiene una iteracción.

Asi que lo que esta pasando es que el código entra 1 vez y hace algo pero luego no repite ni permanece.
Modifca todo usando otra variable para que se quede en el loop
Por ejemplo

bool floop = false; // si no presionas X estará en false y si lo haces se pone en true

mira esto a ver si ahora funciona... igualmente debes verificar como sale del loop, te hago un comentario de que solo sale de un modo

int izqA = 5; 
int izqB = 6; 
int derA = 10; 
int derB = 9; 
int LedFront = 13;
int LedBack = 11;
int Corneta = 3;

int vel = 210;            // Velocidad de los motores (0-255)
int vel2 = 105;            // Velocidad de los motores (0-255)
int estado = 'u';         // inicia detenido

int VelocidadMotor1 = 12; // ENA - PWM
int VelocidadMotor2 = 8; // ENB

int infraPin = 4; // izquierdo - pin del infrarrojos utilizado como entrada digital
int infraPin1=2; // derecho
int valorInfra = 0; // Valor inicial de la lectura digital del infrarrojos
int valorInfra1 = 0;
bool floop = false;

void setup()  { 
  Serial.begin(9600);    // inicia el puerto serial para comunicacion con el Bluetooth
  pinMode(derA, OUTPUT);
  pinMode(derB, OUTPUT);
  pinMode(izqA, OUTPUT);
  pinMode(izqB, OUTPUT);
  pinMode(LedFront, OUTPUT);
  pinMode(LedBack, OUTPUT);
  pinMode(Corneta, OUTPUT);
  pinMode(infraPin, INPUT);
  pinMode(infraPin1, INPUT);
  pinMode(VelocidadMotor1, OUTPUT);
  pinMode(VelocidadMotor2, OUTPUT);

  analogWrite(VelocidadMotor1, 255); //motor izquierdo PWM
  analogWrite(VelocidadMotor2, 255); //motor derecho PWM

  digitalWrite(izqA, LOW);
  digitalWrite(izqB, LOW);
  digitalWrite(derA, LOW);
  digitalWrite(derB, LOW);
}
 
void loop()  { 

  
  if (Serial.available()>0){        // lee el bluetooth y almacena en estado
      estado = Serial.read();
  }

  if (estado =='F'){           // Boton desplazar al Frente
      analogWrite(derB, 0);     
      analogWrite(izqB, 0); 
      analogWrite(derA, vel);  
      analogWrite(izqA, vel);   
  }
  if (estado =='I'){           // Boton desplazar diagonal izquierda
      analogWrite(derB, 0);     
      analogWrite(izqB, 0); 
      analogWrite(derA, vel);  
      analogWrite(izqA, vel2);   
  }
  if (estado =='G'){           // Boton desplazar diagonal derecha
      analogWrite(derB, 0);     
      analogWrite(izqB, 0); 
      analogWrite(derA, vel2);  
      analogWrite(izqA, vel);    
  }
  if (estado =='L'){          // Boton IZQ 
      analogWrite(derB, 0);     
      analogWrite(izqB, 0); 
      analogWrite(derA, 0);  
      analogWrite(izqA, vel);      
  }
  if (estado =='S'){         // Boton Parar
      analogWrite(derB, 0);     
      analogWrite(izqB, 0); 
      analogWrite(derA, 0);    
      analogWrite(izqA, 0); 
  }
  if (estado=='R'){          // Boton DER
      analogWrite(derB, 0);     
      analogWrite(izqB, 0);
      analogWrite(izqA, 0);
      analogWrite(derA, vel);  
  } 

  if (estado=='B'){          // Boton Reversa
      analogWrite(derA, 0);    
      analogWrite(izqA, 0);
      analogWrite(derB, vel);  
      analogWrite(izqB, vel);    
  } 

  if (estado=='H'){          // Boton Reversa diagonal derecha
      analogWrite(derA, 0);    
      analogWrite(izqA, 0);
      analogWrite(derB, vel2);  
      analogWrite(izqB, vel);   
  } 

  if (estado=='J'){          // Boton Reversa diagonal izquierda
      analogWrite(derA, 0);    
      analogWrite(izqA, 0);
      analogWrite(derB, vel);  
      analogWrite(izqB, vel2); 
  }
  if (estado =='W'){          // Luces delanteras encendidas
     digitalWrite(LedFront, HIGH);
  }
  if (estado =='w'){          // Luces delanteras apagadas
     digitalWrite(LedFront, LOW);
  }    
  if (estado =='U'){          // Luces traseras encendidas
     digitalWrite(LedBack, HIGH);
  }
  if (estado =='u'){          // Luces traseras apagadas
     digitalWrite(LedBack, LOW);
  }
  if (estado =='V'){          // Corneta on
   digitalWrite(Corneta, HIGH);
  }
  if (estado =='v'){          // Corneta off
     digitalWrite(Corneta, LOW);
  }
  if (estado =='U'){          // Boton ON se mueve sensando distancia 

  }
  if  (estado=='D'){          // Boton OFF, detiene los motores no hace nada 
  }
  
  if  (estado=='X') 
       floop = true;

  if (floop) {

        valorInfra = digitalRead(infraPin); // valor entrada que lee el infrarrojo izquierdo
        valorInfra1 = digitalRead(infraPin1); // valor entrada que lee el infrarrojo derecho

        if (valorInfra == 0 && valorInfra1 == 0){ // hacia delante
            digitalWrite(izqA, HIGH);
            digitalWrite(derA, HIGH);
            delay(0);
            digitalWrite(izqA, LOW);
            digitalWrite(derA,LOW);
            delay(0);
        }
        if (valorInfra == 0 && valorInfra1 == 1){ // Gira hacia la derecha
            digitalWrite(izqA, LOW);
            digitalWrite(derA,LOW);
            delay(0);
            digitalWrite(izqA, HIGH);
            digitalWrite(derA,LOW);
            delay(0);
        }
        if (valorInfra == 1 && valorInfra1 == 0){ // Gira hacia la izquierda
            digitalWrite(izqA,LOW);
            digitalWrite(derA, LOW);
            delay(0);
            digitalWrite(izqA,LOW);
            digitalWrite(derA, HIGH);
            delay(0);
        }
        if (valorInfra == 1 && valorInfra1 == 1){ // STOP
            digitalWrite(izqA, LOW);
            digitalWrite(izqB, LOW);
            digitalWrite(derB, LOW);
            digitalWrite(derA, LOW);
            floop = false;               // parece ser la única condición para salir
            break;
        }
    }
}