Here's how I handle WiFi network disconnects to automatically reconnect:
Code: Select all
/*
* Demonstration of working WiFi101 network reconnection.
* Example for Adafruit Feather M0 WiFi with ATWINC1500.
*
* November 2021
* Working with Arduino 1.8.16 and WiFi101 firmware version 19.6.1
*
*/
#include <SPI.h>
#include <WiFi101.h> // For WiFi 101 shield or MKR1000
char wifi_ssid[] = "YourWiFiSSID"; // WiFi network SSID (name)
char wifi_pass[] = "YourWiFiPassword"; // WiFi network password
char ping_target[] = "www.google.com"; // A host to ping for a simple test
void setup(){
//Configure pins for Adafruit ATWINC1500 Feather
WiFi.setPins(8,7,4,2);
Serial.begin(115200);
// Make initial WiFi connection
Serial.println("Beginning new WiFi connection.");
WiFi.begin(wifi_ssid, wifi_pass);
delay(1000);
while (WiFi.status() != WL_CONNECTED) {
PrintWifiStatus();
delay(2000);
}
Serial.println("Established WiFi connection.");
}
void loop()
{
int PingReturn;
// Make sure we still have a good WiFi connection
if (WiFi.status() != WL_CONNECTED) {
// Uh oh -- something has gone wrong
PrintWifiStatus();
Serial.println("No WiFi connection. Starting attempt to reconnect.");
WiFi.disconnect();
delay(1000);
WiFi.end();
delay(1000);
// The timing of these delay() calls is somewhat arbitrary...
// But I suspect some of these delays are neccessary.
Serial.println("Beginning new WiFi connection.");
WiFi.begin(wifi_ssid, wifi_pass);
delay(10000);
while (WiFi.status() != WL_CONNECTED) {
PrintWifiStatus();
Serial.println("Failed to connect to WiFi. Trying again.");
WiFi.disconnect();
delay(500);
WiFi.end();
delay(500);
WiFi.begin(wifi_ssid, wifi_pass);
delay(10000);
}
PrintWifiStatus();
Serial.println("Restablished WiFi connection.");
}
// Use WiFi to ping a remote host
Serial.print("Ping target ");
Serial.print(ping_target);
Serial.print(": ");
PingReturn = WiFi.ping(ping_target);
if (PingReturn >= 0) {
Serial.print("Success! RTT = ");
Serial.print(PingReturn);
Serial.println(" ms");
}
else {
Serial.print("Failed! Error code: ");
Serial.println(PingReturn);
}
delay(10000);
}
// Print the current WiFi network status to the serial terminal
void PrintWifiStatus()
{
// Descriptions are taken from the Arduino library documentation
switch (WiFi.status()) {
case WL_CONNECTED:
Serial.println("Connected to a WiFi network.");
break;
case WL_AP_CONNECTED:
Serial.println("Connected in Access Point mode.");
break;
case WL_AP_LISTENING:
Serial.println("Listening for connections in Access Point mode.");
break;
case WL_NO_SHIELD:
Serial.println("No WiFi shield is present.");
break;
case WL_IDLE_STATUS:
Serial.println("Temporary status assigned when WiFi.begin().");
break;
case WL_NO_SSID_AVAIL:
Serial.println("No SSIDs are available.");
break;
case WL_SCAN_COMPLETED:
Serial.println("Scan of networks is completed.");
break;
case WL_CONNECT_FAILED:
Serial.println("Connection failed for all the attempts.");
break;
case WL_CONNECTION_LOST:
Serial.println("The connection is lost.");
break;
case WL_DISCONNECTED:
Serial.println("Disconnected from a network.");
break;
default:
Serial.println("Undefined WiFi status.");
}
return;
}