#define BLYNK_TEMPLATE_ID "TMPL6JJqLvU1r" // definisi konstanta praprosesor untuk menyimpan ID template Blynk
#define BLYNK_TEMPLATE_NAME "LDR Buzzer" // definisi konstanta praprosesor untuk menyimpan nama template
#define BLYNK_AUTH_TOKEN "V143d_WEHjNMPEidbU5Mc_d2Ra5tgl0F" // definisi konstanta praprosesor untuk menyimpan token otentikasi
#include <BlynkSimpleEsp32.h> // pustaka yang diperlukan untuk menggunakan Blynk pada ESP32
char auth[] = BLYNK_AUTH_TOKEN; // Deklarasi variabel auth untuk otentikasi Wi-Fi Blynk
char ssid[] = "Wokwi-GUEST"; // Deklarasi variabel ssid untuk koneksi ke jaringan Wi-Fi yang sesuai
char pass[] = ""; // Deklarasi variabel pass untuk koneksi ke jaringan Wi-Fi yang sesuai
BlynkTimer timer; // Baris ini mendeklarasikan objek timer dengan nama timer yang digunakan untuk mengatur timer dan jadwal pada aplikasi Blynk
#define buzzer 19 // Baris ini menggunakan preprocessor directive #define untuk mendefinisikan sebuah konstanta bernama buzzer dengan nilai 19
#define LDRanalog 34 // menggunakan preprocessor directive #define untuk mendefinisikan sebuah konstanta bernama LDRanalog dengan nilai 34
const float GAMMA = 0.7; // mendeklarasikan variabel konstan bernama GAMMA dengan tipe data float dan nilai 0.7
const float RL10 = 50; // mendeklarasikan variabel konstan bernama RL10 dengan tipe data float dan nilai 50
BLYNK_WRITE(V0) // fungsi callback yang dipanggil setiap kali nilai pada pin virtual V0 di Blynk berubah
{
int variabel = param.asInt(); // mendeklarasikan variabel lokal bernama variabel dengan tipe data integer (int)
if(variabel==1) // mengecek apakah nilai variabel sama dengan 1. Jika nilai variabel sama dengan 1, maka kondisi dalam blok if akan dieksekusi
{
tone(buzzer, 262); // Jika nilai variabel adalah 1, maka perintah tone() akan dipanggil untuk menghasilkan nada pada buzzer
}
else // Jika nilai variabel tidak sama dengan 1 (berarti variabel bukan 1), maka kondisi dalam blok else akan dieksekusi
{
noTone(buzzer); // Jika nilai variabel bukan 1, maka perintah noTone() akan dipanggil untuk menghentikan nada pada buzzer
}
}
void BacaKirimSensor() // deklarasi fungsi bernama BacaKirimSensor()
{
int nilaiADC = analogRead(LDRanalog); // membaca nilai analog dari pin yang terhubung ke sensor LDR menggunakan fungsi analogRead()
float voltage = nilaiADC * 5/4095.0; // mengkonversi nilai ADC menjadi tegangan (voltage) dengan mengalikan nilai ADC dengan 5 (tegangan referensi) dan membaginya dengan 4095.0 (nilai maksimum ADC)
float resistance = 2000 * voltage / (1 - voltage / 5); // menghitung resistansi sensor LDR berdasarkan tegangan yang diukur
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA)); // menghitung nilai lux berdasarkan rumus empiris yang didasarkan pada karakteristik sensor LDR
Blynk.virtualWrite(V1, lux); // mengirimkan nilai lux yang telah dihitung ke pin virtual V1 di aplikasi Blynk menggunakan fungsi Blynk.virtualWrite()
}
void setup() { // Ini adalah fungsi setup() yang berisi inisialisasi awal
Blynk.begin(auth, ssid, pass); // koneksi ke server Blynk diinisialisasi dengan menggunakan token otentikasi, SSID, dan kata sandi Wi-Fi yang telah ditentukan
timer.setInterval(1000L, BacaKirimSensor); // Fungsi BacaKirimSensor akan dipanggil setiap 1 detik untuk membaca nilai dari sensor dan mengirimkannya ke aplikasi Blynk
}
void loop() { // ini adalah awal dari fungsi loop(), yang merupakan bagian utama dari program Arduino. Loop ini akan dijalankan secara terus-menerus setelah fungsi setup() selesai dieksekusi
Blynk.run(); // dipanggil secara bergantian untuk memproses semua peristiwa Blynk yang terjadi
timer.run(); // menjalankan fungsi timer secara teratur
}