Conectar automáticamente tu ESP32 a la mejor red Wi-Fi

El ESP32 es una herramienta poderosa en el ámbito de la conectividad, especialmente cuando se trata de optimizar el acceso a redes Wi-Fi. Con el aumento de dispositivos conectados en entornos domésticos y profesionales, la capacidad de un dispositivo para elegir la red más fuerte disponible se vuelve crucial. A continuación, exploraremos dos métodos para conectar automáticamente tu ESP32 a la red Wi-Fi más fuerte, garantizando un rendimiento óptimo y una conexión estable.

Índice de contenido
  1. Conectar el ESP32 a la red Wi-Fi más fuerte
  2. Entendiendo el enfoque básico de RSSI
    1. Explicación del código básico
  3. Uso de la biblioteca WiFiMulti (Recomendado)
    1. Explicación del código WiFiMulti
  4. ¿Cuál método deberías elegir?

Conectar el ESP32 a la red Wi-Fi más fuerte

Asegurarse de que el ESP32 se conecte a la red Wi-Fi más fuerte es esencial para mantener un rendimiento óptimo. Este proceso es especialmente relevante en áreas donde hay múltiples puntos de acceso y la calidad de la señal puede variar considerablemente. Existen dos métodos principales para lograr esto:

  • Enfoque básico de RSSI
  • Uso de la biblioteca WiFiMulti (Recomendado)

En este artículo, vamos a profundizar en cada uno de estos métodos, explicando cómo funcionan y cómo puedes implementarlos para asegurar que tu ESP32 siempre esté conectado a la mejor red disponible.

Entendiendo el enfoque básico de RSSI

El primer método implica que el ESP32 escanee todas las redes Wi-Fi disponibles en su rango. Para cada red detectada, el dispositivo mide el Indicador de Fuerza de Señal Recibida (RSSI), que indica la calidad de la señal. El RSSI es un valor negativo; cuanto más cerca esté de cero, más fuerte será la señal. A continuación, el ESP32 compara los valores de RSSI de todas las redes y selecciona la que tenga la señal más fuerte.

A continuación, se presenta un fragmento de código que implementa este método. Asegúrate de reemplazar los SSIDs y contraseñas de ejemplo por tus credenciales de red reales antes de cargarlo en tu dispositivo.


// Reemplaza con tus credenciales de red
const char* ssidList[] = {"Red_1", "Red_2", "Red_3"};
const char* passwordList[] = {"contraseña1", "contraseña2", "contraseña3"};

Después de realizar estos cambios, puedes cargar el código en el ESP32. El siguiente bloque de código completo muestra cómo se realiza la conexión a la red más fuerte:

#include "WiFi.h"

// Reemplaza con tus credenciales de red
const char* ssidList[] = {"Red_1", "Red_2", "Red_3"};
const char* passwordList[] = {"contraseña1", "contraseña2", "contraseña3"};

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  Serial.println("Escaneando redes Wi-Fi...");

  int n = WiFi.scanNetworks();
  if (n == 0) {
    Serial.println("No se encontraron redes.");
    return;
  }

  int maxRSSI = -1000; // Inicializa con un valor de RSSI muy bajo
  int bestNetworkIndex = -1;

  for (int i = 0; i < n; ++i) {
    int rssi = WiFi.RSSI(i);
    Serial.printf("%d: %s, RSSI: %dn", i + 1, WiFi.SSID(i).c_str(), rssi);
    
    for (int j = 0; j  maxRSSI) {
        maxRSSI = rssi;
        bestNetworkIndex = j;
      }
    }
  }

  if (bestNetworkIndex == -1) {
    Serial.println("No se encontraron redes conocidas.");
  } else {
    Serial.printf("Conectando a la red más fuerte: %sn", ssidList[bestNetworkIndex]);
    WiFi.begin(ssidList[bestNetworkIndex], passwordList[bestNetworkIndex]);

    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
    }

    Serial.println("nConectado!");
    Serial.printf("Dirección IP: %sn", WiFi.localIP().toString().c_str());
  }
}

void loop() {
  // No hay nada que hacer aquí
}

Una vez que cargues el código, abre el Monitor Serial a 115200 baudios y presiona el botón EN. Verás una lista de redes cercanas y sus valores de RSSI. El ESP32 seleccionará automáticamente y se conectará a la red con la señal más fuerte, indicada por el valor RSSI más alto.

Explicación del código básico

El código comienza incluyendo la biblioteca WiFi.h, esencial para la funcionalidad de Wi-Fi en el ESP32. Luego, se definen dos arreglos: ssidList y passwordList, que almacenan los nombres y contraseñas de las redes Wi-Fi a las que quieres que tu ESP32 se conecte.

La función setup() es donde ocurre la mayor parte del trabajo. Inicializa la comunicación serie y configura el ESP32 en modo estación (STA), permitiendo que actúe como cliente de Wi-Fi que se conecta a una red existente.

Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.disconnect();

Luego, el ESP32 escanea las redes Wi-Fi disponibles en su rango. Si no encuentra ninguna, imprime un mensaje y se detiene. Si encuentra redes, entra en un bucle para encontrar la más fuerte midiendo el RSSI de cada red y comparándolo con un valor llamado maxRSSI, que comienza con un valor muy bajo.

int n = WiFi.scanNetworks();
if (n == 0) {
  Serial.println("No se encontraron redes.");
  return;
}

int maxRSSI = -1000; // Inicializa con un valor de RSSI muy bajo
int bestNetworkIndex = -1;

for (int i = 0; i < n; ++i) {
  int rssi = WiFi.RSSI(i);
  Serial.printf("%d: %s, RSSI: %dn", i + 1, WiFi.SSID(i).c_str(), rssi);
  
  for (int j = 0; j  maxRSSI) {
      maxRSSI = rssi;
      bestNetworkIndex = j;
    }
  }
}

Después de escanear, si no se encuentran redes preferidas, imprime un mensaje. De lo contrario, imprime el nombre de la red más fuerte y intenta conectarse usando las credenciales correspondientes de los arreglos. El ESP32 sigue intentando conectarse, mostrando puntos para indicar el proceso, hasta que se conecta correctamente o se agota el tiempo. Una vez conectado, imprime un mensaje de "Conectado!" junto con su dirección IP asignada.

Uso de la biblioteca WiFiMulti (Recomendado)

El segundo método utiliza la biblioteca WiFiMulti. Esta biblioteca simplifica la gestión de múltiples redes Wi-Fi. Agregas las credenciales (SSIDs y contraseñas) de tus redes preferidas a un objeto WiFiMulti. Al llamar a wifiMulti.run(), el dispositivo escanea automáticamente redes disponibles y intenta conectarse a la más fuerte de tu lista. Si la conexión falla, intenta de forma automática con la siguiente mejor red, asegurando así una conectividad más confiable.

A continuación, se presenta un fragmento de código para implementar este método. Recuerda reemplazar las credenciales de ejemplo por las reales antes de subir el código a tu ESP32.

#include 
#include 

WiFiMulti wifiMulti;

const uint32_t connectTimeoutMs = 10000; // Tiempo de espera de conexión por AP

void setup() {
  Serial.begin(115200);
  delay(10);
  WiFi.mode(WIFI_STA);
  
  // Agregar lista de redes wifi
  wifiMulti.addAP("ssid_1", "contraseña_1");
  wifiMulti.addAP("ssid_2", "contraseña_2");
  wifiMulti.addAP("ssid_3", "contraseña_3");

  int n = WiFi.scanNetworks();
  Serial.println("Escaneo completado");
  if (n == 0) {
      Serial.println("No se encontraron redes");
  } else {
    Serial.print(n);
    Serial.println(" redes encontradas");
    for (int i = 0; i < n; ++i) {
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*");
      delay(10);
    }
  }

  // Conectar a Wi-Fi usando wifiMulti
  Serial.println("Conectando a Wi-Fi...");
  if (wifiMulti.run() == WL_CONNECTED) {
    Serial.println("");
    Serial.println("Wi-Fi conectado");
    Serial.println("Dirección IP: ");
    Serial.println(WiFi.localIP());
  }
}

void loop() {
  // Si se pierde la conexión al hotspot más fuerte, se conectará a la siguiente red de la lista
  if (wifiMulti.run(connectTimeoutMs) == WL_CONNECTED) {
    Serial.print("Wi-Fi conectado: ");
    Serial.print(WiFi.SSID());
    Serial.print(" ");
    Serial.println(WiFi.RSSI());
  } else {
    Serial.println("¡No hay conexión a Wi-Fi!");
  }
  delay(1000);
}

Después de cargar el código, abre el Monitor Serial a 115200 baudios y presiona el botón EN. Verás una lista de redes cercanas y sus valores de RSSI. El ESP32 seleccionará automáticamente y se conectará a la red con la señal más fuerte.

La verdadera magia de WiFiMulti radica en su capacidad de adaptación. Si la conexión a la red más fuerte se pierde por cualquier motivo, la biblioteca cambia sin problemas a la siguiente red más fuerte de tu lista, asegurando que tu ESP32 permanezca conectado incluso en entornos fluctuantes.

Explicación del código WiFiMulti

El código comienza incluyendo las bibliotecas WiFi.h y WiFiMulti.h, esenciales para gestionar conexiones Wi-Fi en el ESP32. A continuación, se crea un objeto WiFiMulti que se utilizará para almacenar y gestionar múltiples credenciales de redes Wi-Fi.

#include 
#include 

WiFiMulti wifiMulti;

La función setup() establece el ESP32 en modo estación (STA) y agrega una lista de redes Wi-Fi (pares de SSID y contraseña) a las que el ESP32 debería intentar conectarse. Luego, escanea las redes Wi-Fi disponibles en las cercanías. Si no encuentra ninguna, imprime un mensaje al respecto. Sin embargo, si encuentra redes, muestra sus detalles, incluidos sus nombres, fortalezas de señal (RSSI) y tipos de seguridad.

WiFi.mode(WIFI_STA);

// Agregar lista de redes wifi
wifiMulti.addAP("ssid_1", "contraseña_1");
wifiMulti.addAP("ssid_2", "contraseña_2");
wifiMulti.addAP("ssid_3", "contraseña_3");

int n = WiFi.scanNetworks();
Serial.println("Escaneo completado");
if (n == 0) {
    Serial.println("No se encontraron redes");
} else {
  Serial.print(n);
  Serial.println(" redes encontradas");
  for (int i = 0; i < n; ++i) {
    Serial.print(i + 1);
    Serial.print(": ");
    Serial.print(WiFi.SSID(i));
    Serial.print(" (");
    Serial.print(WiFi.RSSI(i));
    Serial.print(")");
    Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*");
    delay(10);
  }
}

Tras el escaneo, el ESP32, usando la función wifiMulti.run(), automáticamente escanea redes disponibles e intenta conectarse a la más fuerte de tu lista. Si la conexión es exitosa, imprime un mensaje de confirmación junto con la dirección IP asignada al ESP32 por la red.

if (wifiMulti.run() == WL_CONNECTED) {
  Serial.println("");
  Serial.println("Wi-Fi conectado");
  Serial.println("Dirección IP: ");
  Serial.println(WiFi.localIP());
}

La función loop() es donde reside la lógica de monitoreo continuo y reconexión. Verifica si el ESP32 sigue conectado a la red más fuerte. Si es así, muestra el nombre y la fuerza de la señal de la red conectada. Si se pierde la conexión, intenta automáticamente conectarse a la siguiente red más fuerte de tu lista. Este proceso se repite continuamente, asegurando que tu ESP32 siempre intente mantener la mejor conexión Wi-Fi posible.

void loop() {
  if (wifiMulti.run(connectTimeoutMs) == WL_CONNECTED) {
    Serial.print("Wi-Fi conectado: ");
    Serial.print(WiFi.SSID());
    Serial.print(" ");
    Serial.println(WiFi.RSSI());
  } else {
    Serial.println("¡No hay conexión a Wi-Fi!");
  }
  delay(1000);
}

¿Cuál método deberías elegir?

En resumen, el enfoque básico de RSSI es un buen punto de partida para quienes están comenzando. Sin embargo, si necesitas una solución más robusta y flexible que pueda conectarse automáticamente a la red más fuerte entre múltiples opciones, es recomendable optar por la biblioteca WiFiMulti. Esta opción proporciona una experiencia de conectividad más confiable y asegura que tu dispositivo siga funcionando de manera óptima en diferentes entornos.

Carlos Julián

Carlos Julián es el fundador de Ingtelecto, es Ingeniero Mecatrónico, Profesor y Programador, cuenta con una Maestria en Ciencias de la Educación, creador de contenido activo a través de TikTok @carlosjulian_mx

Estos temas te pueden interesar

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tu puntuación: Útil

Subir