PROBLEMA DI PERDITA CONNESSIONE WIRELESS SU ESP, WEMOS D1 e NodeMCU

Ciao a tutti.
Sono circa 3 giorni che sto impazzendo e non riesco a venirne a capo. Qualsiasi modulo ESP WiFi colleggo al mio router con ip statico, dopo qualche minuto perde la connessione. Ho provato di tutto e di piu’ e letto qualche migliaio di pagine in tutte le lingue ma il problema persiste. I moduli che ho provato sono: ESP8266-07, Wemos D1 e NodeMCU con a bordo una ESP8266-F. Quando perdono la connessione e interrogo i moduli tramite telnet o il monitor seriale di arduino per vederne lo stato, mi danno la connessione OK, l’indirizzo IP a cui sono connessi e lo status del server attivo, ma in realta’ non esiste modo per poterli contattare via wireless ammenoche’ non li resetto. Non posso credere che questo e’ un mio solo problema e che non sia capitato mai a nessuno…

Di seguito uno degli sketch usati:

#include <ESP8266WiFi.h>
IPAddress ip(192, 168, 1, 222);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

const char* ssid     = "TP-LINK_123A47";
const char* password = "mypassword";


//#define DEBUG true
//#define Serial if(DEBUG)Serial
//#define DEBUG_OUTPUT Serial
//extern "C" {
//  #include "user_interface.h"
//}

WiFiServer server(80);
WiFiClient client;

/********************************************************
/*  Debug Print                                         *
/********************************************************/
void dbg_printf ( const char *format, ... )
{

    static char sbuf[1400];                                                     // For debug lines
    va_list varArgs;                                                            // For variable number of params

    va_start ( varArgs, format );                                               // Prepare parameters
    vsnprintf ( sbuf, sizeof ( sbuf ), format, varArgs );                       // Format the message
    va_end ( varArgs );                                                         // End of using parameters

    Serial.print ( sbuf );

}


/********************************************************
/*  Handle WiFi events                                  *
/********************************************************/
void eventWiFi(WiFiEvent_t event) {
     
  switch(event) {
    case WIFI_EVENT_STAMODE_CONNECTED:
      dbg_printf("[WiFi] %d, Connected\n", event);
    break;
    
    case WIFI_EVENT_STAMODE_DISCONNECTED:
      dbg_printf("[WiFi] %d, Disconnected - Status %d, %s\n", event, WiFi.status(), connectionStatus( WiFi.status() ).c_str() );      
    break;
    
     case WIFI_EVENT_STAMODE_AUTHMODE_CHANGE:
      dbg_printf("[WiFi] %d, AuthMode Change\n", event);
    break;
    
    case WIFI_EVENT_STAMODE_GOT_IP:
      dbg_printf("[WiFi] %d, Got IP\n", event);
     // setupOTA();
    break;
    
    case WIFI_EVENT_STAMODE_DHCP_TIMEOUT:
      dbg_printf("[WiFi] %d, DHCP Timeout\n", event);
    break;
    
    case WIFI_EVENT_SOFTAPMODE_STACONNECTED:
      dbg_printf("[AP] %d, Client Connected\n", event);
    break;
    
    case WIFI_EVENT_SOFTAPMODE_STADISCONNECTED:
      dbg_printf("[AP] %d, Client Disconnected\n", event);
    break;
    
    case WIFI_EVENT_SOFTAPMODE_PROBEREQRECVED:
//      dbg_printf("[AP] %d, Probe Request Recieved\n", event);
    break;
    
    default:
        dbg_printf("[GENERIC EVENT] %d\n", event);
    break;
  }
  
}



/********************************************************
/*  WiFi Connection Status                              *
/********************************************************/
String connectionStatus ( int which )
{
    switch ( which )
    {
        case WL_CONNECTED:
            return "Connected";
            break;

        case WL_NO_SSID_AVAIL:
            return "Network not availible";
            break;

        case WL_CONNECT_FAILED:
            return "Wrong password";
            break;

        case WL_IDLE_STATUS:
            return "Idle status";
            break;

        case WL_DISCONNECTED:
            return "Disconnected";
            break;

        default:
            return "Unknown";
            break;
    }
}


void setup(){
  Serial.begin(9600);
  WiFi.config(ip, gateway, subnet);
  delay(100);

  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.setAutoConnect ( true );                                             // Autoconnect to last known Wifi on startup
  WiFi.setAutoReconnect ( true );                                             
  WiFi.onEvent(eventWiFi);                                                    // Handle WiFi event
  WiFi.mode(WIFI_STA);                                                        // Station mode

  
  WiFi.begin(ssid, password);
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
      Serial.print(".");
      delay(200);
  }
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println();
    Serial.println("Fail connecting");
    delay(5000);
    ESP.restart();
  }
  
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Start the server
  server.begin();
 // server.setNoDelay(true);
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {

if (Serial.available()>0) {
  String r = Serial.readStringUntil('\r');
  Serial.print("OK: ");
  Serial.println(r);
  //Serial.flush();

  r = r.substring(0,3);
  
  if (r == "000") {
   if (WiFi.status() != WL_CONNECTED) {
     Serial.println("RICONNESSIONE IN CORSO");
     ESP.restart();
     return;
   } else {
     Serial.println("WIFI CONNESSA");
   }
  
  } else if (r == "001") {
   // Print the IP address
   Serial.print("IP ADDR: "); 
   Serial.println(WiFi.localIP());   
 
  } else if (r == "002") {
   // RESTART ESP
   Serial.println("RESTART ESP"); 
   ESP.restart();
   return;  
   
  } else if (r == "003") {
   
   Serial.println(server.status()); 
  }
  
  
}

// Check if a client has connected
client = server.available();
if (!client) {
return;
}

// Wait until the client sends some data
Serial.println("new client");
while(!client.available()){
delay(1);
}

// Read the first line of the request
String req = client.readStringUntil('\r');
Serial.println(req);
client.flush();


   // Match the request
   int val;
   if (req.indexOf("/gpio/0") != -1) {
     //digitalWrite(2, LOW);
     Serial.println("PIN GO TO LOW");
     val = 0;
   } else if (req.indexOf("/gpio/1") != -1) {
     //digitalWrite(2,HIGH);
     Serial.println("PIN GO TO HIGHT");
     val = 1;
   } else {
     Serial.println("invalid request");
     //client.stop();
     //return;
     val = 2;
   }

// Set GPIO2 according to the request
//digitalWrite(2, val);

//client.flush();

// Prepare the response
String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n\r\n\r\nGPIO is now ";
if (val != 2) {
  s += (val)?"high":"low";
} else s += "undefined";
s += "\n";

// Send the response to the client
client.print(s);
delay(1);
Serial.println("Client disonnected");

// The client will actually be disconnected
// when the function returns and 'client' object is detroyed
}

Possibile che non ci sia nessuno che abbia mai avuto questo problema? Se mi connetto al router wifi del telefono con indirizzo ip assegnato da dhcp e senza password tutto funziona a meraviglia. Ma coloro che scrivono le librerie le provano per bene prima di pubblicarle o li pubblicano con la sola sufficienza di funzionamento su qualche apparato che hanno a disposizione? Ho qualche serio dubbio in merito....

OK: 001
IP ADDR: 192.168.43.226
OK: 003
1
OK: 004
SSID: MobileGo-JoinMe
OK: 006
BSSID: 80:4E:81:8F:48:43
OK: 005
RSSI: -76
[WiFi] 1, Disconnected - Status 3, Connected
[WiFi] 1, Disconnected - Status 6, Disconnected
[WiFi] 1, Disconnected - Status 6, Disconnected
[WiFi] 1, Disconnected - Status 1, Network not availible
[WiFi] 1, Disconnected - Status 1, Network not availible
[WiFi] 1, Disconnected - Status 1, Network not availible
[WiFi] 1, Disconnected - Status 1, Network not availible
[WiFi] 1, Disconnected - Status 1, Network not availible
[WiFi] 1, Disconnected - Status 1, Network not availible
[WiFi] 0, Connected
[WiFi] 3, Got IP
OK: 000
WIFI CONNESSA
OK: 003
1
OK: 004
SSID: MobileGo-JoinMe
OK: 005
RSSI: -46
OK: 001
IP ADDR: 192.168.43.226
new client
GET /gpio/0 HTTP/1.1
PIN GO TO LOW
Client disonnected
new client
GET /gpio/1 HTTP/1.1
PIN GO TO HIGHT
Client disonnected

pascal69:
... Ma coloro che scrivono le librerie le provano per bene prima di pubblicarle o li pubblicano con la sola sufficienza di funzionamento su qualche apparato che hanno a disposizione?

Ma le paghi le librerie ? ? ? :o ... NO, e quindi di che ti lamenti ? ? ? :o :o :o Non è software "commerciale" per il quale puoi pretendere una certa qualità ...

Spesso chi scrive una libreria lo fa per una sua precisa esigenza o ha un certo HW a disposizione e mette il tutto "GRATIS" a disposizione della comunità.
Non per nulla, a volte, ci sono tante librerie diverse, ma relative allo stesso "device" ...

Ci sono dei bugs ? Capisco che è fastidioso, ma è normale ed è il bello del OpenSource, prendi i sorgenti, fai il debug, trovi la soluzione e informi la comunità ... quel bug viene corretto ... e così via di seguito!

Morale ... pensi di aver trovato un bug con il tuo router specifico? ... mettiti li, fai debug e fornisci la soluzione che sarà utile per tutti. Se invece non sei in grado, segnala con educazione la cosa all'autore e, se verrà trovata una soluzione, avrai il bug corretto.

Al contrario, affermazioni piuttosto polemiche/sarcastiche, come quella che leggo qui sopra ... hanno spesso solo l'effetto contrario verso chi ci deve mettere la mani (... e che, ripeto, lo fa GRATIS per tutta la comunità). ::slight_smile:

Guglielmo

Ah, solo per inciso e assolutamente senza alcuna polemica ... ricordo sempre che questo è il forum di Arduino.cc dove si fornisce assistenza per problemi relativi a problematiche che coinvolgono Arduino, i suoi collegamenti e la sua programmazione.

Quindi, ben vengano domande che riguardano moduli ESP8266 collegati ad Arduino, ma domande per moduli che nulla hanno a che vedere con prodotti Arduino, fatti da altri produttori che hanno semplicemente utilizzato/sfruttato l'IDE per sviluppare un loro "core" e facilitare la programmazione delle loro schede, come le schede WeMos o come le schede NodeMcu ... troverebbero probabilmente più risposte sul loro relativo forum di supporto ... ::slight_smile:

Guglielmo

Un' ultima cosa ... ho una decina di WeMod D1 Pro Mini attive da mesi in casa (però sono configurate solo come server) e non ho mai avuto problemi come quelli che descrivi (... anzi, NON ho proprio mai avuto alcun problema).

Alcune sono collegare direttamente ad un access-point della "UinFi" altre lo raggiungono tramite un repeater della "Amped" ...
... magari è effettivamente un problema del tuo access-point ... ::slight_smile:

Perché non provi con i banali programmi di esempio forniti assieme al "core" ... solo server, solo client, senza tanti "fronzoli" e verifichi se il problema c'è anche con i singoli semplici esempi?

Guglielmo

Ho caricato di tutto e di piu' per fare le verifiche. Ho iniziato appunto con i vari programmi di base. A un router D-Link del 2005 addirittura non si ci vogliono neanche connettere, nonostante qualsiasi altro dispositivo si connette regolarmente.

Riguardo al fatto che le librerie non le pago, sinceramente avrei preferito pagarle piuttosto che stare 3 giorni 24 ore no stop a cercare soluzioni senza venirne a capo.

Poi riguardo alle Wemo D1 e NodeMCU, dispongo anche delle schede uno e mega, a cui devo accoppiare l'esp, quindi non e' che postare qui il messaggio sia tanto sbagliato. Capisco probabilmente la soluzione non sia abbastanza facile da trovare e quindi conviene spostarsi nei forum inglesi, meglio se specifici delle case madri, ma considerando che sono periferiche di largo uso, ho voluto provare qui se magari qualcuno ha avuto lo stesso problema, visto che dalle varie ricerche su internet si intravede che alcuni lo hanno avuto e lo hanno risolto per volonta' divina, come ad esempio quelli che dicono di averlo risolto attivando il debug.

Il mio problema principale e' rilevare la perdita di connessione in modo tale da riavviare l'ESP, ma non essendo molto esperto in materia di ESP confiido nei luminari del caso per una soluzione indolore. Tra l'altro io da quando sono iscritto a questo forum ho cercato in qualche modo di dare qualche consiglio a chi si e' trovato in difficolta'....

Pasquale

Hai provato a verificare la versione del firmware? Magari hanno un firmware vecchio ...

Come ti ho detto nel post #4 ... io ne ho una decina (... oltretutto pagate quattro soldi su AliExpress) che sono mesi che monitorizzano alcuni sensori e rendono i dati disponibili (... fanno da server e le interrogo da una applicazione sotto macOS) e NON ho mai avuto questo problema.

Ma se, ad esempio, ad intervalli regolari (... che so io, ogni 60 secondi), imposti sulla WeMos un ping verso il gateway della tua rete ... il ping funziona o anche quello cessa di dare informazioni ? Perché, se cessa di dare informazioni allora almeno hai trovato il modo di rilevare quando avviene il problema ... ::slight_smile:

Guglielmo

La Wemos e il NodeMCU sono nuove di zecca. Il ping l'ho provato da pc verso i dispositivi, e il ping risponde correttamente. Dentro i dispositivi tutti i comandi rispondono correttamente, tranne la ricezione dati dai client. Cerchero' di provare anche a pingare il router dai dispositivi, tempo di risucire a capire il modo di fare il ping al gateway.

Pasquale

pascal69:
Cerchero' di provare anche a pingare il router dai dispositivi, tempo di risucire a capire il modo di fare il ping al gateway.

Usa QUESTA ... è banale :wink:

Guglielmo

io posso portare solo la mia di esperienza, ma è ampiamene positiva, con le Nodemcu.
ho due nodemcu e una wemos d1 (R1 quindi vecchia), in servizio regolare senza casini di sorta, mai avuto un problema.
gli unici problemi di connessione me li dava una nodeMCU che aveva un cavo "ciucco", capito quasi subito
ma mi viene una considerazione: ha considerato che se una nodemcu risponde al ping è ovviamente connessa?
se ho capito bene a te rispondono al ping, secondo me è il programma che non gira, non la parte wifi-TCP IP

Standardoil:
... ma mi viene una considerazione: ha considerato che se una nodemcu risponde al ping è ovviamente connessa?
se ho capito bene a te rispondono al ping, secondo me è il programma che non gira, non la parte wifi-TCP IP

Mmmm ... non è detto, la risposta al ping è solo la risposta ad un pacchetto ICMP (molto più semplice) mentre il resto coinvolge lo stack TCP/IP e, in teoria, potrebbe andare in crash solo detta parte e continuare a funzionare la parte ICMP ... ::slight_smile:

Guglielmo

Sì, scusa, aveva scritto telnet, io pensavo telnet ma ho scritto ping
Cmq anche ping richiede almeno Wi-Fi e cifratura wpa, oltre a riconoscere indirizzo ip

... ed in ogni caso ha scritto:

pascal69:
Ho caricato di tutto e di piu' per fare le verifiche. Ho iniziato appunto con i vari programmi di base. A un router D-Link del 2005 addirittura non si ci vogliono neanche connettere, nonostante qualsiasi altro dispositivo si connette regolarmente.

... quindi, a quanto sembra, il problema non lo ha solo con il suo programma, ma anche con gli esempi a corredo ::slight_smile:

Guglielmo

Usa uno sketch che periodicamente stampa una sorta di stato sulla seriale. PEr esempio potrebbe stampare il risultato di un ping oppure periodicamente prendere una pagina web, quello della pagina web dovrebbe essere tra gli esempi.
Giusto per capire se non si tratta di una incompatibilità con l'Access Point o di un problema di segnale debole o disturbato.

Il problema non e' tanto semplice ed e' pure su larga scala. Ieri sera ho letto cercando notizie su internet che alcune librerie causano questo problema ed altre librerie resettano il dispositivo. Ho letto che e' un problema legato a qualche bug di allocazione memoria. Stamattina ho provato ad attivare il debug mettendo l'istruzione Serial.setDebugOutput(true); subito dopo la Serial.begin e sembra che tutto funziona senza alcun problema. Considerato che sono talmente "fortunato" di poter replicare il problema in qualsiasi momento e di poter fare tutti i test possibili e immaginabili, mi metto a disposizione di coloro che hanno scritto le librerie nel caso in cui avessero bisogno qualsiasi cosa. Premetto che sono nel campo della programmazione e della microelettronica da oltre 30 anni per lavoro, quindi per me parlare con le macchine e' pane quotidiano in qualsiasi linguaggio....

Riguardo al Ping avevo gia' scaricato la libreria e stavo giusto analizzando la callback per ottenere tutte le informazioni in debug, ti ringrazio tantissimo.

Pasquale

pascal69:
... Considerato che sono talmente "fortunato" di poter replicare il problema in qualsiasi momento e di poter fare tutti i test possibili e immaginabili, mi metto a disposizione di coloro che hanno scritto le librerie nel caso in cui avessero bisogno qualsiasi cosa.

Questo però devi andarlo a dire sui forum dei rispettivi produttori e autori dei moduli del ESP8266 ... che NON sono di sicuro qui sul forum Italiano di Arduno :smiley:

Guglielmo

Mi sono premurato ad esporre il problema anche da quelle parti.

Grazie
Pasquale

pascal69,
anche io non ho avuto problemi con gli ESP8266 per cui il tuo mi incuriosisce.
Io ho proposto il ping ma anche lesempio ESP8266WiFi/WiFiClientBasic può andare bene, chiedendo una pagina web invece della 192.168.1.1.

Se usi sempre lo stesso alimentatore magari è quello a dare problemi?

Inoltre, ho capito male ma al ping la ESP8266 risponde ma non risponde più il webserver?

Il router D-Link del 2005 che sicurezza usa? HAi provato anche con la sicurezza disabilitata? Te lo chiedo perché credo che l’ESP8266 usi solo la WPA2 che forse nel 2005 ancora non c’era.

zoomx, non uso sempre lo stesso alimentatore ma i problemi sono sempre gli stessi.
La ESP8266 risponde al ping ma non risponde piu' il webserver.
Il router d-link e' l'ultimo problema, verifichero' quanto detto da te e ti faro' sapere.

In ogni caso con il debug attivo e' da stamattina che sta funzionando senza alcun problema, quindi e' chiaro che e' un problema di software e non di hardware.

Pasquale

Nella maggior parte degli sketch in effetti uso sempre la seriale per sapere che sketch ho messo e spesso come debug sempre attivo.
Può darsi che sia per questo che non mi è mai capitato un problema del genere.