Botón para iniciar/pausar/reiniciar

Hola a todos. Estoy creando un reloj, o bien un segundero. Y estoy haciendo que sólo un botón será el que controle todo. Es decir: con este mismo botón inicia a contar. Una vez iniciado, si lo presiono nuevamente, pausa el segundero(No lo detiene) y quiero implementar que cuando lo deje presionado durante más de 3 segundos se reinicie o bien se detenga y este regrese a 0. Ya intenté con PulseIn, pero realmente no lo logré :’(
Les dejo el código para que se den una referencia de lo que hice.

#include <Servo.h>
Servo ServoReloj;

int a = 2; 
int b = 3;
int c = 4;
int d = 5;
int e = 6;
int f = 7;
int g = 8;

long TiempoAhora=0;
long time2=0;
int pinBoton = 12;
int EstadoBoton = 0;
int periodo = 1000;
int Min = 0;
int Seg = 0;
boolean encendido = false;
int PosServo;
int duracion;
int tiempo;
void setup() 
{
  Serial.begin(9600);
  ServoReloj.attach(11);
  pinMode(a, OUTPUT); // Establece las salidas digitales.
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
}


void loop() 
{
  
  TiempoAhora = millis(); 
  EstadoBoton = digitalRead(pinBoton);
   if (EstadoBoton == HIGH) 
   {   //Si el boton1 esta pulsado 
       if (encendido == true) {        //Comprueba si el reloj esta 
         encendido=false;              //lo prende
         Serial.println("Pausar");
          } 
          else{
      encendido= true;
     Serial.println("Renaudar");
   }
   delay(500);
   }
      if (encendido == true) {              //Comrprueba el estado del reloj
             
   PosServo= PosServo + 3;
   ServoReloj.write(PosServo);
   if(PosServo>179){
      PosServo=0;
   }
   Seg = Seg + 1;            //Suma un segundo
   
   if (Seg > 59) {
     Seg = 0;
     Min = Min + 1;
 
   }

   time2 = millis();            //comprueba el tiempo al final del loop
   time2=time2 - TiempoAhora;       //calcula la diferencia
   if (time2 >=100 ){
     time2=50;
   }
              periodo=900-time2;            //hace la rectificacion con delay
             delay(periodo);
             printtime();                 //Imrpime el tiempo en el LCD
             printdisplay(Min);
        }

}
void printtime(){
   Serial.print(Min);
   Serial.print(":");
   Serial.println(Seg);
}
void printdisplay(int minutos)
{
    switch(minutos)
    {
      case 0: display (1,1,1,1,1,1,0); break;
      case 1: display (0,1,1,0,0,0,0); break;
      case 2: display (1,1,0,1,1,0,1); break;
      case 3: display (1,1,1,1,0,0,1); break;
      case 4: display (0,1,1,0,0,1,1); break;
      case 5: display (1,0,1,1,0,1,1); break;
      case 6: display (1,0,1,1,1,1,1); break;
      case 7: display (1,1,1,0,0,0,0); break;
      case 8: display (1,1,1,1,1,1,1); break;
      case 9: display (1,1,1,1,0,1,1); break;
     default: display (1,1,1,1,1,1,0); break;
    }
      
}
void display (int a, int b, int c, int d, int e, int f, int g)
{
  digitalWrite (2,a);
  digitalWrite (3,b);
  digitalWrite (4,c);
  digitalWrite (5,d);
  digitalWrite (6,e);
  digitalWrite (7,f);
  digitalWrite (8,g);
}

Hola, no se si funcionará, he cambiado algunas cosas. Verifica

#include <Servo.h>
Servo ServoReloj;

int a = 2;
int b = 3;
int c = 4;
int d = 5;
int e = 6;
int f = 7;
int g = 8;

unsigned long timeCrono     = 0;
unsigned long timeStart;
unsigned long time2 		= 0;
int pinBoton				= 12;
boolean EstadoBoton, EstadoBotonAnt = false;
boolean encendido = false;
int periodo 				= 1000;
int Min 					= 0;
int Seg 					= 0;
int PosServo;
int duracion;
int tiempo;
byte estado = 0;

void setup() {
  Serial.begin(9600);
  ServoReloj.attach(11);
  pinMode(a, OUTPUT); // Establece las salidas digitales.
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
}


void loop() {
	EstadoBoton = digitalRead(pinBoton);

	if (EstadoBoton && !EstadoBotonAnt ) 	{   //Si el boton1 esta pulsado
		if (estado == 0) {
			encendido = true;
			timeCrono = millis(); 				// cargo el valor inicial de millis()
		}
		if (estado == 0 && encendido) 
			estado = 1;
		if (estado == 1 && !DisparoLargo){
			DisparoLargo = true;
			timeStart = millis();
		}
		    
	}
	EstadoBotonAnt = EstadoBoton;

	if (estadoBoton && DisparoLargo && (millis()-timeStart > 3000UL)) {
		estado = 2;
		// ver como volver estado a las situaciones anteriores, ejemplo 
		// cuando se libere e boton mas alguna otra condición
	}

	switch(estado) {
		case 0: // inicio conteo
				PosServo = PosServo + 3;
				ServoReloj.write(PosServo);
				if (PosServo>179){
					PosServo = 0;
				}
				Seg = (millis()-timeCrono)/1000;
				Min = (millis()-timeCrono)/60000;
				printtime();                 //Imrpime el tiempo en el LCD
				printdisplay(Min);
				break;
		case 1: // pauso segundos
				if (encendido) {        			// Comprueba si el reloj esta
					encendido = false;            	// lo prende
					Serial.println("Pausar");
				}
				else {
					encendido = true;
					Serial.println("Renaudar");
				}
				break;
		case 2: // 
				estado = 0;  						// reinicio
				break;
	}
}

void printtime(){
	char buffer[20];
	sprintf(buffer,"%02d:%02d", Min, Seg);
   	Serial.println(buffer);
}

void printdisplay(int minutos) {
    switch(minutos) {
      case 0: display (1,1,1,1,1,1,0); break;
      case 1: display (0,1,1,0,0,0,0); break;
      case 2: display (1,1,0,1,1,0,1); break;
      case 3: display (1,1,1,1,0,0,1); break;
      case 4: display (0,1,1,0,0,1,1); break;
      case 5: display (1,0,1,1,0,1,1); break;
      case 6: display (1,0,1,1,1,1,1); break;
      case 7: display (1,1,1,0,0,0,0); break;
      case 8: display (1,1,1,1,1,1,1); break;
      case 9: display (1,1,1,1,0,1,1); break;
     default: display (1,1,1,1,1,1,0); break;
    }
     
}
void display (int a, int b, int c, int d, int e, int f, int g) {
  digitalWrite (2,a);
  digitalWrite (3,b);
  digitalWrite (4,c);
  digitalWrite (5,d);
  digitalWrite (6,e);
  digitalWrite (7,f);
  digitalWrite (8,g);
}