Problema con código estructura switch (case..)

Hola a todos, feliz Navidad!
Quería comentar un problema con un código que estoy desarrollando. El programa tiene una estructura switch con dos case, y consigo entrar en los dos sin problema, el caso es que el primer case me lo hace bien, pero el segundo no. El código es el siguiente:

switch (modo)
    {
      case true:
        Serial.print("MODO MANUAL");
        if (IrReceiver.decodedIRData.command == 0x9 && estadomotor == false) {
          myDFPlayer.play(3);
          delay(3500);
          for (int i = 140; i >= 20; i--) {

            servoMotor2.write(i);
            delay(20);
          }

          for (int i = 115; i >= 0; i--) {

            servoMotor1.write(i);
            delay(20);
          }
          estadomotor = true;
          IrReceiver.decodedIRData.command = 0x00;
        }

        if (IrReceiver.decodedIRData.command == 0x9 && estadomotor == true) //boton flecha hacia abajo
        {
          myDFPlayer.play(5);
          delay(3500);
          for (int i = 0; i <= 115; i++) {

            servoMotor1.write(i);
            delay(20);
          }
          for (int i = 20; i <= 140; i++) {

            servoMotor2.write(i);
            delay(20);
          }
          estadomotor = false;
          IrReceiver.decodedIRData.command = 0x00;
        }

        if (IrReceiver.decodedIRData.command == 0x46)
        {
          avanza();
          delay(2000);
          parar();
        }
        if (IrReceiver.decodedIRData.command == 0x15)
        {
          retrocede();
          delay(2000);
          parar();
        }
        if (IrReceiver.decodedIRData.command == 0xB)
        {
          parar();
          delay(2000);
        }
        if (IrReceiver.decodedIRData.command == 0x43)
        {
          derecha();
          delay(2000);
          parar();
        }
        if (IrReceiver.decodedIRData.command == 0x44)
        {
          izquierda();
          delay(2000);
          parar();
        }
        if (IrReceiver.decodedIRData.command == 0x47 && estado_rele == false)
        {
          myDFPlayer.play(4);
          delay(10000);
          digitalWrite(RELE, HIGH);
          estado_rele = true;
          IrReceiver.decodedIRData.command = 0x00;
        }
        if (IrReceiver.decodedIRData.command == 0x47 && estado_rele == true)
        {
          myDFPlayer.play(8);
          digitalWrite(RELE, LOW);
          estado_rele = false;
          IrReceiver.decodedIRData.command = 0x00;
        }
        if (IrReceiver.decodedIRData.command == 0x19)
        {
          myDFPlayer.play(7);
          servoMotor1.write(60);
          servoMotor2.write(60);
          delay(500);
          servoMotor1.write(0);
          servoMotor2.write(20);
          delay(500);
          servoMotor1.write(115);
          servoMotor2.write(140);

        }
        IrReceiver.resume();
        if (IrReceiver.decodedIRData.command = 0x40) {
          break;
        }
      case false:
        Serial.print("MODO AUTOMATICO");
        estadomotor = false;
        if (distancia1 > 0) {
          if (distancia1 < 10) {
            if (distancia1 > 5) {
              retrocede();
              delay(200);
              parada(100);
            } else {
              izquierda();
              delay(2000);
              avanza();
              delay(2000);
              izquierda();
              delay(2000);
            }
          } else {
            avanza();
          }
        } else {
          avanza();
        }
        
        if (IrReceiver.decodedIRData.command = 0x40) {
        break;
        }
        
    }
    IrReceiver.resume();
  }

Es un poco extenso, modo es una variable booleana, y cuando es false, entra en la parte del código pero no me hace la secuencia de movimientos que le puse. Lo que hace es activar los motores y cuando la distancia alcanza un valor que no he definido, se para. No lo entiendo.
Gracias de antemano.
Actualización: He conseguido que lo haga pero para ello, a parte de la distancia necesita estar recibiendo en todo momento la señal infrarroja del mando, cualquier botón. Si mantengo pulsado cualquier botón y cumple la distancia, hace la secuencia de movimientos, alguien sabe como lo puedo arreglar?

Disculpe mi curiosidad, pero: ¿por qué usa un switch...case en una variable booleana en lugar de un simple if...else?

if (modo)
{
        Serial.print("MODO MANUAL");
        if (IrReceiver.decodedIRData.command == 0x9 && estadomotor == false) {
          myDFPlayer.play(3);
          delay(3500);
...
}
else
{
        Serial.print("MODO AUTOMATICO");
        estadomotor = false;
...
}

En cualquier caso, su problema con el interruptor es que no ejecuta el break final en todos los casos. Todo el código en un "case" debe terminar con "break;", de lo contrario el código cambia a case false: y luego ejecuta todo lo que hay.
Estoy hablando del último if().

if (IrReceiver.decodedIRData.command = 0x40) {
  break;
}

debe volverse solo en "break;".

1 Like

Hola gracias por responder, pues utilizo la estructura switch porque en un principio tenía más de dos casos y utilice una variable de tipo int, pero cuando lo cambié lo dejé así, de todas formas usaré if...else. Y efectivamente, el fallo estaba en el "break". Muchas gracias por la ayuda, que tengas un buen día!

Switch case lo usas cuando tienes muchas (mas de 2 opciones) y para casos como si o no con un if else alcanza.
Tu mismo código usando case donde debe ser e if donde corresponde.
Verifica si funciona.

	if (modo) {
		int comando = IrReceiver.decodedIRData.command;
        Serial.print("MODO MANUAL");
		switch (comando) {
			case 0x09: if (estadomodor) {
							myDFPlayer.play(5);
							delay(3500);
							for (int i = 0; i <= 115; i++) {
								servoMotor1.write(i);
								delay(20);
							}
							for (int i = 20; i <= 140; i++) {
								servoMotor2.write(i);
								delay(20);
							}
							estadomotor = false;
						else {
							myDFPlayer.play(3);
							delay(3500);
							for (int i = 140; i >= 20; i--) {
								servoMotor2.write(i);
								delay(20);
							}
							for (int i = 115; i >= 0; i--) {
								servoMotor1.write(i);
								delay(20);
							}
							estadomotor = true;
						}
						break;
					case 0x0b:
							parar();
							delay(2000);							
							break;					
					case 0x15:					
							retrocede();
							delay(2000);
							parar();
							break;	
					case 0x19:
							myDFPlayer.play(7);
							servoMotor1.write(60);
							servoMotor2.write(60);
							delay(500);
							servoMotor1.write(0);
							servoMotor2.write(20);
							delay(500);
							servoMotor1.write(115);
							servoMotor2.write(140);
							break;
					case 0x40: 
							break;
					case 0x43:
							derecha();
							delay(2000);
							parar();
							break;					
					case 0x44:
							izquierda();
							delay(2000);
							parar();
							break;					
					case 0x46: avanza();
							  delay(2000);
							  parar();
							  break;				
					case 0x47:  
								if (estado_rele) {
									myDFPlayer.play(8);
									digitalWrite(RELE, LOW);
									estado_rele = false;
									IrReceiver.decodedIRData.command = 0x00;
								} else {
									myDFPlayer.play(4);
									delay(10000);
									digitalWrite(RELE, HIGH);
									estado_rele = true;
								}
							break;					
			}
		}      
	} else {
        Serial.print("MODO AUTOMATICO");
        estadomotor = false;
        if (distancia1 > 0) {
          if (distancia1 < 10) {
            if (distancia1 > 5) {
              retrocede();
              delay(200);
              parada(100);
            } else {
              izquierda();
              delay(2000);
              avanza();
              delay(2000);
              izquierda();
              delay(2000);
            }
          } else {
            avanza();
          }
        } else {
          avanza();
        }
    }
    IrReceiver.resume();
  }

Gracias por contestar, voy a estar unas semanas fuera y no lo podré probar pero cuando lo pruebe os mantendré informados. Muchas gracias!

Hola buenas, perdón por la demora pero he estado fuera varias semanas. Ya he retomado el proyecto. Probando tu modificación, el programa no consigue salir del modo automático, puedo cambiar al manual pero se vuelve otra vez al modo automático. Gracias de antemano. Un saludo!

El programa hace lo que tu le dices, y modo viene desde fuera y será manual o automático.
Tu controlas eso no las modificaciones que te hemos sugerido.
En lugar de publicar un código parcial, publica siempre TODO el código para tener una imagen completa del problema
Ya ves que solo pierdes tiempo al publicar un extracto del código.
Tu aislas el problema pensando que esta ahi, pero lo que no entiendes es que si no lo pudiste resolver tampoco pudiste detectar donde esta el problema.
Asi que esperamos todo el código para darte una mejor respuesta.

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