Implementación de la Conexión WiFi
Implementación de la Conexión WiFi
Descripción General
Sección titulada «Descripción General»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
Requisitos Previos
Sección titulada «Requisitos Previos»- Placa ESP32 configurada con Arduino IDE (01-04) o PlatformIO (01-05)
- Una red Wi-Fi con SSID y contraseña conocidos
Conceptos Clave
Sección titulada «Conceptos Clave»Arquitectura Wi-Fi del ESP32
Sección titulada «Arquitectura Wi-Fi del ESP32»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.
Librería Wi-Fi
Sección titulada «Librería Wi-Fi»El ESP32 usa la librería integrada WiFi.h, incluida con el ESP32 Arduino Core. Las funciones clave son:
| Función | Descripció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 |
Estados de Conexión (wl_status_t)
Sección titulada «Estados de Conexión (wl_status_t)»| Estado | Valor | Significado |
|---|---|---|
WL_NO_SHIELD | 255 | Módulo Wi-Fi no presente |
WL_IDLE_STATUS | 0 | Módulo Wi-Fi inactivo |
WL_NO_SSID_AVAIL | 1 | SSID no encontrado |
WL_SCAN_COMPLETED | 2 | Escaneo de red completo |
WL_CONNECTED | 3 | Conectado exitosamente |
WL_CONNECT_FAILED | 4 | Conexión fallida (contraseña incorrecta) |
WL_CONNECTION_LOST | 5 | Conexión perdida después de estar conectado |
WL_DISCONNECTED | 6 | Módulo desconectado |
Pasos de Implementación
Sección titulada «Pasos de Implementación»Paso 1: Conexión Wi-Fi Básica
Sección titulada «Paso 1: Conexión Wi-Fi Básica»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);}Paso 3: Usar Eventos de Wi-Fi (Recomendado)
Sección titulada «Paso 3: Usar Eventos de Wi-Fi (Recomendado)»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 eventosvoid 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";
#endifEn main.cpp:
#include "credentials.h"Agrega credentials.h a .gitignore:
credentials.hOpció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(")");}Verificación
Sección titulada «Verificación»- 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)
Solución de Problemas
Sección titulada «Solución de Problemas»”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:
- Verifica dos veces el SSID y la contraseña (distinguen mayúsculas)
- Asegúrate de que tu router esté transmitiendo el SSID
- Verifica que el router use 2.4 GHz (el ESP32 NO soporta Wi-Fi de 5 GHz)
- Si usas un SSID oculto, agrega:
WiFi.begin(ssid, password, 0, bssid)con BSSID
Desconexiones repetidas
Sección titulada «Desconexiones repetidas»Causas:
- Interferencia del canal Wi-Fi
- El ESP32 está demasiado lejos del router
- Inestabilidad de la fuente de alimentación
Soluciones:
- Acerca el ESP32 al router
- Usa un cable USB más largo o una fuente de alimentación externa
- Agrega
WiFi.setSleep(false)para deshabilitar el ahorro de energía (mejora la estabilidad) - Implementa lógica de reconexión con retroceso exponencial
El ESP32 no encuentra ninguna red
Sección titulada «El ESP32 no encuentra ninguna red»Causas:
- Problema con la antena Wi-Fi del ESP32
- Solo hay redes de 5 GHz disponibles
- Falla de hardware del ESP32
Soluciones:
- Escanea redes: Crea un sketch que llame a
WiFi.scanNetworks() - Si la lista está vacía pero otros dispositivos ven redes, el ESP32 puede estar defectuoso
- Prueba con una antena externa (si la placa tiene conector)
Buenas Prácticas
Sección titulada «Buenas Prácticas»- Usa manejo de Wi-Fi basado en eventos (
WiFi.onEvent()): Más robusto y no bloqueante que sondearWiFi.status()enloop() - 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.ho 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/.cpppara una estructura de proyecto limpia
Resumen
Sección titulada «Resumen»- El ESP32 se conecta a Wi-Fi mediante
WiFi.begin(ssid, password)en modo Estación - La conexión no bloqueante con tiempo de espera previene el bloqueo indefinido
- El manejo basado en eventos (
WiFi.onEvent) es el enfoque más robusto - Las credenciales deben almacenarse separadas del código principal (archivo de cabecera o WiFiManager)
- El monitoreo del RSSI ayuda a diagnosticar la calidad de la conexión
- El ESP32 solo soporta Wi-Fi de 2.4 GHz — esta es una fuente común de confusión
Referencias
Sección titulada «Referencias»- Documentación de la Librería WiFi.h del ESP32
- Librería WiFiManager
- Manejo de Eventos Wi-Fi del ESP32
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 →