Hacer un brazo usando switch case y un pulsador para que cambie de rutina

Necesito ayuda.
Tengo un problema al ejecutar el programa, quiero hacer que al presionar un pulsador cambie de rutina de acuerdo a lo establecido en switch case, el problema es cuando llego a la rutina en que el brazo se mueve automáticamente ya que si presiono otra vez el pulsador no se resetea la cuenta del if y se queda en modo automático y tengo que dar reset a la placa de Arduino para que vuelva a su estado “default”
Aqui dejo el programa y si me hacen el favor de revisarlo lo agradeceré mucho soy nuevo en el foro y en el uso de Arduino.

#include <Servo.h>

const int servo1 = 5;
const int servo2 = 6;
const int servo3 = 7;
const int servo4 = 9;

const int joy1 = A0;
const int joy2 = A1;
const int joy3 = A2;
const int joy4 = A3;

int servoVal;

int bstate = 0;

Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;

void setup() {

pinMode(13, INPUT_PULLUP);

myservo1.attach(servo1);
myservo2.attach(servo2);
myservo3.attach(servo3);
myservo4.attach(servo4);

Serial.begin(9600);
}

void loop() {

Serial.println(bstate);

if (digitalRead (13) == 0) {

bstate = (bstate + 1) % 3;
delay(200);
}

switch (bstate) {

case 1:

automata();

break;

case 2:
servoVal = analogRead(joy1);
servoVal = map(servoVal, 0, 1023, 0, 180);

myservo1.write(servoVal);

servoVal = analogRead(joy2);
servoVal = map(servoVal, 0, 1023, 0, 180);

myservo2.write(servoVal);

servoVal = analogRead(joy3);
servoVal = map(servoVal, 0, 1023, 0, 180);

myservo3.write(servoVal);

servoVal = analogRead(joy4);
servoVal = map(servoVal, 0, 1023, 0, 180);

myservo4.write(servoVal);
break;

default:

myservo4.write(0);
myservo3.write(160);
myservo2.write(50);
myservo1.write(90);

}
}

void automata(){
myservo1.write(10);
delay(1000);

myservo2.write(120);
myservo3.write(90);
delay(1000);

myservo4.write(30);
delay(1000);

myservo2.write(90);
myservo3.write(150);
delay(1000);

myservo1.write(160);
delay(1000);

myservo4.write(0);
delay(1000);
}

primero edita el mensaje para poner el codigo como corresponde, mira las normas.

entiendo que es un brazo robotico y quieres 3 modos el joystick el fijo en una posicion y el ultimo que seria automatico.

el problema viene porque al entrar en automatico tienes 6 segundos de delay durante los cuales no lees el pulsador. busca blink sin delay y te aparecerá como solucionarlo de forma fácil. Como vas a estar comprobando siempre el pulsador ahora vas a necesitar que el incremento sea con un flanco ascendente.

int bstate = 0;
unsigned long antirebote = 100;
unsigned long millisant=0;
unsigned long millisactual=0;

boolean pulsant = 0;
boolean puls = 0;

void setup() {

  pinMode(13, INPUT_PULLUP);

  Serial.begin(9600);
}


void loop() {


  millisactual=millis();

  if (millisactual - millisant > antirebote){
    puls=digitalRead (13);
    if (puls == 0 && pulsant == 1) {
      bstate = (bstate + 1) % 3;
      Serial.println(bstate);
    }
    pulsant=puls;
  }
}

creo que con eso y quitando los delay ya tendrias un codigo funcional. mi "loop" tiene que ir entre tu loop y el swith.

el automatico yo lo governaria de otra forma creaba una variable ciclo, y un array con los tiempos entre cada accion. y mediante un switch decidia que parte del automatico ejecutar. si el tiempo del intervalo es mayor al marcado por el array "ciclo=(ciclo+1)%4" y guardar le valor del tiempo