Temporizador multiple ciclico

Os escribo da con mi temporizador, pues no consigo que vaya como quiero. La idea es:
1- Inicio el temporizador con un boton.
2-Una vez iniciado necesito que se encienda un led rojo(ledStop) durante 8 segundos y a continuacion se apage y se encienda un led verde (ledStart) y a la vez se ejecute una funcion (funcionDianas)que tiene 5 pulsadores y cinco led para unas dianas, es decir pulsador dado led encendido, durante 10 segundos.
3-Una vez pasan esos 10 segundos, se vuelve a encender el led rojo (ledStop) y asi se queda, con los led de las dianas encendidos y el led de stop, hasta que volvamos a pulsar el boton de inicio y se vuelva a ejecutar el sistema.
Os paso el codigo que tengo hecho, este funciona, pero no consigo que vaya con el boton de inicio, ni poder hacerlo ciclico con dicho boton.
Muchas gracias. Saludos.

Tened paciencia, soy nuevo.

// Proyecto temporizador
//By @lex


// Variables
int ledReset = 8; 
int ledStop = 11;
int ledStart = 9;
int ledDiana1 = 10;
int ledDiana2 = 6;
int inicio = 12;
int diana1 = 7;
int diana2 = 4;
int estado = 0;
unsigned long intervaloStop = 2000;
unsigned long intervaloStart = 6000;
boolean estadoInicio = false;
boolean finStop = false;
boolean finStart = false;

// funcion inicio
boolean start (int pulsador){

 if (digitalRead (inicio) == 1){
 estadoInicio = true;
   estado = 1;
 }
 return estadoInicio;
}
// funcion dianas
void funcionDianas(){


 if (digitalRead(diana1)==HIGH)
 { 
   digitalWrite (ledDiana1, HIGH);
 } 
 if (digitalRead(diana2)==HIGH)
 { 
   digitalWrite (ledDiana2, HIGH);
 } 

}




void setup() {


 Serial.begin(9600);
 pinMode (ledStop, OUTPUT);
 pinMode (ledStart, OUTPUT);
 pinMode (ledDiana1, OUTPUT);
 pinMode (ledDiana2, OUTPUT);
 pinMode (ledReset, OUTPUT);
 pinMode (inicio, INPUT);
 pinMode (diana1, INPUT);
 pinMode (diana2, INPUT);
 

}

void loop() {

 

while(start(inicio)){
  
switch (estado) {
 case 1:
  if(millis() <= intervaloStop) {
    
    digitalWrite(ledStop, HIGH);}
    else{
    digitalWrite(ledStop, LOW);
      finStop = true;
 estado =2;
    }
   break;
 case 2:
  digitalWrite(ledStart, HIGH);
 if ((finStop == true) && (millis()<= intervaloStart)){
   funcionDianas(); 
 }else{
 digitalWrite(ledStart, LOW);
 digitalWrite(ledStop, HIGH);
  estado = 3; 
 }  
 break;
 case 3:
 estado = 0;
 delay(3000);
 digitalWrite(ledReset, HIGH);
 break;
}
 } 

}

Por favor lee las normas del foro ,sobre todo en lo referente a como postear codigo
y como debe ser el titulo de un post.Gracias.

El código va bien hasta que vi el delay(3000) eso te bloquea x 3 segundos.
Solo lo miré superficialmente pero sigue creando un nuevo estado que se cumple cuando otro millis() alcance los 3000 mseg, pero no uses delay().

Asi no tendrás bloqueo y responderá a lo que deba responder.
Tu estado inicial no es 0 es 1.
Mira tu primer case.