NODEMCU se desconecta Wifi o WebSocket

Buenos días a todos, les cuento tengo un pequeño proyecto de un autito con un NodeMCU V3 que se maneja con el celu usando el NodeMCU en modo AP.

El problema que estoy teniendo es que hay lugares en donde el NodeMCU se vuelve loco, mejor dicho nunca se conecta al celu, o se conecta y desconecta, o el websocket se conecta y cuando mando una instrucción se desconecta. lo que me llama la atención.
Para intentar solucionar el problema fue cambiar de canal la WIFI pero no tuve resultados positivos.

Abajo dejo el codigo si les sirve de algo. Saludos Joaquin

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WebSocketsServer.h>
#include <ESP8266WebServer.h>
#include <ESP8266WebServerSecure.h>
#include <ESP8266mDNS.h>
#include <Hash.h>
#include "FS.h"
#include <Servo.h> 

//VELOCIDAD
#define PIN_ENABLED_VELOCIDAD 16
#define PIN_CONTROL_A_VELOCIDAD 5 //ADELANTE -> A=1, B=0
#define PIN_CONTROL_B_VELOCIDAD 4 //ATRAS -> A=0, B=1

//GIRO
#define PIN_CONTROL_GIRO 0 //DERECHA -> A=1, B=0

//LED LUCES(CONECTADO WIFI)
#define PIN_LUCES 2 //LUCES -> CONECTO WIFI = 1, DESCONECTO WIFI = 0
#define PIN_BOCINA 14

Servo servoGiro;
ESP8266WiFiMulti WiFiMulti;
ESP8266WebServer server (80);
WebSocketsServer webSocket = WebSocketsServer(81);
String html_home;

void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t lenght) {

    switch(type) {
        case WStype_DISCONNECTED:
            {
            Serial.printf("[%u] Disconnected!\n", num);
            break;
           }
        case WStype_CONNECTED: 
            {
            IPAddress ip = webSocket.remoteIP(num);
            Serial.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload);

            // send message to client
            webSocket.sendTXT(num, "Connected");
        
            break;
          }
        case WStype_TEXT:
           {
            Serial.printf("[%u] get Text: %s\n", num, payload);
            if(payload[0] == 'V') {
                uint32_t velocidad = (uint32_t) strtol((const char *) &payload[1], NULL, 0);
                Serial.printf("Velocidad:[%u]\n", velocidad);
                analogWrite(PIN_ENABLED_VELOCIDAD, velocidad); 
            }
            else if(payload[0] == 'G') {
                 uint32_t giro  = (uint32_t) strtol((const char *) &payload[1], NULL, 0);
                 Serial.printf("Giro:[%u]\n", giro);
                 servoGiro.write(giro);
                 delay(5);  
            }
            else if(payload[0] == 'R') {
                 uint8_t isReversa  = (uint8_t) strtol((const char *) &payload[1], NULL, 0);
                 Serial.printf("Reversa:[%u]\n", isReversa);
                 reversaVelocidad((bool)isReversa);   
            }
            break;
           }
    }
}

void reversaVelocidad(uint8_t isReversa)
{
  if(isReversa == 1)
  {
   digitalWrite(PIN_CONTROL_A_VELOCIDAD, 0);
   digitalWrite(PIN_CONTROL_B_VELOCIDAD, 1); 
  }
  else
  {
    digitalWrite(PIN_CONTROL_A_VELOCIDAD, 1);
    digitalWrite(PIN_CONTROL_B_VELOCIDAD, 0);
  }  
}

void prepareFile(){
  Serial.println("Prepare file system");
  SPIFFS.begin();
  
  File file = SPIFFS.open("/home.html", "r");
  if (!file) {
    Serial.println("file open failed");  
  } else{
    Serial.println("file open success");
    html_home = "";
    while (file.available()) {
      //Serial.write(file.read());
      String line = file.readStringUntil('\n');
      html_home += line + "\n";
    }
    file.close();
    Serial.print(html_home);
  }
}

void setup() {
    Serial.begin(115200);
    Serial.println();

    for(uint8_t t = 4; t > 0; t--) {
        Serial.printf("[SETUP] BOOT WAIT %d...\n", t);
        Serial.flush();
        delay(1000);
    }

    //Configuro funcionamiento pin
    //Velocidad 
    pinMode(PIN_ENABLED_VELOCIDAD, OUTPUT);
    pinMode(PIN_CONTROL_A_VELOCIDAD, OUTPUT);
    pinMode(PIN_CONTROL_B_VELOCIDAD, OUTPUT);
    //Giro
    servoGiro.attach(PIN_CONTROL_GIRO);
   
    //Cargo HTML
    prepareFile();

    //Configuro WIFI
    WiFi.softAP("CamionMan", "12345678");
    IPAddress myIP = WiFi.softAPIP();
    Serial.print("AP IP address: ");
    Serial.println(myIP);

    // start webSocket server
    webSocket.begin();
    webSocket.onEvent(webSocketEvent);

    //MDNS
    if(MDNS.begin("esp8266")) {
        Serial.println("MDNS responder started");
    }

    // handle index
    server.on("/", []() {
        // send home.html
        server.send(200, "text/html", html_home);
    });
    server.begin();

    // Add service to MDNS
    MDNS.addService("http", "tcp", 80);
    MDNS.addService("ws", "tcp", 81);

    Serial.printf("Server Start\n");
    
    //Inicializo PINES por defecto
    //Velocidad
    digitalWrite(PIN_ENABLED_VELOCIDAD,LOW);
    digitalWrite(PIN_CONTROL_A_VELOCIDAD,HIGH);
    digitalWrite(PIN_CONTROL_B_VELOCIDAD, LOW);
    //Giro
    digitalWrite(PIN_CONTROL_GIRO, LOW); 
    servoGiro.write(90);
}

void loop() {
    webSocket.loop();
    server.handleClient();
}

Desde el punto de vista ESP8266 en modo AP y un celu tu programa debe estar bien.
El problema entonces se debe como radia señal el ESP8266.

La distribución de cualquier Dispositivo tiene areas con máximo y minimos, imagina burbujas que estan inteconectadas como globos y justamente hay angulos donde la radiación será nula o muy baja.
Estoy suponiendo porque no he visto el diagrama de radiación de un ESP.

Otro tema es que estas usando un nodemcu y bueno es cómodo para algunas cosas pero tiene una antena integrada y para un caso como el que pretendes sería mejor un ESP07 que tiene antena externa.

Bueno esperaba zonas de menos radiación y debo decir que luce bastante equilibrado.
Te dejo un video donde se ve lo que comentaba

ESP8266 radiation pattern

surbyte antes que nada gracias por la respuesta!! Las prueba que hice son a centímetros o a lo sumo 1 metros de distancia entre el mucho y el móvil. Lo raro es que en el trabajo anda perfecto y en mi casa no anda ni para atrás. Siempre hablando de esa distancia entre móvil y mcu.
Cabe destacar que es la misma placa, misma alimentación todo igual, lo único que cambia es el ambiente.
La verdad me tiene desconcertado. La próxima prueba la voy hacer en la cochera que es subterránea a ver si ahí va bien.

Saludos!

Por probar, has cambiado el canal del nodemcu?? a lo mejor hay alguna señal en tu casa en el canal que usa y en tu oficina no está esa misma señal.

WiFi.softAP (ssid, password, channel, hidden)

Canales del 1 al 13

Bueno pero eso no lo comentaste, nodijiste que funcionaba bien en un ambiente y mal en tu casa.
También puedes cambiar el canal de tu router Wifi.
O simplemente bájate una aplicación para tu celular WIFI Analizer y podrás ver el solapamiento de los canales en tu casa/departamento.

Tendré unas 30 wifi a la redonda, la mayoría en el canal 1, hay un par en el 4 y las demás en el 11(mi router WiFi esta en el canal 11).

El nodeMCU estaba en el canal 1 por defecto, lo que dije "aca esta el problema" se lo cambie y probé en el canal 6, 10 y 13, pero sigue haciendo el mismo efecto.

Estudia entonces la constelación de WIFIs en tu trabajo.

Estuve analizando las señales Wifi tanto en mi casa como en el trabajo y encontré una sorpresa bastante interesante.

En mi casa el modulo no esta en el canal que tiene configurado, por algún motivo se corre y ademas de eso la señal oscila "va y viene" todas las pruebas están hechas con la misma fuente de alimentación y a la misma distancia el celu con que las analice

Dejo unos link con dos vídeos donde muestro la señal en el trabajo y en mi casa para que vean la diferencia. Vuelvo a mencionar, mismo modulo, misma alimentación y misma programación.

Video del analizis en casa, la wifi azul es sube y baja es el NODEMCU "CamionMan":

Video del analizis en el trabajo, la wifi magenta es sube y baja es el NODEMCU "CamionMan":

Saludos Joaquin

Despues que escribo el post hice un nuevo analsis y lo que noto es que en el codigo tengo puesto

WiFi.softAP("CamionMan", "12345678",13);

Pero en mirando el analizador esta en el Canal 6. No le esta dando pelota a este comando

Sin entrar en detalles proba solo el ejemplo de ESP8266Wifi como este agregando el canal que quieras

Segun esto

The simplest version (an overload in C++ terms) of this function requires only one parameter and is used to set up an open Wi-Fi network.

WiFi.softAP(ssid)
To set up password protected network, or to configure additional network parameters, use the following overload:

WiFi.softAP(ssid, password, channel, hidden, max_connection)
The first parameter of this function is required, remaining four are optional.

Meaning of all parameters is as follows:

ssid - character string containing network SSID (max. 63 characters)
password - optional character string with a password. For WPA2-PSK network it should be at least 8 character long. If not specified, the access point will be open for anybody to connect.
channel - optional parameter to set Wi-Fi channel, from 1 to 13. Default channel = 1.
hidden - optional parameter, if set to true will hide SSID.
max_connection - optional parameter to set max simultaneous connected stations, from 1 to 8. Defaults to 4. Once the max number has been reached, any other station that wants to connect will be forced to wait until an already connected station disconnects.
Function will return true or false depending on result of setting the soft-AP.

Probé con el ejemplo que tu dices y el canal lo cambia sin problemas.
Vuelvo a cargar mi programa y cambio el canal, se ve que el IDE estaba haciendo cualquiera o el NODEMCU no borraba bien la memoria.

Saludos y gracias

Yo creo que estas usando demasiadas librerías y tal vez (no lo aseguro) hay alguna interacción negativa ahi.

Verifica la necesidad de tantas librerías.