Cómo configurar una IP estática en el ESP8266 o ESP32


Continuamos con las entradas dedicadas al ESP8266 y el ESP32. En esta ocasión veremos cómo configurar una IP estática en nuestra conexión.

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.

En las dos entradas anteriores hemos visto cómo conectarnos con una red WiFI existente en modo STA y cómo generar nuestra propia red WiFi con modo AP.

Ahora que tenemos nuestro ESP8266 conectado a la red WiFi, la siguiente necesidad va a ser conectarnos a nuestro dispositivo, para lo cuál vamos a tener que poder encontrarlo en dentro de la red. O, dicho de otra forma, necesitamos saber su dirección IP local.

Hasta ahora, habíamos mostrado por puerto serie la dirección IP nada más conectar. Pero no resulta muy práctico tener que tener un ordenador o una pantalla al dispositivo para ver que IP nos ha asignado el DHCP del router ¿verdad?.

Anuncio:

Tenemos varias opciones disponibles para encontrar nuestro dispositivo. Una es usar un escáner de dispositivos, otra es usar el mDNS pero, la más segura y robusta es configurar una IP estática en el ESP8266.

Afortunadamente, es muy sencillo configurar una IP estática en el ESP2866 con la función ‘config’ de ESP8266WiFi.

bool config(IPAddress local_ip, 
			IPAddress gateway, 
			IPAddress subnet, 
			IPAddress dns1 = (uint32_t)0x00000000, 
			IPAddress dns2 = (uint32_t)0x00000000);

Remarcar que el orden de los parámetros es diferente a la librería WiFi de Arduino (las librerías ESP8266WiFi y Arduino WiFI son parecidas, pero no idénticas). Tenedlo en cuenta si buscáis tutoriales en Internet, porque a veces las lían.

Esta función debe ser llamada inmediatamente después de WiFi.begin(), que inicia la conexión con el DHCP activado. Con WiFi.config() podemos configurar la IP, gateway, subnet y, opcionalmente las dns.

En el caso del ESP32 la libreriá se llama simplemente ‘WiFi’.

Ejemplo en modo STA

Vamos a ver un ejemplo de cómo configurar una IP estática en modo STA, es decir, conectándonos a una WiFi existente. El siguiente ejemplo se conectaría a la red, y fijaría la IP a 192.168.1.200.

// Conectar
#include <ESP8266WiFi.h>

// Configurar WiFi generada
const char *ssid = "SSID";
const char *password = "PASSWORD";

IPAddress ip(192,168,1,200);     
IPAddress gateway(192,168,1,1);   
IPAddress subnet(255,255,255,0);   

void setup() 
{
  Serial.begin(115200);
  delay(10);
  Serial.println();
 
  WiFi.mode(WIFI_STA);
  WiFi.config(ip, gateway, subnet);
  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("Conexión establecida");  
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());
}

void loop() 
{
}

Hay que tener en cuenta que el router tiene que estar configurado para asignarnos la IP deseada. Típicamente, esto significa que debe estar fuera del rango de IP designadas para DHCP.

Ejemplo en modo AP

En modo AP la configuración de la IP estática es menos crítica que en modo STA. A fin de cuentas, estamos generando nuestra propia WiFi y nos ponemos la IP que queremos.

Aun así, la función WiFi.softAPConfig() permite cambiar los parámetros dentro de la red WiFi generada. El siguiente ejemplo muestra la configuración, donde también cambiamos la dirección del ESP8266 a 192.168.1.200.

#include <ESP8266WiFi.h> 

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

IPAddress ip(192, 168, 1, 200);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

void setup()
{
	Serial.begin(115200);
	delay(10);
	Serial.println();

	WiFi.softAP(ssid, password);
	WiFi.softAPConfig(ip, gateway, subnet);
	Serial.print("Iniciado AP:\t");
	Serial.println(ssid);

	Serial.print("IP address:\t");
	Serial.println(WiFi.softAPIP());
}

void loop() { }

Ejemplo resumido

Como hicimos en la entrada anterior, si dividimos el código en distintos ficheros, y creamos un fichero de ‘config.h’

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

Y un fichero adicional que llamaremos ‘ESP8266_Utils.hpp’ que contenga las funciones de conexión.

void ConnectWiFi_STA(bool useStaticIP = false)
{
   Serial.println("");
   WiFi.mode(WIFI_STA);
   WiFi.begin(ssid, password);
   if(useStaticIP) WiFi.config(ip, gateway, subnet);
   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());
}

void ConnectWiFi_AP(bool useStaticIP = false)
{ 
   Serial.println("");
   WiFi.mode(WIFI_AP);
   while(!WiFi.softAP(ssid, password))
   {
     Serial.println(".");
     delay(100);
   }
   if(useStaticIP) WiFi.softAPConfig(ip, gateway, subnet);

   Serial.println("");
   Serial.print("Iniciado AP:\t");
   Serial.println(ssid);
   Serial.print("IP address:\t");
   Serial.println(WiFi.softAPIP());
}

El código queda resumido en este sencillo fragmento

#include <ESP8266WiFi.h>
 
#include "config.h"  // Sustituir con datos de vuestra red
#include "ESP8266_Utils.hpp"
  
void setup() 
{
  Serial.begin(115200);

  // Para modo STA
  ConnectWiFi_STA(true);

  // Para modo AP
  //ConnectWiFi_AP(true);
}
 
void loop() 
{
}

¡Así de sencillo! En la próxima entrada veremos otra forma de encontrar nuestro dispositivo con mDNS. ¡Hasta pronto! 

Descarga el código

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

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

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

Si te ha gustado esta entrada y quieres leer más sobre ESP8266 o el ESP32 puedes consultar la sección tutoriales de ESP8266/32
4.3 6 votes
Article Rating

Anuncio:

Previous Cómo emular un teclado o un ratón con Arduino
Next Cómo gestionar procesos en Raspberry Pi
4 Comments
oldest
newest
Inline Feedbacks
View all comments
jesus
3 years ago

joder!! menuda enciclopedia estas hecho, muchas gracias por el articulo

fran
3 years ago

Hola,

En primer lugar, muchas gracias por todos los artículos que escribes, son muy muy útiles.
Quería preguntarte que pasaría si intentas establecer una dirección IP que ya está asociada a otro miembro de la red LAN.

Muchas gracias y un saludo.

Eduardo
2 years ago

Muchísimas gracias por tus tutoriales, tienes una forma muy didáctica de explicarlos, me encanta.
EN MODO STA me ocurre que aunque adjudica bien la IP interna, no me deja salir al exterior, me explico: tengo un programa que manda unos valores a un script en PHP y funciona bien, pero cuando le adjudico una IP interna fija, ya no conecta con el servidor, es curioso.
¿Puede haber un conflicto con IPAddress ?

Rogelio
1 year ago

Hola Luis gracias por esta entrada. Una duda, podemos asignar varias direcciones de gateway? En dado caso que queramos transportar nuestro arduino a otro lugar, es probable que haya un módem diferente on otra gateway hay alguna solución para eso? Gracias de antemano