#define BLYNK_TEMPLATE_ID "TMPL30_hM_YfN"
#define BLYNK_TEMPLATE_NAME "Proximity Alert"
#define BLYNK_AUTH_TOKEN "tlrYTo9dGBgAsFOzdl688BgBxq5AkZyN"
#include <BlynkSimpleEsp32.h>
#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define TRIG_PIN 5
#define ECHO_PIN 18
#define ALERT_LED_PIN 2
#define BUZZER_PIN 4
LiquidCrystal_I2C lcd(0x27, 16, 2);
long duration;
float distanceCM;
unsigned long previousMillis = 0;
const long interval = 100; // 100ms for fast refresh
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Proximity Alert");
WiFi.begin("Wokwi-GUEST", "");
Blynk.config(BLYNK_AUTH_TOKEN);
Blynk.connect();
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(ALERT_LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(ALERT_LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
}
void loop() {
Blynk.run();
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
distanceCM = getDistance();
lcd.setCursor(0, 1);
lcd.print("Dist: ");
lcd.print(distanceCM);
lcd.print(" cm ");
Serial.print("Distance: ");
Serial.print(distanceCM);
Serial.println(" cm");
// Alert Conditions
if (distanceCM < 5) {
digitalWrite(ALERT_LED_PIN, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
Blynk.virtualWrite(V1, 255); // LED ON
Serial.println("Warning: Too Close");
}
else if (distanceCM < 10) {
digitalWrite(ALERT_LED_PIN, HIGH);
digitalWrite(BUZZER_PIN, HIGH);
Blynk.virtualWrite(V1, 255); // LED ON
Serial.println("Alert: Close");
}
else {
digitalWrite(ALERT_LED_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
Blynk.virtualWrite(V1, 0); // LED OFF
}
}
}
float getDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH, 30000); // 30ms timeout
float distance = duration * 0.034 / 2;
Blynk.virtualWrite(V2, distance); // Send distance to Blynk
return distance;
}