To make sure I understand how a web interface is made via an ESP32, I started with a very basic example. The only thing this minimal example will do is to light on and off the RGB LED connected to the Barduino (ESP32) through the incubator shield I designed via a web interface accessible from any browser (desktop and mobile).

Key elements
Librairies
Include the librairies: Arduino framework, AnalogWrite to manipulate analog output with the ESP32 and Wifi, the one that interests us here.
#include <Arduino.h> #include <analogWrite.h> #include <WiFi.h>
Wifi credentials
Include the Wifi network credentials so that the ESP32 can access your wifi.
const char *ssid = "********"; const char *password = "********"; WiFiServer server(80);
Initialize the connection
This code is then used to initialize a connection to the address 192.168.1.118. This IP address is accessible to all devices connected to the same Wifi network.
void initWiFi()
{
Serial.println("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected successfully");
Serial.print("Got IP: ");
Serial.println(WiFi.localIP());
server.begin();
Serial.println("HTTP server started");
delay(100);
}
Get the header
Information will travel via the URL that we send from one side and receive on the other.
For example, a button will add /?RED=ON to the end of our url 192.168.1.118, forming a 192.168.1.118/?RED=ON that we can parse to do things in our code.
void buildPage()
{
WiFiClient client = server.available();
if (client)
{
Serial.println("New Client is requesting web page");
String current_data_line = "";
while (client.connected())
{
if (client.available())
{
char new_byte = client.read();
Serial.write(new_byte);
header += new_byte;
}
}
}
}
If else conditions
Depending on what we get in the header, we can switch the LED on and off.
if (header.indexOf("GET /RED=ON") >= 0)
{
Serial.println("LED is red");
active_color = "red";
rgbLed(100, 0, 0);
}
else if (header.indexOf("GET /?GREEN=ON") != -1)
{
Serial.println("LED is green");
active_color = "green";
rgbLed(0, 100, 0);
}
else if (header.indexOf("GET /?BLUE=ON") != -1)
{
Serial.println("LED is blue");
active_color = "blue";
rgbLed(0, 0, 100);
}
Build the page
To finally build our HTML page with the variables and buttons that allow us to change the colour of the LEDs.
client.println("<!DOCTYPE html><html<");
client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head>");
client.println("<body><h1>ESP32 minimal example</h1>");
client.println("<p>The RGB led is currently <b>" + active_color + "</b>. Click one of the following button to change its color.</p>");
client.println("<form>");
client.println("<button name=\"RED\" value=\"ON\" type=\"submit\">RED</button>");
client.println("<button name=\"GREEN\" value=\"ON\" type=\"submit\">GREEN</button>");
client.println("<button name=\"BLUE\" value=\"ON\" type=\"submit\">BLUE</button>");
client.println("</form>");
client.println("</body></html>");
Source code
#include <Arduino.h>
#include <analogWrite.h>
#include <WiFi.h>
// Wifi
const char *ssid = "********";
const char *password = "********";
WiFiServer server(80);
String header;
// LED Constants
#define led_red 33
#define led_green 25
#define led_blue 26
// LED Variables
String active_color = "off";
void rgbLed(int red, int green, int blue)
{
// The values must be reversed because the LED must be pulled down to operate
analogWrite(led_red, map(red, 0, 255, 255, 0));
analogWrite(led_green, map(green, 0, 255, 255, 0));
analogWrite(led_blue, map(blue, 0, 255, 255, 0));
}
void initWiFi()
{
Serial.println("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected successfully");
Serial.print("Got IP: ");
Serial.println(WiFi.localIP());
server.begin();
Serial.println("HTTP server started");
delay(100);
}
void buildPage()
{
WiFiClient client = server.available();
if (client)
{
Serial.println("New Client is requesting web page");
String current_data_line = "";
while (client.connected())
{
if (client.available())
{
char new_byte = client.read();
Serial.write(new_byte);
header += new_byte;
if (new_byte == '\n')
{
if (current_data_line.length() == 0)
{
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();
if (header.indexOf("GET /RED=ON") >= 0)
{
Serial.println("LED is red");
active_color = "red";
rgbLed(100, 0, 0);
}
else if (header.indexOf("GET /?GREEN=ON") != -1)
{
Serial.println("LED is green");
active_color = "green";
rgbLed(0, 100, 0);
}
else if (header.indexOf("GET /?BLUE=ON") != -1)
{
Serial.println("LED is blue");
active_color = "blue";
rgbLed(0, 0, 100);
}
client.println("<!DOCTYPE html><html<");
client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head>");
client.println("<body><h1>ESP32 minimal example</h1>");
client.println("<p>The RGB led is currently <b>" + active_color + "</b>. Click one of the following button to change its color.</p>");
client.println("<form>");
client.println("<button name=\"RED\" value=\"ON\" type=\"submit\">RED</button>");
client.println("<button name=\"GREEN\" value=\"ON\" type=\"submit\">GREEN</button>");
client.println("<button name=\"BLUE\" value=\"ON\" type=\"submit\">BLUE</button>");
client.println("</form>");
client.println("</body></html>");
client.println();
break;
}
else
{
current_data_line = "";
}
}
else if (new_byte != '\r')
{
current_data_line += new_byte;
}
}
}
header = "";
client.stop();
Serial.println("Client disconnected.");
}
}
void setup()
{
Serial.begin(9600);
delay(500);
pinMode(led_red, OUTPUT);
pinMode(led_green, OUTPUT);
pinMode(led_blue, OUTPUT);
rgbLed(0, 0, 0);
initWiFi();
}
void loop()
{
buildPage();
}
