riavvio dopo perdita connessione wifi

Salve a tutti, ho un relè collegato ad un wemos d1,che a volte, forse a causa della lontananza dal router si disconnette o si blocca e non risulta più raggiungibile, ma se stacco e riattacco la corrente torna a funzionare regolarmente… il problema avviene in maniera totalmente randomica,magari non si presenta per settimane e poi me lo fa 2 volte in poche ore…così pensavo di inserire nello sketch un controllo per verificare la connessione wifi e nel caso non fosse attiva si dovrebbe riavviare… non sono molto esperto e vorrei un vostro consiglio…che ne dite,sarebbe possibile?

Lo sketch che utilizzo ora è:

#include <ESP8266WiFi.h>

const char* ssid = "xxx";
const char* password = "xxx";

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);

int pinLed = D5; 

void setup() {
  Serial.begin(115200);
  delay(10);

  // prepare GPIO2
  pinMode(pinLed, OUTPUT);
  digitalWrite(pinLed, 0);
  
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Start the server
  server.begin();
  Serial.println("Server started");

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

void loop() {
  // Check if a client has connected
  WiFiClient 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)
    val = 0;
  else if (req.indexOf("/gpio/1") != -1)
    val = 1;
  else {
    Serial.println("invalid request");
    client.stop();
    return;
  }

  // Set GPIO2 according to the request
  digitalWrite(pinLed, val);
  
  client.flush();

  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now ";
  s += (val)?"high":"low";
  s += "</html>\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
}

Grazie mille

Buongiorno, essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD ([u]spiegando bene quali conoscenze hai di elettronica e di programmazione[/u] ... possibilmente [u]evitando[/u] di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :)

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. ;)

Ok, chiedo scusa per la mia mancanza... ho appena provveduto presentandomi nell'apposita sezione... grazie

n3dv3d: pensavo di inserire nello sketch un controllo per verificare la connessione wifi e nel caso non fosse attiva si dovrebbe riavviare...

Semplice, fai una funzione che controlla la presenza della connessione ed in caso negativo cerca di ristabilirla (di fatto sono le istruzioni che hai messo nel setup), quindi la richiami nel setup() e nel loop() (ma basta pure solo nel loop).

Questo è un esempio:

...
void CheckWiFi() {
  if (WiFi.status() != WL_CONNECTED)
  {
    Serial.println();
    Serial.print("Connecting to ");
    Serial.println(ssid);
    while (WiFi.status() != WL_CONNECTED) {
      Serial.print(".");
      delay(500);
    }
    Serial.println("");
    Serial.println("WiFi connected");
  }
}

void setup() {
  Serial.begin(115200);
  delay(10);

  // prepare GPIO2
  pinMode(pinLed, OUTPUT);
  digitalWrite(pinLed, 0);

  // Connect to WiFi network
  CheckWiFi();

  // Start the server
  server.begin();
  Serial.println("Server started");

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

void loop() {
  
  CheckWiFi();
  
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
...

Ciao, innanzi tutto grazie mille per la risposta... stasera proverò la modifica che mi hai suggerito... ma secondo te potrebbe essere solo un problema di connessione wifi o potrebbe andare in blocco lo sketch?

Non posso saperlo senza la mia sfera di cristallo che oggi purtroppo ho lasciato a casa... ;)

Scherzi a parte, realmente, non posso sapere se ti si blocca la MCU, ma poiché il programma che hai postato non prevede alcun recupero della connessione, è chiaro che se per qualche ragione perde la connessione (es. si spegne il router o esci dalla sua portata) sicuramente non sarà più raggiungibile.

Prova e fammi sapere.

Ok, ieri sera ho modificato lo sketch con i tuoi suggerimenti... ora vediamo come si comporta.... per intanto grazie mille

La connessione WiFi viene messa in piedi con:

WiFi.begin(ssid, password);

Quando cade si riconnette automaticamente. Il codice postato da DocDoc non fa altro che aspettare che torni in piedi da sola.

Magari si potrebbe anche modificare la potenza di trasmissione (tra 0.0 e 20.0) per vedere se cambia qualcosa:

WiFi.setOutputPower(10.0);
WiFi.begin(ssid, password);

Claudio_FF:
Quando cade si riconnette automaticamente.

Si ma la cosa strana è che l’OP parla di una WeMos D1, anche io questa cosa l’avevo con un WeMos D1 che a me non si riconnetteva da solo (tra l’altro ad un altro WeMos D1 impostato come AP), ed era per questo che avevo fatto la modifica. Non so se magari è un bug della versione che ho (io avevo una D1R1 non la più recente D1R2 o D1 mini) ma ho risolto in quel modo.

n3dv3d:
Ok, ieri sera ho modificato lo sketch con i tuoi suggerimenti… ora vediamo come si comporta… per intanto grazie mille

Ah, devo precisare: il codice di esempio l’ho scritto “a memoria”, ora non ritrovo il progetto originario (devo cercare meglio a casa, sicuramente ce l’ho) ma forse nella CheckWiFi ci avevo messo un reconnect (o al limite un altro begin), se non ti funziona prova a metterlo anche tu:

void CheckWiFi() {
 if (WiFi.status() != WL_CONNECTED)
 {
   WiFi.reconnect();  // <-- QUESTO
   Serial.println();
   Serial.print("Connecting to ");
   Serial.println(ssid);
   while (WiFi.status() != WL_CONNECTED) {