Tutorial Menggunakan Modul Relay dengan ESP32 : Mengontrol Peralatan AC (Server WEB)

Mengontrol peralatan rumah tangga yang bertegangan AC dari jarak jauh dapat dilakukan dengan menggunakan ESP32 dan relay. Pada tutorial ini akan menjelaskan cara mengontrol modul relay dengan ESP32. Kita akan melihat bagaimana modul relay bekerja, cara menghubungkan relay ke ESP32, dan membangun server web untuk mengontrol relay dari jarak jauh (atau sebanyak relay yang Anda inginkan).
Relay
Relay adalah sakelar yang dioperasikan secara elektrik dan seperti sakelar lainnya, dapat dihidupkan atau dimatikan, memungkinkan arus mengalir atau tidak. Relay dapat dikontrol dengan tegangan rendah, seperti 3,3V yang disediakan oleh GPIO ESP32 dan memungkinkan kita untuk mengontrol tegangan tinggi seperti 12V, 24V atau tegangan listrik utama (230V di Eropa dan 120V di AS)
Modul Relay 1, 2, 4, 8 dan 16 Channel
Terdapat berbagai modul relai dengan jumlah saluran yang berbeda. Anda dapat menemukan modul relai dengan satu, dua, empat, delapan, dan bahkan enam belas saluran. Jumlah saluran menentukan jumlah output yang dapat kita kendalikan.
Terdapat modul relai yang elektromagnetnya dapat diberi daya 5V dan 3.3V. Keduanya dapat digunakan dengan ESP32 – Anda dapat menggunakan pin VIN (yang menyediakan 5V) atau pin 3.3V.
Selain itu, beberapa di antaranya dilengkapi dengan optocoupler bawaan yang menambahkan “lapisan” perlindungan ekstra, mengisolasi ESP32 secara optik dari rangkaian relai.
Dapatkan modul relay disini
Susunan Pin pada Relay
Di sisi kiri, terdapat dua set tiga soket untuk menghubungkan tegangan tinggi, dan pin di sisi kanan (tegangan rendah) terhubung ke GPIO ESP32.
Sambungan Tegangan Listrik Utama
Modul relai yang ditunjukkan pada foto sebelumnya memiliki dua konektor, masing-masing dengan tiga soket: umum (COM), Biasanya Tertutup (NC), dan Normally Open (TIDAK).
- COM: hubungkan arus yang ingin Anda kendalikan (tegangan listrik utama).
- NC (Normally Closed): Konfigurasi normally closed digunakan ketika Anda ingin relay dalam keadaan tertutup secara default. Pin NC atau COM terhubung, artinya arus mengalir kecuali Anda mengirimkan sinyal dari ESP32 ke modul relay untuk membuka sirkuit dan menghentikan aliran arus.
- NO (Normally Open): Konfigurasi normally open bekerja sebaliknya: tidak ada koneksi antara pin NO dan COM, sehingga rangkaian terputus kecuali Anda mengirimkan sinyal dari ESP32 untuk menutup rangkaian.
Pin Kontrol
Sisi tegangan rendah memiliki satu set empat pin dan satu set tiga pin. Set pertama terdiri dariVCCDanGNDuntuk menghidupkan modul, dan masukkan 1 (IN1) dan masukan 2 (IN2) untuk mengontrol relay bawah dan atas secara berturut-turut.
Jika modul relai Anda hanya memiliki satu saluran, Anda hanya akan memiliki satu pin IN. Jika Anda memiliki empat saluran, Anda akan memiliki empat pin IN, dan seterusnya.
Sinyal yang Anda kirim ke pin IN menentukan apakah relay aktif atau tidak. Relay akan aktif ketika input turun di bawah sekitar 2V. Ini berarti Anda akan mengalami skenario berikut:
- Konfigurasi Normally Closed (NC) :
- Sinyal TINGGI – arus mengalir
- Sinyal RENDAH – arus tidak mengalir
- Konfigurasi Normally Open (NO) :
- Sinyal TINGGI – arus tidak mengalir
- Sinyal RENDAH – arus mengalir
Anda sebaiknya menggunakan konfigurasi normally closed (tertutup normal) ketika arus seharusnya mengalir hampir sepanjang waktu, dan Anda hanya ingin menghentikannya sesekali.
Gunakan konfigurasi normally open (biasanya terbuka) ketika Anda ingin arus mengalir sesekali (misalnya, menyalakan lampu sesekali).
Pemilihan Catu Daya
Rangkaian pin kedua terdiri dariGND,VCC, DanJD-VCCjarum. ItuJD-VCCPin ini memberi daya pada elektromagnet relai. Perhatikan bahwa modul ini memiliki penutup jumper yang menghubungkan pin VCC dan JD-VCC; yang ditunjukkan di sini berwarna kuning, tetapi milik Anda mungkin berwarna berbeda.
Dengan mengenakan topi jumper,VCCDanJD-VCCPin-pin tersebut terhubung. Itu berarti elektromagnet relai diberi daya langsung dari pin daya ESP32, sehingga modul relai dan rangkaian ESP32 tidak terisolasi secara fisik satu sama lain.
Tanpa penutup jumper, Anda perlu menyediakan sumber daya independen untuk menyalakan elektromagnet relai melaluiJD-VCCKonfigurasi tersebut secara fisik mengisolasi relay dari ESP32 dengan optocoupler bawaan modul, yang mencegah kerusakan pada ESP32 jika terjadi lonjakan listrik.
Menghubungkan Modul Relai ke ESP32
Hubungkan modul relai ke ESP32 seperti yang ditunjukkan pada diagram berikut. Diagram tersebut menunjukkan pemasangan kabel untuk modul relai 2 saluran, pemasangan kabel untuk jumlah saluran yang berbeda caranya serupa.
Alternatifnya, Anda dapat menggunakan sumber daya 12V untuk mengontrol peralatan 12V.
Dalam contoh ini, kita mengontrol sebuah lampu. Kita hanya ingin menyalakan lampu sesekali, jadi lebih baik menggunakan konfigurasi normally open (terbuka normal).
Kita menghubungkan pin IN1 keGPIO 26Anda dapat menggunakan GPIO lain yang sesuai.
Mengontrol Modul Relay dengan ESP32 – Sketsa Arduino
Kode untuk mengontrol relay dengan ESP32 semudah mengontrol LED atau output lainnya. Dalam contoh ini, karena kita menggunakan konfigurasi normally open, kita perlu mengirimkan sinyal LOW untuk membiarkan arus mengalir, dan sinyal HIGH untuk menghentikan aliran arus.
/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-relay-module-ac-web-server/
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*********/
const int relay = 26;
void setup() {
Serial.begin(115200);
pinMode(relay, OUTPUT);
}
void loop() {
// Normally Open configuration, send LOW signal to let current flow
// (if you're usong Normally Closed configuration send HIGH signal)
digitalWrite(relay, LOW);
Serial.println("Current Flowing");
delay(5000);
// Normally Open configuration, send HIGH signal stop current flow
// (if you're usong Normally Closed configuration send LOW signal)
digitalWrite(relay, HIGH);
Serial.println("Current not Flowing");
delay(5000);
}Cara Kerja Kode
Tentukan pin yang terhubung dengan pin IN relai.
const int relay = 26;
Di dalamsetup(), definisikan relay sebagai output.
pinMode(relay, OUTPUT);
Di dalamlingkaran(), kirimRENDAHsinyal untuk membiarkan arus mengalir dan menyalakan lampu.
digitalWrite(relay, LOW);
Jika Anda menggunakan konfigurasi normally closed, kirimkanTINGGIBerikan isyarat untuk menyalakan lampu. Kemudian, tunggu 5 detik.
delay(5000);
Hentikan aliran arus dengan mengirimkanTINGGIsinyal ke pin relai. Jika Anda menggunakan konfigurasi normally closed, kirimkanRENDAHsinyal untuk menghentikan aliran arus.
digitalWrite(relay, HIGH);
Mengontrol Beberapa Relay dengan Server Web ESP32
Di bagian ini, kami telah membuat contoh server web yang memungkinkan Anda mengontrol relay sebanyak yang Anda inginkan melalui server web, baik yang dikonfigurasi sebagai normally open (NOP) maupun normally closed (NC). Anda hanya perlu mengubah beberapa baris kode untuk menentukan jumlah relay yang ingin Anda kontrol dan penugasan pin.
Menginstal Pustaka Server Web
Kita akan membangun server web menggunakan pustaka-pustaka berikut:
- ESPAsyncWebServer oleh ESP32Async
- AsyncTCP oleh ESP32Async
Anda dapat menginstal pustaka-pustaka ini di Pengelola Pustaka Arduino. Buka Pengelola Pustaka dengan mengklik ikon Pustaka di bilah sisi kiri.
Cari ESPAsyncWebServer dan instal ESPAsyncWebServer oleh ESP32Async .
Kemudian, instal pustaka AsyncTCP. CariAsyncTCPdan instal AsyncTCP oleh ESP32Async .
Kode
Setelah menginstal pustaka yang diperlukan, salin kode berikut ke Arduino IDE Anda.
/*********
Rui Santos & Sara Santos - Random Nerd Tutorials
Complete project details at https://RandomNerdTutorials.com/esp32-relay-module-ac-web-server/
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*********/
// Import required libraries
#include "WiFi.h"
#include "ESPAsyncWebServer.h"
// Set to true to define Relay as Normally Open (NO)
#define RELAY_NO true
// Set number of relays
#define NUM_RELAYS 5
// Assign each GPIO to a relay
int relayGPIOs[NUM_RELAYS] = {2, 26, 27, 25, 33};
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
const char* PARAM_INPUT_1 = "relay";
const char* PARAM_INPUT_2 = "state";
// Create AsyncWebServer object on port 80
AsyncWebServer server(80);
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
html {font-family: Arial; display: inline-block; text-align: center;}
h2 {font-size: 3.0rem;}
p {font-size: 3.0rem;}
body {max-width: 600px; margin:0px auto; padding-bottom: 25px;}
.switch {position: relative; display: inline-block; width: 120px; height: 68px}
.switch input {display: none}
.slider {position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; border-radius: 34px}
.slider:before {position: absolute; content: ""; height: 52px; width: 52px; left: 8px; bottom: 8px; background-color: #fff; -webkit-transition: .4s; transition: .4s; border-radius: 68px}
input:checked+.slider {background-color: #2196F3}
input:checked+.slider:before {-webkit-transform: translateX(52px); -ms-transform: translateX(52px); transform: translateX(52px)}
</style>
</head>
<body>
<h2>ESP Web Server</h2>
%BUTTONPLACEHOLDER%
<script>function toggleCheckbox(element) {
var xhr = new XMLHttpRequest();
if(element.checked){ xhr.open("GET", "/update?relay="+element.id+"&state=1", true); }
else { xhr.open("GET", "/update?relay="+element.id+"&state=0", true); }
xhr.send();
}</script>
</body>
</html>
)rawliteral";
// Replaces placeholder with button section in your web page
String processor(const String& var){
//Serial.println(var);
if(var == "BUTTONPLACEHOLDER"){
String buttons ="";
for(int i=1; i<=NUM_RELAYS; i++){
String relayStateValue = relayState(i);
buttons+= "<h4>Relay #" + String(i) + " - GPIO " + relayGPIOs[i-1] + "</h4><label class=\"switch\"><input type=\"checkbox\" onchange=\"toggleCheckbox(this)\" id=\"" + String(i) + "\" "+ relayStateValue +"><span class=\"slider\"></span></label>";
}
return buttons;
}
return String();
}
String relayState(int numRelay){
if(RELAY_NO){
if(digitalRead(relayGPIOs[numRelay-1])){
return "";
}
else {
return "checked";
}
}
else {
if(digitalRead(relayGPIOs[numRelay-1])){
return "checked";
}
else {
return "";
}
}
return "";
}
void setup(){
// Serial port for debugging purposes
Serial.begin(115200);
// Set all relays to off when the program starts - if set to Normally Open (NO), the relay is off when you set the relay to HIGH
for(int i=1; i<=NUM_RELAYS; i++){
pinMode(relayGPIOs[i-1], OUTPUT);
if(RELAY_NO){
digitalWrite(relayGPIOs[i-1], HIGH);
}
else{
digitalWrite(relayGPIOs[i-1], LOW);
}
}
// Connect to Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
// Print ESP32 Local IP Address
Serial.println(WiFi.localIP());
// Route for root / web page
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/html", index_html, processor);
});
// Send a GET request to <ESP_IP>/update?relay=<inputMessage>&state=<inputMessage2>
server.on("/update", HTTP_GET, [] (AsyncWebServerRequest *request) {
String inputMessage;
String inputParam;
String inputMessage2;
String inputParam2;
// GET input1 value on <ESP_IP>/update?relay=<inputMessage>
if (request->hasParam(PARAM_INPUT_1) & request->hasParam(PARAM_INPUT_2)) {
inputMessage = request->getParam(PARAM_INPUT_1)->value();
inputParam = PARAM_INPUT_1;
inputMessage2 = request->getParam(PARAM_INPUT_2)->value();
inputParam2 = PARAM_INPUT_2;
if(RELAY_NO){
Serial.print("NO ");
digitalWrite(relayGPIOs[inputMessage.toInt()-1], !inputMessage2.toInt());
}
else{
Serial.print("NC ");
digitalWrite(relayGPIOs[inputMessage.toInt()-1], inputMessage2.toInt());
}
}
else {
inputMessage = "No message sent";
inputParam = "none";
}
Serial.println(inputMessage + inputMessage2);
request->send(200, "text/plain", "OK");
});
// Start server
server.begin();
}
void loop() {
}Definisikan Konfigurasi Relay
Ubah variabel berikut untuk menunjukkan apakah Anda menggunakan relay dalam konfigurasi normally open (NO) atau normally closed (NC). AturNOMOR_RELAYvariabel keBENARuntuk sistem operasi yang biasanya terbuka diatur kePALSUuntuk yang biasanya tertutup.
#define RELAY_NO true
Tentukan Jumlah Relay (Saluran)
Anda dapat menentukan jumlah relay yang ingin Anda kendalikan padaNUM_RELAYvariabel. Untuk tujuan demonstrasi, kita akan menetapkannya menjadi 5.
#define NUM_RELAYS 5
Definisikan Penugasan Pin Relay
Pada variabel array berikut, Anda dapat mendefinisikan GPIO ESP32 yang akan mengontrol relay:
int relayGPIOs[NUM_RELAYS] = {2, 26, 27, 25, 33};
Jumlah relai yang dipasang padaNUM_RELAYVariabel tersebut harus sesuai dengan jumlah GPIO yang dialokasikan di dalamnya.relayGPIOssusunan.
Kredensial Jaringan
Masukkan kredensial jaringan Anda ke dalam variabel berikut.
const char* ssid = “REPLACE_WITH_YOUR_SSID”;
const char* password = “REPLACE_WITH_YOUR_PASSWORD”;
Cara Menghubungkan Relay 8 Saluran ke ESP32
Untuk tujuan demonstrasi, kita mengontrol 5 saluran relai. Hubungkan ESP32 ke modul relai seperti yang ditunjukkan pada diagram skematik berikut.

Demonstrasi
Setelah melakukan perubahan yang diperlukan, unggah kode tersebut ke ESP32 Anda.
Buka Serial Monitor dengan kecepatan baud 115200 dan tekan tombol EN pada ESP32 untuk mendapatkan alamat IP-nya.
Kemudian, buka browser di jaringan lokal Anda dan ketik alamat IP ESP32 untuk mengakses server web.
Anda akan mendapatkan hasil seperti berikut, dengan jumlah tombol yang sama dengan jumlah relay yang telah Anda definisikan dalam kode Anda.
Sekarang, Anda dapat menggunakan tombol-tombol tersebut untuk mengontrol relay Anda dari jarak jauh menggunakan ponsel cerdas Anda.
Penutup untuk Keamanan
Untuk proyek akhir, pastikan Anda menempatkan modul relai dan ESP di dalam wadah tertutup untuk menghindari adanya pin AC yang terbuka.
Kesimpulan
Menggunakan relay dengan ESP32 adalah cara yang bagus untuk mengontrol peralatan rumah tangga AC dari jarak jauh.
Mengontrol relay dengan ESP32 semudah mengontrol output lainnya, Anda hanya perlu mengirimkan sinyal HIGH dan LOW seperti yang Anda lakukan untuk mengontrol LED.
Anda dapat menggunakan contoh server web kami yang mengontrol output untuk mengontrol relay. Anda hanya perlu memperhatikan konfigurasi yang Anda gunakan. Jika Anda menggunakan konfigurasi normally open, relay akan bekerja dengan logika terbalik.
Credit article translated from RANDOM NERD TUTORIALS































