Come riconnettere arduino alla rete Wifi se perde il segnale

Ciao a tutti,

mi sono fatto piccolo serverino con Arduino e moduletto wifi ESP8266.

Una volta acceso Arduino si collega alla rete di casa mia ed è pronto per accettare comandi tramite chiamate HTTP metodo GET.

La cosa che vi chiedo è questa, funziona tutto bene fino a quando il mio router non si riavvia, magari manca la corrente, magari inavvertitamente ho staccato la presa, a quel punto per raggiungere nuovamente Arduino devo per forza di cose accenderlo e spegnerlo. Questa procedura mi secca un pò. Posso modificare il mio sketch per fare in modo che nel momento in cui perde il segnale wifi si ricollega?

#include <ESP8266WiFi.h>
#include <String.h>
#include <SPI.h>
//#include <dht11.h>
//#include "EmonLib.h"                   // Include Emon Library
//EnergyMonitor emon1;                   // Create an instance


// the IP address for the shield:
IPAddress ip(192, 168, 110, 177);   
IPAddress ipGateway (192, 168, 110, 1);   
IPAddress dns(255,255,255,0); 
const char* ssid     = "ssdi";
const char* password = "Er$d";

int status = WL_IDLE_STATUS;

WiFiServer server(80);

int pin1 = 1; // LED pin
int pin2 = 2; // LED pin
int pin3 = 3; // LED pin
int pin4 = 4; // LED pin
int pin5 = 5; // LED pin
int pin6 = 6; // LED pin
int pin7 = 7; // LED pin
int pin8 = 8; // LED pin
int pin9 = 9; // LED pin
int pin10 = 10; // LED pin
int pin11 = 11; // LED pin
int pin12 = 12; // LED pin
int pin13 = 13; // LED pin
String readString; 
boolean LEDON = false; 



String header;
// Auxiliar variables to store the current output state
String output5State = "off";
String output4State = "off";
const int output5 = 5;
const int output4 = 4;



/*-----( Declare objects )-----*/
//dht11 DHT11;

/*-----( Declare Constants, Pin Numbers )-----*/
//#define DHT11PIN 4

  void setup(){
    //INIZIALIZZO I PIN A OFF
    for (int i=2; i<=9; i++) {
       pinMode(i, OUTPUT);
       digitalWrite(i, LOW);
       delay(500);
    }    
    Serial.begin(115200);
    // Initialize the output variables as outputs
    pinMode(output5, OUTPUT);
    pinMode(output4, OUTPUT);
    // Set outputs to LOW
    digitalWrite(output5, LOW);
    digitalWrite(output4, LOW);
  
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }
    server.begin();
  }

  int value = 0;
 
  void loop(){
    Serial.println("loop."); 
    WiFiClient client = server.available();   // Listen for incoming clients
  
    if (client) {                             // If a new client connects,
      Serial.println("New Client.");          // print a message out in the serial port
      String currentLine = "";                // make a String to hold incoming data from the client
      while (client.connected()) {            // loop while the client's connected
        if (client.available()) {             // if there's bytes to read from the client,
          char c = client.read();             // read a byte, then
          Serial.write(c);                    // print it out the serial monitor
          header += c;
          if (c == '\n') {                    // if the byte is a newline character
            // if the current line is blank, you got two newline characters in a row.
            // that's the end of the client HTTP request, so send a response:
            if (currentLine.length() == 0) {
              // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
              // and a content-type so the client knows what's coming, then a blank line:
              client.println("HTTP/1.1 200 OK");
              client.println("Content-type:text/html");
              client.println("Connection: close");
              client.println();
              
              // turns the GPIOs on and off
              if (header.indexOf("GET /5/on") >= 0) {
                Serial.println("GPIO 5 on");
                output5State = "on";
                digitalWrite(output5, HIGH);
              } else if (header.indexOf("GET /5/off") >= 0) {
                Serial.println("GPIO 5 off");
                output5State = "off";
                digitalWrite(output5, LOW);
              } else if (header.indexOf("GET /4/on") >= 0) {
                Serial.println("GPIO 4 on");
                output4State = "on";
                digitalWrite(output4, HIGH);
              } else if (header.indexOf("GET /4/off") >= 0) {
                Serial.println("GPIO 4 off");
                output4State = "off";
                digitalWrite(output4, LOW);
              }
              
              // Display the HTML web page
              client.println("<!DOCTYPE html><html>");
              client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
              client.println("<link rel=\"icon\" href=\"data:,\">");
              // CSS to style the on/off buttons 
              // Feel free to change the background-color and font-size attributes to fit your preferences
              client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
              client.println(".button { background-color: #195B6A; border: none; color: white; padding: 16px 40px;");
              client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
              client.println(".button2 {background-color: #77878A;}</style></head>");
              
              // Web Page Heading
              client.println("<body><h1>ESP8266 Web Server</h1>");
              
              // Display current state, and ON/OFF buttons for GPIO 5  
              client.println("<p>GPIO 5 - State " + output5State + "</p>");
              // If the output5State is off, it displays the ON button       
              if (output5State=="off") {
                client.println("<p><a href=\"/5/on\"><button class=\"button\">ON</button></a></p>");
              } else {
                client.println("<p><a href=\"/5/off\"><button class=\"button button2\">OFF</button></a></p>");
              } 
                 
              // Display current state, and ON/OFF buttons for GPIO 4  
              client.println("<p>GPIO 4 - State " + output4State + "</p>");
              // If the output4State is off, it displays the ON button       
              if (output4State=="off") {
                client.println("<p><a href=\"/4/on\"><button class=\"button\">ON</button></a></p>");
              } else {
                client.println("<p><a href=\"/4/off\"><button class=\"button button2\">OFF</button></a></p>");
              }
              client.println("</body></html>");
              
              // The HTTP response ends with another blank line
              client.println();
              // Break out of the while loop
              break;
            } else { // if you got a newline, then clear currentLine
              currentLine = "";
            }
          } else if (c != '\r') {  // if you got anything else but a carriage return character,
            currentLine += c;      // add it to the end of the currentLine
          }
        }
      }
      // Clear the header variable
      header = "";
      // Close the connection
      client.stop();
      Serial.println("Client disconnected.");
      Serial.println("");
    }
}
  
  void sendHeader(WiFiClient client) {
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println();
   // client.print("<html><head><title>");
   // client.print(title);
   // client.println("</title><body>");
  }
  
  
  String getValue(String data, char separator, int index)
  {
    int found = 0;
    int strIndex[] = {0, -1};
    int maxIndex = data.length()-1;
  
    for(int i=0; i<=maxIndex && found<=index; i++){
      if(data.charAt(i)==separator || i==maxIndex){
          found++;
          strIndex[0] = strIndex[1]+1;
          strIndex[1] = (i == maxIndex) ? i+1 : i;
      }
    }
  
    return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
  }//fine metodo getvalue

ciao

si potrebbe sviluppare un controllo ed eventuale ri-connessione al tuo wifi nel caso ti cada, faccio un esempio poi tu adattalo alla tua esigenza :slight_smile:

int Max_Test  = 0;
  while((Wifi.status()!= WL_CONNECTED)&& (Max_Test<5)){ //numero di tentaivi massimo 5
    WiFi.begin(ssid, password);
    delay(5000);    //tempo tra un tentativo e l'altro
    Max_Test++;
    }

è un codice buttato giù alla veloce, prova a vedere se funziona :slight_smile:

Ricorda solo che dopo che è stata ristabilita la connessione va riportata la variabile Max_Test a zero :slight_smile:

MD

Io ho fatto così in un mio progetto (ripetitore di telecomando Sky via WiFi, su una WeMos D1l codice te l'ho leggermente ritoccato per una UNO):

void setup() {
  ...
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  pinMode(LED_BUILTIN, OUTPUT);
  ...
}

void loop() {
  if (WiFi.status() != WL_CONNECTED)
    ConnectWiFi();
  ...
}

bool ConnectWiFi() {
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    digitalWrite(LED_BUILTIN, LOW);
    Serial.print(".");
    delay(200);
    digitalWrite(LED_BUILTIN, HIGH);
  }
  ipLocal = WiFi.localIP();
  IPAddress subnet = WiFi.subnetMask();
  Serial.println("");
  Serial.print ("WiFi connected ");
  Serial.print(ipLocal);
  Serial.print(" ");
  Serial.println(subnet);
}

Nel leggere il tuo post mi sono accorto di un errore nel mio codice postato dentro la condizione del while, ho dimenticato lo stato di WiFi.status()… lo modifico :slight_smile:

MD

Ok ti ringrazio molto anzi vi ringrazio molto per le risposte. Proverò ad applicare queste modifiche e vi tengo aggiornati.

provato il vostro codice sono un paio di giorni che tengo monitorato l’arduino provando a scollegare il router e ricollegarlo. Funzica :D:D:D:D

Bene bene :)

Sono contento :grinning:

Un saluto

MD