El número de aplicaciones potenciales de un microcontrolador se disparan al conectarlo a internet. En el corazón de la mayoría de las aplicaciones con gestión de datos en tiempo real, está el WiFi (de manera directa o vía Bluetooth).
Usaremos para este ejemplo del M5Stack ESP32 Basic Development Kit.
Hay dos modos principales de conectarse:
- Station Station mode (STA), para conectarse a un punto de acceso de Wi-Fi. Es el modo por defecto.
- Software Access point (soft-AP), o como punto de acceso para que otros dispositivos puedan conectarse a internet a través de nuestro microcontrolador ESP32.
- Otros: como cliente, como servidor, UDP (User Datagram Protocol), etc…
En este artículo hablaremos del primero: la conexión a un punto de acceso.
Hay dos librerías más comúnmente utilizadas. WiFi.h es la que utilizaremos aquí. WiFiNINA es otra librería desarrollada para la placa Arduino MKR WiFi1010 y similares. A nosotros nos ha dado problemas con la actualización del firmware, así que no lo veremos aquí.
Comenzaremos la programación en Arduino IDE, abriendo las librerías:
- M5Stack.h: para poder conectar el modelo de placa elegido
- WiFi.h: para poder conectarnos a la red wifi.
- arduino_secrets.h: para poder usar el nombre de la red y nuestra clave de red con privacidad
#include "M5Stack.h" #include "WiFi.h" #include "arduino_secrets.h"
Ahora crearemos las variables con el nombre y el password de nuestra red. Para ello usaremos la función SECRET_ de Arduino:
const char* ssid = SECRET_SSID; const char* password = SECRET_PSW;
Crearemos un nuevo script llamado arduino_secrets.h, con el siguiente contenido (incluir entre comillas el nombre y el password de tu red wifi):
#define SECRET_SSID "MOVISTAR_Jujujujajajaja" #define SECRET_PSW "8Ehkd76ef_Jijijijijejejeje"
Y guardar este archivo en la misma carpeta de nuestro proyecto (en mi caso “M5Stack_Wifi”), dentro de la carpeta Arduino. No nos olvidemos de cambiar la extensión “.ino” (por defecto) por “.h”. De este modo, cada vez que usemos las variables ssid y password en nuestro código, el IDE de Arduino buscará los valores reales (en arduino_secrets.h) sin necesidad de que los compartamos al mostrar nuestro código.
En void setup abriremos el puerto de conexión con el M5 y con el Monitor Serie del IDE de Arduino. La función M5.begin hace las dos cosas simultáneamente (si añades la función Serial.begin a M5.begin, creo que da problemas; al menos a mi me los ha dado). También abriremos la conexión Wifi mediante Wifi.begin, seguido entre paréntesis por el ssid y el password de nuestra red wifi):
void setup() { M5.begin(115200); WiFi.begin(ssid, password);
La variable WiFi.status determina el estado de nuestra conexión wifi. Puede adquirir, entre otros, los siguientes valores:
- WL_CONNECTED: conectado a la red wifi;
- WL_IDLE_STATUS: estado temporal mientras intenta conectarse.
- WL_CONNECT_FAILED: cuando todos los intentos programados han sido fallidos.
- WL_CONNECTION_LOST: cuando se ha perdido la conexión;
- WL_DISCONNECTED: cuando se ha desconectado de la red;
Aprovecharemos esta variable (WiFi.status) para informar al usuario de que la ESP32 está intentando conectarse a la red:
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Conectando a la red WiFi..."); M5.Lcd.println("Conectando a la red Wifi..."); }
Y utilizaremos las funciones print y println para escribir el mensaje de aviso tanto en el Monitor Serie del IDE de Arduino (computer) como en la pantalla LCD del M5Stack.
Hemos añadido un delay(500) para que pase medio segundo (500 milisegundos) entre mensajes.
Una vez que nos hemos conectado a la WiFi (y salgamos del bucle while), podemos obtener información de la red WiFi, tanto para el IDE de Arduino como para la pantalla LCD del M5Stack:
Serial.println("Conectado a la red WiFi"); Serial.print("Con la direccion IP: "); Serial.println(WiFi.localIP()); Serial.print("Nombre de la red: "); Serial.println(WiFi.SSID()); Serial.print("Fuerza RSSI conexión (-30 lo mejor, -90 lo peor): "); Serial.println(WiFi.RSSI()); M5.Lcd.println("Conectado a la red WiFi"); M5.Lcd.print("Con la dirección IP: "); M5.Lcd.println(WiFi.localIP()); M5.Lcd.print("Nombre de la red: "); M5.Lcd.println(WiFi.SSID()); M5.Lcd.print("Fuerza RSSI conexión (-30 lo mejor, -90 lo peor): "); M5.Lcd.println(WiFi.RSSI()); }
Finalmente, añadimos el void loop, en este caso vacio (no queremos hacer nada más que conectarnos a la red):
void loop() {}
Así ha quedado el programa entero:
#include "M5Stack.h" #include "WiFi.h" #include "arduino_secrets.h" const char* ssid = SECRET_SSID; const char* password = SECRET_PSW; void setup() { M5.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Conectando a la red WiFi..."); M5.Lcd.println("Conectando a la red Wifi..."); } Serial.println("Conectado a la red WiFi"); Serial.print("Con la direccion IP: "); Serial.println(WiFi.localIP()); Serial.print("Nombre de la red: "); Serial.println(WiFi.SSID()); Serial.print("Fuerza RSSI conexión (-30 lo mejor, -90 lo peor): "); Serial.println(WiFi.RSSI()); M5.Lcd.println("Conectado a la red WiFi"); M5.Lcd.print("Con la dirección IP: "); M5.Lcd.println(WiFi.localIP()); M5.Lcd.print("Nombre de la red: "); M5.Lcd.println(WiFi.SSID()); M5.Lcd.print("Fuerza RSSI conexión (-30 lo mejor, -90 lo peor): "); M5.Lcd.println(WiFi.RSSI()); } void loop() {}
Adjunto un video demostrativo de su funcionalidad.
Fuentes para este artículo:
https://flaviocopes.com/arduino-connect-wifi/
https://diyprojects.io/esp32-how-to-connect-local-wifi-network-arduino-code/