Estoy programando un Módulo ESP8266 mediante Arduino y tengo un problema. El objetivo que busco es programar el módulo para que pueda encender un LED a través de un dispositivo que no esté en la red interna(por ejemplo desde un móvil) o desde la red interna.
Para ello he abierto el puerto 80 de mi router y que todas las peticiones externas que vayan al puerto 80 las desvíe a la IP del Módulo ESP 8266.
Para el control del led se ha programado una pequeña página WEB mediante html que tiene unos botones para encender o apagar el led, aparte de la propia programación de Arduino.

Vale, cuando accedo con un dispositivo que está en la red interna (móvil o PC) a la IP del módulo ESP funciona correctamente.
Cuando accedo con un dispositivo externo a la red (con un móvil), poniendo la IP pública de mi red, enciendo el led y después doy a apagar el led y el módulo se queda bloqueado y el navegador se queda en blanco, no llega enviar la petición al servidor.
Os dejo el código, aunque no hayáis programado en Arduino echad un ojo al código es bastante intuitivo, quizás veáis algo.
Código
#include <ESP8266WiFi.h> //Incluye la librería ESP8266WiFi const char* ssid = "Nombre de Wifi"; //Indicamos el nombre de la red WiFi (SSID) a la que queremos conectarnos. const char* password = "contraseña"; //Indicamos la contraseña de de red WiFi WiFiServer server(80); //Definimos el puerto de comunicaciones int PinLED = 2; // GPIO2 //Definimos el pin de salida - GPIO2 / D4 int estado = LOW; //Definimos la variable que va a recoger el estado del LED int t1=0; int t2=0; void setup() { Serial.begin(115200); // configuracion del monitor serial del Arduino(para visualizar por la consola de Arduino) pinMode(PinLED, OUTPUT); //Inicializamos el GPIO2 como salida digitalWrite(PinLED, LOW); //Dejamos inicialmente el GPIO2 apagado WiFi.begin(ssid, password); //Inicializamos la conexión del ESP8266 con la red WiFi while (WiFi.status() != WL_CONNECTED) { // Verifica el estado de la conexión del ESP8266 cada 0,5s hasta que conecta delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi conectada"); // Indica que el ESP8266 conectado con la red WiFi server.begin(); // Inicia el ESP8266 en modo Station Serial.println("Servidor inicializado"); Serial.printf("Utiliza esta URL para conectar: http://%s/n", WiFi.localIP().toString().c_str());//IP del ESP8266 } void loop(){ if (WiFi.status() == WL_CONNECTED) //Esta parte no es necesaria se ha puesto para ver si { // el servidor se bloquea, si va bien cada 10seg muestra t1=millis(); // el mensaje if((t1-t2)>=10000) { t2=millis(); } } WiFiClient client = server.available(); // Comprueba si el cliente ha conectado con el ESP8266 if (!client) { return; } Serial.println("nuevo cliente"); // Espera hasta que el cliente envía alguna petición while(!client.available()){ delay(1); } String peticion = client.readStringUntil('\r'); // Lee la petición enviada al ESP8266 y se almacena en un string. Serial.println(peticion); client.flush(); // Comprueba la petición if (peticion.indexOf('/LED=ON') != -1) { //Si se dió al boton de la pagina WEB encender LED=ON estará en el string de petición estado = HIGH; } if (peticion.indexOf('/LED=OFF') != -1){ estado = LOW; } digitalWrite(PinLED, estado); //Enciende o apaga el LED en función de la petición client.println("HTTP/1.1 200 OK"); //Envía la página HTML de respuesta al cliente client.println(""); //No olvidar esta línea de separación client.println("<!DOCTYPE HTML>"); client.println("<meta charset='UTF-8'>"); //para que en el servidor aparezcan tildes client.println("<html>"); //Imprime el estado del led client.print("<h1>El LED está ahora: "); if(estado == HIGH) { client.print("ENCENDIDO</h1>"); } else { client.print("APAGADO</h1>"); } //Se crean enlaces para modificar el estado del LED client.println("Presiona <a href='/LED=ON'>AQUÍ</a> para encender el LED<br>"); client.println("Presiona <a href='/LED=OFF'>AQUÍ</a> para apagar el LED<br><br>"); //Se crean cajas de comprobación (checkbox) para modificar el estado del LED client.println("<input type='checkbox' onClick=location.href='/LED=ON'> ENCENDER </input><br>"); client.println("<input type='checkbox' onClick=location.href='/LED=OFF'> APAGAR </input><br><br>"); //Se crean botones para modificar el estado del LED client.println("<button type='button' onClick=location.href='/LED=ON'> ENCENDER </button>"); client.println("<button type='button' onClick=location.href='/LED=OFF'> APAGAR </button><br><br>"); //Se crean botones con estilos para modificar el estado del LED client.println("<button type='button' onClick=location.href='/LED=ON' style='margin:auto; background-color:green; color:#A9F5A9; padding:5px; border:2px solid black; width:200;'><h2> ENCENDER</h2> </button>"); client.println("<button type='button' onClick=location.href='/LED=OFF' style='margin:auto; background-color:red; color:#F6D8CE; padding:5px; border:2px solid black; width:200;'><h2> APAGAR</h2> </button><br><br>"); //Se crea un único botón para modificar el estado del LED if(estado == HIGH) { client.print("<button type='button' onClick=location.href='/LED=OFF'> APAGAR </button><br><br>"); } else { client.print("<button type='button' onClick=location.href='/LED=ON'> ENCENDER </button><br><br>"); } client.println("</html>"); delay(1); Serial.println("Petición finalizada"); // Se finaliza la petición al cliente. Se inicaliza la espera de una nueva petición. }
Muchas gracias por la ayuda.
Salu2.