/*
Nama : Selvia Margareta Sitompul
Npm : 203510467
Kelas : 7F
LAB IoT PROJEK UAS Tentang: Otomasi Rumah ESP32 Menggunakan Blynk 2.0
Dengan Simulator Online */
#define BLYNK_TEMPLATE_ID "TMPL6E_gQIYrU"
#define BLYNK_TEMPLATE_NAME "LAB IOT SELVIA"
#define BLYNK_AUTH_TOKEN "ivdmLS8q38QoTN-eGQjaS0KIPQo1tCA1"
// Comment this out to disable prints and save space
#define BLYNK_PRINT Serial
//Pengimportan Library
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = BLYNK_AUTH_TOKEN;
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
// Mendefinisikan Nilai untuk Pin
#define button1_pin 26
#define button2_pin 25
#define button3_pin 33
#define button4_pin 32
// mendefinisikan nilai pin relay di blynk
#define relay1_pin 13
#define relay2_pin 12
#define relay3_pin 14
#define relay4_pin 27
//untuk menyimpan dan melacak status dari suatu relay.
//Dengan menginisialisasi nilai awalnya ke 0, ini memberikan keadaan awal yang dapat diinterpretasikan sebagai relay dalam keadaan mati atau tidak aktif.
int relay1_state = 0;
int relay2_state = 0;
int relay3_state = 0;
int relay4_state = 0;
//Change the virtual pins according the rooms
//membuat sebuah makro atau definisi dengan nama button1_vpin yang diartikan sebagai V1.
//Ini dapat digunakan dalam program untuk memudahkan penggunaan pin virtual tertentu pada aplikasi Blynk.
#define button1_vpin V1
#define button2_vpin V2
#define button3_vpin V3
#define button4_vpin V4
//------------------------------------------------------------------------------
// This function is called every time the device is connected to the Blynk.Cloud
// Request the latest state from the server
BLYNK_CONNECTED() { // sebuah fungsi atau callback yang dipanggil otomatis ketika perangkat berhasil terhubung dengan server Blynk.
Blynk.syncVirtual(button1_vpin);//untuk menginisialisasi atau menyinkronkan nilai pada pin virtual tertentu dengan nilai aktual dari perangkat ke aplikasi Blynk.
Blynk.syncVirtual(button2_vpin);//button1_vpin adalah sebuah makro atau definisi yang mungkin merujuk pada suatu pin virtual di Blynk (didefinisikan sebelumnya dengan #define button1_vpin V1).
Blynk.syncVirtual(button3_vpin);
Blynk.syncVirtual(button4_vpin);
}
//--------------------------------------------------------------------------
// This function is called every time the Virtual Pin state change
// "Fungsi ini dipanggil setiap kali keadaan (state) Virtual Pin berubah."
//i.e when web push switch from Blynk App or Web Dashboard
//Ini adalah deklarasi fungsi callback untuk menangani perubahan nilai pada Virtual Pin tertentu (button1_vpin) di aplikasi Blynk.
//Saat ada perubahan pada pin virtual tersebut di aplikasi Blynk, fungsi ini akan dijalankan secara otomatis.
BLYNK_WRITE(button1_vpin) {
relay1_state = param.asInt();//digunakan untuk mengambil nilai yang dikirimkan dari aplikasi Blynk ke perangkat melalui pin virtual (button1_vpin).
digitalWrite(relay1_pin, relay1_state);//perintah untuk mengubah status (menyalakan atau mematikan) relay pada pin fisik perangkat (relay1_pin) berdasarkan nilai relay1_state.
}//digitalWrite() digunakan untuk mengontrol keadaan output digital pada suatu pin. Dalam hal ini, relay akan diatur sesuai dengan nilai yang diterima dari aplikasi Blynk melalui pin virtual.
//--------------------------------------------------------------------------
BLYNK_WRITE(button2_vpin) {
relay2_state = param.asInt();
digitalWrite(relay2_pin, relay2_state);
}
//--------------------------------------------------------------------------
BLYNK_WRITE(button3_vpin) {
relay3_state = param.asInt();
digitalWrite(relay3_pin, relay3_state);
}
//--------------------------------------------------------------------------
BLYNK_WRITE(button4_vpin) {
relay4_state = param.asInt();
digitalWrite(relay4_pin, relay4_state);
}
//--------------------------------------------------------------------------
void setup()//untuk menginisialisasi dan menyiapkan berbagai konfigurasi yang diperlukan sebelum program utama dimulai.
{
// Debug console
Serial.begin(115200);//perintah yang digunakan dalam program Arduino untuk memulai komunikasi serial pada kecepatan tertentu.
//--------------------------------------------------------------------
pinMode(button1_pin, INPUT_PULLUP);//digunakan dalam program Arduino untuk mengkonfigurasi suatu pin sebagai input dengan opsi resistornya diaktifkan (pull-up).
pinMode(button2_pin, INPUT_PULLUP);
pinMode(button3_pin, INPUT_PULLUP);
pinMode(button4_pin, INPUT_PULLUP);
//--------------------------------------------------------------------
pinMode(relay1_pin, OUTPUT);//untuk mengonfigurasi suatu pin sebagai output
pinMode(relay2_pin, OUTPUT);
pinMode(relay3_pin, OUTPUT);
pinMode(relay4_pin, OUTPUT);
//--------------------------------------------------------------------
//During Starting all Relays should TURN OFF
digitalWrite(relay1_pin, HIGH);//untuk mengatur nilai logika tinggi (HIGH) pada suatu pin digital.
digitalWrite(relay2_pin, HIGH);
digitalWrite(relay3_pin, HIGH);
digitalWrite(relay4_pin, HIGH);
//--------------------------------------------------------------------
Blynk.begin(auth, ssid, pass);//untuk menginisialisasi koneksi dengan server Blynk
// You can also specify server:
//Blynk.begin(auth, ssid, pass, "blynk.cloud", 80);
//Blynk.begin(auth, ssid, pass, IPAddress(192,168,1,100), 8080);
//--------------------------------------------------------------------
//Blynk.virtualWrite(button1_vpin, relay1_state);
//Blynk.virtualWrite(button2_vpin, relay2_state);
//Blynk.virtualWrite(button3_vpin, relay3_state);
//Blynk.virtualWrite(button4_vpin, relay4_state);
//--------------------------------------------------------------------
}
void loop()//instruksi-instruksi yang akan dieksekusi berulang kali, membentuk suatu loop tak terbatas.
{
Blynk.run();//menangani proses-proses seperti pengiriman data, penerimaan perintah atau perubahan nilai dari aplikasi Blynk, serta memastikan bahwa koneksi dengan server Blynk tetap terjaga.
timer.run();//Library timer sering digunakan untuk menjadwalkan dan mengelola kejadian atau tugas tertentu dalam suatu program yang berbasis waktu
// You can inject your own code or combine it with other sketches.
// Check other examples on how to communicate with Blynk. Remember
// to avoid delay() function!
listen_push_buttons();
}
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
void listen_push_buttons(){
//--------------------------------------------------------------------------
if(digitalRead(button1_pin) == LOW){
delay(200);
control_relay(1);
Blynk.virtualWrite(button1_vpin, relay1_state); //digunakan untuk membaca status tombol yang terhubung ke pin
}
//--------------------------------------------------------------------------
else if (digitalRead(button2_pin) == LOW){
delay(200);
control_relay(2);
Blynk.virtualWrite(button2_vpin, relay2_state); //untuk mengirimkan data atau nilai ke aplikasi Blynk melalui pin virtual.
}
//--------------------------------------------------------------------------
else if (digitalRead(button3_pin) == LOW){
delay(200);
control_relay(3);
Blynk.virtualWrite(button3_vpin, relay3_state); //update button state
}
//--------------------------------------------------------------------------
else if (digitalRead(button4_pin) == LOW){
delay(200);
control_relay(4);
Blynk.virtualWrite(button4_vpin, relay4_state); //update button state
}
//--------------------------------------------------------------------------
}
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
void control_relay(int relay){//untuk mengontrol suatu relay berdasarkan nilai yang diterima sebagai parameter.
//------------------------------------------------
if(relay == 1){
relay1_state = !relay1_state;
digitalWrite(relay1_pin, relay1_state);
Serial.print("Relay1 State = ");
Serial.println(relay1_state);
delay(50);
}
//------------------------------------------------
else if(relay == 2){
relay2_state = !relay2_state;
digitalWrite(relay2_pin, relay2_state);
delay(50);
}
//------------------------------------------------
else if(relay == 3){
relay3_state = !relay3_state;
digitalWrite(relay3_pin, relay3_state);
delay(50);
}
//------------------------------------------------
else if(relay == 4){//Kontrol relay jika parameter relay bernilai 4
relay4_state = !relay4_state;
digitalWrite(relay4_pin, relay4_state);
delay(50);
}
//------------------------------------------------
}
//MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM