PROBLEMA AL CAMBIAR DE CASE

Buen dia
Soy nuevo el foro.

Mi problema es que al cambiar de case se quede en el case 2 o simplemente no hace nada quería saber si me pueden decir si mi programa esta bien o que modificación necesita.

La finalidad del programa es para un proyecto de una banda transportadora que pare cuando pase por un sensor ultrasonico.

#include <Servo.h>
Servo servoMotor;
long dis;
long tiem;
int led1 = 11;
int botonState = 0;
int relay = 6;
int relay2= 7;

void setup()
{
Serial.begin(9600);
servoMotor.attach(12);
pinMode(relay, OUTPUT); // Configurar relay como salida o OUTPUT
pinMode(relay2, OUTPUT); // Configurar relay 2 como salida o OUTPUT
pinMode(10, OUTPUT); //salida del pulso generado por el sensor ultrasónico ECHO
pinMode(9, INPUT);//entrada del pulso generado por el sensor ultrasónico TRIGGER
pinMode(22, OUTPUT); //salida del pulso generado por el sensor ultrasónico 2 TRIGGER
pinMode(23, INPUT);//entrada del pulso generado por el sensor ultrasónico 2 ECHO
pinMode(11, INPUT);//Alarma de la distancia(encenderá el led)
pinMode(2, OUTPUT); //verde
pinMode(3, OUTPUT); //amarillo
pinMode(4, OUTPUT); //rojo
pinMode(5, OUTPUT); //azul
pinMode(8, INPUT_PULLUP); //Boton
}

void loop()
{
 if (digitalRead(8) == 0)
   {
    // el operador % significa modulo
    botonState = (botonState + 1) % 4;
    delay(100);
   }
 switch (botonState) {
  
 case 0:
    digitalWrite(5, HIGH);
 break;
  
 case 1:
    digitalWrite(10, LOW); //recibimiento del pulso.
    delayMicroseconds(5);
    digitalWrite(10, HIGH);//envió del pulso.
    delayMicroseconds(10);
    tiem = pulseIn(9, HIGH); //fórmula para medir el pulso entrante.
    dis = long(0.017 * tiem); //fórmula para calcular la distancia del sensor ultrasónico.
    if (dis > 10) { //comparativo para la alarma se ingresa la distancia en la que encenderá o apagara.
    digitalWrite(11, LOW);
    digitalWrite(2, LOW); 
  }
 else
  {
    digitalWrite(11, HIGH);
    digitalWrite(2, HIGH);  
   
    servoMotor.write(0);
    // Esperamos 3 segundo
    delay(3000);
  
    // Desplazamos a la posición 90º
    servoMotor.write(90);
    // Esperamos 1 segundo
    delay(3000);
  }
    Serial.println("LA DISTANCIA MEDIDA ES:");
    Serial.println(dis);
    Serial.println("cm");
    delay(500);
 break;
      
 case 2:
    digitalWrite(22, LOW); //recibimiento del pulso.
    delayMicroseconds(5);
    digitalWrite(22, HIGH);//envió del pulso.
    delayMicroseconds(10);
    tiem = pulseIn(23, HIGH); //fórmula para medir el pulso entrante.
    dis = long(0.017 * tiem); //fórmula para calcular la distancia del sensor ultrasónico.
    if (dis > 10) { //comparativo para la alarma se ingresa la distancia en la que encenderá o apagara.
    digitalWrite(11, LOW);
    digitalWrite(3, LOW);
    digitalWrite(relay, HIGH); // envia señal alta al relay
    Serial.println("Relay accionado");
  }
 else
  {
    digitalWrite(11, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(relay, LOW); // envia señal alta al relay
    Serial.println("Relay accionado");

    servoMotor.write(0);
    // Esperamos 3 segundo
    (3000);
  
    // Desplazamos a la posición 90º
    servoMotor.write(90);
    // Esperamos 1 segundo
    delay(3000);

  }
    Serial.println("LA DISTANCIA MEDIDA ES:");
    Serial.println(dis);
    Serial.println("cm");
    delay(500);
 break;

 case 3:
    digitalWrite(10, LOW); //recibimiento del pulso.
    delayMicroseconds(5);
    digitalWrite(10, HIGH);//envió del pulso.
    delayMicroseconds(10);
    tiem = pulseIn(9, HIGH); //fórmula para medir el pulso entrante.
    dis = long(0.017 * tiem); //fórmula para calcular la distancia del sensor ultrasónico.
    if (dis > 10) { //comparativo para la alarma se ingresa la distancia en la que encenderá o apagara.
    
    digitalWrite(11, LOW);
    digitalWrite(4, LOW);
    digitalWrite(relay, HIGH); // envia señal alta al relay
    Serial.println("Relay accionado");
  }
 else
  {
    digitalWrite(11, HIGH);
    digitalWrite(4, HIGH);
    digitalWrite(relay, LOW); // envia señal alta al relay
    Serial.println("Relay accionado");
   
    servoMotor.write(0);
    // Esperamos 3 segundo
    delay(3000);
  
    // Desplazamos a la posición 90º
    servoMotor.write(90);
    // Esperamos 1 segundo
    delay(3000);

    // Desplazamos a la posición 180º
    servoMotor.write(180);
    // Esperamos 1 segundo
    delay(3000);
  }
    Serial.println("LA DISTANCIA MEDIDA ES:");
    Serial.println(dis);
    Serial.println("cm");
    delay(500);
    break;
  }
 }

Coinicido al 100% co nlo que te dice ArduMyth

if (digitalRead(8) == 0)

no es suficiente en un equipo que se mueve con motores/contactores funcionando. Hay ruidos electricos y todo tipo de problemas que harán que esa condicion se repita.

Lo mínimo es que mires la transición pero lo correcto es que uses algo como Bounce2 Library

De casualidad di con alguien que puso toda la información perfectamente indicada

The download is here : https://github.com/thomasfredericks/Bounce-Arduino-Wiring/archive/master.zip
The documentation is here : Home · thomasfredericks/Bounce2 Wiki · GitHub
The playground page is here : Arduino Playground - HomePage
The github is here : GitHub - thomasfredericks/Bounce2: Debouncing library for Arduino and Wiring