ESP32 WebServer Blink

Enciender y Apagar elLED incorporado (Pin 5) en el módulo ESP32 desde una página web.

https://learn.sparkfun.com/tutorials/esp32-thing-hookup-guide

El módulo se configura como un Web Server para responder a las petición desde un browser. La dirección mostrada en la figura es un ejemplo.

La librería  básica usada es WiFi.h con los valores de SSID y Password para acceder a la red existente, valores que se deben actualizar de acuerdo a la configuración de su red. El router asigna una dirección IP de forma automática, y su valor se muestra en el monitor serial, dirección usada en un brower para observar el resultado.

Monitor Serial

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

Conectando a RedWifi
..
WiFi conectado 
Dirección IP: 192.168.10.104

Para simplificar las instrucciones, la sección de conexión a la red WiFi se realiza en la función inicia_wifi().

Instrucciones:

Para iniciar el modo servidor web se requiere WifiServer server(puertoweb), el puerto web es el 80.

En el programa se revisa el estado del cliente (client): conectado, disponible, leyendo cada caracter enviado por el browser e interpretando las instrucciones por cada fin de línea (‘\n’).

Si la línea recibida finaliza con «GET /H» o «GET /L» se realiza el cambio de estado del LED.

Al final se cierra la conexión, y se continua monitoreando el estado del cliente.

/* ESP32 web server para encender LED_Pin
forma básica con la función inicia_wifi
Referencia: https://www.arduino.cc/en/Tutorial/WiFiWebServer  
*/
#include <WiFi.h>

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

// puerto de servidor web 80
const PROGMEM uint8_t puertoweb = 80;
WiFiServer server(puertoweb);


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

void setup()
{
    // Conexion serial
    Serial.begin(115200);
    Serial.setTimeout(500);
    // espera inicializar serial
    while(!Serial) { }

    // LED monitor
    pinMode(LED_pin, OUTPUT);
    delay(10);

    inicia_wifi();
    server.begin();
}

void loop(){
    WiFiClient client = server.available();
    if (client){
        String linea = "";
        Serial.println();
        Serial.println("Nuevo cliente.");
        while (client.connected()) {
            if (client.available()) {
                char c = client.read();
                Serial.write(c);
                if (c == '\n') {
                    // Si recibe fin de linea y la linea es vacia,
                    // la peticion http finalizó, se responde:
                    if (linea.length() == 0) {
                        // HTTP headers inician con ésta secuencia:
                        client.println("HTTP/1.1 200 OK");
                        client.println("Content-type:text/html");
                        client.println();
                        // contenido despues de headers
                        client.print("Click <a href="\"/H\"">ENCIENDE LED</a>
");
                        client.print("Click <a href="\"/L\"">   APAGA LED</a>
");
                        // finaliza contenido:
                        client.println();
                        // sale del lazo:
                        break;
                    } else {
                        linea = "";
                    }
                } else if (c != '\r') {
                    linea = linea + c;
                }
            // Revisa click del cliente "GET /H" or "GET /L":
            if (linea.endsWith("GET /H")) {
                digitalWrite(LED_pin, HIGH);
            }
            if (linea.endsWith("GET /L")) {
                digitalWrite(LED_pin, LOW);
            }
        }
    }
    delay(1); // espera que browser procese
    client.stop(); // cierra conexión:
    Serial.println("Cliente desconectado.");
    }
}

void inicia_wifi() {
    // conexion WiFi
    Serial.print("\n Conectando a ");
    Serial.println(ssid);
    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 \n Dirección IP: ");
    Serial.println(WiFi.localIP());
    delay(10);
}

Puntos por desarrollar

  • Añadir en la pagina el estado del LED. Sugerencia: aumentar una variable de estado para el led y usarla en la página html.
  • Conectar a un servidor MQTT e iniciar el estado del LED con el correspondiente en el Estado MQTT.

Referencia: https://www.arduino.cc/en/Tutorial/WiFiWebServer