#define BLYNK_TEMPLATE_ID "TMPL6PfOvZcTL"
#define BLYNK_TEMPLATE_NAME "Smart Parking Assistant"
#define BLYNK_AUTH_TOKEN "VqBmfEj_RKQwM_95ttADl0mRYGtBO6UU"
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
#define TRIG_PIN 5
#define ECHO_PIN 18
#define BUZZER_PIN 19
#define LED_RED 25
#define LED_GREEN 26
#define LED_BLUE 27
#define DANGER_THRESHOLD 10
#define CAUTION_THRESHOLD 30
#define SERIAL_INTERVAL 500
#define BUZZ_FAST_ON 100
#define BUZZ_FAST_OFF 100
#define BUZZ_SLOW_ON 300
#define BUZZ_SLOW_OFF 600
BlynkTimer timer;
unsigned long lastSerialTime = 0;
unsigned long lastBuzzToggle = 0;
bool buzzState = false;
float currentDistance = 0.0;
enum ParkingState { SAFE, CAUTION_STATE, DANGER_STATE };
ParkingState parkingState = SAFE;
void setup() {
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
setLED(0, 255, 0);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
timer.setInterval(SERIAL_INTERVAL, updateBlynk);
Serial.println("=== Smart Parking Assistant Ready ===");
}
void loop() {
Blynk.run();
timer.run();
currentDistance = measureDistance();
if (currentDistance < DANGER_THRESHOLD) {
parkingState = DANGER_STATE;
} else if (currentDistance < CAUTION_THRESHOLD) {
parkingState = CAUTION_STATE;
} else {
parkingState = SAFE;
}
applyLocalResponse();
if (millis() - lastSerialTime >= SERIAL_INTERVAL) {
lastSerialTime = millis();
Serial.printf("[Parking] Distance: %.1f cm | Status: %s\n",
currentDistance, statusLabel());
}
}
float measureDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH, 30000UL);
if (duration == 0) return 400.0;
return (duration * 0.0343f) / 2.0f;
}
void applyLocalResponse() {
unsigned long now = millis();
switch (parkingState) {
case DANGER_STATE:
setLED(255, 0, 0);
if (now - lastBuzzToggle >= (buzzState ? BUZZ_FAST_ON : BUZZ_FAST_OFF)) {
buzzState = !buzzState;
digitalWrite(BUZZER_PIN, buzzState ? HIGH : LOW);
lastBuzzToggle = now;
}
break;
case CAUTION_STATE:
setLED(255, 150, 0);
if (now - lastBuzzToggle >= (buzzState ? BUZZ_SLOW_ON : BUZZ_SLOW_OFF)) {
buzzState = !buzzState;
digitalWrite(BUZZER_PIN, buzzState ? HIGH : LOW);
lastBuzzToggle = now;
}
break;
case SAFE:
default:
setLED(0, 255, 0);
digitalWrite(BUZZER_PIN, LOW);
buzzState = false;
break;
}
}
void setLED(uint8_t r, uint8_t g, uint8_t b) {
analogWrite(LED_RED, r);
analogWrite(LED_GREEN, g);
analogWrite(LED_BLUE, b);
}
void updateBlynk() {
Blynk.virtualWrite(V0, currentDistance);
Blynk.virtualWrite(V1, currentDistance);
Blynk.virtualWrite(V2, parkingState == DANGER_STATE ? 255 : 0);
Blynk.virtualWrite(V3, parkingState == CAUTION_STATE ? 255 : 0);
Blynk.virtualWrite(V4, parkingState == SAFE ? 255 : 0);
Blynk.virtualWrite(V5, statusLabel());
}
const char* statusLabel() {
switch (parkingState) {
case DANGER_STATE: return "DANGER";
case CAUTION_STATE: return "CAUTION";
default: return "SAFE";
}
}