📢 ¡Disponible en el Arduino IDE!
Instalá AyresWiFiManager directamente desde el Library Manager del IDE de Arduino.
Solo buscá “AyresWiFiManager” y tocá “Instalar”.
AWM - Gestor Wi‑Fi “pro” para ESP32/ESP8266 con portal cautivo real (AP+DNS), UI moderna servida desde LittleFS, almacenamiento seguro de credenciales, políticas de fallback, botón de provisión, LED de estado, NTP, chequeo de Internet y logging configurable.
Proyecto: https://github.com/AyresNet/AyresWiFiManager
Licencia: MIT — (c) 2025 AyresNet
- Portal cautivo real: DNS catch‑all + rutas de detección (Android/iOS/Windows) para forzar apertura en
http://192.168.4.1. - UI ligera (sin dependencias externas) servida desde
/data(LittleFS): búsqueda, reescaneo, barras de señal y opción de borrar credenciales desde el portal. - API clara y multiplataforma (ESP32/ESP8266) con políticas explícitas.
- Fallbacks inteligentes:
NO_CREDENTIALS_ONLY(default),ON_FAIL,SMART_RETRIES,BUTTON_ONLY,NEVER. - Botón y LED integrados:
- Botón (LOW): 2–5 s abre portal · ≥5 s borra JSON y reinicia.
- LED:
ONconectado ·BLINK_SLOWportal ·BLINK_FASTescaneo ·OFFidle (+ patrones dobles/triples para feedback).
- Borrado seguro de
.jsoncon lista blanca y recursivo en ESP32. - Logging profesional (macros
AWM_LOG*) con nivel ajustable porbuild_flags. - Utilidades: NTP (pool.ntp.org/time.nist.gov),
hayInternet()(Google204), RSSI, timestamp, reconexión automática.
- Almacenamiento de credenciales en
/wifi.json(LittleFS). - Rutas del portal
GET /→index.htmlPOST /save→ guarda{ssid,password}y reiniciaGET /scano/scan.json→[{ssid,rssi,secure}]POST /erase→ borra.json(respeta protegidos) y reinicia
- HTML/JS/CSS de ejemplo incluidos:
data/index.html,data/success.html,data/error.html - ESP32:
esp_wifi_set_ps(WIFI_PS_NONE),LittleFS.begin(true)(auto‑formateo)
ESP8266:WiFi.setSleepMode(WIFI_NONE_SLEEP), iteración LittleFS no recursiva
platformio.ini mínimo:
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
monitor_speed = 115200
board_build.filesystem = littlefs
; Opcional: logging
build_flags =
-D AWM_ENABLE_LOG=1 ; 0=off, 1=on
-D AWM_LOG_LEVEL=3 ; 1=E, 2=W, 3=I, 4=D, 5=V- Coloca tus archivos del portal en
data/(por ejemploindex.html). - Sube el FS:
pio run -t uploadfs. - Flashea el sketch y abre el monitor serie.
- Añadí las cores ESP32/ESP8266 oficiales.
- Instalá el uploader de LittleFS correspondiente (ESP32/ESP8266).
- Subí la carpeta
data/al FS con la herramienta “Data Upload”. - Compilá y cargá el sketch.
#include <AyresWiFiManager.h>
AyresWiFiManager wifi;
void setup() {
Serial.begin(115200);
wifi.setAPCredentials("ayreswifimanager","123456789");
wifi.setPortalTimeout(300); // 5 min por inactividad
wifi.setAPClientCheck(true); // no cierra si hay clientes
wifi.setWebClientCheck(true); // cada request reinicia el timer
// wifi.setCaptivePortal(false); // desactiva redirecciones, si querés
wifi.begin(); // monta FS, carga /wifi.json si existe
wifi.run(); // intenta STA; si falla aplica la política de fallback
}
void loop() {
wifi.update(); // sirve HTTP/DNS y maneja timeouts/LED
}El ejemplo examples/30sVentana/src/main.cpp hace:
- Si hay credenciales → abre portal con timeout por inactividad de 30 s; si no lo usás, se cierra solo y continúa.
- Si no hay credenciales → abre portal “normal” (ej. 5 min por inactividad).
- En ambos casos, si usás el portal (clientes AP o requests HTTP), no se cierra hasta que dejes de usarlo.
// Portal / AP
void setHtmlPathPrefix(const String& prefix); // ej: "/wifimanager"
void setHostname(const String& host);
void setAPCredentials(const String& ssid, const String& pass);
void setCaptivePortal(bool enabled); // DNS + rutas captive
void setPortalTimeout(uint32_t seconds); // 0 = sin timeout
void setAPClientCheck(bool enabled); // no cerrar si hay clientes
void setWebClientCheck(bool enabled); // cada request reinicia timer
void openPortal();
void closePortal();
bool isPortalActive() const;
// Fallback
enum class FallbackPolicy { ON_FAIL, NO_CREDENTIALS_ONLY, SMART_RETRIES, BUTTON_ONLY, NEVER };
void setFallbackPolicy(FallbackPolicy p);
void setSmartRetries(uint8_t maxRetries, uint32_t windowMs);
void enableButtonPortal(bool enable);
void setAutoReconnect(bool enabled);
// Estado / utilidades
bool tieneCredenciales() const;
bool connectToWiFi();
bool isConnected();
int getSignalStrength(); // RSSI
uint64_t getTimestamp(); // ms (0 si no hay NTP)
bool hayInternet(); // generate_204
bool scanRedDetectada();
void forzarReconexion();
// LED
enum class LedPattern { OFF, ON, BLINK_SLOW, BLINK_FAST, BLINK_DOUBLE, BLINK_TRIPLE };
void setLedAuto(bool enable);
void setLedPatternManual(LedPattern p);
// Seguridad FS (.json protegidos)
void setProtectedJsons(std::initializer_list<const char*> names); // ej: {"/wifi.json","licencia.json"}- Botón (pin por defecto 0,
INPUT_PULLUP, activo en LOW):- 2–5 s → abre portal (si
enableButtonPortal(true)) - ≥5 s → borra
.json(respetasetProtectedJsons) y reinicia
- 2–5 s → abre portal (si
- LED (pin por defecto 2):
ONconectado a Wi‑FiBLINK_SLOWportal activoBLINK_FASTescaneandoBLINK_DOUBLE / TRIPLEfeedback al mantener botónOFFsin enlace/portal
Podés fijar el patrón manual (
setLedPatternManual) o dejarlo automático (setLedAuto(true)).
Incluye include/AWM_Logging.h con macros:
AWM_LOGE("error: %d", code); // Error
AWM_LOGW("warning...");
AWM_LOGI("info...");
AWM_LOGD("debug x=%d", x);
AWM_LOGV("verbose...");Activación por flags de compilación (PlatformIO):
build_flags =
-D AWM_ENABLE_LOG=1
-D AWM_LOG_LEVEL=3 ; 1=ERROR, 2=WARN, 3=INFO, 4=DEBUG, 5=VERBOSE- Poné
AWM_ENABLE_LOG=0para apagar todos los logs (macro‑noops). - Subí/bajá
AWM_LOG_LEVELsegún lo que quieras ver.
data/index.html– escaneo, filtro, selección de SSID, formulario de guardado, opciones avanzadasdata/success.html– confirmación de guardado (SVG con pulso; el equipo se reinicia)data/error.html– error de guardado (SVG con vibración sutil + enlace “Volver”)
Cambiá la raíz con
setHtmlPathPrefix("/wifimanager")si preferís otra carpeta.
Subida del FS
- PlatformIO:
pio run -t uploadfs - Arduino IDE: herramienta “Data Upload”
AyresWiFiManager busca ser simple y explícito:
- Sin auto‑magia de configuración: vos decidís cuándo abrir portal y por cuánto.
- Portal verdaderamente cautivo (DNS + rutas), no solo un AP + webserver.
- UI moderna sin CDNs, pensada para ESPs con poca RAM/flash.
- Borrado seguro de
.jsoncon whitelist y (en ESP32) recursivo. - Logging integrable y niveles ajustables.
examples/AWM_Minimal/AWM_Minimal.ino– uso mínimo (begin(),update(),isConnected()).examples/AWM_Advanced/AWM_Advanced.ino– LED de estado, botón de pulsación corta → portal, NTP, reconexión.examples/standard/main.cpp– flujo simple estándar.examples/30sVentana/main.cpp– “ventana” de arranque de 30 s si existen credenciales.examples/usedExample/usedExample.ino– ejemplo de uso legado.
AyresWiFiManager/
├─ data/ # Captive-portal HTML/CSS/JS (LittleFS examples)
│ ├─ index.html # Main portal page
│ ├─ success.html # Confirmation after saving credentials
│ └─ error.html # Error page
│
├─ examples/ # Example sketches (Arduino IDE & PlatformIO)
│ ├─ AWM_Minimal/
│ │ └─ AWM_Minimal.ino # Minimal usage (begin + update + isConnected)
│ ├─ AWM_Advanced/
│ │ └─ AWM_Advanced.ino # Advanced: LED, button, NTP, reconnect
│ ├─ standard/
│ │ └─ main.cpp # Simple reference flow
│ ├─ 30sVentana/
│ │ └─ main.cpp # 30s "boot window" captive portal
│ └─ usedExample/
│ └─ usedExample.ino # Legacy usage example
│
├─ src/ # Core library sources
│ ├─ AyresWiFiManager.h # Main header (public API)
│ ├─ AyresWiFiManager.cpp # Implementation
│ └─ AWM_Logging.h # Optional lightweight logging macros
│
├─ library.properties # Arduino Library Manager metadata
├─ library.json # PlatformIO metadata
├─ platformio.ini # Example PIO project config
├─ LICENSE # MIT License
├─ README.md # Main documentation (English)
└─ README.es.md # Documentation in Spanish
Si querés mantener librerías locales fuera del repo, añadí rutas a
.gitignore(ej.:lib/AyresShell/).
Los archivos del portal (index.html, success.html, error.html) deben
subirse al LittleFS del sketch del usuario:
- Copiá los archivos desde
data/de esta librería al directoriodata/de tu sketch. - Subilos al dispositivo:
- Arduino IDE: menú → ESP32 LittleFS Data Upload
- PlatformIO:
pio run --target uploadfs
⚠️ Nota importante:
Eldata/en la raíz de esta librería es solo de referencia/ejemplo.
No se sube automáticamente cuando compilás un sketch.
- Protegé archivos críticos:
wifi.setProtectedJsons({"/wifi.json","licencia.json"}); - Definí timeouts por inactividad coherentes (
setPortalTimeout) y activásetAPClientCheck(true)+setWebClientCheck(true)si no querés que se cierre mientras lo usan. - Para instalaciones remotas,
setFallbackPolicy(SMART_RETRIES)+setAutoReconnect(true)suelen dar buena experiencia. - Si necesitás ahorrar logs en producción:
-D AWM_ENABLE_LOG=0.
- ESP32 (Arduino core)
- ESP8266 (Arduino core)
Requiere LittleFS. En ESP32 se auto‑formatea si
begin(true)falla.
¡PRs e issues son bienvenidos!
Ideas: ejemplos adicionales, traducciones, mejoras UI/UX del portal, nuevas políticas de fallback.
MIT — ver archivo LICENSE (o cabeceras SPDX en el código).
¿Dudas o ideas? Abrí un issue en el repo. ¡Gracias por probar AyresWiFiManager! 🚀


