#define BLYNK_TEMPLATE_ID "TMPL34mMUTKrv"
#define BLYNK_TEMPLATE_NAME "Home Automation 2"
#define BLYNK_AUTH_TOKEN "wfl4QUSjfjwC4mOVlPz8_kEn3yhckUTw"
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <ESP32Servo.h> // ✅ ESP32-compatible servo library
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
BlynkTimer timer;
// Button pins
#define button1_pin 26
#define button2_pin 25
#define button3_pin 33
#define button4_pin 32 // For servo
// Relay pins
#define relay1_pin 13
#define relay2_pin 12
#define relay3_pin 14
// Relay states
int relay1_state = 0;
int relay2_state = 0;
int relay3_state = 0;
// Virtual Pins
#define button1_vpin V1
#define button2_vpin V2
#define button3_vpin V3
#define button4_vpin V4 // Servo
// Servo config
Servo myServo;
#define servoPin 18 // PWM-capable pin
int servoAngle = 0;
BLYNK_CONNECTED() {
Blynk.syncVirtual(button1_vpin);
Blynk.syncVirtual(button2_vpin);
Blynk.syncVirtual(button3_vpin);
Blynk.syncVirtual(button4_vpin);
}
// Relay controls from Blynk
BLYNK_WRITE(button1_vpin) {
relay1_state = param.asInt();
digitalWrite(relay1_pin, relay1_state);
}
BLYNK_WRITE(button2_vpin) {
relay2_state = param.asInt();
digitalWrite(relay2_pin, relay2_state);
}
BLYNK_WRITE(button3_vpin) {
relay3_state = param.asInt();
digitalWrite(relay3_pin, relay3_state);
}
BLYNK_WRITE(button4_vpin) {
rotate_servo();
}
void setup() {
Serial.begin(115200);
// Set pin modes
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);
// Turn off all relays initially
digitalWrite(relay1_pin, HIGH);
digitalWrite(relay2_pin, HIGH);
digitalWrite(relay3_pin, HIGH);
// Attach the servo
myServo.setPeriodHertz(50); // Standard 50Hz for servos
myServo.attach(servoPin, 500, 2400); // min/max pulse width in µs
myServo.write(servoAngle); // Set to 0°
Blynk.begin(auth, ssid, pass);
}
void loop() {
Blynk.run();
timer.run();
listen_push_buttons();
}
void listen_push_buttons() {
if (digitalRead(button1_pin) == LOW) {
delay(200);
control_relay(1);
Blynk.virtualWrite(button1_vpin, relay1_state);
}
else if (digitalRead(button2_pin) == LOW) {
delay(200);
control_relay(2);
Blynk.virtualWrite(button2_vpin, relay2_state);
}
else if (digitalRead(button3_pin) == LOW) {
delay(200);
control_relay(3);
Blynk.virtualWrite(button3_vpin, relay3_state);
}
else if (digitalRead(button4_pin) == LOW) {
delay(200);
rotate_servo();
Blynk.virtualWrite(button4_vpin, servoAngle);
}
}
void control_relay(int relay) {
if (relay == 1) {
relay1_state = !relay1_state;
digitalWrite(relay1_pin, relay1_state);
Serial.print("Relay 1 State: ");
Serial.println(relay1_state);
}
else if (relay == 2) {
relay2_state = !relay2_state;
digitalWrite(relay2_pin, relay2_state);
Serial.print("Relay 2 State: ");
Serial.println(relay2_state);
}
else if (relay == 3) {
relay3_state = !relay3_state;
digitalWrite(relay3_pin, relay3_state);
Serial.print("Relay 3 State: ");
Serial.println(relay3_state);
}
}
void rotate_servo() {
servoAngle += 45;
if (servoAngle > 180) servoAngle = 0;
myServo.write(servoAngle);
Serial.print("Servo Angle: ");
Serial.println(servoAngle);
}