Communicating with ESP32: Wi-Fi

--

Halo teman-teman, kembali lagi bareng aku Ananta. Minggu ini kita akan membahas komunikasi eksternal ESP32 lagi nih teman-teman, bahkan kali ini kita akan membahas media komunikasi yang lebih sering lagi kita pakai daripada Bluetooth. Mungkin kalian juga sudah menebak dari judulnya, dan benar sekali, kali ini kita akan membahas mengenai komunikasi eksternal ESP32 yang memanfaatkan Wi-Fi atau WLAN.

Kali ini kita akan memanfaatkan Web Server untuk mengontrol ESP32 kita dengan Wi-Fi. Eksperimen kali ini akan bertujuan mengontrol nyala lampu dua buah LED yang tersambung dengan ESP32 memanfaatkan sambungan Wi-Fi. Kontrol akan dilakukan melalui sebuah web server yang dapat dijalankan pada PC yang terhubung pada Wi-Fi, web server dapat ditemukan dengan mengetikkan IP address dari Serial Monitor ESP32.

KOMPONEN

yak jadi komponen-komponen yang akan kita perlukan kali ini adalah:

  1. ESP32 dan Breadboard
  2. Kabel jumper
  3. LED
  4. Resistor 330 Ohm
  5. Kabel USB
  6. PC dengan Arduino IDE dan koneksi Wi-Fi

RANGKAIAN

Baik langsung kita mulai saja percobaannya, nah pertama rangkai dulu nih rangkaian ESP32 nya, aku rangkainya seperti ini, terinspirasi dari tutorial ini juga https://randomnerdtutorials.com/esp32-web-server-arduino-ide/:

Dari gambar bisa dilihat bahwa aku menyambungkan 2 LED ke ESP32 melalui GPIO 26(kuning) dan GPIO 27(biru), sementara seperti biasa aku sambungkan ground menuju sumbu negatif dari LED melalui resistor.

SOURCE CODE

Nah kali ini nih, kita bakalan ngebahas tentang source-code yang bakal kita gunakan untuk melakukan eksperimennya, source-codenya aku temukan di laman ini https://randomnerdtutorials.com/esp32-web-server-arduino-ide/

/*********
Rui Santos
Complete project details at https://randomnerdtutorials.com
*********/
// 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 == '\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("");
}
}

Nah, jangan langsung dicompile dalam Arduino IDE tapi, ada beberapa hal yang harus kita modifikasi pada source-code terkait jaringan Wi-Fi kita.

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

Pada bagian code di atas, kita harus mengubah bagian SSID dengan nama Wi-Fi yang kita gunakan pada bagian REPLACE_WITH_YOUR_SSID, misal yang aku gunakan adalah Wi-Fi rumahku bernama “alaska” dan tuliskan password pada bagian REPLACE_WITH_YOUR_PASSWORD.

contoh nama wi-fi

Yap, setelah diubah, barulah compile kode tadi pada Arduino IDE.

Setelah kode berhasil di-compile cek keberjalanan kode pada serial monitor Arduino IDE, apabila berhasil akan terlihat nama wi-fi yang sesuai dan juga sebuah IP Address pada serial monitor, salin IP-Address tersebut dan jalankan pada browser kegemaran kita (Safari, Chrome, Edge, dll).

Web server (kiri), Serial monitor (kanan)

Setelah kita mendapat tampilan tersebut pada browser, kita bisa mengontrol hidup atau matinya masing-masing LED yang akan aku tunjukkan di bawah

DEMO

CSS and HTML

Ada satu lagi nih yang menarik dari modul ini, kita bisa mengubah tampilan tombol menjadi tampilan lain yang lebih user-friendly, yang cukup mengganggu adalah tombol-tombolnya terlihat sama untuk masing-masing lampu sehingga besar kemungkinan kita salah memencet tombol untuk lampu yang kita inginkan. Nah disini aku akan berusaha untuk memodifikasi tombol-tombolnya sesuai dengan warna lampunya, tombol atas untuk kuning dan tombol bawah untuk biru.

Seperti terlihat pada source code, kita bisa melakukan modifikasi pada bagian-bagian html dan css untuk mengubah tampilan.

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

Nah, ubahlah bagian source code di atas menjadi seperti di bawah ini

// 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: #f1c40f; border: none; color: white; padding: 16px 40px;");
client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
client.println(".button1 { background-color: #3498db; 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\"><button1 class=\"button1\">ON</button1></a></p>");
} else {
client.println("<p><a href=\"/27/off\"><button1 class=\"button1 button2\">OFF</button1></a></p>");
}
client.println("</body></html>");

Setelah diubah, maka tampilan web akan menjadi seperti ini, tombol kuning untuk menyalakan lampu kuning sementara tombol biru dapat menyalakan lampu berwarna biru agar tidak memusingkan dalam memilih.

DEMO CSS

Yaps selesai sudah percobaan kita kali ini, beberapa hal yang aku pelajari disini antara lain:

Kita bisa meneliti user-experience (UX) mulai dari masalah yang kita temukan sendiri. Dalam pengembangan aplikasi atau website, UX merupakan komponen penting untuk menjaga kenyamanan pengguna dalam penggunaan produk IT. UX researcher bertugas dalam meneliti komponen-komponen produk yang berkemungkinan dapat mengganggu kenyamanan pengguna dan memodifikasinya agar lebih user friendly. Penelitian mengenai UX ini dapat dilakukan secarabtidak terstruktur berdasarkan experience peneliti sendiri dan juga terstruktur yang dilakuan melalui survey pada pengguna.

Baik itu saja untuk minggu ini teman-teman, terima kasih sudah membaca dan sampai jumpa minggu dapan!

I Wayan Ananta Suandira / 18219038

--

--