Go Down

Topic: riavvio dopo perdita connessione wifi (Read 128 times) previous topic - next topic

n3dv3d

Nov 11, 2019, 11:24 pm Last Edit: Nov 12, 2019, 02:54 am by gpb01
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 è:

Code: [Select]

#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

gpb01

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 (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando 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. ;)
Search is Your friend ... or I am Your enemy !

n3dv3d

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

docdoc

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:
Code: [Select]
...
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) {
...
Alex "docdoc"
- "Qualsiasi cosa, prima di rompersi, funzionava"

n3dv3d

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?

docdoc

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.
Alex "docdoc"
- "Qualsiasi cosa, prima di rompersi, funzionava"

n3dv3d

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

Claudio_FF

La connessione WiFi viene messa in piedi con:
Code: [Select]
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:
Code: [Select]
WiFi.setOutputPower(10.0);
WiFi.begin(ssid, password);
********* IF e SWITCH non sono cicli ! *********
**** Una domanda ben posta è già mezza risposta ****
*** La corrente si misura in mA, la quantità di carica in mAh ***

docdoc

#8
Nov 13, 2019, 02:01 pm Last Edit: Nov 13, 2019, 02:01 pm by docdoc
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.

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:

Code: [Select]
void CheckWiFi() {
 if (WiFi.status() != WL_CONNECTED)
 {
   WiFi.reconnect();  // <-- QUESTO
   Serial.println();
   Serial.print("Connecting to ");
   Serial.println(ssid);
   while (WiFi.status() != WL_CONNECTED) {
Alex "docdoc"
- "Qualsiasi cosa, prima di rompersi, funzionava"

Go Up