NECESITO AYUDA CON UN SEMAFORO QUE USA SOLAMENTE FUNCION MILLIS.

-Hola a todos, debo realizar un programa que simule un semáforo usando solamente la función millis y tengo problemas en cierto punto debido a que debo cumplir dos condiciones:
1)Tener un interruptor que al estar activo apague los semáforos por completo, pero al desactivarlo inicie nuevamente el semáforo.
2)Mediante otro interruptor pausar las leds de los semáforos y al liberar el interruptor que siga la marcha con la que proseguía el semáforo.

tengo problemas en esas dos ultimas condiciones. Por favor ¿alguien tiene algunas ideas sobre como podría realizar esos dos incisos?

gracias por leerme!!

código que e realizado hasta el momento:

unsigned long tiempo = 0;
unsigned long tiempo1= 0;
unsigned long tiempo2= 0;
unsigned long tiempo3= 0;
unsigned long tiempo4= 0;
unsigned long tiempo5= 0;
unsigned long tiempo6= 0;
unsigned long tiempo7= 0;
unsigned long tiempo8= 0;
unsigned long tiempo9= 0;
unsigned long tiempo10= 0;
unsigned long tiempo11= 0;
unsigned long tiempo12= 0;
unsigned long tiempo13= 0;
unsigned long tiempo14= 0;
unsigned long tiempo15= 0;
int espera = 1000;
int PARPADEO = 250;
int PARPADEO2= 251;
int bandera;

int SI_R=6; //declaramos los valores de los 3 LED del primer semaforo.
int SI_A=7;
int SI_V=8;
int S2_R=2;
int S2_A=3; //declaramos los valores de los 3 LED del segundo semaforo.
int S2_V=4;
int S3_R=10;
int S3_A=11; ////declaramos los valores de los 3 LED del tercer semaforo.
int S3_V=12;
int n1;
int n2;

//** Programa **//

void setup() {
pinMode(n1,INPUT);
pinMode(n2,INPUT);
pinMode(SI_V,OUTPUT); //se definen como salida los leds del semaforo 1.
pinMode(SI_A,OUTPUT);
pinMode(SI_R,OUTPUT);

pinMode(S2_V,OUTPUT); //se definen como salida los leds del semaforo 2.
pinMode(S2_A,OUTPUT);
pinMode(S2_R,OUTPUT);

pinMode(S3_V,OUTPUT);
pinMode(S3_A,OUTPUT); //se definen como salida los leds del semaforo 3.
pinMode(S3_R,OUTPUT);

}

void apagar(){
if((n2==1) && (n1==0)){

digitalWrite(SI_V,LOW);
digitalWrite(SI_R,LOW);
digitalWrite(SI_A,LOW);
digitalWrite(S2_V,LOW);
digitalWrite(S2_R,LOW);
digitalWrite(S2_A,LOW);
digitalWrite(S3_V,LOW);
digitalWrite(S3_R,LOW);
digitalWrite(S3_A,LOW);
}

}
void pausar(){
if((n2==0) && (n1==1)){
espera=0;
PARPADEO=0;
PARPADEO2=0;
tiempo=0;
tiempo1=0;
tiempo2=0;
tiempo3=0;
tiempo4=0;
tiempo5=0;
tiempo6=0;
tiempo7=0;
tiempo8=0;
tiempo9=0;
tiempo10=0;
tiempo11=0;
tiempo12=0;
tiempo13=0;
tiempo14=0;
tiempo15=0;
}

}

void loop()
{
n1=digitalRead(9);
n2=digitalRead(5);
pausar();
apagar();
if((n1==0) && (n2==0)){
Secuencia_Semaforo();
}

}

void Secuencia_Semaforo(){
bandera:
if(millis() == 0){
digitalWrite(SI_V,HIGH); //iniciamos teniendo el EN VERDE el primer semaforo
digitalWrite(S2_R,HIGH); //el segundo semaforo permance en rojo
digitalWrite(S3_R,HIGH); //El tercer semaforo permance en rojo.
tiempo=millis();
}
//PRIMER CICLO DEL SEMAFORO 1*********//
while (millis() == espera) //esperamos t segundos
{
digitalWrite(SI_V,LOW);
digitalWrite(SI_A,HIGH);
}
while (millis() == espera + PARPADEO ) //esperamos t segundos
{
digitalWrite(SI_A,LOW); //apagamos el led amarillo
}

while (millis() == espera + PARPADEO + PARPADEO2 ) //esperamos t segundos
{
digitalWrite(SI_A,HIGH); //El led amarillo se vuelve intermitente al pasar de un estado al otro
}

while (millis() == espera + PARPADEO + PARPADEO2 + 250) //esperamos t segundos
{
digitalWrite(SI_A,LOW);
}

while (millis() == espera + PARPADEO + PARPADEO2 + 500) //esperamos t segundos
{
digitalWrite(SI_A,HIGH);
}
tiempo=espera + PARPADEO + PARPADEO2 + 500;

while (millis() == tiempo + espera){
digitalWrite(SI_A,LOW); //apagamos el led amarillo
digitalWrite(SI_R,HIGH); //encendemos el led rojo
digitalWrite(S2_R,LOW); //apagamos el led rojo del segundo semaforo
digitalWrite(S2_V,HIGH); //encendemos el led verde
}
tiempo1= tiempo + espera;
//SEGUNDO CICLO DEL SEMAFORO 1*********//
while(millis() == tiempo1 + espera) //esperamos t segundos
{
digitalWrite(S2_V,LOW); //agamos el led amarillo
digitalWrite(S2_A,HIGH); //encendemos el led amarillo
}
tiempo2=tiempo1 + espera;

while(millis() == tiempo2 + PARPADEO) //esperamos t segundos
{
digitalWrite(S2_A,LOW); //apagamos el led amarillo
}
tiempo3=tiempo2 + PARPADEO;

while(millis() == tiempo3 + PARPADEO) //esperamos t segundos
{
digitalWrite(S2_A,HIGH); //El Led amarillo se vuelve intermitente.
}
tiempo4=tiempo3 + PARPADEO;

while(millis() == tiempo4 + PARPADEO) //esperamos t segundos
{
digitalWrite(S2_A,LOW);
}
tiempo5=tiempo4 + PARPADEO;

while(millis() == tiempo5 + PARPADEO) //esperamos t segundos
{
digitalWrite(S2_A,HIGH);
}
tiempo6=tiempo5 + PARPADEO;

while(millis() == tiempo6 + PARPADEO) //esperamos t segundos
{
digitalWrite(S2_A,LOW);
}
tiempo7= tiempo6 + PARPADEO;

while(millis() == tiempo7 + espera)
{
digitalWrite(S2_R,HIGH); //encendemos el led rojo
digitalWrite(S3_R,LOW); //apagamos el led rojo del tercer semaforo
digitalWrite(S3_V,HIGH); //encendemos el led verde del tercer semaforo.

}
//TERCER CICLO DEL SEMAFORO 1*********//
tiempo8=tiempo7 + espera;

while(millis() == tiempo8 + espera) //esperamos t segundos
{
digitalWrite(S3_V,LOW); //encendemos el led amarillo
}
tiempo9=tiempo8 + espera;

while(millis() == tiempo9 + PARPADEO) //esperamos t segundos
{
digitalWrite(S3_A,HIGH); //apagamos el led rojo
}
tiempo10= tiempo9 + PARPADEO;

while(millis() == tiempo10 + PARPADEO) //esperamos t segundos
{
digitalWrite(S3_A,LOW); //apagamos el led amarillo
}

tiempo11= tiempo10 + PARPADEO;

while(millis() == tiempo11 + PARPADEO) //esperamos t segundos
{
digitalWrite(S3_A,HIGH); //EL LED amarillo se vuelve intermitente.
}
tiempo12= tiempo11 + PARPADEO;

while(millis() == tiempo12 + PARPADEO) //esperamos t segundos
{
digitalWrite(S3_A,LOW);
}
tiempo13= tiempo12 + PARPADEO;

while(millis() == tiempo13 + PARPADEO) //esperamos t segundos
{
digitalWrite(S3_A,HIGH);
}
tiempo14= tiempo13 + PARPADEO;

while(millis() == tiempo14 + PARPADEO) //esperamos t segundos
{
digitalWrite(S3_A,LOW); //apagamos el LED amarillo.
}
tiempo15= tiempo14 + PARPADEO;

while(millis() == tiempo15 + espera)
{
digitalWrite(S3_R,HIGH); //Encendemos el LED rojo.
digitalWrite(SI_R,LOW); //apagamos el LED ROjo del primer semaforo.
digitalWrite(SI_V,HIGH); //encendemos el led verdel primer semaforo. */
soft_reset();
}

return 0;
goto bandera;
}

void soft_reset() {

asm volatile (" jmp 0");

}

Por favor, etiqueta correctamente el código tal y como se especifica en las NORMAS

Dos cosas.
Lee las normas del foro como te ha pedido @victorjam, edita tu código usando etiquetas y retira las mayúsculas en el título.