Wemos d1 mini - relè - webserver

Buonasera a tutti,
ho bisogno del vs. aiuto perchè dopo parecchio tempo ho ripreso il mio interruttore wifi,
composto da schedina wemos d1 mini + relè + webserver ....
il problema che non riesco a risolvere è che dopo un certo tempo la wemos perde la connessione
o meglio funziona solo se faccio un reset fisico direttamente sulla scheda( cosa non fattibile una volta chiusa la scheda nella sua scatola).
Ho fatto molte prove e un sacco di copia e incolla( forse troppi) ma nulla da fare!
l'unica cosa che vi posso dire è che avendo 3 schede uguali le ho provate tutte e tre e il problema persiste
per cui penso che il problema ( ed è per questo che ho scritto qui )sia del mio software.
vi allego lo sketch .. se qualcuno può darmi una mano ...come sempre ,,grazie in anticipo.

MassiBal

[code]
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <ArduinoOTA.h>
#include <ESP8266WebServer.h>
#include <WiFiClient.h>

#ifndef STASSID
#define STASSID "xxxxxxxx"
#define STAPSK  "xxxxxxxx"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

const char* www_username = "xxxxxxxx";
const char* www_password = "xxxxxxxxx!";

#define GPIO13 13

IPAddress ip(192, 168, 1, x);
IPAddress gateway(192, 168, 1, 254);
IPAddress subnet(255, 255, 255, 0);
IPAddress dns(213, 144, 64, 1);
// dns secondaario dns(213,144,66,1);
ESP8266WebServer server(xx);// porta ext : xxxx

String response_message = "";

//_____________________________________________________
void setup() {
  pinMode(GPIO13, OUTPUT);
  Serial.begin(9600);
  Serial.setDebugOutput(true);
  digitalWrite(GPIO13, HIGH);
  WiFi.config(ip, gateway, subnet, dns);
  WiFi.setOutputPower(10.0);
  WiFi.setAutoReconnect(true);
  WiFi.persistent(false);
  WiFi.mode(WIFI_OFF);
  WiFi.mode(WIFI_STA);
  delay(500);

  WiFi.begin(ssid, password);

  if (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("WiFi Connect Failed! Rebooting...");
    delay(500);
    WiFi.forceSleepBegin();
    wdt_reset();
    while (1)wdt_reset();
  }

  CheckWiFi();
  ArduinoOTA.begin();

  server.begin();
  server.on("/", []() {
    if (!server.authenticate(www_username, www_password))
      return server.requestAuthentication();
    rootPageHandler();
  });
  server.on("/", rootPageHandler);
  server.on("/gpio", gpioPageHandler);
  Serial.println("HTTP server started");

}
//______________________________________________________
void loop()
{
  if (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("WiFi Connect Failed! Rebooting...");
    delay(500);
    WiFi.forceSleepBegin();
    wdt_reset();
    ESP.restart();
    while (1)wdt_reset();
  }
  CheckWiFi();
  ArduinoOTA.handle();
  server.handleClient();
}
void CheckWiFi() {
  delay (500);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
}

void rootPageHandler()
{

  String response_message = "<html><head><title>CONTROLLO RELE'</title></head>";
  response_message += "<body style=\"background-color:LightSlateGray\"><h1><center>CONTROLLO RELE'</center></h1>";

  if (WiFi.status() == WL_CONNECTED)
  {

    response_message += "<center>Rete WLAN Status:     CONNESSA </center>
" + String(WiFi.SSID()) + "  -->IP: " + String(WiFi.localIP().toString());
  }
  else
  {
    response_message += "<center>WLAN Status: Disconnected</center>
";
  }
  response_message += "
";
  response_message += "
";
  response_message += "
";


  //response_message += "<ul><li><a href=\"/wlan_config\">Configurazione Rete WiFI</a></li>";
  response_message += "<li><a href=\"/gpio\">Controllo Rele'</h4></li></ul>";
  response_message += "</body></html>";

  server.send(200, "text/html", response_message);
}

/* GPIO page allows you to control the GPIO pins */
void gpioPageHandler()
{

  // Check if there are any GET parameters
  if (server.hasArg("gpio13"))
  {
    if (server.arg("gpio13") == "1")
    {
      digitalWrite(GPIO13, LOW);
    }
    else
    {
      digitalWrite(GPIO13, HIGH);
    }
  }

  String response_message = "<html><head><title>ESP8266 Webserver</title></head>";
  response_message += "<body style=\"background-color:Silver\"><h1><center>Domotica </center></h1>";
  response_message += "<form method=\"get\">";

  response_message += "IP CAM   :
";
  response_message += "
";
  response_message += "
";


  if (digitalRead(GPIO13) == HIGH)
  {
    response_message += "<input type=\"radio\" name=\"gpio13\" value=\"1\" onclick=\"submit();\">On
";
    response_message += "
";
    response_message += "<input type=\"radio\" name=\"gpio13\" value=\"0\" onclick=\"submit();\" checked>Off
";
  }
  else
  {
    response_message += "<input type=\"radio\" name=\"gpio13\" value=\"1\" onclick=\"submit();\" checked>On
";
    response_message += "
";
    response_message += "<input type=\"radio\" name=\"gpio13\" value=\"0\" onclick=\"submit();\">Off
";
  }

  response_message += "</form></body></html>";

  server.send(200, "text/html", response_message);
}

[/code]

Tutta la sezione di verica connessione / reset etc etc è inutile e l'ESP8266 può gestire autonomamente la riconnessione in caso di caduta e ripristino del WiFi.
In passato questa funzionalità ogni tanto non funzionava a dovere, ma nelle ultime release l'hanno resa più stabile e va alla grande.

Visto che hai già impostato WiFi.setAutoConnect(true); deve funzionare anche nel tuo sketch.

Inoltre eliminerei l'istruzione WiFi.persistent(false); perché (credo) che in questo modo l'ESP non vada a salvare nella locazione di memoria prevista le credenziali WiFi e di conseguenza rende necessario il reset per instaurare una nuova connessione.

Anche il setup dei dns secondo me è di troppo... ci pensa il router a quello. A meno di particolari esigenze non è necessario impostarli manualmente.
Cosi come per l'indirizzo IP in realtà: visto che hai incluso la libreria ESP8266mDNS.h perché non la usi? In questo modo non devi ogni volta andare a preoccuparti di che indirizzo viene assegnato al wemos, ma puoi usare direttamente l'hostname: http://.local

const char* hostname = "esp8266Webserver";

void setup(){
.....
  if(MDNS.begin(hostname){
    Serial.println("MDNS responser started");
    Serial.println("Open the browser at address http://esp8266Webserver or http://esp8266Webserver.local");
   }
.....
}


void loop(){
....
MDNS.update();
....
}

P.S.
Se hai bisogno di eseguire qualcosa ogni volta che c'è connessione, puoi usare gli event handler ed associare una funzione di callback (dai un'occhiata all'esempio ESP8266WiFi -> WiFiEvents.ino per vedere come).

P.S.S.
La variabile globale response_message è inutile visto che poi usi quelle locali nelle funzioni.

Ti ringrazio per tutti gli accorgimenti da te sottolineati ,che adesso che li hai evidenziati è chiaro che sono frutto del copia incolla forsennato dovuto alla mia disperazione.. provvedo subito all'eliminazione ...
mi rimane però un dubbio potrebbe quindi essere il **WiFi.persistent(false); ** a causare la disconnessione del wemos ?

inoltre cosa intendi per "nelle ultime release l'hanno resa più stabile e va alla grande ", ?

grazie mille e buona giornata

Massibal

Non proprio, secondo me causa la NON riconnessione.

Per il discorso delle release, mi riferisco alla versione del core ESP8266 per Arduino: la più recente è al momento la versione 2.7.4.

In passato anche io avevo riscontrato problemi con la riconnessione automatica... a volte andava a volte no.
Ma ormai è da un po' che uso questa opzione e funziona come ci si aspetta, quindi presumo che abbiano sistemato qualche bug.

Guarda, sto testando un mia libreria con un Wemos D1 mini proprio in questo momento... abilito e disabilito l'Access Point del telefono e lui si riconnette senza problemi ogni volta.

Tutto ciò che faccio nel setup è questo:

WiFi.setAutoReconnect(true);
WiFi.begin(ssid, password);

etc etc

chiaro , hai ragione ...dovrò fare un pò di pulizia !

scusa l'ignoranza ma come faccio a vedere quale versione del core ESP8266 per Arduino ho installato ? ?

grazie

Gestore schede dell'Arduino IDE.

scusami , ho formulato male la domanda ... come faccio ad installare la versione del core ESP8266 2.7.4 ?

grazie
Massibal

o meglio ... io ho selezionato sull'ide arduino la WEMOS d1 R2e mini , è corretto ?

garzie

ti ringrazio molto
per il momento ... ho fatto l' aggiornamento del core ESP8266 all'ultima versione !!

domani provo con le modifiche che mi hai consigliato.
buona serata
massibal

Leggo solo ora, ma vedo che hai risolto con la versione.

Facci sapere se si risolve anche il problema della riconnessione automatica!

buongiorno,
ho lasciato acceso router e scheda wemos con relativo relè tutta la notte
poi questa mattina ho provato e funzionava.. ora purtroppo ho provato dal lavoro e mi dice
"impossibile raggiungere sito" -- ERR_ADDRESS_UNREACHABLE

non so se a questo punto c'è qualche problema hardware ... oggi provo a usare solo la wemos collegata diretta al pc e un semplice led .( senza relè e alimentatore esterno)..poi tidico!
grazie
Massibal

massibal:
... poi questa mattina ho provato e funzionava.. ora purtroppo ho provato dal lavoro e mi dice
"impossibile raggiungere sito" -- ERR_ADDRESS_UNREACHABLE

... stai provando dall'esterno della tua rete ... hai attivato NAT sul router (con tutti i rsichi di dare accesso dall'esterno ad un web server giocattolo come quello del ESP8266) ? ? ?

Guglielmo

buongiorno Guglielmo,
veramente ho aperto una porta specifica ... ma il problema non penso che sia legato all'accesso da esterno rete perchè a casa facevo le prove anche dal cellulare con rete dati esterna e mi collego ad un IP statico con porta dedicata ...
purtroppo non capisco proprio a cosa sia dovuto questo disconnessione e soprattutto perchè per ricollegarsi ho bisogno di un reset!:frowning:

grazie
massimiliano

massibal:
buongiorno Guglielmo,
veramente ho aperto una porta specifica ...

Ok, quindi, come ti chiedevo hai fatto NAT (Network address translation) sul router ... tu sai vero che sei esposto a qualsiasi attacco da parte della rete?

Non mi meraviglierebbe che quella porta è stata immediatamente individuata da uno delle diverse migliaia di BOT che girano per trovare certe cose e attaccata con diverse connessioni o cose simili ... ::slight_smile:

Guglielmo

azz... no nessun NAT ...oltre ad implementare il NAT immediatamente ....
come posso verificare se mi hanno BOTato ????
grazie

massibal:
azz... no nessun NAT ...oltre ad implementare il NAT immediatamente ....

Se tu hai aperto la porta e l'hai riindirizzata sul ESP ... HAI fatto un NAT :smiley: ... chiunque vada sul IP:port praticamente arriva sul tuo ESP ... :o :o :o

ESP8266 è un bel oggetto, ma il suo web-server e le sue capacità NON sono assolutamente adatte ad essere aperte su una rete pubblica dove, chiunque, lanciando 10 connessioni, te lo ammazza.

E' fatto per essere usato all'interno della tua rete, magari ricevendo comandi da un qualche cosa di interno che, in modo sicuro, riceve comandi dall'esterno. Hai presente tutti i Sonoff che sono in giro? Ne hai mai visto uno a cui accedi direttamente? NO, passi sempre per eWeLink in modo sicuro, lui poi, attraverso la tua rete e comanda gli ESP ...

Guglielmo

grazie ...
diciamo che ho messo una pagina di autenticazione per poter accedere alla wemos...
con admin e password.,...

la cosa che mi interessa è però capire se il mio programmino è ok , o se ci sono errori che potrebbero causare questo problema... molto fastidioso!!

grazie
Massibal

oggi pomeriggio ,ho notato che la wemos si disconnette ma poi dopo un tempo che non so quantificare , potrebbe essere 30 minuti, dopo però
si riconnette da sola senza reset infatti riesco a comunicare senza dover rifare il RESET .... avete idee ?
grazie

oggi ho notato che se si impalla ma invio tre o 4 richieste al webserver , poi lui riparte ( senza dover fare il reset) ... qualcuno mi sa aiutare , se posso fare qualche accrocchio software ,?

grazie mille

Metti il codice attuale ed abilita il debug cosi proviamo a capire cosa succede.

Debug port: serial
Debug level: quello + completo cosi vediamo tutti i messaggi