IoT/ESP32 B.Tech/Diploma Beginner

ESP32 Web Server – Arduino IDE

In this project you’ll create a standalone web server with an ESP32 that can toggle two LEDs using the Arduino IDE programming environment.

  • Suitable forB.Tech/Diploma IoT/ESP32 students
  • Build time1-2 weeks
  • LevelBeginner
  • Available atAjvika Labs, Kakinada

About this project

In this project you’ll create a standalone web server with an ESP32 that controls outputs (two LEDs) using the Arduino IDE programming environment. The web server is mobile responsive and can be accessed with any device that as a browser on the local network. We’ll show you how to create the web server and how the code works step-by-step.
We recommend following our latest updated guide instead:
Building an ESP32 Web Server: The Complete Guide for Beginners
If you want to learn more about the ESP32, read
Getting Started Guide with ESP32
Project Overview
Before going straight to the project, it is important to outline what our web server will do, so that it is easier to follow the steps later on.
The web server you’ll build controls two LEDs connected to the ESP32
GPIO 26
and
GPIO 27
;
You can access the ESP32 web server by typing the ESP32 IP address on a browser in the local network;
By clicking the buttons on your web server you can instantly change the state of each LED.
This is just a simple example to illustrate how to build a web server that controls outputs, the idea is to replace those LEDs with a
relay
, or any other electronic components you want.
Installing the ESP32 board in Arduino IDE
There’s an add-on for the Arduino IDE that allows you to program the ESP32 using the Arduino IDE and its programming language. Follow one of the following tutorials to prepare your Arduino IDE:
Windows instructions
– Installing the ESP32 Board in Arduino IDE
Mac and Linux instructions
– Installing the ESP32 Board in Arduino IDE
Parts Required
For this tutorial you’ll need the following parts:
ESP32 development board
–
read ESP32 Development Boards Review and Comparison
2x 5mm LED
2x 330 Ohm resistor
Breadboard
Jumper wires
You can use the preceding links or go directly to
MakerAdvisor.com/tools
to find all the parts for your projects at the best price!
Schematic
Start by building the circuit. Connect two LEDs to the ESP32 as shown in the following schematic diagram – one LED connected to
GPIO 26
, and the other to
GPIO 27.
Note
: We’re using the ESP32 DEVKIT DOIT board with 36 pins. Before assembling the circuit, make sure you check the pinout for the board you’re using.
ESP32 Web Server Code
Here we provide the code that creates the ESP32 web server. Copy the following code to your Arduino IDE, but don’t upload it yet. You need to make some changes to make it work for you.

// Load Wi-Fi library
#include `WiFi.h`

// Replace with your network credentials
const char* ssid = \"REPLACE_WITH_YOUR_SSID\";
const char* password = \"REPLACE_WITH_YOUR_PASSWORD\";

// Set web server port number to 80
WiFiServer server(80);

// Variable to store the HTTP request
String header;

// Auxiliar variables to store the current output state
String output26State = \"off\";
String output27State = \"off\";

// Assign output variables to GPIO pins
const int output26 = 26;
const int output27 = 27;

// Current time
unsigned long currentTime = millis();
// Previous time
unsigned long previousTime = 0;
// Define timeout time in milliseconds (example: 2000ms = 2s)
const long timeoutTime = 2000;

void setup() {
Serial.begin(115200);
// Initialize the output variables as outputs
pinMode(output26, OUTPUT);
pinMode(output27, OUTPUT);
// Set outputs to LOW
digitalWrite(output26, LOW);
digitalWrite(output27, LOW);

// Connect to Wi-Fi network with SSID and password
Serial.print(\"Connecting to \");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(\".\");
}
// Print local IP address and start web server
Serial.println(\"\");
Serial.println(\"WiFi connected.\");
Serial.println(\"IP address: \");
Serial.println(WiFi.localIP());
server.begin();
}

void loop(){
WiFiClient client = server.available(); // Listen for incoming clients

if (client) { // If a new client connects,
currentTime = millis();
previousTime = currentTime;
Serial.println(\"New Client.\"); // print a message out in the serial port
String currentLine = \"\"; // make a String to hold incoming data from the client
while (client.connected() && currentTime - previousTime <= timeoutTime) { // loop while the client's connected
currentTime = millis();
if (client.available()) { // if there's bytes to read from the client,
char c = client.read(); // read a byte, then
Serial.write(c); // print it out the serial monitor
header += c;
if (c == '\
') { // if the byte is a newline character
// if the current line is blank, you got two newline characters in a row.
// that's the end of the client HTTP request, so send a response:
if (currentLine.length() == 0) {
// HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
// and a content-type so the client knows what's coming, then a blank line:
client.println(\"HTTP/1.1 200 OK\");
client.println(\"Content-type:text/html\");
client.println(\"Connection: close\");
client.println();

// turns the GPIOs on and off
if (header.indexOf(\"GET /26/on\") >= 0) {
Serial.println(\"GPIO 26 on\");
output26State = \"on\";
digitalWrite(output26, HIGH);
} else if (header.indexOf(\"GET /26/off\") >= 0) {
Serial.println(\"GPIO 26 off\");
output26State = \"off\";
digitalWrite(output26, LOW);
} else if (header.indexOf(\"GET /27/on\") >= 0) {
Serial.println(\"GPIO 27 on\");
output27State = \"on\";
digitalWrite(output27, HIGH);
} else if (header.indexOf(\"GET /27/off\") >= 0) {
Serial.println(\"GPIO 27 off\");
output27State = \"off\";
digitalWrite(output27, LOW);
}

// Display the HTML web page
client.println(\"<!DOCTYPE html><html>\");
client.println(\"<head><meta name=\\"viewport\\" content=\\"width=device-width, initial-scale=1\\">\");
client.println(\"<link rel=\\"icon\\" href=\\"data:,\\">\");
// CSS to style the on/off buttons
// Feel free to change the background-color and font-size attributes to fit your preferences
client.println(\"<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\");
client.println(\".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;\");
client.println(\"text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}\");
client.println(\".button2 {background-color: #555555;}</style></head>\");

// Web Page Heading
client.println(\"<body>ESP32 Web Server</h1>\");

// Display current state, and ON/OFF buttons for GPIO 26
client.println(\"GPIO 26 - State \" + output26State + \"</p>\");
// If the output26State is off, it displays the ON button
if (output26State==\"off\") {
client.println(\"<a href=\\"/26/on\\"><button class=\\"button\\">ON</button></a></p>\");
} else {
client.println(\"<a href=\\"/26/off\\"><button class=\\"button button2\\">OFF</button></a></p>\");
}

// Display current state, and ON/OFF buttons for GPIO 27
client.println(\"GPIO 27 - State \" + output27State + \"</p>\");
// If the output27State is off, it display

Technologies used

ESP32ArduinoWiFiBLERelayArduino IDEHTMLCSS

Hardware components

  • ESP32
  • Arduino
  • Relay

Software & tools

  • Arduino IDE

What you get

  • Working project / hardware kit, tested before delivery
  • Complete source code with explanation
  • Project demo and guidance for your viva
  • Project report, PPT and IEEE paper support (on request)
Delivery & Payment
Delivery takes a minimum of two weeks from the date your inquiry is confirmed. Payment is in two parts: • 50% advance to start the project • Remaining 50% before delivery Note: • Documentation and PPT are not included by default • If you need documentation/PPT, it can be arranged for extra time and cost We'll confirm the exact timeline and cost with you after reviewing your requirements.