#define BLYNK_TEMPLATE_ID "TMPL6mwq2r4k7"
#define BLYNK_TEMPLATE_NAME "DIY SMART HOME DEVICE"
#define BLYNK_AUTH_TOKEN "bLqGgmjfSfAYcGwWeAAvR44uOkIGZSWs"
// Comment this out to disable prints and save space
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = BLYNK_AUTH_TOKEN;
// Your WiFi credentials.
char ssid[] = "Wokwi-GUEST"; // WiFi name
char pass[] = ""; // WiFi Password
BlynkTimer timer;
#define button1_pin 25
#define button2_pin 33
#define button3_pin 32
#define button4_pin 22
#define relay1_pin 12
#define relay2_pin 14
#define relay3_pin 27
#define relay4_pin 26
int relay1_state = 0;
int relay2_state = 0;
int relay3_state = 0;
int relay4_state = 0;
unsigned long startTime1 = 0;
unsigned long startTime2 = 0;
unsigned long startTime3 = 0;
unsigned long startTime4 = 0;
unsigned long blynkStartTime1 = 0;
unsigned long blynkStartTime2 = 0;
unsigned long blynkStartTime3 = 0;
unsigned long blynkStartTime4 = 0;
// Change the virtual pins according to the rooms
#define button1_vpin V1
#define button2_vpin V2
#define button3_vpin V3
#define button4_vpin V4
// Function prototypes
void handleButtonPress(int buttonPin, int relayPin, int &relayState, unsigned long &startTime, int vpin, int delayVpin);
//------------------------------------------------------------------------------
// This function is called every time the device is connected to the Blynk.Cloud
BLYNK_CONNECTED() {
Blynk.syncVirtual(button1_vpin);
Blynk.syncVirtual(button2_vpin);
Blynk.syncVirtual(button3_vpin);
Blynk.syncVirtual(button4_vpin);
}
//--------------------------------------------------------------------------
// This function is called every time the Virtual Pin state changes
BLYNK_WRITE(button1_vpin) {
relay1_state = param.asInt(); // Read the button state from Blynk
digitalWrite(relay1_pin, relay1_state ? HIGH : LOW);
Serial.print("Blynk button state for pin ");
Serial.print(button1_pin);
Serial.print(": ");
Serial.println(relay1_state);
if (blynkStartTime1 != 0) {
unsigned long delayTime = millis() - blynkStartTime1;
Serial.print("Delay time for pin ");
Serial.print(button1_pin);
Serial.print(": ");
Serial.print(delayTime);
Serial.println(" ms");
Blynk.virtualWrite(V5, delayTime); // Send delay time to Blynk
startTime1 = 0; // Reset start time
}
blynkStartTime1 = millis();
}
BLYNK_WRITE(button2_vpin) {
relay2_state = param.asInt(); // Read the button state from Blynk
digitalWrite(relay2_pin, relay2_state ? HIGH : LOW);
Serial.print("Blynk button state for pin ");
Serial.print(button2_pin);
Serial.print(": ");
Serial.println(relay2_state);
if (blynkStartTime2 != 0) {
unsigned long delayTime = millis() - blynkStartTime2;
Serial.print("Delay time for pin ");
Serial.print(button2_pin);
Serial.print(": ");
Serial.print(delayTime);
Serial.println(" ms");
Blynk.virtualWrite(V6, delayTime); // Send delay time to Blynk
startTime2 = 0; // Reset start time
}
blynkStartTime2 = millis();
}
BLYNK_WRITE(button3_vpin) {
relay3_state = param.asInt(); // Read the button state from Blynk
digitalWrite(relay3_pin, relay3_state ? HIGH : LOW);
Serial.print("Blynk button state for pin ");
Serial.print(button3_pin);
Serial.print(": ");
Serial.println(relay3_state);
if (blynkStartTime3 != 0) {
unsigned long delayTime = millis() - blynkStartTime3;
Serial.print("Delay time for pin ");
Serial.print(button3_pin);
Serial.print(": ");
Serial.print(delayTime);
Serial.println(" ms");
Blynk.virtualWrite(V7, delayTime); // Send delay time to Blynk
startTime3 = 0; // Reset start time
}
blynkStartTime3 = millis();
}
BLYNK_WRITE(button4_vpin) {
relay4_state = param.asInt(); // Read the button state from Blynk
digitalWrite(relay4_pin, relay4_state ? HIGH : LOW);
Serial.print("Blynk button state for pin ");
Serial.print(button4_pin);
Serial.print(": ");
Serial.println(relay4_state);
if (blynkStartTime4 != 0) {
unsigned long delayTime = millis() - blynkStartTime4;
Serial.print("Delay time for pin ");
Serial.print(button4_pin);
Serial.print(": ");
Serial.print(delayTime);
Serial.println(" ms");
Blynk.virtualWrite(V8, delayTime); // Send delay time to Blynk
startTime4 = 0; // Reset start time
}
blynkStartTime4 = millis();
}
//----------------------------------------------------------------------
void setup() {
// Debug console
Serial.begin(115200);
//--------------------------------------------------------------------
pinMode(button1_pin, INPUT_PULLUP);
pinMode(button2_pin, INPUT_PULLUP);
pinMode(button3_pin, INPUT_PULLUP);
pinMode(button4_pin, INPUT_PULLUP);
//--------------------------------------------------------------------
pinMode(relay1_pin, OUTPUT);
pinMode(relay2_pin, OUTPUT);
pinMode(relay3_pin, OUTPUT);
pinMode(relay4_pin, OUTPUT);
//--------------------------------------------------------------------
// During Starting all Relays should TURN OFF
digitalWrite(relay1_pin, HIGH);
digitalWrite(relay2_pin, HIGH);
digitalWrite(relay3_pin, HIGH);
digitalWrite(relay4_pin, HIGH);
//--------------------------------------------------------------------
Blynk.begin(auth, ssid, pass);
}
void loop() {
Blynk.run();
timer.run();
listen_push_buttons();
}
// Function to handle button press logic
void listen_push_buttons() {
handleButtonPress(button1_pin, relay1_pin, relay1_state, startTime1, button1_vpin, V5);
handleButtonPress(button2_pin, relay2_pin, relay2_state, startTime2, button2_vpin, V6);
handleButtonPress(button3_pin, relay3_pin, relay3_state, startTime3, button3_vpin, V7);
handleButtonPress(button4_pin, relay4_pin, relay4_state, startTime4, button4_vpin, V8);
}
// Function to handle button press logic
void handleButtonPress(int buttonPin, int relayPin, int &relayState, unsigned long &startTime, int vpin, int delayVpin) {
if (digitalRead(buttonPin) == LOW) {
delay(100); // Debouncing
relayState = !relayState;
digitalWrite(relayPin, relayState ? HIGH : LOW);
Serial.print("Physical button for pin ");
Serial.print(buttonPin);
Serial.print(" pressed, state changed to: ");
Serial.println(relayState);
Blynk.virtualWrite(vpin, relayState); // Update button state
startTime = millis(); // Record the start time
} else if (digitalRead(buttonPin) == HIGH && startTime != 0) {
// Button released, calculate the delay
unsigned long delayTime = millis() - startTime;
Serial.print("Delay time for pin ");
Serial.print(buttonPin);
Serial.print(": ");
Serial.print(delayTime);
Serial.println(" ms");
Blynk.virtualWrite(delayVpin, delayTime); // Send delay time to Blynk
startTime = 0; // Reset start time
}
}