Project 8 : ESP32 Wi-Fi Controlling Devices
Welcome back, nama aku Gavriel Benny, dengan NIM 18219078 dari jurusan Sistem dan Teknologi Informasi ITB. Hari ini, aku mau bereksperimen dengan menggunakan Wi-Fi.
Pada zaman sekarang, hampir semua teknologi menggunakan Wi-Fi. Khususnya di ESP32 ini, ESP32 sudah dilengkapi Wi-Fi, yaitu sebuah protocol koneksi yang memiliki kemampuan lebih luas dalam jaraknya dibanding dengan koneksi bluetooth.
Nah, pada hari ini, aku mau membuat sistem kendali jarak jauh menggunakan komunikasi Wi-Fi untuk menyalakan dan mematikan devais (LED) dengan membangun sebauh web server pada ESP32. Nantinya, web server tersebut dapat diakses di devais lain yang memiliki internet browser dengan cara memasukan IP Address yang dihasilkan oleh Web Server.
Pertama seperti biasa, komponen apa saja sih yang aku butuhkan,
- ESP32
- 2 buah 5mm LED
- 2 buah Resistor 330 Ohm
- Breadboard
- Kabel Jumper
Setelah menyiapkan komponen-komponen tersebut, hal yang pertama kita lakukan adalah merakitnya. Berikut gambar rakitan untuk project kali ini :
Sebuah kabel jumper di sambungkan dari sebuah lampu ke GPIO26 ESP32. Lampu lainnya disambungkan ke GPIO27. Lalu, kedua lampu memiliki resistor yang disambungkan ke Ground (GND) dari ESP32 tersebut. Jika sudah merakit, kita sambungkan ke PC.
Setelah merakit aku memasukkan kode untuk ESP32 Web Server (beserta penjelasan di dalamnya) sebagai berikut :
/*********
Rui Santos
Complete project details at https://randomnerdtutorials.com
*********/// memasukkan library WiFi
#include <WiFi.h>// mengisi dengan ID dan Password WiFi yang digunakan
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";// menetapkan nomor port web server menjadi 80
WiFiServer server(80);// Variabel untuk meletakkan header dari HTTP request
String header;// Auxiliar variabel untuk meletakkan output state yang sedang digunakan
String output26State = "off";
String output27State = "off";// menetapkan variabel output, yaitu 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);
// menginisialisasi output variabel menjadi output
pinMode(output26, OUTPUT);
pinMode(output27, OUTPUT);
// menyetel outputs menjadi LOW, atau tidak nyala
digitalWrite(output26, LOW);
digitalWrite(output27, LOW);// proses untuk koneksi ke jaringan Wi-Fi menggunakan SSID dan Password
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password); // memulai koneksi Wi-Fi
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();
}// Dalam loop, kita menulis apa yang akan terjadi jika ada client yang terhubung dengan Web Server dengna koneksi Wi-Fi
void loop(){
WiFiClient client = server.available(); // mendeteksi client yang mungkin terhubungif (client) { // jika client baru connect,
currentTime = millis();
previousTime = currentTime;
Serial.println("New Client."); // mengeluarkan message ke serial monitor
String currentLine = ""; // membuat string untuk menahan data yang datang dari klien
while (client.connected() && currentTime - previousTime <= timeoutTime) { // loop terus selama client masiconnected
currentTime = millis();
if (client.available()) { // jika ada byte yang bisa dibaca dari client,
char c = client.read(); // baca byte
Serial.write(c); // print di serial monitor
header += c;
if (c == '\n') { // jika byte adalah newline character
// jika line sekarang kosong, kamu mendapatkan 2 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();
// menyalakn dan mematikan GPIO 26 dan 27
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);
}
// menampilkan HTML web page
client.println("<!DOCTYPE html><html>"); // tanda bahwa kita mengirim HTML
client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"); // membuat HTML dapat responsive di browser manapun
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;}"); // membuat style dari Web page
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>");
// menampilkan status sekarang, tombol on/off untuk GPIO26
client.println("<p>GPIO 26 - State " + output26State + "</p>");
// jika output state off, ditampilkan tombol on
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>");
}
// menampilkan status sekarang, tombol on/off untuk GPIO27
client.println("<p>GPIO 27 - State " + output27State + "</p>");
// jika output state off, ditampilkan tombol on
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
}
}
}
// menghapus header yang ada
header = "";
// menutup koneksi
client.stop();
Serial.println("Client disconnected.");
Serial.println("");
}
}
Khususnya, untuk kode berikut, jangan lupa untuk diganti dengan User ID dan Password dari Wi-Fi yang kalian gunakan
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Setelah membuat kode, langsung aja kita upload kode tersebut, dan hasilnya sebagai berikut di Serial Monitor :
Nah setelah aku melihat di serial monitor, aku mendapatkan sebuah IP Address. IP Address tersebut aku masukkan ke Web Browser yang ada di Gadget aku, dan hasilnya sebagai berikut
Setelah berhasil sambung ke Gadget maka akan muncul tulisan sebagai berikut di Serial Monitor
Berhasil koneksi ke Wi-Fi rumahku, dan terdapat New Client, yaitu gadget yang aku gunakan.
Nah dari sini langsung saja kita coba praktekan menekan tombol On/Off yang ada dan hasilnya sebagai berikut :
Ketika lampu GPIO26 Nyala, ada perubahan juga di Serial Monitor
Dapat terlihat bahwa, GET /26/on HTTP/1.1, yaitu bahwa GPIO26 telah berhasil nyala dengan baik. Selanjutnya kita coba untuk menyalakan GPIO27
Sama seperti GPIO26, terdapat perubahan di Serial Monitor
Dapat terlihat bahwa, GET /27/on HTTP/1.1, menyatakan bahwa lampu di GPIO27 sudah berhasil nyala. Dan terakhir aku menyalakan kedua lampu tersebut
Jika ingin lebih jelas, aku membuat video demo untuk project ini,
Dari project ini, aku jadi mengerti bagaimana membuat suatu Web Server dengan ESP32. Seperti contoh disini aku belajar untuk mengontrol 2 LED dengan Web Server tersebut menggunakan suatu koneksi Wi-Fi. Sebenarnya tidak harus LED, output-output lain juga dapat digunakan dan dicoba.
Nah, itu dia untuk project ke 8. Semoga hal-hal berikut dapat membantu kalian yang ingin mencobanya. Menurutku, project kali ini mejadi salah satu project terseru selama ini sih. Tunggu aku di project-project selanjutnya yaa, See you and Thankyou.