WiFi101 ATWINC1500 Network Reconnect

For CircuitPython issues, ask in the Adafruit CircuitPython forum.

Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.
Locked
User avatar
guytonomy
 
Posts: 3
Joined: Sat May 26, 2018 10:00 am

WiFi101 ATWINC1500 Network Reconnect

Post by guytonomy »

Hi All -- I was having a lot of trouble getting my WiFi to reconnect (for example, when the AP reboots). Searching the forums it seems like this is a common thread. I think I've figured it out and this code may help someone.

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;
}



Locked
Please be positive and constructive with your questions and comments.

Return to “Wireless: WiFi and Bluetooth”