// Importing libraries
#include <Wire.h>
#include <SoftwareSerial.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include "DHTesp.h"
#include "ThingSpeak.h"
const char* WIFI_NAME = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
const int myChannelNumber = 2520070;
const char* myApiKey = "6EZGVRB1XQV3261X";
const char* server = "api.thingspeak.com";
WiFiClient client;
LiquidCrystal_I2C lcd(0x27, 20, 4);
Servo s1;
Servo s2;
SoftwareSerial gsmSerial(10, 11); // RX, TX
int LED_PIN = 4;
int LED_PIN2 = 12;
int trigPin1 = 2;
int echoPin1 = 3;
int trigPin2 = 5;
int echoPin2 = 6;
int SERVO1_PIN = 13;
int SERVO2_PIN = 7;
int SERVO3_PIN;
int pos = 0;
const int PERSON_DISTANCE_THRESHOLD = 40;
const int TRASH_DISTANCE_THRESHOLD1 = 8;
const int TRASH_DISTANCE_THRESHOLD2 = 19;
float duration_us1, distance_cm1, duration_us2, distance_cm2;
bool full = false;
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(9600);
pinMode(trigPin1, OUTPUT);
pinMode(echoPin1, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(LED_PIN2, OUTPUT);
pinMode(trigPin2, OUTPUT);
pinMode(echoPin2, INPUT);
// Attach servos to pins and set initial positions
s1.attach(SERVO1_PIN);
s1.write(0);
s2.attach(SERVO2_PIN);
s2.write(0);
gsmSerial.begin(9600);
delay(1000);
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Arduino Based");
lcd.setCursor(0, 1);
lcd.print("INTELLIGENT WASTE");
lcd.setCursor(0, 2);
lcd.print("MANAGEMENT SYSTEM");
delay(1500);
Serial.begin(9600);
// Connect to WiFi
Serial.println("Connecting to WiFi...");
WiFi.begin(WIFI_NAME, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting...");
}
Serial.println("WiFi connected!");
Serial.print("Local IP: ");
Serial.println(WiFi.localIP());
}
void loop() {
// Sensing distance from person
digitalWrite(trigPin2, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin2, LOW);
duration_us2 = pulseIn(echoPin2, HIGH);
distance_cm2 = 0.017 * duration_us2;
Serial.print("Distance from Person: ");
Serial.print(distance_cm2);
Serial.println(" cm");
ThingSpeak.setField(1, distance_cm2);
if (distance_cm2 < PERSON_DISTANCE_THRESHOLD) {
if (!full) {
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("HELLO!");
lcd.setCursor(0, 1);
lcd.print("BIN OPENING");
delay(1000);
// Open the bin
for (pos = 0; pos <= 90; pos += 1) {
s2.write(pos);
delay(10);
}
delay(4000);
for (pos = 90; pos >= 0; pos -= 1) {
s2.write(pos);
delay(10);
}
} else {
s1.write(0);
digitalWrite(LED_PIN2, LOW);
digitalWrite(LED_PIN, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" BIN IS FULL! ");
lcd.setCursor(0, 1);
lcd.print("UNFILL THE BIN");
delay(1000);
}
}
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
duration_us1 = pulseIn(echoPin1, HIGH);
distance_cm1 = 0.017 * duration_us1;
Serial.print("Distance from Trash: ");
Serial.print(distance_cm1);
Serial.println(" cm");
ThingSpeak.setField(2, distance_cm1);
delay(20);
if ((distance_cm1 >= TRASH_DISTANCE_THRESHOLD1) && (distance_cm1 <= TRASH_DISTANCE_THRESHOLD2)) {
digitalWrite(LED_PIN2, LOW);
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(" BIN IS FULL");
lcd.setCursor(0, 1);
lcd.print(" COMPACTING ");
delay(1000);
for (pos = 0; pos <= 180; pos += 1) {
digitalWrite(LED_PIN, HIGH);
delay(25);
s1.write(pos);
digitalWrite(LED_PIN, LOW);
delay(25);
delay(25);
}
delay(1000);
for (pos = 180; pos >= 0; pos -= 1) {
digitalWrite(LED_PIN, HIGH);
delay(25);
s1.write(pos);
digitalWrite(LED_PIN, LOW);
delay(25);
delay(25);
}
}
if (distance_cm1 < TRASH_DISTANCE_THRESHOLD1) {
full = true;
s1.write(0);
digitalWrite(LED_PIN2, LOW);
digitalWrite(LED_PIN, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" BIN IS FULL! ");
lcd.setCursor(0, 1);
lcd.print("UNFILL THE BIN");
delay(1000);
sendSMS("+13157461243", "Hello, Bin 1 Is Full! go unfill it");
delay(10000);
} else {
full = false;
digitalWrite(LED_PIN, LOW);
digitalWrite(LED_PIN2, HIGH);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("READY TO USE ");
lcd.setCursor(0, 1);
lcd.print(" THANK YOU");
delay(2000);
}
}
void sendSMS(String phoneNumber, String message) {
gsmSerial.println("AT+CMGF=1\r");
delay(100);
gsmSerial.print("AT+CMGS=\"+265996352102\"\r");
gsmSerial.print(phoneNumber);
gsmSerial.println("\"");
delay(100);
gsmSerial.print("Hello Bin1 is full! Go and empty the bin");
delay(100);
gsmSerial.write(26);
delay(100);
}