Problema Switch

Hola! soy novato en programacion seguro que es muy facil pero no doy con la respuesta, he buscado mucho y no me sale: tengo una barra led 5 lds a 5 pins una ui hecha en processing que manda señales por serial a cada senyal las luces hacen distintas funciones: todas encendidas, todas en intermitente, de derecha a izquierda, al reves, de dentro a fuera. cada funcion es un bucle para q se ejecute siempre el problema esta en que cuando mando otra señal no sale del bucle y no funciona. si lo hago sin bucle si funciona.

gracias de antemano

podrias poner el scketch? será más sencillo de poder ver donde puede estar el error.

Los terminas con "break;"?

Este es mi sketch

 /* Barra led conectada a los pins de 2 a 6
 *  desde processing se manda las siguientes seguientes senales H, J, M, L, R
 *  que actuan en la barra con diferentes modos de luz 
 */
int led[] = {2, 3, 4, 5, 6};
int info;
void setup() {
  // put your setup code here, to run once:
for(int i = 1; i < 6 ; i++){
  pinMode(led[i], OUTPUT);
  } 
Serial.begin(9600);  
 
}

void loop() {
  
  if(Serial.available()){
    info = Serial.read(); //leemos Serial
  switch(info){
    case 'H':
    apagarTot();
      //todos fijo
      digitalWrite(led[0],HIGH);
      digitalWrite(led[1],HIGH);
      digitalWrite(led[2],HIGH);
      digitalWrite(led[3],HIGH);
      digitalWrite(led[4],HIGH);
      break;
    
   case 'J':
      apagarTot();
   while(info = 'J'){
    //Intermitents
      digitalWrite(led[0],HIGH);
      digitalWrite(led[1],HIGH);
      digitalWrite(led[2],HIGH);
      digitalWrite(led[3],HIGH);
      digitalWrite(led[4],HIGH);
      delay(500);
      digitalWrite(led[0],LOW);
      digitalWrite(led[1],LOW);
      digitalWrite(led[2],LOW);
      digitalWrite(led[3],LOW);
      digitalWrite(led[4],LOW);
      delay(500);
    }
    break;
    case 'M':
    apagarTot();
    while(info = 'M'){
      // 2 a 6
      for(int x = 0; x < 5; x++){
      digitalWrite(led[x], HIGH);
      delay(100);
       digitalWrite(led[x], LOW);
        delay(200); 
  }
  }
   break;
   case 'L':
   //de 6 a 2 
   apagarTot();
   while(info = 'L'){
    for(int x = 4; x > -1; x--){
   digitalWrite(led[x], HIGH);
    delay(100);
   digitalWrite(led[x], LOW);
    delay(200);
   }
    
    }
    break;
    case 'R':
    apagarTot();
    while(info = 'R'){
     
 digitalWrite(led[0], LOW);
      digitalWrite(led[4], LOW);
 digitalWrite(led[2], HIGH);
 delay(100);
  digitalWrite(led[2], LOW);
   digitalWrite(led[1], HIGH);
    digitalWrite(led[3], HIGH);
    delay(100);
     digitalWrite(led[1], LOW);
      digitalWrite(led[3], LOW);
      digitalWrite(led[4], HIGH);
      digitalWrite(led[0], HIGH);
      delay(200);
      }
    break;
  } 
  }//fi de if serial
}//fi de loop
void apagarTot(){
      digitalWrite(led[0],LOW);
      digitalWrite(led[1],LOW);
      digitalWrite(led[2],LOW);
      digitalWrite(led[3],LOW);
      digitalWrite(led[4],LOW);
  
  }

Por favor lee el privado que te enviaré y edita tu post anterior con etiquetas para código y respeta de aquí en mas el resto de las normas ahi señaladas.

Cuando lo hagas responderé tus consultas

Estas poniendo una condicion en el while ,que a pesar de que es incorrecta(ya que 1 signo de = es asignacion y no comparacion que son dos ==) es evaluada como cierta y entras en un bucle infinito.

Primero de todo muchas gracias!!!

He puesto el == en el while y sigue igual.
os dejo el codigo actualizado

/* Barra led conectada a los pins de 2 a 6
 *  desde processing se manda las siguientes seguientes senales H, J, M, L, R
 *  que actuan en la barra con diferentes modos de luz 
 */
int led[] = {2, 3, 4, 5, 6};
char info;
void setup() {
  // put your setup code here, to run once:
for(int i = 1; i < 6 ; i++){
  pinMode(led[i], OUTPUT);
  } 
Serial.begin(9600);  
 
}

void loop() {
  
  if(Serial.available()){
    info = Serial.read(); //leemos Serial
  switch(info){
    case 'H':
    apagarTot();
      //todos fijo
      digitalWrite(led[0],HIGH);
      digitalWrite(led[1],HIGH);
      digitalWrite(led[2],HIGH);
      digitalWrite(led[3],HIGH);
      digitalWrite(led[4],HIGH);
      Serial.println(info);
      break;
    
   case 'J':
    apagarTot();
   while(info == 'J'){
    //Intermitents
      digitalWrite(led[0],HIGH);
      digitalWrite(led[1],HIGH);
      digitalWrite(led[2],HIGH);
      digitalWrite(led[3],HIGH);
      digitalWrite(led[4],HIGH);
      delay(500);
      digitalWrite(led[0],LOW);
      digitalWrite(led[1],LOW);
      digitalWrite(led[2],LOW);
      digitalWrite(led[3],LOW);
      digitalWrite(led[4],LOW);
      delay(500);
      Serial.println(info);
    }
    
    break;
    case 'M':
    apagarTot();
    while(info){
      // 2 a 6
      for(int x = 0; x < 5; x++){
      digitalWrite(led[x], HIGH);
      delay(100);
       digitalWrite(led[x], LOW);
        delay(200); 
  }
  }
   break;
   case 'L':
   //de 6 a 2 
   apagarTot();
   while(info == 'L'){
    for(int x = 4; x > -1; x--){
   digitalWrite(led[x], HIGH);
    delay(100);
   digitalWrite(led[x], LOW);
    delay(200);
   }
    
    }
    break;
    case 'R':
   apagarTot();
    while(info == 'R'){
     
 digitalWrite(led[0], LOW);
      digitalWrite(led[4], LOW);
 digitalWrite(led[2], HIGH);
 delay(100);
  digitalWrite(led[2], LOW);
   digitalWrite(led[1], HIGH);
    digitalWrite(led[3], HIGH);
    delay(100);
     digitalWrite(led[1], LOW);
      digitalWrite(led[3], LOW);
      digitalWrite(led[4], HIGH);
      digitalWrite(led[0], HIGH);
      delay(200);
      }
    break;
  } 
  }//fi de if serial
}//fi de loop
void apagarTot(){
      digitalWrite(led[0],LOW);
      digitalWrite(led[1],LOW);
      digitalWrite(led[2],LOW);
      digitalWrite(led[3],LOW);
      digitalWrite(led[4],LOW);
  
  }

le doy H y funciona pero con los case que tienen bucle no salen de el y falla

Que es esto

case 'J':
                  apagarTot();
                  while (info == 'J'){

Entras a un case de un switch y luego te quedas dentro porque info == 'J'

dime cuando sale? JAMAS!!!

Esto

case 'J':
                  apagarTot();
                  while (info == 'J'){
                        //Intermitents
                        digitalWrite(led[0],HIGH);
                        digitalWrite(led[1],HIGH);
                        digitalWrite(led[2],HIGH);
                        digitalWrite(led[3],HIGH);
                        digitalWrite(led[4],HIGH);
                        delay(500);
                        digitalWrite(led[0],LOW);
                        digitalWrite(led[1],LOW);
                        digitalWrite(led[2],LOW);
                        digitalWrite(led[3],LOW);
                        digitalWrite(led[4],LOW);
                        delay(500);
                        Serial.println(info);
                  }
                  break;

.

una vez que entra no sale NUNCA!!

Y cometes el mismo error una y otra vez en los siguienes case

Si pones un case ya esta.. se cumple lo que quieres y a otra cosa, a menos que quieras que se repita, entonces simplemente no cambies el valor de info cuando no se digita nada y volvera a ese mismo case

Para lograr eso debes SACARLO del if (Serial.available())

Usa eso para ver si hay teclas presionadas y luego FUERA de esa condición, realiza tu switch case, SIN poner a cero tu variable info.

Pero no se si es lo que buscas?

Hola! Muchas gracias!! La idea es q cuando entre en case se ejecute todo el rato has q se vuelva a presionar otra letra por eso puse los bucles Si lo pongo sin los bucles funciona el switch pero se ejecuta una sola vez

No comprendo lo de sacarlo del if(serial.available())

Muchas gracias

La idea que tienes es equivocada.

Lo que debes hacer es esto:

Tu misma rutina pero ordenada como te dije

void loop() {
  
  if (Serial.available()){
      info = Serial.read(); //leemos Serial
      if (info == '\n')
          apagarTot();
  }//fin de if serial

  switch (info){
      case 'H':
                //todos fijo
                digitalWrite(led[0],HIGH);
                digitalWrite(led[1],HIGH);
                digitalWrite(led[2],HIGH);
                digitalWrite(led[3],HIGH);
                digitalWrite(led[4],HIGH);
                Serial.println(info);
                break;

      case 'J':
                //Intermitents
                digitalWrite(led[0],HIGH);
                digitalWrite(led[1],HIGH);
                digitalWrite(led[2],HIGH);
                digitalWrite(led[3],HIGH);
                digitalWrite(led[4],HIGH);
                delay(500);
                digitalWrite(led[0],LOW);
                digitalWrite(led[1],LOW);
                digitalWrite(led[2],LOW);
                digitalWrite(led[3],LOW);
                digitalWrite(led[4],LOW);
                delay(500);
                Serial.println(info);
                break;
        case 'M':
                // 2 a 6
                for(int x = 0; x < 5; x++){
                    digitalWrite(led[x], HIGH);
                    delay(100);
                    digitalWrite(led[x], LOW);
                    delay(200); 
                }
                break;
        case 'L':
                  //de 6 a 2 
                  apagarTot();
                  for (int x = 4; x > -1; x--){
                      digitalWrite(led[x], HIGH);
                      delay(100);
                      digitalWrite(led[x], LOW);
                      delay(200);
                  }
                  break;
        case 'R':
                  digitalWrite(led[0], LOW);
                  digitalWrite(led[4], LOW);
                  digitalWrite(led[2], HIGH);
                  delay(100);
                  digitalWrite(led[2], LOW);
                  digitalWrite(led[1], HIGH);
                  digitalWrite(led[3], HIGH);
                  delay(100);
                  digitalWrite(led[1], LOW);
                  digitalWrite(led[3], LOW);
                  digitalWrite(led[4], HIGH);
                  digitalWrite(led[0], HIGH);
                  delay(200);
                  break;
    } 
}//fi de loop

void apagarTot(){
  digitalWrite(led[0],LOW);
  digitalWrite(led[1],LOW);
  digitalWrite(led[2],LOW);
  digitalWrite(led[3],LOW);
  digitalWrite(led[4],LOW);
}

Cuando entre un caracter y luego se lea el ENTER, entonces apagas los leds y luego se ejecutará la tecla pulsada hasta que se digite otra

Ok!!! Entendido Lo pruebo

La segunda fase es q funcione desde processing mandando las señales por serial igual

Muchísimas gracias

He probado el codigo y funciona, entra i sale del switch pero solo se ejecuta una vez y lo que quiero es que se ejecute hasta que se marque otra letra

Muchisimas gracias

Porque se ejecuta una vez si no estas introduciendo mas ordens via Serial? Debría seguir.

A mi me funciona perfectamente, o sea repite los comandos

/* Barra led conectada a los pins de 2 a 6
 *  desde processing se manda las siguientes seguientes senales H, J, M, L, R
 *  que actuan en la barra con diferentes modos de luz 
 */
const byte led[] = {2, 3, 4, 5, 6};
byte info, infoAnt = 0;

void setup() {
  // put your setup code here, to run once:
  for (int i = 1; i < 6 ; i++){
       pinMode(led[i], OUTPUT);
  } 
  Serial.begin(9600);  
 
}

void loop() {
  
  if (Serial.available()){
      info = Serial.read(); //leemos Serial
      if (info == '\n') {
          apagarTot();
          Serial.println("Se presiono ENTER");
      }
  }//fin de if serial

  if (info != infoAnt) 
      Serial.println(info);

  infoAnt = info;

  switch (info){
      case 'H':
                //todos fijo
                digitalWrite(led[0],HIGH);
                digitalWrite(led[1],HIGH);
                digitalWrite(led[2],HIGH);
                digitalWrite(led[3],HIGH);
                digitalWrite(led[4],HIGH);
                Serial.println("Todos en HIGH");
                break;

      case 'J':
                //Intermitents
                digitalWrite(led[0],HIGH);
                digitalWrite(led[1],HIGH);
                digitalWrite(led[2],HIGH);
                digitalWrite(led[3],HIGH);
                digitalWrite(led[4],HIGH);
                Serial.println("Todos en HIGH");
                delay(500);
                digitalWrite(led[0],LOW);
                digitalWrite(led[1],LOW);
                digitalWrite(led[2],LOW);
                digitalWrite(led[3],LOW);
                digitalWrite(led[4],LOW);
                Serial.println("Todos en LOW");
                delay(500);
                break;
        case 'M':
                // 2 a 6
                Serial.println("HIGH 100 LOW 200 mseg");
                for(int x = 0; x < 5; x++){
                    digitalWrite(led[x], HIGH);
                    delay(100);
                    digitalWrite(led[x], LOW);
                    delay(200); 
                }
                break;
        case 'L':
                  //de 6 a 2 
                  Serial.println("HIGH 100 LOW 200 mseg");
                  for (int x = 4; x >=0; x--){
                      digitalWrite(led[x], HIGH);
                      delay(100);
                      digitalWrite(led[x], LOW);
                      delay(200);
                  }
                  break;
        case 'R':
                  Serial.println("Random");
                  digitalWrite(led[0], LOW);
                  digitalWrite(led[4], LOW);
                  digitalWrite(led[2], HIGH);
                  delay(100);
                  digitalWrite(led[2], LOW);
                  digitalWrite(led[1], HIGH);
                  digitalWrite(led[3], HIGH);
                  delay(100);
                  digitalWrite(led[1], LOW);
                  digitalWrite(led[3], LOW);
                  digitalWrite(led[4], HIGH);
                  digitalWrite(led[0], HIGH);
                  delay(200);
                  break;
    } 
}//fi de loop

void apagarTot(){
  digitalWrite(led[0],LOW);
  digitalWrite(led[1],LOW);
  digitalWrite(led[2],LOW);
  digitalWrite(led[3],LOW);
  digitalWrite(led[4],LOW);
}

Mira con esta variante

No se si tiene q ver que uso mac para programar

Menos se yo, nunca use una MAC.

Con el ultimo código con cada letra mayúsculas que digito veo como cambian los carteles a tu velocidad claro.

Solucionado!!!
Muchisimas gracias!!!

una ultima cuestions por que en este if

 if (info != infoAnt) 
      Serial.println(info);

  infoAnt = info;

no se ponen {}???

muchissimas gracias por tu dedicacion y velocidad de respuesta

La respuesta la deberías haber averiguado tu sin tener que preguntar cómo?

Pues le pones {} y ves que pasa, y lo pruebas como yo lo hice y ves que pasa.

En ambos casos funcionará pero entonces cual es la explicación? No hace falta poner llaves?

Si solo se trata de una sola línea después del if no necesitas llaves pero si fueran mas de 1 si. Esa es la respueta, o ambas lo son.