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
}
Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentartiIN 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.
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.
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) {