#define BLYNK_TEMPLATE_ID "TMPL6dp5eRx3R"
#define BLYNK_TEMPLATE_NAME "KONTROL LAMPU"
#define BLYNK_AUTH_TOKEN "B_Cvrc1kpU8w8I1R8Yb9lHRITcfLZYLI"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = "B_Cvrc1kpU8w8I1R8Yb9lHRITcfLZYLI";
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
#define LED 18
#define LED2 19
#define PIR_PIN 2 // OUT dari sensor PIR disambung ke GPIO2
int SW_state1 = 0; // kondisi lampu LED1
int SW_state2 = 0; // kondisi lampu LED2
int pirState = LOW;
int val = 0;
// Tombol Blynk untuk LED pertama
BLYNK_WRITE(V0)
{
SW_state1 = param.asInt();
if (SW_state1 == 1) {
digitalWrite(LED, HIGH);
Serial.println("LED1 HIDUP (Blynk)");
Blynk.virtualWrite(V0, HIGH);
} else {
digitalWrite(LED, LOW);
Serial.println("LED1 MATI (Blynk)");
Blynk.virtualWrite(V0, LOW);
}
}
// Tombol Blynk untuk LED kedua
BLYNK_WRITE(V1)
{
SW_state2 = param.asInt();
if (SW_state2 == 1) {
digitalWrite(LED2, HIGH);
Serial.println("LED2 HIDUP (Blynk)");
Blynk.virtualWrite(V1, HIGH);
} else {
digitalWrite(LED2, LOW);
Serial.println("LED2 MATI (Blynk)");
Blynk.virtualWrite(V1, LOW);
}
}
// Fungsi untuk membaca sensor PIR
void checkPIR() {
val = digitalRead(PIR_PIN);
if (val == HIGH) { // ada gerakan
if (pirState == LOW) {
Serial.println("Gerakan terdeteksi!");
digitalWrite(LED, HIGH);
digitalWrite(LED2, HIGH);
Blynk.virtualWrite(V0, HIGH);
Blynk.virtualWrite(V1, HIGH);
pirState = HIGH;
}
} else { // tidak ada gerakan
if (pirState == HIGH) {
Serial.println("Tidak ada gerakan.");
// Hanya matikan jika keduanya OFF di Blynk
if (SW_state1 == 0) {
digitalWrite(LED, LOW);
Blynk.virtualWrite(V0, LOW);
}
if (SW_state2 == 0) {
digitalWrite(LED2, LOW);
Blynk.virtualWrite(V1, LOW);
}
pirState = LOW;
}
}
}
void setup() {
Serial.begin(115200);
pinMode(LED, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(PIR_PIN, INPUT);
Blynk.begin(auth, ssid, pass);
timer.setInterval(1000L, checkPIR); // cek PIR setiap 1 detik
}
void loop() {
Blynk.run();
timer.run();
}