micropython-wifi-station-access-point

Conexión Wi-Fi en MicroPython: estación y punto de acceso

  • 5 min

La conexión Wi-Fi en MicroPython es la conexión de la placa con una red inalámbrica mediante el módulo network.

Hasta ahora, nuestros programas vivían aislados dentro del chip. Lo interesante del ESP32 y del ESP8266 es su radio Wi-Fi. Gracias a ella, podemos enviar datos a la nube, controlar relés desde el móvil o sincronizar la hora con internet.

En MicroPython, todo lo relacionado con la red se maneja a través del módulo estándar network.

Antes de escribir código, es importante entender que nuestra placa puede funcionar en dos modos (e incluso en los dos a la vez):

  1. Station (IF_STA): La placa se comporta como tu móvil o tu portátil. Se conecta a un router Wi-Fi existente para tener acceso a internet o a la red local. Es el modo más habitual.
  2. Access Point (IF_AP): La placa se comporta como un router. Genera su propia red Wi-Fi y otros dispositivos (tu móvil u otra placa) se conectan a ella. Es útil para la configuración inicial o en zonas sin cobertura.

Modo estación: conectarse al router

Este es el modo que usarás el 99% de las veces para proyectos IoT. Queremos que nuestra placa se conecte al Wi-Fi de casa para enviar datos.

El proceso siempre sigue estos pasos:

  1. Activar la interfaz de estación (network.WLAN.IF_STA).
  2. Conectar usando SSID (nombre de red) y contraseña.
  3. Esperar a que el router nos asigne una IP (DHCP).

Función de conexión con tiempo de espera

No basta con lanzar la orden de conexión; hay que verificar que ha tenido éxito. Puedes incluir esta función reutilizable en tu boot.py.

import network
import time

def conectar_wifi(ssid, password):
    # Creamos el objeto de interfaz de estación
    wlan = network.WLAN(network.WLAN.IF_STA)
    
    # Si ya estamos conectados, no hacemos nada
    if not wlan.isconnected():
        print('Conectando a la red...')
        
        # Activamos la interfaz
        wlan.active(True)
        
        # Iniciamos la conexión
        wlan.connect(ssid, password)
        
        # Esperamos hasta que conecte o pasen 10 segundos
        max_wait = 10
        while not wlan.isconnected() and max_wait > 0:
            print(f"Esperando conexión... {max_wait}")
            time.sleep(1)
            max_wait -= 1
            
    # Comprobación final
    if wlan.isconnected():
        print('¡Conexión establecida!')
        print('Datos de red (IP, máscara, gateway, DNS):', wlan.ifconfig())
    else:
        print('Fallo al conectar. Revisa contraseña o alcance.')

# Uso de la función
conectar_wifi("MiCasa_WiFi", "ContraseñaSuperSecreta")
Copied!

El método .ifconfig() es muy útil. Nos devuelve una tupla con 4 valores: (IP, Máscara de Subred, Gateway, DNS).

Desactivar el modo AP por defecto

Un detalle curioso (y a veces molesto) es que muchas placas ESP32/ESP8266 vienen con el modo Access Point activado de fábrica. Esto significa que, aunque te conectes a tu router, tu placa sigue emitiendo una red abierta llamada “MicroPython-xxxx”.

Para ahorrar energía y mejorar la seguridad, es buena práctica apagarlo si no lo usas:

ap = network.WLAN(network.WLAN.IF_AP)
ap.active(False) # Apagamos el AP
Copied!

Modo punto de acceso: crear tu propia red

Imagina que quieres controlar un robot en medio del campo, donde no hay routers. O que has creado un producto comercial y necesitas que el usuario introduzca su contraseña de Wi-Fi la primera vez.

Para eso usamos el modo AP. La placa genera su propia red Wi-Fi.

Creación del punto de acceso

import network

def crear_punto_acceso(nombre_ap, password_ap):
    ap = network.WLAN(network.WLAN.IF_AP)
    
    # Activamos la interfaz
    ap.active(True)
    
    # Configuramos el AP
    # security=3 corresponde a WPA2-PSK
    ap.config(ssid=nombre_ap, key=password_ap, security=3)

    print(f"Red Wi-Fi creada: {nombre_ap}")
    print("Dirección IP del AP:", ap.ifconfig()[0])

# Uso
crear_punto_acceso("Mi_Proyecto_ESP32", "12345678")
Copied!

Por defecto, la IP del ESP32 en modo AP suele ser 192.168.4.1. Si te conectas con tu móvil a esa red y abres esa IP en el navegador, estarás “hablando” con tu placa.

Longitud de la contraseña Si usas seguridad WPA/WPA2 (que deberías), la contraseña debe tener al menos 8 caracteres. Si pones menos, el AP no se iniciará o dará error.

Modo híbrido (STA + AP)

Lo genial del hardware del ESP32/ESP8266 es que puede mantener ambas interfaces activas simultáneamente.

Puedes estar conectado al Wi-Fi de tu casa para subir datos a la nube (STA) y, a la vez, generar una red propia (AP) para que un técnico se conecte a configurar parámetros sin necesidad de acceder a la red doméstica.

import network

# Instanciamos ambas
sta = network.WLAN(network.WLAN.IF_STA)
ap = network.WLAN(network.WLAN.IF_AP)

# Activamos ambas
sta.active(True)
ap.active(True)

# Configuramos independientemente...
sta.connect("RouterCasa", "clave")
ap.config(ssid="Mantenimiento_Bot", key="admin123", security=3)
Copied!

Buenas prácticas de seguridad

No escribas contraseñas en main.py

Subir tu código a GitHub con las claves de tu casa hardcodeadas es un error clásico. Lo recomendable es crear un archivo separado llamado secrets.py (y añadirlo al .gitignore si usas git).

Archivo secrets.py:

WIFI_SSID = "MiCasa"
WIFI_PASS = "123456"
Copied!

Archivo main.py:

import secrets
from wifi_manager import conectar_wifi # Suponiendo que guardaste la función

conectar_wifi(secrets.WIFI_SSID, secrets.WIFI_PASS)
Copied!

Con esto, ya tenemos la puerta abierta al mundo. En las próximas secciones, usaremos esta conexión para crear servidores web y enviar mensajes MQTT.