[ESP32 most complete study notes (protocol) - 1.ESP32 network server]

About this tutorial:

ESP32 Basics                                

1. Introduction to ESP32                                                                

2. ESP32 Arduino Integrated Development Environment

3. VS Code and PlatformIO

4. ESP32 pins

5. ESP32 input and output

6.ESP32 Pulse Width Modulation

7. ESP32 analog input

8. ESP32 interrupt timer

9 .ESP32 deep sleep

ESP32 Protocol

1. ESP32 web server

2.ESP32 LoRa

3.ESP32 BLE

4.ESP32 BLE client-server

5.ESP32 Bluetooth

6.ESP32 MQTT

7.ESP32 ESP-NOW

8.ESP32 Wi-Fi

9.ESP32 WebSocket

10.ESP32 ESP-MESH

11. ESP32 mailbox

12.ESP32 SMS

13. ESP32 HTTP get POST

14.HTTP GET Web APIs

15.HTTP POST Web APIs

 ESP32 server articles

Keep updating, follow bloggers and don't get lost! ! !

 ESP32 Sensor Module

Keep updating, follow bloggers and don't get lost! ! !

ESP32 Ultimate Combat

More than 100 ESP32 practical projects, please pay attention! ! !

        After learning the basics of ESP32, we will then enter the study of the protocol. In this part, we will further study ESP32 with examples. Without further ado, let's get started! ! !

ESP32 Web Server - Arduino IDE

        In this project, you will use the Arduino IDE programming environment to create a standalone web server with an ESP32 that controls outputs (two LEDs). The web server is mobile responsive and can be accessed using any device as a browser on the local network. We'll show you step by step how to create a web server and how the code works.

Project Overview

Before jumping straight into the project, it's important to outline what our web server will do so that it's easier to follow the steps later.

  • The web server you will build controls the two LEDs GPIO 26 and GPIO 27 connected to the ESP32 ;
  • You can enter the ESP32 IP address in a browser on the local network to access the ESP32 Web server;
  • You can instantly change the state of each LED by clicking a button on the web server.

required parts

For this tutorial, you will need the following parts:

ESP32 Development Board
2 x 5mm LEDs
2x 330 Ohm Resistors
Breadboard Jumper
Wires

schematic diagram

Start by building the circuit. Connect two LEDs to the ESP32 as shown in the diagram below - one LED to GPIO 26 and the other to GPIO 27.

NOTE : We are using the ESP32 DEVKIT DOIT board with 36 pins. Always check the pinouts of the board you are using before assembling your circuit.

ESP32 Web Server Code

We provide the code to create the ESP32 web server here. Copy the code below to your Arduino IDE, but don't upload it yet. You need to make some changes to make it work for you.

#include <WiFi.h>

// Replace with your network credentials
const char* ssid1 = "";
const char* password1 = "";

// 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(ssid1, password1);
  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 == '\n') {                    // 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><h1>ESP32 Web Server</h1>");
            
            // Display current state, and ON/OFF buttons for GPIO 26  
            client.println("<p>GPIO 26 - State " + output26State + "</p>");
            // If the output26State is off, it displays the ON button       
            if (output26State=="off") {
              client.println("<p><a href=\"/26/on\"><button class=\"button\">ON</button></a></p>");
            } else {
              client.println("<p><a href=\"/26/off\"><button class=\"button button2\">OFF</button></a></p>");
            } 
               
            // Display current state, and ON/OFF buttons for GPIO 27  
            client.println("<p>GPIO 27 - State " + output27State + "</p>");
            // If the output27State is off, it displays the ON button       
            if (output27State=="off") {
              client.println("<p><a href=\"/27/on\"><button class=\"button\">ON</button></a></p>");
            } else {
              client.println("<p><a href=\"/27/off\"><button class=\"button button2\">OFF</button></a></p>");
            }
            client.println("</body></html>");
            
            // The HTTP response ends with another blank line
            client.println();
            // Break out of the while loop
            break;
          } else { // if you got a newline, then clear currentLine
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }
      }
    }
    // Clear the header variable
    header = "";
    // Close the connection
    client.stop();
    Serial.println("Client disconnected.");
    Serial.println("");
  }
}

Set up your WiFi network

You need to modify the following lines with your network: SSID and Password. The code is well commented on where you should make changes.

// Replace with your network credentials
const char* ssid1     = "";
const char* password1 = "";

upload code

You can now upload your code and the web server will run in no time. Follow the steps below to upload the code to the ESP32:

1) Insert the ESP32 development board into the computer;

2) Select your development board in Tools > Development Board  of Arduino IDE (in our example, we are using ESP32 DEVKIT DOIT development board);

3) Select COM Port in Tools Ports .

4) Press the upload button in the Arduino IDE and wait a few seconds while the code compiles and uploads to your board.

5) Wait for the " Upload complete " message.

Find ESP IP address

After uploading the code, open the Serial Monitor with a baud rate of 115200.

Press the ESP32 EN button (reset). Connect the ESP32 to Wi-Fi and output the ESP IP address on the serial monitor. Copy the IP address as you will need it to access the ESP32 web server.

access web server

To access the web server, open a browser, paste the ESP32 IP address, and you will see the following page. In our case it is 192.168.1.135 .

If you look at the serial monitor, you can see what's going on in the background. ESP receives an HTTP request from a new client (in this case, your browser).

test web server

Now you can test that your web server is working properly. Click the button to control the LED.

In the meantime, you can take a look at the Serial Monitor to see what's going on in the background. For example, when you click the button to turn GPIO 26 ON, the ESP32  receives a request on the /26/on URL.

When the ESP32 receives this request, it opens a connection to GPIO 26 ON and updates its status on the web page.

The button works in a similar fashion for GPIO 27 . Test that it works.

how the code works

In this section, we'll take a closer look at the code to understand how it works.

The first thing you need to do is include the WiFi library.

#include <WiFi.h>

As mentioned before, you need to insert your ssid and password in the following line inside double quotes.

const char* ssid1 = "";
const char* password1 = "";

Then, set the web server to port 80.

WiFiServer server(80);

The following line creates a variable to store the headers of the HTTP request:

String header;

Next, you create helper variables to store the current state of the output. If you want to add more outputs and save their state, you need to create more variables.

String output26State = "off";
String output27State = "off";

You also need to assign a GPIO to each output. Here we use GPIO 26 and GPIO 27. You can use any other suitable GPIO.

const int output26 = 26;
const int output27 = 27;

setup()

Now, let's go to setup() . First, we start the serial communication at 115200 baud rate for debugging.

Serial.begin(115200);

You can also define GPIOs as outputs and set them low.

// Initialize the output variables as outputs
pinMode(output26, OUTPUT);
pinMode(output27, OUTPUT);

// Set outputs to LOW
digitalWrite(output26, LOW);
digitalWrite(output27, LOW);

The following lines start the Wi-Fi connection WiFi.begin(ssid, password) , wait for a successful connection and print the ESP IP address in the serial monitor.

// 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();

loop()

In loop() we program what happens when a new client establishes a connection with the web server.

ESP32 always listens for incoming clients via the following line:

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

 When a request is received from the client, we will save the incoming data. The subsequent while loop will run as long as the client remains connected. We do not recommend changing the following parts of the code unless you know exactly what you are doing.

if (client) { // If a new client connects,
  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()) { // loop while the client's connected
    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 == '\n') { // 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();

 The next part of the if and else statement checks which button was pressed in your web page and controls the output accordingly. As we've seen before, we make requests to different URLs depending on which button was pressed.

// 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);
}

For example, if you press the GPIO 26 ON button, the ESP32 will receive a request for the /26/ON URL (we can see this on the Serial Monitor's HTTP headers). So we can check if the header contains the expression GET /26/on . If it does, we change the output26State variable to ON and the ESP32 turns on the LED.

This works similarly for other buttons. So, if you want to add more outputs, you should modify this part of the code to include them.

Display HTML pages

The next thing you need to do is create a web page. The ESP32 will send a response to your browser with some HTML code to build a web page.

Send a webpage to the client using this expression client.println() . You should enter something to send to the client as a parameter.

The first thing we should send is always the following line, which shows that we are sending HTML.

<!DOCTYPE HTML><html>

Below is used to prevent requests for icons. - You don't need to worry about this line.

client.println("<link rel=\"icon\" href=\"data:,\">");

web style

Next, we have some CSS text to style the button and the appearance of the page. We choose the Helvetica font, define the content to be displayed as a block and center align it.

client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");

We style the button with the #4CAF50 color, no border, white text, and this padding: 16px 40px . We also set text-decoration to none, define font size, margins and cursor as pointer.

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;}");

 We also define the style of the second button, with all the properties of the button we defined earlier, but with a different color. This will be the style for the close button.

client.println(".button2 {background-color: #555555;}</style></head>");

Set the first title of the page

In the next line, you can set the first title of the page. Here we have "  ESP32 Web Server  ", but you can change this text to anything you like.

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

Display buttons and corresponding states

Then, you write a paragraph to display the current state of GPIO 26 . As you can see, we use the output26State variable so that the state is updated as soon as that variable changes.

client.println("<p>GPIO 26 - State " + output26State + "</p>");

 We then display an on or off button depending on the current state of the GPIO. If the current state of the GPIO is off, we show the ON button, if not, we show the OFF button.

if (output26State=="off") {
  client.println("<p><a href=\"/26/on\"><button class=\"button\">ON</button></a></p>");
} else {
  client.println("<p><a href=\"/26/off\"><button class=\"button button2\">OFF</button></a></p>");
}

We use the same program for GPIO 27 .

close connection

Finally, when the response is over, we clear the header variable and stop the connection to the client client.stop() .

// Clear the header variable
header = "";
// Close the connection
client.stop();

Summarize

        In this tutorial, we have shown you how to build a web server using the ESP32. We've shown you a simple example of controlling two LEDs, but the idea is to replace these LEDs with a relay or any other output you want to control.

Guess you like

Origin blog.csdn.net/m0_46509684/article/details/129336485