#define BLYNK_TEMPLATE_ID "TMPL6ZM0hZ8Hk"
//Ini adalah definisi praprosesor yang menyimpan ID template Blynk yang digunakan dalam proyek.
//Template Blynk adalah cara untuk menyusun dan mengatur widget dalam aplikasi Blynk.
#define BLYNK_TEMPLATE_NAME "Smart Temperature Control"
//Ini adalah definisi praprosesor yang menyimpan nama template Blynk yang digunakan dalam proyek.
//Nama ini hanya digunakan untuk tujuan identifikasi dan dokumentasi.
#define BLYNK_AUTH_TOKEN "zu4vA1LoPdZSaFGBMZkwYR1jXGMkfZUM"
//Ini adalah definisi praprosesor yang menyimpan token otentikasi Blynk yang digunakan untuk mengautentikasi
//perangkat ESP32 Anda dengan server Blynk.
//Token ini merupakan kunci yang diperlukan untuk berkomunikasi dengan server Blynk.
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <ESP32Servo.h>
#include <DHTesp.h>
//Ini adalah perintah preprocessor untuk mengimpor pustaka-pustaka yang diperlukan dalam program, termasuk pustaka
//WiFi untuk koneksi Wi-Fi, pustaka Blynk untuk berkomunikasi dengan server Blynk, pustaka ESP32Servo untuk
//mengendalikan servo, dan pustaka DHTesp untuk berkomunikasi dengan sensor DHT22.
char auth[] = BLYNK_AUTH_TOKEN;
//Ini adalah deklarasi variabel auth yang menyimpan token otentikasi Blynk. Nilai token
//diambil dari definisi praprosesor sebelumnya.
char ssid[] = "Wokwi-GUEST";
//ni adalah deklarasi variabel ssid yang menyimpan nama jaringan Wi-Fi yang akan digunakan
//untuk menghubungkan ESP32 ke Internet.
char pass[] = "";
//Ini adalah deklarasi variabel pass yang menyimpan kata sandi jaringan Wi-Fi yang digunakan
//untuk mengautentikasi ESP32 ke jaringan Wi-Fi.
Servo Servo1; //Ini adalah deklarasi objek Servo1 dari kelas Servo.
//Objek ini digunakan untuk mengendalikan servo yang terhubung ke pin 14 pada ESP32.
DHTesp dht;//Ini adalah deklarasi objek dht dari kelas DHTesp. Objek ini digunakan
//untuk berkomunikasi dengan sensor DHT22.
TempAndHumidity data;//ni adalah deklarasi objek data.
int suhu;//Ini adalah deklarasi variabel suhu yang akan digunakan untuk menyimpan nilai suhu yang dibaca
// dari sensor DHT22.
const int Relay = 2;//Ini adalah deklarasi variabel konstan Relay yang menyimpan nomor pin yang
//akan digunakan untuk mengendalikan sebuah relay
BlynkTimer timer; //ni adalah deklarasi objek timer dari kelas BlynkTimer. Objek ini digunakan untuk mengatur
//jadwal pemanggilan fungsi myTimerEvent yang akan dijalankan pada interval tertentu.
void myTimerEvent()
//ni adalah fungsi yang akan dipanggil oleh timer pada interval yang telah ditentukan. Dalam fungsi ini,
//suhu dibaca dari sensor DHT22, kemudian nilai suhu dibandingkan dan relay dikendalikanberdasarkan suhu yang terbaca.
// Selain itu, nilai suhu juga dikirim ke Blynk untuk ditampilkan pada widget dengan ID V0.
{
suhu=data.temperature;
Serial.println("Temp: " + String(data.temperature, 2) + "°C");//Baris ini mencetak suhu yang diukur dari sensor DHT22
//ke Serial Monitor. Data suhu diambil dari data.temperature, dan nilai ini dikonversi ke string dengan dua angka desimal
//setelah koma menggunakan String(data.temperature, 2). Hasilnya adalah pesan yang mencetak suhu dalam derajat Celsius (°C) ke Serial Monitor
if(data.temperature>30){//Ini adalah pernyataan kondisional yang memeriksa apakah suhu yang diukur (data.temperature) lebih besar dari 30 derajat Celsius.
digitalWrite(2, LOW);//Jika kondisinya benar (suhu lebih dari 30°C), maka pin 2 (atau digital pin 2) akan diatur ke status LOW.
}
else{//ika kondisi pada baris sebelumnya tidak terpenuhi (suhu kurang dari atau sama dengan 30°C), maka perangkat yang dikontrol oleh pin 2 akan diatur ke status HIGH
digitalWrite(2, HIGH);//Ini menandakan bahwa perangkat akan aktif atau hidup jika suhu tidak melebihi 30°C.
}
Blynk.virtualWrite(V0,suhu);// Baris ini mengirimkan data suhu (suhu) ke widget Blynk dengan ID V0.
//Ini memungkinkan untuk memantau suhu di aplikasi Blynk dan menampilkan nilai suhu dalam widget yang sesuai.
}
int SW_State1 = 0;
//Ini adalah deklarasi variabel SW_State1 yang digunakan untuk menyimpan status yang diterima dari widget Blynk dengan ID V1.
BLYNK_WRITE (V1) //Ini adalah fungsi yang akan dipanggil ketika nilai widget Blynk dengan ID V1 berubah.
//Fungsi ini mengendalikan posisi servo berdasarkan nilai yang diterima dari Blynk dan juga mencetak pesan ke Serial Monitor.
{
SW_State1 = param.asInt();//aris ini mengambil nilai yang dikirim dari widget Blynk dan mengkonversinya ke tipe data integer. Nilai ini disimpan dalam variabel SW_State1.
if (SW_State1 == 1)//Ini adalah pernyataan kondisional. Ini memeriksa apakah SW_State1 sama dengan 1. Jika nilai yang dikirim dari widget Blynk adalah 1, maka kondisi ini akan benar.
{
Servo1.write(30);//Ini mengatur posisi servo motor Servo1 ke 90 derajat. Ini mungkin digunakan untuk menggerakkan pintu atau mekanisme lain ke posisi "Arm" (tersiap).
Serial.println("Pintu Arm");//Ini mencetak pesan "Pintu Arm" ke Serial Monitor. Ini berguna untuk memantau aktivitas program melalui antarmuka Serial Monitor.
Blynk.virtualWrite(V1, HIGH);//Ini mengirimkan sinyal ke widget Blynk dengan ID V1 untuk menunjukkan bahwa pintu dalam posisi "Arm." Ini dapat menciptakan umpan balik visual di aplikasi Blynk.
}
else//ika kondisi pada baris 2 tidak terpenuhi (nilai SW_State1 bukan 1).
{
Servo1.write(0);//ni mengatur posisi servo motor Servo1 ke 0 derajat. Ini mungkin digunakan untuk menggerakkan pintu atau mekanisme lain ke posisi "DisArm" (tidak siap).
Serial.println("Pintu DisArm");//Ini mencetak pesan "Pintu DisArm" ke Serial Monitor. Ini berguna untuk memantau aktivitas program melalui antarmuka Serial Monitor.
Blynk.virtualWrite(V1, LOW);//ni mengirimkan sinyal ke widget Blynk dengan ID V1 untuk menunjukkan bahwa pintu dalam posisi "DisArm." Ini juga menciptakan umpan balik visual di aplikasi Blynk.
}
}
BLYNK_WRITE (V2) //Ini adalah fungsi yang akan dipanggil ketika nilai widget Blynk dengan ID V2 berubah.
//Fungsi ini mengendalikan posisi servo berdasarkan nilai yang diterima dari Blynk dan juga mencetak pesan ke Serial Monitor.
{
SW_State1 = param.asInt();//aris ini mengambil nilai yang dikirim dari widget Blynk dan mengkonversinya ke tipe data integer. Nilai ini disimpan dalam variabel SW_State1.
if (SW_State1 == 1)//Ini adalah pernyataan kondisional. Ini memeriksa apakah SW_State1 sama dengan 1. Jika nilai yang dikirim dari widget Blynk adalah 1, maka kondisi ini akan benar.
{
Servo1.write(60);//Ini mengatur posisi servo motor Servo1 ke 90 derajat. Ini mungkin digunakan untuk menggerakkan pintu atau mekanisme lain ke posisi "Arm" (tersiap).
Serial.println("Pintu Arm");//Ini mencetak pesan "Pintu Arm" ke Serial Monitor. Ini berguna untuk memantau aktivitas program melalui antarmuka Serial Monitor.
Blynk.virtualWrite(V1, HIGH);//Ini mengirimkan sinyal ke widget Blynk dengan ID V2 untuk menunjukkan bahwa pintu dalam posisi "Arm." Ini dapat menciptakan umpan balik visual di aplikasi Blynk.
}
else//ika kondisi pada baris 2 tidak terpenuhi (nilai SW_State1 bukan 1).
{
Servo1.write(0);//ni mengatur posisi servo motor Servo1 ke 0 derajat. Ini mungkin digunakan untuk menggerakkan pintu atau mekanisme lain ke posisi "DisArm" (tidak siap).
Serial.println("Pintu DisArm");//Ini mencetak pesan "Pintu DisArm" ke Serial Monitor. Ini berguna untuk memantau aktivitas program melalui antarmuka Serial Monitor.
Blynk.virtualWrite(V2, LOW);//ni mengirimkan sinyal ke widget Blynk dengan ID V2 untuk menunjukkan bahwa pintu dalam posisi "DisArm." Ini juga menciptakan umpan balik visual di aplikasi Blynk.
}
}
BLYNK_WRITE (V3) //Ini adalah fungsi yang akan dipanggil ketika nilai widget Blynk dengan ID V3 berubah.
//Fungsi ini mengendalikan posisi servo berdasarkan nilai yang diterima dari Blynk dan juga mencetak pesan ke Serial Monitor.
{
SW_State1 = param.asInt();//aris ini mengambil nilai yang dikirim dari widget Blynk dan mengkonversinya ke tipe data integer. Nilai ini disimpan dalam variabel SW_State1.
if (SW_State1 == 1)//Ini adalah pernyataan kondisional. Ini memeriksa apakah SW_State1 sama dengan 1. Jika nilai yang dikirim dari widget Blynk adalah 1, maka kondisi ini akan benar.
{
Servo1.write(90);//Ini mengatur posisi servo motor Servo1 ke 90 derajat. Ini mungkin digunakan untuk menggerakkan pintu atau mekanisme lain ke posisi "Arm" (tersiap).
Serial.println("Pintu Arm");//Ini mencetak pesan "Pintu Arm" ke Serial Monitor. Ini berguna untuk memantau aktivitas program melalui antarmuka Serial Monitor.
Blynk.virtualWrite(V3, HIGH);//Ini mengirimkan sinyal ke widget Blynk dengan ID V3 untuk menunjukkan bahwa pintu dalam posisi "Arm." Ini dapat menciptakan umpan balik visual di aplikasi Blynk.
}
else//ika kondisi pada baris 2 tidak terpenuhi (nilai SW_State1 bukan 1).
{
Servo1.write(0);//ni mengatur posisi servo motor Servo1 ke 0 derajat. Ini mungkin digunakan untuk menggerakkan pintu atau mekanisme lain ke posisi "DisArm" (tidak siap).
Serial.println("Pintu DisArm");//Ini mencetak pesan "Pintu DisArm" ke Serial Monitor. Ini berguna untuk memantau aktivitas program melalui antarmuka Serial Monitor.
Blynk.virtualWrite(V3, LOW);//ni mengirimkan sinyal ke widget Blynk dengan ID V3 untuk menunjukkan bahwa pintu dalam posisi "DisArm." Ini juga menciptakan umpan balik visual di aplikasi Blynk.
}
}
void setup()// Ini adalah fungsi setup() yang akan dijalankan sekali saat perangkat pertama kali dihidupkan. Dalam fungsi ini,
//menginisialisasi komunikasi serial, menghubungkan ke server Blynk, menghubungkan objek servo ke pin yang sesuai, mengatur timer,
//menghubungkan objek sensor DHT22 ke pin yang sesuai, dan menginisialisasi pin 2 sebagai OUTPUT untuk mengendalikan relay.
{
Serial.begin(115200);//Baris ini menginisialisasi komunikasi serial pada Arduino dengan kecepatan baud rate 115,200.
Blynk.begin(auth, ssid, pass);//Ini menginisialisasi koneksi ke server Blynk dengan menggunakan informasi otentikasi (auth), nama jaringan WiFi (ssid), dan kata sandi WiFi (pass) yang Anda tentukan. Blynk adalah platform yang memungkinkan
//mengendalikan perangkat Arduino melalui aplikasi seluler atau web.
Servo1.attach(14);//Ini menghubungkan servo motor (dalam hal ini, Servo1) ke pin digital 14 pada papan Arduino. Dengan menggunakan Servo1.attach(14), servo motor akan dikendalikan melalui pin 14.
timer.setInterval(1000L, myTimerEvent);//Baris ini mengatur timer yang akan memanggil fungsi myTimerEvent() setiap 1000 milisekon (1 detik). Timer ini digunakan untuk mengatur interval di mana Anda akan melakukan pembaruan atau tugas tertentu,
//seperti membaca data sensor dan mengirim data ke server Blynk.
dht.setup(12,DHTesp::DHT22);//Baris ini menginisialisasi komunikasi dengan sensor DHT22 yang terhubung ke pin digital 12. DHT22 adalah sensor suhu dan kelembaban yang akan digunakan untuk mengukur suhu dan kelembaban di sekitar lingkungan.
pinMode(2, OUTPUT);//Ini mengatur pin digital 2 sebagai output.
}
void loop()//Ini adalah fungsi loop() yang akan dijalankan secara berulang. Dalam fungsi ini,Menjalankan Blynk.run()
//untuk memproses komunikasi dengan server Blynk dan timer.run() untuk menjalankan jadwal pemanggilan fungsi myTimerEvent.
{
Blynk.run();//Baris ini memanggil fungsi Blynk.run(). Fungsi ini adalah bagian integral dari library Blynk. Ketika dipanggil dalam loop, ia bertanggung jawab untuk menjalankan proses utama komunikasi antara perangkat Arduino Anda dan server Blynk.
// Hal ini mencakup mengirim data dari perangkat Anda ke server Blynk dan menerima instruksi atau perintah dari server Blynk ke perangkat Anda. Dengan cara ini, Anda dapat mengendalikan perangkat Arduino Anda melalui aplikasi Blynk dan juga memonitor status perangkat tersebut.
timer.run();//Baris ini memanggil fungsi timer.run(). Fungsi ini berhubungan dengan objek timer yang telah Anda buat sebelumnya dengan timer.setInterval(1000L, myTimerEvent); dalam fungsi setup(). Fungsi timer.run() bertanggung jawab untuk mengatur timer dan memicu
//fungsi myTimerEvent() pada interval yang telah ditentukan (dalam hal ini, setiap 1000 milisekon atau 1 detik). Fungsi myTimerEvent() adalah tempat di mana Anda dapat menempatkan tugas-tugas yang perlu dijalankan secara berkala, seperti membaca sensor dan mengirim data ke server Blynk.
}