Problema web server modo station

Hola! Configure el nodemcu como web server modo Station (creo que se dice así)

El problema es que deja de funcionar el web server, no hay algo específico puede dejar de funcionar a los minutos, horas desde que fue encendido.

El codigo consiste en la creación de una conexión WiFi, le modifique la ip para alojar el servidor en la ip 200.200.200.1 y de allí mandar datos.

Luego está la parte web que es común a todas, esperan un cliente web y muestran de acuerdo la petición.

El problema es que como dije deja de funcionar y no me muestra nada en la página web, queda en blanco como cargando y ni error me tira, debo reiniciar el sistema para que funcione

Lo creé con el proposito de controlar una cortina por el teléfono (usé app inventor y pongo que al entrar se conecte a esa red y cargue el web server con 3 botones, subir, parar, bajar, funciona apenas arranca y tal vez durante horas, pero llega un momento que deja de responder)

Si me pueden ayudar lo agradezco, si sirve luego subo el código y quisiera recomendación de algo estable para el control de la cortina si no fuera viable como está ahora

Gracias!

#include <ESP8266WiFi.h>                  //Incluye la librería ESP8266WiFi
 
const char ssid[] = "Araña";    //Definimos la SSDI de nuestro servidor WiFi -nombre de red- 
const char password[] = "helado123";       //Definimos la contraseña de nuestro servidor 
WiFiServer server(80);                    //Definimos el puerto de comunicaciones
 

int bajada = LOW;
int subida = LOW;//Definimos la variable que va a recoger el estado del LED
 
void setup() {
  Serial.begin(115200);
 
  pinMode(D2, OUTPUT);                //Inicializamos el GPIO2 como salida
  digitalWrite(D2, LOW);              //Dejamos inicialmente el GPIO2 apagado
  pinMode(D1, OUTPUT);                //Inicializamos el GPIO2 como salida
  digitalWrite(D1, LOW);              //Dejamos inicialmente el GPIO2 apagado
 
  server.begin();                         //inicializamos el servidor
  WiFi.mode(WIFI_AP);
  WiFi.softAP(ssid, password);            //Red con clave, en el canal 1 y visible
  //WiFi.softAP(ssid, password,3,1);      //Red con clave, en el canal 3 y visible 
  //WiFi.softAP(ssid);                    //Red abierta
 
  Serial.println();
 
  Serial.print("Direccion IP Access Point - por defecto: ");      //Imprime la dirección IP
  Serial.println(WiFi.softAPIP()); 
  Serial.print("Direccion MAC Access Point: ");                   //Imprime la dirección MAC
  Serial.println(WiFi.softAPmacAddress()); 
 
  IPAddress local_ip(200, 200, 200, 1);                           //Modifica la dirección IP 
  IPAddress gateway(192, 168, 1, 1);   
  IPAddress subnet(255, 255, 255, 0);
  WiFi.softAPConfig(local_ip, gateway, subnet);
  Serial.println();
  Serial.print("Access Point - Nueva direccion IP: ");
  Serial.println(WiFi.softAPIP());
}
 
void loop() 
{
  // Comprueba si el cliente ha conectado
  WiFiClient client = server.available();  
  if (!client) {
    return;
  }
 
  // Espera hasta que el cliente envía alguna petición
  Serial.println("nuevo cliente");
  while(!client.available()){
    delay(1);
  }
 
  // Imprime el número de clientes conectados
  Serial.printf("Clientes conectados al Access Point: %dn", WiFi.softAPgetStationNum()); 
  // Lee la petición;
  String peticion = client.readStringUntil('H');
  Serial.println(peticion);
  client.flush();

   String data = peticion;     // habia una peticion por parte de favicon.ico que me molestaba, con esto lo elimine
   byte desde = data.indexOf('/');           //porque repetia todo lo que hacia y por ejemplo me apagaba y prendia 2 veces las cosas en 1 seg
   desde++;                                  //
   byte hasta = data.indexOf('o');           //
 String loderojo = data.substring(desde, hasta); //
   Serial.println("cliente:" + data.substring(desde, hasta));
  
String popa="favic";
 if (data.substring(desde, hasta) == popa){
  goto fin;
 }else {
  // Comprueba la petición
  if (peticion.indexOf('/2') != -1) {
    subida = HIGH;
    bajada =LOW;
  } 
  if (peticion.indexOf('/1') != -1){
    subida = LOW;
    bajada = LOW;
  }

  if (peticion.indexOf('/0') != -1){
    subida = LOW;
    bajada = HIGH;
  }
 
  //Enciende o apaga el LED en función de la petición
  if (subida == HIGH){
    digitalWrite (D1, LOW);
    digitalWrite (D2, LOW);
    delay (750);
    digitalWrite (D2, HIGH);
    digitalWrite (D1, LOW);
  }
  if (bajada == HIGH){
    digitalWrite (D1, LOW);
    digitalWrite (D2, LOW);
    delay (750);
    digitalWrite (D1, HIGH);
    digitalWrite (D2, LOW);
  }

  if (bajada == LOW && subida == LOW){
    digitalWrite (D1, LOW);
    digitalWrite (D2, LOW);
  }

  Serial.println ("estados:");
  Serial.print("subida");
  Serial.println(subida);
  Serial.print("bajada");
  Serial.println(bajada);
  // Envía la página HTML de respuesta al cliente
  client.println("HTTP/1.1 200 OK");
  client.println("");                                     //No olvidar esta línea de separación
  client.println("<!DOCTYPE HTML>");
  client.println("<meta charset='UTF-8'>");
  client.println("<html>");
 
      //Imprime el estado del led
  client.print("<h1 style='color:blue;' align='center'> Buen día doctora! </h1>");
 

      //Se crean botones para modificar el estado del LED
  client.println("<button type='button'align='center' onClick=location.href='/2'> SUBIR </button>");
  client.println("");
  client.println("<button type='button'align='center' onClick=location.href='/1'> PARAR </button>");
  client.println("");
  client.println("<button type='button'align='center' onClick=location.href='/0'> BAJAR </button>

");

  client.println("</html>"); 
 }
 fin:
  delay(1);
  Serial.println("Petición finalizada");          // Se finaliza la petición al cliente. Se inicaliza la espera de una nueva petición.
 
  //Desconexión de los clientes
  //WiFi.softAPdisconnect();
}

Cuando pruebas el nodemcu lo haces en un LAN o fuera de ella?

La LAN es creada por node, es lo que está arriba del código, se llama Araña y dice la contraseña
Eso sigue funcionando con la página colgada, es decir puedo conectarme y desconectarme del node

Si eso es lo que preguntabas

Y donde esta el problema?

En que en un momento X, donde abro la ip para ver la página, está en blanco, ni carga y por consiguiente no puedo clickear los botones, debo reiniciar el nodemcu para que la página funcione nuevamente

Ahh pero entonces tu nodemcu se tilda.. lo estas vigilando via seríal ademas de via WEB?
Seguramente si miras ese momento verás como esta tilado y te arroja una seríe de errores.

Algo puede no estar bien en tu código.

Actualmente no, pero había probado con otro node dejarlo y funcionó por horas y lo desconecté

Lo que más me llama la atención es que sea aleatorio, en vez de luego de hacer algo

1.¿conoces algún método 100% estable que no deba reiniciarlo y cambiarlo de esa forma?, probé esto porque parecía que andaría, pero esos fallos molestan, antes usaba con mqtt pero también luego de varios usos, tiraba un error de stack y se tildaba

  1. Viste que creo una red y de ahí un servidor local, se tildará igual si armo un servidor local en mi propia red WiFi ¿es más estable, menos, tenés idea? Quiero buscar lo más estable posible que no deba reiniciar nunca o casi nunca el node

Tomá un ejemplo tal como viene la librería y ponelo a funcionar a ver como se comporta.
Si no se tilda entonces esta claro que tu código tiene algun detalle a revisar.

Tambien podrías en tu código agregar mensajes para saber donde ocurre el fallo usando el monitor Serie.

Como ultimo recurso podes agregar un WatchDog para que en caso de colgarse se reinicie pero eso no resuelve la causa del problema.

Si comparas tu setup con un ejemplo de la librería verás algunas cosas fuera de lugar.

ejemplo server.begin debería estar al final, luego de una conexion exitosa a la red.
No veo que esperes a que el ESP se conecte a la red te sugiero este arranque a ver como va
la inicialización debe ir como global

IPAddress local_ip(200, 200, 200, 1);                           //Modifica la dirección IP 
IPAddress gateway(192, 168, 1, 1);   
IPAddress subnet(255, 255, 255, 0);

En todo ejemplo que las usé, fue de este modo o sea antes del setup.

Este sería un arranque mas adecuado pero no lo he probado.

#include <ESP8266WiFi.h>                  //Incluye la librería ESP8266WiFi
 
const char ssid[] = "Araña";    //Definimos la SSDI de nuestro servidor WiFi -nombre de red- 
const char password[] = "helado123";       //Definimos la contraseña de nuestro servidor 

IPAddress local_ip(200, 200, 200, 1);                           //Modifica la dirección IP 
IPAddress gateway(192, 168, 1, 1);   
IPAddress subnet(255, 255, 255, 0);
WiFiServer server(80);                    //Definimos el puerto de comunicaciones

int bajada = LOW;
int subida = LOW;//Definimos la variable que va a recoger el estado del LED
 
void setup() {
  Serial.begin(115200);
 
  pinMode(D2, OUTPUT);                //Inicializamos el GPIO2 como salida
  digitalWrite(D2, LOW);              //Dejamos inicialmente el GPIO2 apagado
  pinMode(D1, OUTPUT);                //Inicializamos el GPIO2 como salida
  digitalWrite(D1, LOW);              //Dejamos inicialmente el GPIO2 apagado
 
  
  WiFi.mode(WIFI_AP);
  WiFi.softAP(ssid, password);            //Red con clave, en el canal 1 y visible
  //WiFi.softAP(ssid, password,3,1);      //Red con clave, en el canal 3 y visible 
  //WiFi.softAP(ssid);                    //Red abierta
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  Serial.println();
 
  Serial.print("Direccion IP Access Point - por defecto: ");      //Imprime la dirección IP
  Serial.println(WiFi.softAPIP()); 
  Serial.print("Direccion MAC Access Point: ");                   //Imprime la dirección MAC
  Serial.println(WiFi.softAPmacAddress()); 
 

  WiFi.softAPConfig(local_ip, gateway, subnet);
  Serial.println();
  Serial.print("Access Point - Nueva direccion IP: ");
  Serial.println(WiFi.softAPIP());
  server.begin();                         //inicializamos el servidor
}

EDITO

que tiene que ver esto

IPAddress local_ip(200, 200, 200, 1);                           //Modifica la dirección IP 
IPAddress gateway(192, 168, 1, 1);

con tu gateway?

200.200.200.1 con 192.168.1.1 de tu router? WRONG ERROR
Debes usar una IP dentro de la red algo como 192.168.1.X con X de 2 a 255

La verdad no sé, iba probando y como funcionaba lo dejé, pero igual en ese código es para la red que creo (no se que tiene que ver el gateway)

Es mas recomendable que lo deje predeterminado y en vez de crear un access point use la conexión WiFi que dispongo?

Claro que es mas recomendable usar la red WIFI, pero también puedes usarlo como AP y debe funcionar.

Porque no vuelves a los casos simples de la librería y ves como se comportan, no los alteres. Prueba estabilidad a largo plazo.

Listo, muchas gracias por la ayuda. Podes cerrarlo o lo que se haga

¡hasta el próximo problema o hasta que pueda ayudar a alguno jaja!