Auto-OFF Impresora 3D

Hola buenas,
Estoy intentando hacer un auto off para una impresora 3D. Mi intencion es aprovechar un contacto NC de un final de carrera, ya que al finalizar la impresion hace un home y activa este contacto.
Al inicio de la impresion hace home y activa 2 veces este final de carrera, y al finalizar vuelve a presionarlo otras 2 veces. La idea es poner un contador de pulsos para este final de carrera y cuando el contador=>4 espere un tiempo prudencial para que se enfrie el extrusor y conmutar un rele para apagar el sistema. He pensado en alimentar el arduino con un pulsador y, mediante un rele, realimentar el arduino.

/*
____________________________________________________________
Programa para auto apagar la anet A8 al finalizar la impresion,
se utilizara el pin libre del final de carrera del eje x, ya 
que al finalizar la impresion, se hace un home.
En el home final se detectara el pulso del final de carrera, se
esperará un tiempo para que se enfrie el extrusor,y apagaremos el sistema. 
 */

 
 /*
 _________________________________________________________
  Declaramos puertos de entrada, salidas y variables
 _________________________________________________________
 */
  const int boton=2;//pin entrada final de carrera
  const int rele=7;//pin mando relé
  int contador=0;//variable para guardar la cuenta de pulsaciones
  int estadoAnteriorBoton=0;
  int valorBoton=0;
  int tiempo=15;//variable en min de tiempo de espera para apagar el sist.
 /*________________________________________________________
  FUNCION PRINCIPAL:se ajecuta cada vez que el Arduino se inicia
  ________________________________________________________*/
  
void setup() {

 Serial.begin(9600);//inicia comunicacion serie
 pinMode(rele,OUTPUT);
 pinMode(boton,INPUT);
}

/*_______________________________________________________________
  FUNCION CICLICA:esta funcion se mantiene ejecutando mientras
                  este alimentado el Arduino.
 ________________________________________________________________*/
 
void loop() {
  digitalWrite(rele,0);//al ir en logica negativa, conmuto el rele para
                       //realimentar la alimentacion del Arduino.
                       
valorBoton=digitalRead(boton);//se asigna el valor a la variable "valorBoton"
                              //en funcion de si el F. carrera esta o no activo.
                              
  //_________-IF PARA EL CONTADOR-_______________________
                              
if(valorBoton!=estadoAnteriorBoton){//si cambia el estado del final de carrera
                              //entramos en el if del contador
  if(valorBoton==HIGH){//si el boton esta pulsado...
    contador++;//aumentamos el contador en 1 y....
    Serial.println(contador);//mostramos su valor en monitor serie.
  }
}
  //________________-IF PARA ACTUAR EN RELÉ-_________________________
  if(contador>4){//si el contador supera cierto valor...
    delay(tiempo*60000);
    digitalWrite(rele,1);//desconectamos la realimentacion de Arduino
                         //y apagamos todo el sistema.
  
  }

estadoAnteriorBoton=valorBoton;
      
    }
//FIN PROGRAMA

/*_________________________ACLARACIONES________________________________
 
 El contacto libre del final de carrera es un Normalmente Cerrado, por lo que
 la lógica de todo el programa es Negativa.El control del relé que tengo(hl-52s v1.1) tambien
 es en Lógica Negativa.
 ___________________________________________________________________________*/

Y el problema es?

Cierto,he intentado no extenderme y no lo he puesto, perdon.
Al montar el esquema simplemente no funciona, el contador no me cuenta bien, empieza a aumentar de manera descontrolada, y, cuando pasa el umbral de 4, no conmuta el rele.

He probado los componentes por separado y funcionan correctamente, por lo que supongo que será problema de la programacion, pero no encuentro donde puede estar.

Bueno a tu código le falta un debounce o sea, ese contacto rebota y ese rebote hace que cuente como loco.

Una posilidad simple es usar Bounce2.h library

Esta librería te permite elegir pin y el tiempo que va a verificar que este en el estado que te interesa.

pero aunque no presione el boton, el contador cuenta hasta el infinito, no es que en una pulsacion me cuente 20, sino que aumenta sin yo tocar nada. Y aun asi cuando pasara de 4 el contador deberia conmutar, y no lo hace.
Voy a mirar lo de la libreria y muchisimas gracias.

Entonces colocale una R de 10k al boton para referenciarlo a masa (GND).

Esto es un pull-down. Cuando presionas tienes HIGH como en tu código.