#define BLYNK_AUTH_TOKEN "#define BLYNK_TEMPLATE_ID "TMPL6pMqVo2tR"
#define BLYNK_TEMPLATE_NAME "Sistem Kebun IoT"
#define BLYNK_AUTH_TOKEN "9cPy0lNESA8XP_w8J14Xx0yJTnKcpo0y" // Token autentikasi untuk ESP32 agar bisa terhubung ke Blynk
#include <ESP32Servo.h> // Library untuk mengontrol servo motor menggunakan ESP32
#include <WiFi.h> // Library untuk koneksi Wi-Fi ESP32
#include <BlynkSimpleEsp32.h> // Library untuk komunikasi ESP32 dengan aplikasi Blynk
Servo myServo; // Membuat objek servo untuk digunakan dalam program
// Deklarasi pin untuk setiap perangkat yang digunakan dalam sistem
const int servoPin = 13; // Pin servo
const int rainSensorPin = 34; // Pin sensor hujan
const int buzzerPin = 27; // Pin buzzer
const int lightSensorPin = 33; // Pin sensor cahaya (LDR)
const int ledPin = 21; // Pin LED
// Threshold untuk mendeteksi kondisi lingkungan berdasarkan sensor
const int rainThreshold = 2000; // Nilai batas untuk menentukan hujan
const int lightThreshold = 300; // Nilai batas untuk menentukan kondisi terang
// Variabel status untuk perangkat yang dikontrol
bool isClosed = false; // Status servo (terbuka atau tertutup)
bool isLedOn = false; // Status LED (nyala atau mati)
bool buzzerManualControl = false; // Status kontrol manual buzzer dari aplikasi Blynk
bool buzzerActive = false; // Status apakah buzzer berbunyi secara otomatis
int beepCount = 0; // Jumlah beep yang dilakukan buzzer
// Variabel untuk mengatur timer buzzer agar berbunyi setiap 20 detik
unsigned long buzzerStartMillis = 0; // Waktu terakhir buzzer berbunyi
const unsigned long buzzerInterval = 20000; // Buzzer berbunyi setiap 20 detik
const unsigned long beepDuration = 500; // Durasi setiap beep buzzer (500ms)
const unsigned long beepPause = 500; // Jeda antar beep buzzer (500ms)
// Data koneksi Wi-Fi dan autentikasi Blynk
char ssid[] = "KOST PUTRI"; // Nama Wi-Fi yang digunakan
char pass[] = "2025PAKETUOTAK#"; // Password Wi-Fi
void setup() {
Serial.begin(115200); // Memulai komunikasi Serial untuk debugging
WiFi.begin(ssid, pass); // Memulai koneksi Wi-Fi
// Loop untuk memastikan ESP32 berhasil terhubung ke Wi-Fi
Serial.print("Menghubungkan ke WiFi...");
while (WiFi.status() != WL_CONNECTED) { // Jika belum terhubung, coba terus hingga berhasil
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Terhubung!"); // Notifikasi bahwa Wi-Fi sudah terhubung
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass); // Menghubungkan ESP32 ke Blynk menggunakan token
myServo.attach(servoPin); // Menghubungkan servo ke pin yang telah didefinisikan
myServo.write(0); // Memastikan servo mulai dalam kondisi terbuka
// Mengatur mode setiap pin yang digunakan (sensor sebagai input, aktuator sebagai output)
pinMode(rainSensorPin, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(lightSensorPin, INPUT);
pinMode(ledPin, OUTPUT);
// Memastikan LED dan buzzer dalam keadaan awal mati
digitalWrite(ledPin, LOW);
digitalWrite(buzzerPin, LOW);
Serial.println("=== Sistem Kebun IoT Siap ==="); // Notifikasi bahwa sistem siap digunakan
}
// --- Kontrol dari Blynk ---
BLYNK_WRITE(V1) { // Kontrol Servo melalui aplikasi Blynk
int servoValue = param.asInt(); // Mendapatkan nilai dari slider di Blynk
myServo.write(servoValue); // Mengubah sudut servo sesuai dengan nilai dari Blynk
Serial.println("Servo diatur ke: " + String(servoValue)); // Cetak nilai servo ke Serial Monitor
}
BLYNK_WRITE(V2) { // Kontrol LED melalui aplikasi Blynk
int ledState = param.asInt(); // Mendapatkan status LED dari tombol di Blynk
digitalWrite(ledPin, ledState); // Menyalakan atau mematikan LED sesuai perintah
Serial.println("LED Status: " + String(ledState ? "ON" : "OFF")); // Cetak status LED ke Serial Monitor
}
BLYNK_WRITE(V3) { // Kontrol Manual Buzzer melalui Blynk
int buzzerControl = param.asInt(); // Mendapatkan status buzzer dari Blynk
buzzerManualControl = buzzerControl; // Menentukan apakah buzzer dikontrol manual atau otomatis
digitalWrite(buzzerPin, buzzerControl); // Menyalakan atau mematikan buzzer sesuai perintah
Serial.println("Buzzer Manual Status: " + String(buzzerControl ? "ON" : "OFF")); // Cetak status buzzer ke Serial Monitor
}
void loop() {
Blynk.run(); // Menjalankan fungsi utama Blynk untuk komunikasi dengan cloud
unsigned long currentMillis = millis(); // Mendapatkan waktu saat ini dalam milidetik
// --- Sensor Hujan ---
int rainValue = analogRead(rainSensorPin); // Membaca nilai sensor hujan
Serial.print("[Sensor Hujan] Nilai: ");
Serial.println(rainValue); // Cetak nilai sensor hujan ke Serial Monitor
// Logika kontrol servo berdasarkan sensor hujan
if (!isClosed && rainValue > rainThreshold) {
myServo.write(180); // Jika hujan terdeteksi, servo menutup
isClosed = true; // Perbarui status servo sebagai tertutup
Serial.println("Hujan Terdeteksi → Servo Menutup");
} else if (isClosed && rainValue <= rainThreshold) {
myServo.write(0); // Jika cuaca cerah, servo membuka
isClosed = false; // Perbarui status servo sebagai terbuka
Serial.println("Cuaca Cerah → Servo Membuka");
}
// --- Buzzer Beep 3 Kali Setiap 20 Detik ---
if (!buzzerManualControl) { // Pastikan buzzer tidak dikontrol secara manual
if (!buzzerActive && currentMillis - buzzerStartMillis >= buzzerInterval) {
buzzerStartMillis = currentMillis; // Perbarui waktu buzzer terakhir berbunyi
buzzerActive = true;
beepCount = 3; // Mulai beep 3 kali
Serial.println("Buzzer Otomatis Mulai Beep 3 Kali");
}
if (buzzerActive && beepCount > 0) { // Jika buzzer sedang aktif dan masih ada beep tersisa
digitalWrite(buzzerPin, HIGH);
delay(beepDuration); // Durasi beep 500ms
digitalWrite(buzzerPin, LOW);
delay(beepPause); // Jeda antar beep 500ms
Serial.println("Beep!");
beepCount--; // Kurangi jumlah beep
if (beepCount == 0) {
buzzerActive = false; // Jika beep selesai, matikan buzzer
Serial.println("Buzzer Selesai Beep");
}
}
}
// --- Sensor Cahaya ---
int lightValue = analogRead(lightSensorPin); // Membaca nilai sensor cahaya
Serial.print("[Sensor Cahaya] Nilai: ");
Serial.println(lightValue); // Cetak nilai sensor cahaya ke Serial Monitor
// Logika kontrol LED berdasarkan sensor cahaya
if (lightValue <= lightThreshold && !isLedOn) {
digitalWrite(ledPin, HIGH); // Jika gelap, nyalakan LED
isLedOn = true;
Serial.println("Ruangan Gelap → LED Menyala");
} else if (lightValue > lightThreshold && isLedOn) {
digitalWrite(ledPin, LOW); // Jika terang, matikan LED
isLedOn = false;
Serial.println("Ruangan Terang → LED Mati");
}
delay(200); // Memberikan jeda sebelum membaca sensor kembali
}