como-conectar-un-esp8266-a-una-red-wifi-modo-sta

Cómo conectar un ESP32 a una red WiFi (modo STA)

  • 6 min

El modo STA permite que un ESP32 o ESP8266 se conecte a una WiFi existente como un dispositivo más.

Una de las principales ventajas de la familia ESP, y que tanto vamos a aprovechar, es que tiene conectividad WiFi completa. Esto nos permite enviar datos, recibir órdenes, montar servidores web o comunicarnos con otros servicios sin añadir hardware extra.

En este caso la placa actuará en modo estación (STA, Station), es decir, como un dispositivo que se conecta a un punto de acceso (AP, Access Point). Es el modo que usaréis en la mayoría de proyectos conectados a la red de casa, del taller o de la oficina.

El ejemplo está orientado a ESP32. En muchos casos también puede adaptarse a ESP8266 cambiando librerías y algunos detalles de pines.

Conectar a red WiFi

Conectarse a una red Wifi con el ESP32 es muy sencillo gracias a las funciones de la librería WiFi, que forma parte del core de ESP32 para el entorno Arduino.

Para conectarnos simplemente usamos el método ‘Wifi.begin(…)’, que tiene la siguiente definición,

WiFi.begin(ssid, password = null, channel = 0, bssid = null, connect = true)
Copied!
  • ssid, nombre de la red WiFi a la que nos queremos conectar (max 32 char)
  • password, opcional, contraseña (mínimo 8 char y máximo 64)
  • channel, opcional, el canal de WiFi a emplear
  • bssid, opcional, dirección MAC del punto de acceso
  • connect, indica si queremos conectar inmediatamente (si es false, sólo guarda los parámetros)

Un ejemplo de código para conectarnos a una red WiFi existente con el ESP32 tendría la siguiente forma.

#include <WiFi.h>

// Sustituir con datos de vuestra red
const char* ssid     = "ssid";
const char* password = "password";

void setup()
{
  Serial.begin(115200);
  delay(10);
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Conectando a:\t");
  Serial.println(ssid); 

  // Esperar a que nos conectemos
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(200);
  Serial.print('.');
  }

  // Mostrar mensaje de exito y dirección IP asignada
  Serial.println();
  Serial.print("Conectado a:\t");
  Serial.println(WiFi.SSID()); 
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());
}

void loop() 
{
}
Copied!

La función WiFi.begin(…) guarda los credenciales indicados en la memoria flash no volátil (que se mantiene incluso aunque carguemos otro programa). Ante un fallo de conexión, el dispositivo se conectará automáticamente al último punto de acceso cuando esté disponible. Además, una vez configurado una vez, podemos volver a conectarnos llamando a la sobrecarga sin parámetros.

WiFi.begin()
Copied!

Las funciones WiFi.begin(…) devuelven el estado de la conexión para determinar cuándo hemos establecido la conexión con la red. También podemos obtenerlo en otro momento a lo largo de nuestro programa con la función WiFi.status(). Esta variable de estado puede ser:

WL_CONNECTEDConexión establecida
WL_NO_SSID_AVAILEl SSID no se encuentra
WL_CONNECT_FAILEDContraseña incorrecta
WL_IDLE_STATUSWi-Fi está cambiando entre estados
WL_DISCONNECTEDEl dispositivo no está configurado en modo STA

La función WiFi.mode(WIFI_STA) es opcional en este ejemplo. Sirve para dejar únicamente el modo STA y desactivar el AP en caso de que lo hubiéramos configurado previamente ya que, como decíamos, la configuración WiFi se guarda aunque reprogramemos. Las opciones de modos son:

WIFI_OFFApagado
WIFI_STAEstacion
WIFI_APAccess point
WIFI_AP_STAStation+Acces Point

Los dos últimos modos permiten que la placa genere su propia red WiFi, o que combine AP y STA al mismo tiempo.

Ejemplo resumido

El código de conexión puede parecer un poco largo, pero si limpiamos y organizamos el código, el código queda reducido a unas pocas líneas para conectarnos a una red WiFI.

#include <WiFi.h>
 
#include "config.h"  // Sustituir con datos de vuestra red
#include "ESP32_Utils.hpp"
 
void setup()
{
  Serial.begin(115200);
  
  ConnectWiFi_STA();
}
 
void loop() 
{
}
Copied!

Un fichero adicional que llamaremos ‘ESP32_Utils.hpp’ que contenga las funciones habituales.

void ConnectWiFi_STA()
{
   Serial.println("");
   WiFi.mode(WIFI_STA);
   WiFi.begin(ssid, password);
   while (WiFi.status() != WL_CONNECTED) 
   { 
     delay(100);  
     Serial.print('.'); 
   }
 
   Serial.println("");
   Serial.print("Iniciado STA:\t");
   Serial.println(ssid);
   Serial.print("IP address:\t");
   Serial.println(WiFi.localIP());
}
Copied!

Un fichero de configuración llamado ‘config.h’ que contenga la contraseña y el password.

const char* ssid     = "ssid";
const char* password = "password";
Copied!

Organizar de esta forma nuestros proyectos es una buena costumbre, que permite tener un código más limpio, mantenible, y reutilizable.

Conectar a red WiFi Múltiple

Existe otra forma de conectarse a una red WiFi, o mejor dicho, a la que tenga mejor señal de entre red WiFi disponibles. Para ello usaremos la librería ‘WiFiMulti’.

En la configuración usaremos wifiMulti.addAP(…) para agregar varias redes WiFI proporcionando sus respectivas SSID y su contraseña. Al arrancar, el ESP8266 se conectará a la red que tenga mejor recepción.

Este modo es menos habitual que el anterior, ya que normalmente no vamos a tener varias WiFi disponibles (es más frecuente tener varios AP con el mismo SSID y contraseña). Pero resulta interesante en algunos proyectos de redes malladas, sniffers, etc.

Sin embargo, gestionar un WiFi múltiple también supone una sobrecarga de trabaja adicional para el ESP8266, aunque no demasiado grande. Por lo que usar esta función únicamente cuando realmente sea necesaria y no os acostumbréis a usarla “porque sí”.

#include <WiFi.h>
#include <WiFiMulti.h>

WiFiMulti wifiMulti;

void setup() 
{
  Serial.begin(115200);
  delay(10);
  
  WiFi.mode(WIFI_STA);
  wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1");
  wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2");
  wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3");

  Serial.println("Conectando");
  while (wifiMulti.run() != WL_CONNECTED) 
  {
    delay(250);
    Serial.print('.');
  }

  // Mostrar mensaje de exito, WiFI conectada y dirección IP asignada
  Serial.println();
  Serial.print("Conectado a:\t");
  Serial.println(WiFi.SSID());
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());
}

void loop() 
{
}
Copied!

¡Así de sencillo! ¿A que es impresionante lo que puede hacer este pequeño dispositivo? Con esto ya tenemos nuestra placa conectada a una red WiFi, lista para empezar a enviar datos, hacer peticiones o levantar servicios en red.

Descarga el código

Todo el código de esta entrada está disponible para su descarga en Github.

github-full

Versión para el ESP8266: https://github.com/luisllamasbinaburo/ESP8266-Examples

Versión para el ESP32: https://github.com/luisllamasbinaburo/ESP32-Examples