/* Smart Waste Management System
Module: SWE6206 Emerging Technologies
Assessment: IOT001 Smart waste management system
Student ID: 511522205018*/
#define BLYNK_TEMPLATE_ID "TMPL3SY33dQk7"
#define BLYNK_TEMPLATE_NAME "smart campus waste management sysytem"
#define BLYNK_AUTH_TOKEN "l1pdXe63bRq5BJNmsqIMWMScEvkVcBrw"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = BLYNK_AUTH_TOKEN;
#define PIN_TRIG 26
#define PIN_ECHO 25
#define LOWLED 18
#define MIDLED 19
#define HIGHLED 21
#define MOTOR 27
#define BUZZER_PIN 22
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
unsigned int level = 0;
BlynkTimer timer;
BLYNK_WRITE(V3)
{
// Motor control via Blynk app
int pinValue = param.asInt();
digitalWrite(MOTOR, pinValue);
Blynk.virtualWrite(V3, pinValue);
}
void beepBuzzer(int frequency, int duration, int repeat) {
// Function to produce beeping sounds
for (int i = 0; i < repeat; i++) {
tone(BUZZER_PIN, frequency, duration);
delay(300); // Delay between consecutive beeps
}
delay(2000); // Delay after the entire sequence
}
void setup() {
// Pin setup for LEDs, motor, and buzzer
pinMode(LOWLED, OUTPUT);
pinMode(MIDLED, OUTPUT);
pinMode(HIGHLED, OUTPUT);
pinMode(MOTOR, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(LOWLED, HIGH);
digitalWrite(MIDLED, HIGH);
digitalWrite(HIGHLED, HIGH);
digitalWrite(MOTOR, LOW);
Serial.begin(115200);
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
// WiFi connection
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println(" Connected!");
// Blynk initialization
Blynk.begin(auth, ssid, pass);
}
void loop() {
// Start a new measurement:
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
// Read the result:
int duration = pulseIn(PIN_ECHO, HIGH);
Serial.print("Distance in CM: ");
Serial.println(duration / 58);
Serial.print("Distance in inches: ");
Serial.println(duration / 148);
level = duration / 58;
Blynk.virtualWrite(V4, level);
// Distance-based actions
if (level < 100) {
// High bin level, collection required. Motor closes the lid, no more rubbish allowed inside.
digitalWrite(LOWLED, LOW);
digitalWrite(MOTOR, HIGH);
digitalWrite(HIGHLED, HIGH);
digitalWrite(MIDLED, HIGH);
beepBuzzer(3000, 100, 3); // Beep three times with a 3000 Hz tone
Blynk.virtualWrite(V0, HIGH);
Blynk.virtualWrite(V1, LOW);
Blynk.virtualWrite(V2, LOW);
Blynk.virtualWrite(V3, HIGH);
} else if ((level > 100) && (level < 400)) {
// Medium level means ready to collect
digitalWrite(LOWLED, HIGH);
digitalWrite(MOTOR, LOW);
digitalWrite(HIGHLED, HIGH);
digitalWrite(MIDLED, LOW);
beepBuzzer(3000, 100, 2); // Beep once with a 3000 Hz tone
Blynk.virtualWrite(V0, LOW);
Blynk.virtualWrite(V1, HIGH);
Blynk.virtualWrite(V2, LOW);
Blynk.virtualWrite(V3, LOW);
} else if (level >= 400) {
// Bin is empty, no need to collect
digitalWrite(HIGHLED, LOW);
digitalWrite(MIDLED, HIGH);
digitalWrite(LOWLED, HIGH);
digitalWrite(MOTOR, LOW);
beepBuzzer(3000, 300, 1); // Beep once with a 3000 Hz tone
Blynk.virtualWrite(V0, LOW);
Blynk.virtualWrite(V1, LOW);
Blynk.virtualWrite(V2, HIGH);
Blynk.virtualWrite(V3, LOW);
}
delay(1000);
Blynk.run();
}