#define BLYNK_TEMPLATE_ID "TMPL38ji2IBRz"
#define BLYNK_TEMPLATE_NAME "Test 2"
#define BLYNK_AUTH_TOKEN "5bk_pPTHyj5s_UrnjP4OEkv2gPhYIChx"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
// Pin Definitions
#define PIR1_PIN 26
#define PIR2_PIN 25
#define RELAY1_PIN 13
#define RELAY2_PIN 12
#define WIFI_LED_PIN 2
// Virtual pins
#define VPIN_RELAY1 V1
#define VPIN_RELAY2 V2
#define VPIN_WIFI_STATUS V3
// State tracking
bool relay1_app = false;
bool relay2_app = false;
void setup() {
Serial.begin(115200);
// Input/Output
pinMode(PIR1_PIN, INPUT);
pinMode(PIR2_PIN, INPUT);
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
pinMode(WIFI_LED_PIN, OUTPUT);
// Default states
digitalWrite(RELAY1_PIN, LOW);
digitalWrite(RELAY2_PIN, LOW);
digitalWrite(WIFI_LED_PIN, LOW);
// Connect Blynk
Blynk.begin(auth, ssid, pass);
// Timers
timer.setInterval(500L, checkWiFiStatus);
timer.setInterval(200L, handleRelays);
}
// Sync Blynk states
BLYNK_CONNECTED() {
Blynk.syncVirtual(VPIN_RELAY1);
Blynk.syncVirtual(VPIN_RELAY2);
}
BLYNK_WRITE(VPIN_RELAY1) {
relay1_app = param.asInt();
}
BLYNK_WRITE(VPIN_RELAY2) {
relay2_app = param.asInt();
}
void handleRelays() {
bool pir1 = digitalRead(PIR1_PIN);
bool pir2 = digitalRead(PIR2_PIN);
digitalWrite(RELAY1_PIN, relay1_app || pir1);
digitalWrite(RELAY2_PIN, relay2_app || pir2);
}
void checkWiFiStatus() {
if (WiFi.status() != WL_CONNECTED) {
static bool toggle = false;
digitalWrite(WIFI_LED_PIN, toggle);
toggle = !toggle;
Blynk.virtualWrite(VPIN_WIFI_STATUS, "Searching...");
} else {
digitalWrite(WIFI_LED_PIN, HIGH);
Blynk.virtualWrite(VPIN_WIFI_STATUS, "Connected");
}
}
void loop() {
Blynk.run();
timer.run();
}