// 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"; // WiFi SSID
const char* WIFI_PASSWORD = ""; // WiFI Password
const int myChannelNumber = 2520070; // ThingSpeak channel number
const char* myApiKey = "6EZGVRB1XQV3261X"; // ThingSpeak API key
const char* server = "api.thingspeak.com"; // ThingSpeak server address
WiFiClient client;
// Initialize LCD with I2C address 0x27, 20 columns, and 4 rows
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Create servo objects
Servo s1;
Servo s2;
// Initialize the GSM module's software serial port
SoftwareSerial gsmSerial(10, 11); // RX, TX
// Define pin constants
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; // Variable to store the servo position
// Define distance thresholds
const int PERSON_DISTANCE_THRESHOLD = 40; // centimeters
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() {
// Initialize LCD
lcd.init();
lcd.backlight();
Serial.begin(9600);
// Set pin modes
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);
// Set up software serial for GSM module
gsmSerial.begin(9600);
// Wait for the GSM module to become ready
delay(1000);
// Display startup message on LCD
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;
// Printing distance from person to Serial Monitor
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) {
// Display opening message on LCD
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); // Wait before closing the bin
// Close the bin
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);
}
}
// Sensing distance from trash
digitalWrite(trigPin1, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin1, LOW);
duration_us1 = pulseIn(echoPin1, HIGH);
distance_cm1 = 0.017 * duration_us1;
// Printing distance from trash to Serial Monitor
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);
// Compact trash
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) {
// Bin is full
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);
// Send an SMS message
sendSMS("+13157461243", "Hello, Bin 1 Is Full! go unfill it");
// Wait for 10 seconds before sending another message
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);
}
}
// Function to send an SMS message
void sendSMS(String phoneNumber, String message) {
gsmSerial.println("AT+CMGF=1\r"); // Set GSM module to text mode
delay(100);
gsmSerial.print("AT+CMGS=\"+265996352102\"\r"); // Set recipient phone number
gsmSerial.print(phoneNumber);
gsmSerial.println("\"");
delay(100);
gsmSerial.print("Hello Bin1 is full! Go and empty the bin"); // Set message text
delay(100);
gsmSerial.write(26); // Send the message
delay(100);
}