me falla la logica? Arduino UNO + esp8266 + boton

Hola, estoy haciendo un proyectito y necesito encender o apagar un led, con un boton y que tambien se pueda conmutar con la señal recibida con un esp8266 modelo esp-01. La primera parte del código la tengo así:

#define SSID        "mySSID"
#define PASS        "myPASS"
int led = 13;
void setup()  
{
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
  Serial.begin(9600);
  Serial.println("AT");
  delay(2000);
  Serial.println("AT+RST");
  delay(2000);
  Serial.println("AT+CWMODE=1");
  delay(8000);
  String cmd="AT+CWJAP=\"";
  cmd+=SSID;
  cmd+="\",\"";
  cmd+=PASS;
  cmd+="\"";
  Serial.println(cmd);
  delay(13000);
  Serial.println("AT+CIPMUX=1");
  delay(12000);
  Serial.println("AT+CIPSERVER=1,3333");
  delay(3000);
  digitalWrite(led, HIGH);
  delay(300);
  digitalWrite(led, LOW);
  delay(300);
  digitalWrite(led, HIGH);
  delay(300);
  digitalWrite(led, LOW);
  delay(300);
  digitalWrite(led, HIGH);
  delay(300);
  digitalWrite(led, LOW);
  delay(300);
}

esa parte funciona sin problemas. Ahora en el loop, la primera prueba:

void loop() 
{  
  if (finder.find("led1off")  ){
    digitalWrite(led, LOW);
  }
  if (finder.find("led1on")  ){
    digitalWrite(led, HIGH);
  }
}

y funciona de maravilla. Ahora pruebo el boton, sin el wifi:

const int buttonPin = 2;
const int ledPin =  13;
;

int buttonState = 0;
int lastButtonState = 0;
int ledState = 0;


void setup() {
  pinMode(ledPin, OUTPUT);      
  pinMode(buttonPin, INPUT);
  digitalWrite(ledPin, LOW);
}

void loop(){
  buttonState = digitalRead(buttonPin);

  if (buttonState == HIGH && lastButtonState == LOW) {
    delay(50);
    if (ledState == 0) {    
      digitalWrite(ledPin, HIGH);
      ledState = 1;
    }
    else {
      digitalWrite(ledPin, LOW);
      ledState = 0;
    }
  }
  lastButtonState = buttonState;
}

y funciona de maravilla tambien, ahora el codigo final, todo junto:

#include <TextFinder.h>
#include <SoftwareSerial.h>

#define SSID        "mySSID"
#define PASS        "myPASS"
int led = 13;
const int buttonPin = 2;
int buttonState = 0;
int lastButtonState = 0;
int ledState = 0;
TextFinder  finder(Serial);
void setup()  
{
  pinMode(led, OUTPUT);
  pinMode(buttonPin, INPUT);
  digitalWrite(led, LOW);
  Serial.begin(9600);
  Serial.println("AT");
  delay(2000);
  if(finder.find("OK"))
  Serial.println("AT+RST");
  delay(2000);
  Serial.println("AT+CWMODE=1");
  delay(8000);
  String cmd="AT+CWJAP=\"";
  cmd+=SSID;
  cmd+="\",\"";
  cmd+=PASS;
  cmd+="\"";
  Serial.println(cmd);
  delay(13000);
  Serial.println("AT+CIPMUX=1");
  delay(12000);
  Serial.println("AT+CIPSERVER=1,3333");
  delay(3000);
  digitalWrite(led, HIGH);
  delay(300);
  digitalWrite(led, LOW);
  delay(300);
  digitalWrite(led, HIGH);
  delay(300);
  digitalWrite(led, LOW);
  delay(300);
  digitalWrite(led, HIGH);
  delay(300);
  digitalWrite(led, LOW);
  delay(300);
}
void loop() 
{
  buttonState = digitalRead(buttonPin);

  if (buttonState == HIGH && lastButtonState == LOW) {
    delay(50);
    if (ledState == 0) {    
      digitalWrite(led, HIGH);
      ledState = 1;
    }
    else {
      digitalWrite(led, LOW);
      ledState = 0;
    }
  }
  lastButtonState = buttonState;
  
  if (finder.find("led1off")  ){
    digitalWrite(led, LOW);
    ledState = 0;
  }
  if (finder.find("led1on")  ){
    digitalWrite(led, HIGH);
    ledState = 1;
  }
}

y no funciona :’( tengo que pulsar el boton unas 10 veces para que cambie el estado del led, la orden por wifi igual, tengo que mandarla muchas veces hasta que la procesa bien ¿donde esta el fallo?

Como odio cuando no sale mi respuesta.. me pasa una y otra vez. Bien. Empecemos de nuevo. Decía que tu código luce bien pero mira esta página. Usa este ejemplo a ver si mejoras esa demora en inicializar tu dispositivo. Tardas 47 segundos en prepararlo. Algo me parece que demora demasiado.

Ejemplo udpSendingReceivingString si retrocedes en esta página esta toda la librería incluyendo el ejemplo.

Prueba a ver si esto funciona mejor.