Project 8: “ESP32 Web Server”

Salimatussholati Az Zahra
7 min readApr 6, 2022

--

Assalamu’alaikum, halo semuanyaa! Balik lagi bersama aku, Salimatussholati Az Zahra :D Pada kesempatan ini, aku bakal menceritakan pengalaman aku dalam mengerjakan project sistem embedded yang melibatkan web server pada ESP32. Pada project sebelumnya, aku telah mencoba bereksperimen dengan wireless communication protocol pada ESP32 berupa Bluetooth. Selain Bluetooth, ESP32 juga memiliki wireless communication protocol yang lain, yaitu WiFi.

WiFi adalah teknologi nirkabel yang dapat melakukan pertukaran data melalui sebuah jaringan komputer. Pada project ini, aku akan menggunakan WiFi sebagai sebuah web server untuk melakukan pertukaran data antara ESP32 dan gawai yang terhubung dengan internet. Aku mencoba menyalakan lampu LED yang ditancapkan pada ESP32 dari gawai yang aku hubungkan dengan internet.

Sebelum memulai project kali ini, alangkah baiknya kita menyiapkan alat dan bahan terlebih dahulu!

Alat dan bahan yang aku gunakan dalam project ini, antara lain:

  1. Dua Lampu LED

2. Resistor 330 ohm

3. Gawai

4. Koneksi WiFi

5. Kabel jumper male to male

6. Breadboard

7. Mikrocontroller ESP32

8. Kabel USB

Setelah menyiapkan alat dan bahan, saatnya kita menyusun alat-alat elektronik yang telah kita siapkan sesuai dengan skema berikut.

Source: https://randomnerdtutorials.com/esp32-web-server-arduino-ide/

Berikut adalah tampilan rangkaian sistem embedded yang telah aku susun.

Selanjutnya, kita akan mencoba menghubungkan ESP32 dengan laptop melalui kabel USB agar mikrocontroller dapat memperoleh tenaga listrik. Setelah itu, buka aplikasi arduino IDE dan masukkan kode berikut ke dalam IDE.

// Load Wi-Fi library
#include <WiFi.h> // Replace with your network credentials
const char* ssid = "YOUR_WIFI_SSID";
const char* password = "YOUR_WIFI_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(); // melacak clientif (client) { // jika terhubung
currentTime = millis();
previousTime = currentTime;
Serial.println("New Client."); // cetak serial monitor
String currentLine = ""; // data dari client
while (client.connected() && currentTime - previousTime <= timeoutTime) { // loop while the client's connected
currentTime = millis();
if (client.available()) { // ada bytes to read
char c = client.read(); // read a byte, then
Serial.write(c); // cetak serial monitor
header += c;
if (c == '\n') { // jika newline/enter
// 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("");
}
}

Namun, sebelum kita meng-upload kode berikut, kita perlu melakukan beberapa pengaturan pada kode, seperti sebagai berikut:

Pertama, kita harus melakukan perubahan kode program pada bagian

menjadi sesuai dengan WiFi di rumah kita masing-masing.

Setelah itu, kita mengatur web server menjadi port 80

Baris berikutnya adalah variabel untuk menyimpan header dari HTTP request

Berikut adalah baris untuk menyimpan kondisi output saat ini.

Selanjutnya, kita memasukkan GPIO pada variabel output.

Pada bagian setup(), kita menggunakan 115200 baud. Agar mengetahui keadaan ESP32 terhadap koneksi WiFi, kita harus mencetak keadaan ESP32

Pada void loop, terdapat program utama dari aplikasi web server.

Kode di atas mendeteksi adanya clients yang datang. Setelah permintaan dari client diterima, kita akan menyimpan data yang datang. While loop akan dijalankan selama client tetap terkoneksi.

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

Kode berikutnya adalah pernyataan if else yang mengecek tombol mana yang ditekan pada web page dan menyesuaikannya dengan output. Seperti yang kita lihat sebelumnya, kita membuat request pada URL yang berbeda tergantung dengan tombol yang ditekan.

Setelah mengupload kode, buka serial monitor, atur pada 115200 baud, dan klik EN atau enable pada mikrocontroller ESP32. Berikut adalah tampilan serial monitor-ku. Dapat dilihat bahwa web server akan menyediakan IP address untuk web page yang menerima dan mengolah input dari kita. Pada percobaan ini, aku mendapat IP address 192.168.0.195

Setelah itu, aku memasukkan IP address yang aku dapatkan pada search engine dan mendapati page seperti berikut.

Setelah itu, aku mencoba menyalakan lampu LED yang terhubung dengan GPIO 26 dengan cara mengeklik salah satu tombol pada page tersebut.

Berikutnya, aku mencoba menyalakan lampu LED yang terhubung dengan GPIO 27.

Berikut ini adalah tampilan ketika aku menyalakan kedua lampu LED melalui tombol-tombol pada web page tersebut.

Yuhu, akhirnya project ini dapat diselesaikan tanpa adanya masalah yang belum terpecahkan. Terima kasih telah membaca dan sampai jumpa di project-project berikutnya!

--

--

Salimatussholati Az Zahra

Mencoba membangkitkan kembali kebiasaan berekspresi dengan puisi