Ir al contenido

Implementación de la Conexión WiFi

Implementación de la Conexión WiFi

Esta sección cubre cómo conectar el ESP32 a una red Wi-Fi. Al finalizar esta sección, podrás:

  • Escribir un sketch de ESP32 que se conecte a una red Wi-Fi
  • Implementar lógica de tiempo de espera de conexión y reconexión
  • Mostrar la dirección IP del ESP32 después de la conexión
  • Manejar eventos de desconexión Wi-Fi con elegancia
  • Placa ESP32 configurada con Arduino IDE (01-04) o PlatformIO (01-05)
  • Una red Wi-Fi con SSID y contraseña conocidos

El subsistema Wi-Fi del ESP32 opera en dos modos principales:

  • Modo Estación (STA): El ESP32 se conecta a un punto de acceso Wi-Fi existente (router). Es el modo más común para dispositivos IoT.
  • Modo Punto de Acceso (AP): El ESP32 crea su propia red Wi-Fi a la que otros dispositivos pueden unirse. Se usa para configuración de dispositivos o conexiones directas.
  • Modo STA+AP: Ambos modos simultáneamente. El ESP32 se conecta a tu red mientras también aloja su propio AP.

Esta sección se enfoca en el Modo Estación, que se usa en todos los proyectos del curso.

El ESP32 usa la librería integrada WiFi.h, incluida con el ESP32 Arduino Core. Las funciones clave son:

FunciónDescripción
WiFi.begin(ssid, password)Iniciar la conexión a Wi-Fi
WiFi.status()Devolver el estado actual de la conexión
WiFi.localIP()Obtener la dirección IP asignada
WiFi.disconnect()Desconectarse del Wi-Fi
WiFi.reconnect()Forzar la reconexión
WiFi.mode(mode)Establecer el modo Wi-Fi (STA/AP/AP_STA)
WiFi.setAutoReconnect(true)Habilitar la reconexión automática
EstadoValorSignificado
WL_NO_SHIELD255Módulo Wi-Fi no presente
WL_IDLE_STATUS0Módulo Wi-Fi inactivo
WL_NO_SSID_AVAIL1SSID no encontrado
WL_SCAN_COMPLETED2Escaneo de red completo
WL_CONNECTED3Conectado exitosamente
WL_CONNECT_FAILED4Conexión fallida (contraseña incorrecta)
WL_CONNECTION_LOST5Conexión perdida después de estar conectado
WL_DISCONNECTED6Módulo desconectado

El código de conexión más simple:

#include <WiFi.h>
const char* ssid = "YourWiFiSSID";
const char* password = "YourWiFiPassword";
void setup() {
Serial.begin(115200);
delay(1000);
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("Wi-Fi connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
// Tu código principal aquí
delay(10000);
}

Importante: El bucle while bloquea la ejecución hasta que se establece la conexión. Para código de producción, se prefiere un enfoque no bloqueante (Paso 2).

Paso 2: Conexión No Bloqueante con Tiempo de Espera

Sección titulada «Paso 2: Conexión No Bloqueante con Tiempo de Espera»

Una rutina de conexión robusta debe tener tiempo de espera y reintentar en lugar de bloquear indefinidamente:

#include <WiFi.h>
const char* ssid = "YourWiFiSSID";
const char* password = "YourWiFiPassword";
const int MAX_CONNECTION_ATTEMPTS = 40; // ~20 segundos (40 * 500ms)
void setup() {
Serial.begin(115200);
delay(1000);
connectToWiFi();
}
void connectToWiFi() {
Serial.print("Connecting to Wi-Fi");
WiFi.begin(ssid, password);
int attempts = 0;
while (WiFi.status() != WL_CONNECTED && attempts < MAX_CONNECTION_ATTEMPTS) {
delay(500);
Serial.print(".");
attempts++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println();
Serial.println("Wi-Fi connected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
} else {
Serial.println();
Serial.println("Wi-Fi connection failed!");
Serial.println("Restarting ESP32...");
delay(2000);
ESP.restart(); // Reiniciar e intentar de nuevo
}
}
void loop() {
// Verificar el estado de la conexión periódicamente
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Wi-Fi disconnected! Reconnecting...");
connectToWiFi();
}
delay(10000);
}

El ESP32 Arduino Core proporciona manejo de eventos de Wi-Fi, que es más robusto que el sondeo:

#include <WiFi.h>
const char* ssid = "YourWiFiSSID";
const char* password = "YourWiFiPassword";
// Función manejadora de eventos
void WiFiEvent(WiFiEvent_t event) {
switch (event) {
case ARDUINO_EVENT_WIFI_STA_START:
Serial.println("Wi-Fi started");
break;
case ARDUINO_EVENT_WIFI_STA_CONNECTED:
Serial.println("Wi-Fi connected to AP");
break;
case ARDUINO_EVENT_WIFI_STA_GOT_IP:
Serial.print("IP address obtained: ");
Serial.println(WiFi.localIP());
break;
case ARDUINO_EVENT_WIFI_STA_DISCONNECTED:
Serial.println("Wi-Fi disconnected! Attempting to reconnect...");
WiFi.reconnect(); // Reconexión automática
break;
case ARDUINO_EVENT_WIFI_STA_STOP:
Serial.println("Wi-Fi stopped");
break;
default:
break;
}
}
void setup() {
Serial.begin(115200);
delay(1000);
// Registrar el manejador de eventos
WiFi.onEvent(WiFiEvent);
// Habilitar la reconexión automática (característica integrada del ESP32)
WiFi.setAutoReconnect(true);
// Iniciar la conexión
WiFi.begin(ssid, password);
Serial.print("Connecting to ");
Serial.println(ssid);
}
void loop() {
// Tu código principal se ejecuta aquí
// La reconexión Wi-Fi se maneja automáticamente mediante eventos
delay(10000);
}

Paso 4: Almacenar Credenciales de Forma Segura

Sección titulada «Paso 4: Almacenar Credenciales de Forma Segura»

Codificar credenciales en el sketch está bien para desarrollo, pero es inseguro para producción. Enfoques alternativos:

Opción 1: Archivo de Cabecera Separado (Recomendado para Desarrollo)

Crea credentials.h:

#ifndef CREDENTIALS_H
#define CREDENTIALS_H
const char* ssid = "YourWiFiSSID";
const char* password = "YourWiFiPassword";
#endif

En main.cpp:

#include "credentials.h"

Agrega credentials.h a .gitignore:

credentials.h

Opción 2: Librería WiFiManager (Para Producción)

La librería WiFiManager crea un portal cautivo en el primer arranque, permitiendo a los usuarios configurar las credenciales Wi-Fi mediante un navegador web.

#include <WiFiManager.h>
void setup() {
Serial.begin(115200);
WiFiManager wm;
// Conexión automática con credenciales guardadas, o iniciar el portal de configuración
if (!wm.autoConnect("ESP32-Config")) {
Serial.println("Failed to connect!");
ESP.restart();
}
Serial.println("Wi-Fi connected!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
void loop() {
delay(10000);
}

Las credenciales se almacenan en el almacenamiento no volátil (NVS) del ESP32 y persisten entre reinicios.

Paso 5: Monitoreo de la Intensidad de la Señal

Sección titulada «Paso 5: Monitoreo de la Intensidad de la Señal»
void printSignalStrength() {
long rssi = WiFi.RSSI();
Serial.print("Signal strength (RSSI): ");
Serial.print(rssi);
Serial.print(" dBm (");
// Evaluación cualitativa
if (rssi > -50) {
Serial.print("Excellent");
} else if (rssi > -60) {
Serial.print("Good");
} else if (rssi > -70) {
Serial.print("Fair");
} else if (rssi > -80) {
Serial.print("Weak");
} else {
Serial.print("Very weak");
}
Serial.println(")");
}
  • El ESP32 se conecta a la red Wi-Fi y obtiene una dirección IP
  • El Monitor Serial muestra “Wi-Fi connected” con la IP correcta
  • Desconectar el router hace que el ESP32 intente reconectarse
  • Reconectar el router restaura la conexión Wi-Fi
  • El enfoque basado en eventos maneja las desconexiones sin bloquear loop()
  • La lectura RSSI es razonable (>-70 dBm para operación estable)

”No such host” o tiempo de espera de conexión

Sección titulada «”No such host” o tiempo de espera de conexión»

Causas:

  • SSID o contraseña incorrectos
  • El router no transmite el SSID (red oculta)
  • El router está en una banda de frecuencia diferente (el ESP32 solo soporta 2.4 GHz)

Soluciones:

  1. Verifica dos veces el SSID y la contraseña (distinguen mayúsculas)
  2. Asegúrate de que tu router esté transmitiendo el SSID
  3. Verifica que el router use 2.4 GHz (el ESP32 NO soporta Wi-Fi de 5 GHz)
  4. Si usas un SSID oculto, agrega: WiFi.begin(ssid, password, 0, bssid) con BSSID

Causas:

  • Interferencia del canal Wi-Fi
  • El ESP32 está demasiado lejos del router
  • Inestabilidad de la fuente de alimentación

Soluciones:

  1. Acerca el ESP32 al router
  2. Usa un cable USB más largo o una fuente de alimentación externa
  3. Agrega WiFi.setSleep(false) para deshabilitar el ahorro de energía (mejora la estabilidad)
  4. Implementa lógica de reconexión con retroceso exponencial

Causas:

  • Problema con la antena Wi-Fi del ESP32
  • Solo hay redes de 5 GHz disponibles
  • Falla de hardware del ESP32

Soluciones:

  1. Escanea redes: Crea un sketch que llame a WiFi.scanNetworks()
  2. Si la lista está vacía pero otros dispositivos ven redes, el ESP32 puede estar defectuoso
  3. Prueba con una antena externa (si la placa tiene conector)
  • Usa manejo de Wi-Fi basado en eventos (WiFi.onEvent()): Más robusto y no bloqueante que sondear WiFi.status() en loop()
  • Implementa tiempo de espera de conexión: Nunca esperes indefinidamente la conexión — usa un contador para limitar los intentos
  • Habilita la reconexión automática: WiFi.setAutoReconnect(true) reduce el código de reconexión manual
  • Separa las credenciales del código: Usa credentials.h o WiFiManager para evitar exponer contraseñas en el código fuente
  • Monitorea el RSSI: Si la señal cae por debajo de -80 dBm, la conexión será inestable
  • Maneja el Wi-Fi en un archivo separado: Crea un wifi_manager.h/.cpp para una estructura de proyecto limpia
  1. El ESP32 se conecta a Wi-Fi mediante WiFi.begin(ssid, password) en modo Estación
  2. La conexión no bloqueante con tiempo de espera previene el bloqueo indefinido
  3. El manejo basado en eventos (WiFi.onEvent) es el enfoque más robusto
  4. Las credenciales deben almacenarse separadas del código principal (archivo de cabecera o WiFiManager)
  5. El monitoreo del RSSI ayuda a diagnosticar la calidad de la conexión
  6. El ESP32 solo soporta Wi-Fi de 2.4 GHz — esta es una fuente común de confusión

¿Desarrollas un producto IoT comercial?

Ofrecemos servicios ODM de ESP32, del diseño a la fabricación. Del prototipo a la producción: el equipo detrás de este tutorial puede construirlo contigo.

Hablemos →