#define BLYNK_TEMPLATE_ID "TMPL6aAuMx5E8"
#define BLYNK_TEMPLATE_NAME "testing"
#define BLYNK_AUTH_TOKEN "BiD9QyOD77TRQoasS_mQ_FK_qkcUNUOu"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#define TRIG_PIN 32
#define ECHO_PIN 34
#define LED_PIN 21
#define LDR_PIN 18 // Define the pin for the LDR sensor
#define PIR_PIN 22 // Define the pin for the PIR motion sensor
#define BUZZER_PIN 25 // Define the pin for the buzzer
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "huszzz";
char pass[] = "hellokitty";
BlynkTimer timer;
bool isBlynkConnected = false;
bool manualLEDControl = false; // To track manual control state
// Ultrasonic sensor distance measurement
long measureDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2;
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
return distance;
}
// Function to play a welcome doorbell melody
void playWelcomeMelody() {
int melody[] = {262, 294, 330, 262, 330, 349, 392, 294, 349, 392};
int durations[] = {400, 400, 400, 400, 400, 400, 600, 400, 400, 600};
for (int i = 0; i < 10; i++) {
tone(BUZZER_PIN, melody[i], durations[i]);
delay(durations[i] * 1.5);
}
noTone(BUZZER_PIN);
}
// Send ultrasonic sensor data to Blynk
void sendUltrasonicData() {
long distance = measureDistance();
if (distance > 0) {
Blynk.virtualWrite(V1, distance);
if (distance <= 50) {
Serial.println("Welcome home!! :)");
playWelcomeMelody();
} else {
noTone(BUZZER_PIN);
Serial.println("Buzzer OFF: Object out of range or no object.");
}
} else {
Serial.println("Distance measurement failed.");
}
}
// Blynk write handler for manual LED control
BLYNK_WRITE(V0) {
int buttonState = param.asInt();
if (buttonState == 1) {
manualLEDControl = true; // Enable manual control
digitalWrite(LED_PIN, HIGH); // Turn LED ON
Serial.println("LED ON (Manual)");
} else {
manualLEDControl = false; // Disable manual control
digitalWrite(LED_PIN, LOW); // Turn LED OFF
Serial.println("LED OFF (Manual)");
}
}
// Check Wi-Fi and Blynk connection status
void checkConnections() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("Wi-Fi disconnected! Reconnecting...");
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("\nWi-Fi connected!");
}
if (!Blynk.connected()) {
Serial.println("Blynk disconnected! Reconnecting...");
Blynk.connect();
}
if (WiFi.status() == WL_CONNECTED && Blynk.connected()) {
if (!isBlynkConnected) {
Serial.println("Wi-Fi and Blynk connected!");
isBlynkConnected = true;
}
} else {
isBlynkConnected = false;
}
}
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(LDR_PIN, INPUT);
pinMode(PIR_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, pass);
int wifiRetries = 0;
while (WiFi.status() != WL_CONNECTED && wifiRetries < 30) {
delay(500);
Serial.print(".");
wifiRetries++;
}
if (WiFi.status() == WL_CONNECTED) {
Serial.println("\nWiFi Connected");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
} else {
Serial.println("\nWiFi connection failed. Please check your credentials.");
return;
}
Serial.println("Connecting to Blynk...");
Blynk.begin(auth, ssid, pass, "blynk.cloud", 80);
if (Blynk.connected()) {
Serial.println("Blynk Connected");
} else {
Serial.println("Blynk connection failed. Please check your auth token or server.");
}
timer.setInterval(2000L, sendUltrasonicData);
timer.setInterval(5000L, checkConnections);
}
void loop() {
if (!manualLEDControl) {
int ldrStatus = digitalRead(LDR_PIN);
int pirStatus = digitalRead(PIR_PIN);
if (ldrStatus == HIGH && pirStatus == HIGH) {
digitalWrite(LED_PIN, HIGH);
Serial.println("LED ON: Dark and motion detected.");
} else {
digitalWrite(LED_PIN, LOW);
Serial.println("LED OFF: No motion or sufficient light.");
}
}
if (Blynk.connected()) {
Blynk.run();
}
timer.run();
}