#define BLYNK_TEMPLATE_ID "TMPL3sIm1jfGN"
#define BLYNK_TEMPLATE_NAME "IOT Project 2024"
#define BLYNK_AUTH_TOKEN "I4LXgYfCl0lQj1UsErEd4yrqIOyr3-lW"
#define BLYNK_PRINT Serial
unsigned int value = 0;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <HX711.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include "DHTesp.h"
#include <DHT.h>
// Blynk authentication and Wi-Fi credentials
//char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Pin configurations for ultrasonic sensors
#define TRIG_PIN1 13
#define ECHO_PIN1 12
#define TRIG_PIN2 14
#define ECHO_PIN2 27
// Pin LCD Display
#define SDA 15 //Define SDA pins
#define SCL 2 //Define SCL pins
// Pin configurations for weight sensors
#define weightDt1 18
#define weightSck1 5
#define weightDt2 17
#define weightSck2 16
// Pin DHT Sensors
#define DHT_TYPE DHT22
#define DHT_PIN1 26
#define DHT_PIN2 25
// Pin LED
#define LED_PIN1 33
#define LED_PIN2 32
#define LED_PIN3 22
#define LED_PIN4 23
// Pin Speaker
#define SPEAKER_PIN1 21
#define SPEAKER_PIN2 19
#define SWITCH_PIN 4
// Virtual pins for Blynk
//#define button0_vpin V0
//#define button1_vpin V1
//#define button2_vpin V2
//#define button3_vpin V3
//#define button4_vpin V4
// LCD setup
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Calibration factor for load cell
const int conversionFactor = 420;
// Fill level threshold
const int fillLevelThreshold = 80;
// Weight sensor objects
HX711 scale1;
HX711 scale2;
// DHT sensors
DHT dht1(DHT_PIN1, DHT_TYPE);
DHT dht2(DHT_PIN2, DHT_TYPE);
BlynkTimer timer;
// This function is called every time the Virtual Pin 4 state changes
BLYNK_WRITE(V4)
{
Serial.println("Inside Blynk Write");
Blynk.virtualWrite(V0,"Started Successfully.");
if(param.asInt() == 1){
Blynk.virtualWrite(V0,"Bio Waste DustBin Data.");
sendSensorData1();
timer.setInterval(10000L, sendSensorData1);
}else{
Blynk.virtualWrite(V0,"Non-Bio Waste DustBin Data.");
sendSensorData2();
timer.setInterval(10000L, sendSensorData2);
}
}
// This function is called every time the device is connected to the Blynk.Cloud
BLYNK_CONNECTED()
{
Blynk.syncVirtual(V0);
Blynk.syncVirtual(V1);
Blynk.syncVirtual(V2);
Blynk.syncVirtual(V3);
Blynk.syncVirtual(V4);
Serial.println("Inside Blynk: Blynk is Connected");
lcd.clear();
lcd.print("Blynk -Connected");
delay(5000);
}
// This function sends Arduino's uptime every second to Virtual Pin
void myTimerEvent()
{
Blynk.virtualWrite(V0, millis() / 1000);
Blynk.virtualWrite(V1, millis() / 1000);
Blynk.virtualWrite(V2, millis() / 1000);
Blynk.virtualWrite(V3, millis() / 1000);
Blynk.virtualWrite(V4, millis() / 1000);
}
bool i2CAddrTest(uint8_t addr) {
Wire.begin();
Wire.beginTransmission(addr);
if (Wire.endTransmission() == 0) {
return true;
}
return false;
}
void setup() {
Wire.begin(SDA, SCL);
if (!i2CAddrTest(0x27)) {
lcd = LiquidCrystal_I2C(0x3F, 16, 2);
}
// Initialize LCD display
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Smart Campus");
lcd.setCursor(0,1);
lcd.print("Waste Management");
lcd.setCursor(0,2);
lcd.print(" Version 0.0.1");
Serial.begin(9600);
//pinMode(4, INPUT_PULLUP); // switch
pinMode(SWITCH_PIN, INPUT_PULLUP);
pinMode(TRIG_PIN1, OUTPUT);
pinMode(ECHO_PIN1, INPUT);
pinMode(TRIG_PIN2, OUTPUT);
pinMode(ECHO_PIN2, INPUT);
pinMode(LED_PIN1, OUTPUT);
pinMode(LED_PIN2, OUTPUT);
pinMode(LED_PIN3, OUTPUT);
pinMode(LED_PIN4, OUTPUT);
pinMode(SPEAKER_PIN1, OUTPUT);
pinMode(SPEAKER_PIN2, OUTPUT);
// Initialize Wi-Fi connection
Serial.print("Connecting to Wi-Fi...");
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("WiFi connected!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bio Waste:");
lcd.setCursor(0, 2);
lcd.print("Non-Bio Waste:");
// Initialize weight sensors
scale1.begin(weightDt1, weightSck1);
scale2.begin(weightDt2, weightSck2);
// Connect to Blynk server
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
dht1.begin();
dht2.begin();
// Set a timer to send sensor data every 10 seconds
//timer.setInterval(10000L, sendSensorData1);
//timer.setInterval(10000L, sendSensorData2);
}
void TemperatureHumidity()
{
// DHT sensor
float temperature1= dht1.readTemperature();
float humidity1 = dht1.readHumidity();
float temperature2= dht2.readTemperature();
float humidity2 = dht2.readHumidity();
lcd.clear();
lcd.setCursor(0,1);
lcd.print("Temp 1: " + String(temperature1, 2) + " C");
lcd.setCursor(0,2);
lcd.print("Humidity 1: " + String(humidity1, 1) + "%");
delay(2500);
lcd.clear();
lcd.setCursor(0,1);
lcd.print("Temp 2: " + String(temperature2, 2) + " C");
lcd.setCursor(0,2);
lcd.print("Humidity 2: " + String(humidity2, 1) + "%");
delay(2500);
}
void loop() {
Blynk.run();
timer.run();
fillLevelDetection();
TemperatureHumidity();
}
void fillLevelDetection() {
// Read fill level and weight from Biodegradable Waste
int fillLevel1 = readUltrasonicSensor(TRIG_PIN1, ECHO_PIN1);
int weight1 = scale1.get_units(10) / conversionFactor;
// Read fill level and weight from Non-Biodegradable Waste
int fillLevel2 = readUltrasonicSensor(TRIG_PIN2, ECHO_PIN2);
int weight2 = scale2.get_units(10) / conversionFactor;
lcd.clear();
// Update LCD display
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print(fillLevel1);
lcd.print("% filled, ");
lcd.print(weight1);
lcd.print(" kg");
lcd.setCursor(0, 3);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(fillLevel2);
lcd.print("% filled, ");
lcd.print(weight2);
lcd.print(" kg");
// Send data to Blynk
//Blynk.virtualWrite(V0, fillLevel1);
//Blynk.virtualWrite(V0, weight1);
//Blynk.virtualWrite(V0, fillLevel2);
//Blynk.virtualWrite(V0, weight2);
// Notify when either trash can reaches 80 percent or exceeds 40kg
if (fillLevel1 >= fillLevelThreshold || weight1 >= 40) {
Blynk.logEvent("bio_trigger");
Serial.println("Biodegradable waste almost full ! Kindly dispose.");
delay(1000);
}
if (fillLevel2 >= fillLevelThreshold || weight2 >= 40) {
Blynk.logEvent("non_bio_trigger");
Serial.println("Non-Biodegradable waste almost full ! Kindly dispose.");
delay(1000);
}
}
int readUltrasonicSensor(int TRIG_PIN, int ECHO_PIN) {
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
int distance = duration / 58;
int fill = 100 - map(distance, 0, 100, 0, 100);
int fillLevel = 0;
// Incase value of fill exceeds 100 (Here height of trash can is 100cm)
if (fill >= 0) {
fillLevel = fill;
} else if (fill < 0) {
fillLevel = 0;
}
return fillLevel;
}
void sendSensorData1() {
// Ultrasonic sensor
long duration, distance;
digitalWrite(TRIG_PIN1, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN1, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN1, LOW);
duration = pulseIn(ECHO_PIN1, HIGH);
distance = (duration / 2) / 29.1; // Convert to cm
// DHT sensor
float temperature = dht1.readTemperature();
float humidity = dht1.readHumidity();
// Send data to Blynk
Blynk.virtualWrite(V3, distance);
Blynk.virtualWrite(V1, temperature);
Blynk.virtualWrite(V2, humidity);
// Check if bin is full
if (distance < 10) {
Blynk.virtualWrite(V0,"Bio Waste Bin is full!");
//tone(16, 262, 250);
tone(SPEAKER_PIN1,262,250);
digitalWrite(LED_PIN2, HIGH);
digitalWrite(LED_PIN1, LOW);
lcd.clear();
lcd.print("Bio Waste Bin is full!");
}
else{
Blynk.virtualWrite(V0,"Bio Waste Bin has Space.");
digitalWrite(LED_PIN1, HIGH);
digitalWrite(LED_PIN2, LOW);
lcd.clear();
lcd.print("Bio Waste Bin has Space.");
}
delay(5000);
}
void sendSensorData2() {
// Ultrasonic sensor
long duration, distance;
digitalWrite(TRIG_PIN2, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN2, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN2, LOW);
duration = pulseIn(ECHO_PIN2, HIGH);
distance = (duration / 2) / 29.1; // Convert to cm
// DHT sensor
float temperature = dht2.readTemperature();
float humidity = dht2.readHumidity();
// Send data to Blynk
Blynk.virtualWrite(V3, distance);
Blynk.virtualWrite(V1, temperature);
Blynk.virtualWrite(V2, humidity);
lcd.clear();
lcd.setCursor(0,1);
// Check if bin is full
if (distance < 10) {
Blynk.virtualWrite(V0,"Non Bio-Waste DustBin is full!");
//tone(16, 262, 250);
tone(SPEAKER_PIN2,262,250);
digitalWrite(LED_PIN4, HIGH);
digitalWrite(LED_PIN3, LOW);
lcd.print("Non Bio-Waste DustBin is full!");
}
else{
Blynk.virtualWrite(V0,"Non Bio-Waste DustBin has Space.");
digitalWrite(LED_PIN3, HIGH);
digitalWrite(LED_PIN4, LOW);
lcd.print("Non Bio-Waste DustBin has Space");
}
delay(5000);
}Bio Waste Fill Level
Indication : Bio Waste
Non-Bio Waste Fill Level
Indication : Non-Bio Waste
Bio Waste Weight
Non-Bio Waste Weight
Monitoring Trash Cans Details
LED On/Off
Bio Waste Bin
Non-Bio Waste Bin