#define BLYNK_TEMPLATE_ID "TMPL3PTkwGUar"
#define BLYNK_TEMPLATE_NAME "Smart Waste Management System"
#define BLYNK_AUTH_TOKEN "DBothE_C37tMjsm4S2BhpbE1PoIMqhkD" // Replace with your Blynk Auth Token
#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <ESP32Servo.h>
#define DHTPIN 4 // Digital pin connected to the DHT sensor
#define DHTTYPE DHT22 // DHT 22 (AM2302)
// Pins for the first ultrasonic sensor (for detecting waste level)
#define TRIGGER_PIN_INSIDE 23
#define ECHO_PIN_INSIDE 22
// Pins for the second ultrasonic sensor (for detecting proximity)
#define TRIGGER_PIN_OUTSIDE 18
#define ECHO_PIN_OUTSIDE 19
#define LED_GREEN 25 // Green LED pin
#define LED_RED 26 // Red LED pin
#define SERVO_PIN 21 // Servo motor pin
#define TEMPERATURE_THRESHOLD 30.0 // Threshold for high temperature in °C
#define WASTE_LEVEL_THRESHOLD 20.0 // Threshold for waste level in cm
#define OBJECT_DETECTION_THRESHOLD 20.0 // Threshold for object detection in cm
#define LID_CLOSED_ANGLE 0
#define LID_OPEN_ANGLE 90
DHT dht(DHTPIN, DHTTYPE);
Servo servo;
unsigned long lidOpenTime = 0;
const unsigned long lidOpenDuration = 5000; // 5 seconds in milliseconds
bool isLidOpen = false;
// WiFi credentials
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = ""; // Replace with your WiFi Password
void setup() {
Serial.begin(9600);
pinMode(TRIGGER_PIN_INSIDE, OUTPUT);
pinMode(ECHO_PIN_INSIDE, INPUT);
pinMode(TRIGGER_PIN_OUTSIDE, OUTPUT);
pinMode(ECHO_PIN_OUTSIDE, INPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_RED, OUTPUT);
servo.attach(SERVO_PIN);
dht.begin();
closeLid(); // Ensure the lid is initially closed
Serial.println("System initialized.");
// Initialize Blynk
Blynk.begin(auth, ssid, pass);
}
void loop() {
Blynk.run(); // Keep Blynk connection alive
float distanceInside = getDistance(TRIGGER_PIN_INSIDE, ECHO_PIN_INSIDE);
float distanceOutside = getDistance(TRIGGER_PIN_OUTSIDE, ECHO_PIN_OUTSIDE);
float temperature = dht.readTemperature(); // Read temperature from DHT sensor
float humidity = dht.readHumidity(); // Read humidity from DHT sensor
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
// Send temperature and humidity to Blynk
Blynk.virtualWrite(V1, temperature); // Send temperature value to Blynk
Blynk.virtualWrite(V4, humidity); // Send humidity value to Blynk
// Check temperature levels
if (temperature > TEMPERATURE_THRESHOLD) {
Serial.println("Temperature high!");
} else if (temperature < (TEMPERATURE_THRESHOLD - 10)) {
Serial.println("Temperature is low!");
}
// Check waste level
Blynk.virtualWrite(V5,distanceInside);
if (distanceInside < WASTE_LEVEL_THRESHOLD) {
digitalWrite(LED_RED, HIGH); // Waste level high
digitalWrite(LED_GREEN, LOW);
Serial.println("Waste level high.");
Blynk.virtualWrite(V2, "High Waste"); // Send waste level status to Blynk
} else {
digitalWrite(LED_GREEN, HIGH); // Waste level low
digitalWrite(LED_RED, LOW);
Serial.println("Waste level low.");
Blynk.virtualWrite(V2, "Low Waste"); // Send waste level status to Blynk
}
// Check if an object is nearby to open the lid
if (distanceOutside < OBJECT_DETECTION_THRESHOLD && !isLidOpen) {
Serial.println("Object detected outside, opening lid.");
openLid();
isLidOpen = true;
Blynk.virtualWrite(V3, "Lid Open"); // Send lid status to Blynk
} else if (millis() - lidOpenTime >= lidOpenDuration && isLidOpen) {
Serial.println("Closing lid.");
closeLid();
isLidOpen = false;
Blynk.virtualWrite(V3, "Lid Closed"); // Send lid status to Blynk
}
delay(1000); // Add a delay to make the output readable and to avoid too many prints
}
float getDistance(int triggerPin, int echoPin) {
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
float duration = pulseIn(echoPin, HIGH);
float distance = duration * 0.034 / 2; // Speed of sound in air is 343m/s
return distance;
}
void openLid() {
servo.write(LID_OPEN_ANGLE); // Open position
lidOpenTime = millis(); // Record the time when the lid was opened
Serial.println("Lid Opening");
Serial.println("Lid Status: Open");
}
void closeLid() {
servo.write(LID_CLOSED_ANGLE); // Close position
lidOpenTime = 0; // Reset lidOpenTime
Serial.println("Lid Closing");
Serial.println("Lid Status: Closed");
}