Switch case

Hola, amigos. Estoy haciendo un programa con Push buttons y la función Switch Case en el que a cada botón le corresponde una operación matemática.

Lo que busco es que cada vez que presione otro botón la operación se cambie.

Mi problema es que si intento ir desde el case 4 al case 3 no puedo, se queda funcionando en el case 4. No sé si no entiendo bien el comportamiento del Switch case o algo me está faltando.

Nota: si puedo ir cambiar la operación presionando el botón del case 1, luego el 2, el 3 y el 4, en ese orden.

¿Cómo puedo regresar del case 4 al 1?

int boton1 = 13, boton2 = 12, boton3 = 11, boton4 = 10;

float s = 0, r = 0, d = 0, m = 0;

float suma = 0, resta = 0, multiplicacion = 0;

double division =0;

char operador;

void setup() {
Serial.begin(9600);
pinMode(boton1, INPUT);
pinMode(boton2, INPUT);
pinMode(boton3, INPUT);
pinMode(boton4, INPUT); 
}


void loop() {
  
 if (digitalRead(boton1)==1){
  operador = 1;
 }
  if (digitalRead(boton2)==1){
  operador = 2;
 }
  if (digitalRead(boton3)==1){
  operador = 3;
 }
  if (digitalRead(boton4)==1){
  operador = 4;
 }

 switch(operador){

  case 1:
    s++;
    r = 0; m = 0; d = 0;
    Serial.println("Suma");
    suma = s+1;
    Serial.println(suma);
    operador = 5;
    delay(200);
    break;
    
    case 2:
    r++;
    s = 0; m = 0; d = 0;
    Serial.println("Resta");
    resta = 1000-r;
    Serial.println(resta);
    operador = 6;
    delay(200);
    break;
    
    case 3:
    d++;
    r = 0; m = 0; s = 0;
    Serial.println("Division");
    division = 100/d;
    Serial.println(division);
    operador = 7;
    delay(200);
    break;
    
    case 4:
    m++;
    r = 0; s = 0; d = 0;
    Serial.println("Multiplicacion");
    multiplicacion = 1000*m;
    Serial.println(multiplicacion);
    operador = 8;
    delay(200);
    break;
 }
 }

Tu código funciona bien, no entiendo tu pregunta.

Puedes poner un GOTO que no lo aconsejo o creas una función o un método para que vaya donde quieras.

Olvida lo de GOTO no es aconsejable en C usarlo.

Dentro de switch case tienes algo que controla el siguiente paso y es operador.
En cada case observa que operador toma un nuevo número o sea que terminada la acción del case donde estas, la siguiente vez o ciclo pasa a otro case.

Eso esta funcionando de acuerdo a lo que alguien así lo indicó, que claramente no has sido tu.

Hola:

Si no te queda otra, usar GOTO. Mi profesor me lo prohibió para evitar malas prácticas de programación, solo es para hacer pruebas, curiosear pero no para dejarlo en tus proyectos.

for (byte r = 0; r < 255; r++) {
  for (byte g = 255; g > 0; g--) {
    for (byte b = 0; b < 255; b++) {
      if (analogRead(0) > 250) {
        goto bailout;
      }
      // more statements ...
    }
  }
}

bailout:

Ver enlace GOTO.

El truco de las funciones.
Crea funciones. llamas a esa función desde el case 4. Dentreo de esa función que te rediriga en la parte alta del switc y desde ahí indica al case 1.

Vuelvo a insistir. No uses GOTO o no te acostumbres a ellos por mucho que te resulva la vida en ciertos puntos, que luego te arrepientes. Por ahora, ningún compilador del que sea, lo quieren quitar. Invluyendo VB .net, C#, C/C++ CLR .net, C/C++ Win32 y los que tranques.

Habrá más formas de haferlo.

Saludos.

No se usa GOTO en C, con eso estarias demostrando que no sabes programar.

Por otro lado, hay muchas cosas para mejorar en tu programacion, la principal:

Usar variables INT para declarar los pines de un arduino o cualquier microcontrolador, no tiene sentido y va en contra del uso de la poca memoria que tienes.

Para esos casos y otros se usa #define, lee sobre esto.

#define nombre valor

ej:

#define boton4 10

digitalRead(boton4)

Sobre el funcionamiento, estoy de acuerdo con @surbyte. No hay mucho mas.

Slds, Nahuel Granade

Hay un lenguaje de programación que si uso el GOTO si o si, hay que usarlo porque está diseñado así. Por ejemplo, el asm (ensamblador). Te hartas de GOTO hasta en la saciedad. Esto ya es para lenguajes de muy bajo nivel. Para los de alto nivel como C, mejor dejarlo de lado.

Metaconta:
Hay un lenguaje de programación que si uso el GOTO si o si, hay que usarlo porque está diseñado así. Por ejemplo, el asm (ensamblador). Te artas de GOTO hasta en la saciedad. Esto ya es para lenguajes de muy bajo nivel. Para los de alto nivel como C, mejor dejarlo de lado.

si claro, hablamos de C, no en assembler.

Es que hay cosas peores. jeejejeje.-