ESP32 SmartConfig-App

Para la configuración inicial de los dispositivos requiere una aplicación en un dispositivo tablet o móvil para configurar la conexión a la red WiFi con los datos de SSID y Password.

El concepto presentado por espressif con documentación actualizada al 2018.06.08 se encuentra en:

https://www.espressif.com/en/products/software/esp-touch/overview

https://www.espressif.com/sites/default/files/faq/screen_shot_2016-04-27_at_1.30.27_pm_0.png
Figura: Espressif https://www.espressif.com/sites/default/files/faq/screen_shot_2016-04-27_at_1.30.27_pm_0.png

La implementación de la aplicación que se usó para probar el ejercicio se encuentra en Google Play. Revisar el desarro de la aplicación realizará como otro tema.

https://play.google.com/store/apps/details?id=com.cmmakerclub.iot.esptouch

El procedimiento de conexión tiene dos partes:

  1. Modo configuración de WiFi, usando la aplición SmartConfig
  2. Modo normal de conexión WiFi, con los datos WiFi ya configurados

Para seleccionar los modos se usa una botonera «Configuración»  en un pin digital disponible con funcion y circuito semejante a RESET, en el ejemplo se usa GPIO14.

Modo configuración de WiFi

Para iniciar el modo configuración de la red se deben usar las botoneras «Configuración» y «RESET» con la secuencia:

1. pulsar Botonena GPIO14 y mantener pulsada
2. Luego pulsar y soltar reset
3. Mantener pulsado GPIO14 por 5 segundos después y soltar
4. Usar el móvil/tableta con la aplicación SmartConfig para configurar
5. Escribir SSID y password en móvil/tablet y «confirmar»
6. Esperar confirmación y estará conectado.

Modo normal de conexión WiFi

Es el modo predeterminado de operación, no requiere presionar el botón de «Configuración». Arranca con los valores almacenados de SSID y PASSWORD.

Monitor Serial

Los resultados del proceso de configuración y conexión a WiFi se muestran a continuación. Para fines de muestra, se ha demorado la activación con el móvil/tablet, note que la conexión a WiFI se realiza casi inmediatamente (tres puntos …)

....ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
ets Jun  8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1100
load:0x40078000,len:10088
load:0x40080400,len:6380
entry 0x400806a4
configurando WiFi
Esperando conexión SmartConfig móvil/tablet
........................................
 Esperando conexión SmartConfig móvil/tablet
...............
 Finalizado SmartConfig.

 Conectando a WiFi
...
 WiFi conectado , Dirección IP: iotirni19 , 192.168.10.102
conectado a:
iotirni19 , 192.168.10.102 , -56
conectado a:
iotirni19 , 192.168.10.102 , -53
conectado a:
iotirni19 , 192.168.10.102 , -54
conectado a:
iotirni19 , 192.168.10.102 , -55
conectado a:
iotirni19 , 192.168.10.102 , -55
conectado a:
iotirni19 , 192.168.10.102 , -55

Instrucciones Arduino

Las instrucciones se han dividido por bloques: configura_wifi() y conecta_wifi(). En ambas funciones se presentan mensajes y parpadeos de led.

Configura_wifi() espera a que se obtenga un valor afirmativo para WiFi.smartConfigDone() y finalizar.

Conecta_wifi() es muy semejante a la función inicia_wifi() usada en los primeros ejemplos que usaba variables para SSID y Password()

/* ESP32 Smart Config de Espressif
modificado a partir de:
https://www.espressif.com/en/products/software/esp-touch/overview
Usa el GPIO14 en estado LOW para entrar en modo configuración.
Usar BOTONERA "CONFIGURACION" en pin14, con pullup (HIGH)
Para configurar:
1. pulsar Botonena GPIO14 y mantener pulsada
2. Luego pulsar y soltar reset
3. Mantener pulsado GPIO14 por 5 segundos después y soltar
4. Usar el móvil/tableta con la aplicación SmartConfig para configurar
5. Escribir SSID y password en móvil/tablet y "confirmar"
6. Esperar confirmación y estará conectado.
*/
#include <WiFi.h>

// PIN configuración
const PROGMEM uint8_t CONFIG_pin = 14; 

// LED monitor interno
//ESP01-pin=1, ESP07-pin=2; ESP32-pin=5
const PROGMEM uint8_t LED_pin = 5; 

void setup() {
    Serial.begin(115200);

    // PIN configuración
    pinMode(CONFIG_pin, INPUT);
    
    // LED monitor
    pinMode(LED_pin, OUTPUT);
    
    // Revisa si entra a modo configuración
    if (digitalRead(CONFIG_pin)==LOW){
        Serial.println("configurando WiFi");
        // configura con SmartConfig
        configura_wifi();
    }
    // Modo conexión a Router
    conecta_wifi();

}
void loop() {
    // Ejemplo de tarea a realizar.
    Serial.println("conectado a:");
    Serial.print(WiFi.SSID());
    Serial.print(" , ");
    Serial.print(WiFi.localIP());
    Serial.print(" , ");
    Serial.println(WiFi.RSSI());
    // LED interno enciende en LOW
    digitalWrite(LED_pin, HIGH);
    delay(100);
    digitalWrite(LED_pin, LOW);
    delay(100);
    digitalWrite(LED_pin, HIGH);
    delay(100);
    digitalWrite(LED_pin, LOW);
    delay(250);
    // termina ejemplo
    delay(1000);
}

void configura_wifi(){
    // inicia en modo estación
    WiFi.mode(WIFI_AP_STA);
    WiFi.beginSmartConfig();
    int cuenta = 0;
    // Espera por un paquete Smartconfig del móvil/tablet
    Serial.println("Esperando conexión SmartConfig móvil/tablet");
    while (!WiFi.smartConfigDone()) {
        delay(500);
        Serial.print(".");
        cuenta = cuenta+1;
        if (cuenta>=40){
            Serial.println("\n Esperando conexión SmartConfig móvil/tablet");
            cuenta = 0;}
        // LED interno enciende en LOW
        digitalWrite(LED_pin, HIGH);
        delay(50);
        digitalWrite(LED_pin, LOW);
        delay(50);
        }
    Serial.println("\n Finalizado SmartConfig.");
    }

void conecta_wifi() {
    // conexion WiFi
    Serial.println("\n Conectando a WiFi");
    
    WiFi.begin();//ssid, password);
    int cuenta = 0;
    while (WiFi.status() != WL_CONNECTED){
        Serial.print(".");
        cuenta = cuenta+1;
        if (cuenta>=40){
            Serial.println();
            cuenta = 0;}
        // LED interno enciende en LOW
        digitalWrite(LED_pin, LOW);
        delay(250);
        digitalWrite(LED_pin, HIGH);
        delay(250);
        }
    Serial.print("\n WiFi conectado , Dirección IP: ");
    Serial.print(WiFi.SSID());
    Serial.print(" , ");
    Serial.println(WiFi.localIP());
    delay(10);
}

Por desarrollar:
Personalizar la aplicación del móvil/tableta a partir del código básico de espressif.

Referencias:
https://www.espressif.com/en/products/software/esp-touch/overview

https://www.espressif.com/sites/default/files/documentation/esp-touch_user_guide_en.pdf