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

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

Empezamos con las entradas dedicadas a programar el ESP8266 y el ESP32. Como no podía ser de otra forma empezamos por el caso más sencillo, cómo conectar el ESP8266 o ESP32 a una red WiFi existente.

En entradas anteriores hemos visto cómo programar el ESP8266 con el entorno de Arduino, y la guía de programación del ESP8266, haciendo hincapié a las diferencias entre programar un Arduino y un ESP8266.

También hemos visto dos de las placas de desarrollo más populares basadas en el ESP8266, la NodeMCU y la Wemos D1 Mini. Quedan muchas más por ver, pero de momento es más que suficiente para meternos en harina en la programación.

Así que (por fin!) podemos empezar a jugar con este divertidísimo dispositivo, conectando nuestro ESP8266 a una WiFi. En este caso el ESP8266 actuará en modo estación (STA, Station), es decir, como un dispositivo que se conecta a un punto de acceso (AP, Access Point). En la próxima entrada veremos cómo hacer que el propio ESP8266 genere su propia WiFI actuando como AP.

Haremos referencia al ESP8266, pero el mismo código es compatible para el ESP32, ajustando el nombre de las librerías. Al final tenéis el código tanto para el ESP8266 como para el ESP32.

Conectar a red WiFi

Conectarse a una red Wifi con el ESP8266 es muy sencillo gracias a las funciones de la librería ESP8266WiFi, que forma parte de la definición del ESP8266 que descargamos con el gestor de placas al configurar el IDE de Arduino.

En el caso del ESP32 la librería se llama simplemente ‘WiFi’.

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)

Siendo:

  • 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 ESP8266 tendría la siguiente forma.

#include <ESP8266WiFi.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() 
{
}

La función WiFi.begin(…) del ESP8266 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 ESP8266 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()

Las funciones WiFi.begin(…) devuelven el estado del ESP8266 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 del ESP8266 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 ESP8266 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, el ESP8266 guarda la configuración del WiFi aunque lo reprogramemos. Las opciones de modos son:

WIFI_OFFApagado
WIFI_STAEstacion
WIFI_APAccess point
WIFI_AP_STAStation+Acces Point

Veremos los dos últimos en la próxima entrada cuando veamos cómo generar nuestra propia WiFi con el ESP8266.

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 <ESP8266WiFi.h>
 
#include "config.h"  // Sustituir con datos de vuestra red
#include "ESP8266_Utils.hpp"
 
void setup()
{
  Serial.begin(115200);
  
  ConnectWiFi_STA();
}
 
void loop() 
{
}

Un fichero adicional que llamaremos ‘ESP8266_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());
}

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

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

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 ‘ESP8266WiFiMulti’.

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 <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

ESP8266WiFiMulti 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() 
{
}

Otras funciones WiFI del ESP8266

Aquí tenemos un resumen de algunas de las funciones adicionales disponibles en ESP8266 WiFi. Los nombres son autodescriptivos de su función pero, sí tenéis dudas, podéis consultar la documentación del ESP8266.

// Gestión de la conexión
WiFi.reconnect();
WiFi.disconnect(true);
WiFi.isConnected();
WiFi.setAutoConnect(autoConnect);
WiFi.status();

// Devuelven el valor indicado (no sirven para reescribir el valor)
WiFi.SSID();
WiFi.hostname();
WiFi.localIP();
WiFi.subnetMask()
WiFi.gatewayIP();
WiFi.dnsIP(dns_no);
WiFi.macAddress();

¡Así de sencillo! ¿A que es impresionante lo que puede hacer este pequeño dispositivo? En la próxima entrada veremos algo aún más impresionante, como configurar el ESP8266 para actuar como un AP, es decir, generar su propia WiFi a la que se conecten otros dispositivos. ¡Hasta pronto!

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