<RESUELTO> Rebote o debounce de boton fisico

Buenos dias, antes de nada decir que soy novato, y que lamento molestar con esta nimiedad. Pero llevo dos dias tratando de cambiar el estado de un relé con botones físicos, sin que me cuente miles de pulsaciones. De momento solo tengo en el programa un boton, que cambiaría el estado de rele1, si está LOW a HIGH, y viceversa. El proyecto completo es un programa de riego con dos electrovalvulas que puedan ser manejadas de manera directa, con los botones, de manera remota, mediante un servidor web, y que se puedan tambien programar riegos a determinadas horas con la ayuda de un RTC y un modulo de micro sd para guardar las horas de riego (o quizas usar la memoria EEPROM), y empleando una placa NodeMCU. Ya he buscado por el foro y veo que no soy el primero que pretende algo similar, no obstante mi problema se encuentra en la gestión del boton en este momento, puesto que actualmente sí me funciona el cambio de estado del relé via remota.

Adjunto el código, supongo que mi error será alguna tonteria. Muchas gracias de antemano.

#include <ESP8266WiFi.h> //Incluimos la librería para del WiFi
 //Trabajaremos con este, 18/02/2019
//Credenciales del WiFi
const char* ssid = "vodafoneDFD0";
const char* password = "B5YTHMTVUL4NG6";

int rele1 = D0; // D0 is the LEDBUILDIN (Active LOW)
int rele2 = D1;
int boton1 = D2;    // the number of the pushbutton pin
int estadoAnterior = 0;         // the current state of the output pin
int estadoActual;             // the current reading from the input pin
int contador = 0;   // the previous reading from the input pin

WiFiServer server(80);
 
void setup() {
  Serial.begin(115200); //Inicio el puerto serie 
  delay(10);
 
  pinMode(rele1, OUTPUT);
  digitalWrite(rele1, LOW);
   pinMode(rele2, OUTPUT);
  digitalWrite(rele2, LOW);
  pinMode(boton1, INPUT);
  // Conecto con la red WiFi en modo estación (STA)
  Serial.println();
  Serial.println();
  Serial.print("Conectando a ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
  delay(5000);

 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi conectado");
 
  // Inicializo el servidor
  server.begin();
  Serial.println("Servidor iniciado");
 
  // Muestro la IP local asignada. URL del servidor
  Serial.print("Usa esta URL para conectar al servidor: ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");
 
}
 
void loop() {
  {
  
  estadoActual = digitalRead(boton1);

 if (estadoAnterior != estadoActual)
 {
  contador++;
  int validarPar = contador % 2;
  if (validarPar != 1)
  {
    
 // digitalRead(rele1);
  //}
  if (digitalRead(rele1)==HIGH)
  {
    digitalWrite (rele1,LOW);
  }
   else
  {
    digitalWrite (rele1,HIGH);
  }
  
  }
   estadoAnterior = estadoActual;

 }
}   
 // Compruebo si hay un cliente disponible (una petición)
  WiFiClient client = server.available();
  if (!client) {
    return; // En caso de no haber un cliente, no hago nada
  }
 
  // Espero hasta que el cliente realice una petición
  Serial.println("¡Nuevo cliente!");
  while(!client.available()){
    delay(1);
  }
 
  // Leo la primera linea de la petición del cliente
  String request = client.readStringUntil('\r'); // Leo hasta retorno de carro
  Serial.println(request); //Imprimo la petición
  client.flush(); //Limpio el buffer
 
  // Interpreto lo que he recibido

 
 int value = rele1 ;
  if (request.indexOf("/LED=ON") != -1)  {
    digitalWrite(rele1, HIGH);
    value = HIGH;
  }
  if (request.indexOf("/LED=OFF") != -1)  {
    digitalWrite(rele1, LOW);
    value = LOW;
  }
    int blk2 = LOW;
  if (request.indexOf("/BLK2=ON") != -1)  {
    digitalWrite(rele2, HIGH);
    blk2 = HIGH;
  }
  if (request.indexOf("/BLK2=OFF") != -1)  {
    digitalWrite(rele2, LOW);
    blk2 = LOW;
  }
 
// Pongo rele1 al valor que ha solicitado el cliente en la petición
 
  // Devuelvo la respuesta al cliente -> Todo ha ido bien, el mensaje ha sido interpretado correctamente
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println(""); //  do not forget this one
  
  // A partir de aquí creo la página en raw HTML
  client.println("<!DOCTYPE HTML>"); 
  client.println("<html>");
 
  client.print("El LED esta:  ");
 
  if(value == HIGH) {
    client.print("ON");
  } else {
    client.print("OFF");
  }
  client.println("

");
  client.println("<a href=\"/LED=ON\"\"><button>Encender </button></a>"); // Los botones con enlace
  client.println("<a href=\"/LED=OFF\"\"><button>Apagar </button></a>
");  
  client.println("</html>");

  

  client.print("El bloque 2 esta:  ");
 
  if(blk2 == HIGH) {
    client.print("ON");
  } else {
    client.print("OFF");
  }
  client.println("

");
  client.println("<a href=\"/BLK2=ON\"\"><button>Encender </button></a>"); // Los botones con enlace
  client.println("<a href=\"/BLK2=OFF\"\"><button>Apagar </button></a>
");  
  client.println("</html>");
 
  delay(1);
  Serial.println("Cliente desconectado"); // Nos desconectamos del cliente
  Serial.println("");


}

Perdon por molestar, mas aun cuando no hay problema en el software.
El problema es que compré un zócalo para la placa NodeMCU, y no encajan perfectos el uno con el otro, así que creo que se ha estropeado o bien la placa o bien el zócalo, y a veces no se hacen bien las conexiones.
Perdon, y una vez mas, muchas gracias.