#include <LiquidCrystal_I2C.h>
#define TRIG 2
#define ECHO 3
#define GREEN 4
#define YELLOW 5
#define RED 6
#define BUZZER 7
// Distance thresholds (in cm)
const long DIST_SAFE = 50;
const long DIST_WARNING = 20;
LiquidCrystal_I2C lcd(0x27, 16, 2);
long readDistanceCM() {
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
long duration = pulseIn(ECHO, HIGH);
return duration * 0.034 / 2;
}
void setup() {
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(GREEN, OUTPUT);
pinMode(YELLOW, OUTPUT);
pinMode(RED, OUTPUT);
pinMode(BUZZER, OUTPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Smart Trash Bin");
lcd.setCursor(0, 1);
lcd.print("Initializing...");
delay(1000);
}
void loop() {
long distance = readDistanceCM();
// Display distance without clearing LCD every time
lcd.setCursor(0, 0);
lcd.print("Distance: ");
lcd.print(distance);
lcd.print("cm "); // extra spaces to overwrite previous digits
// LED and Buzzer logic
if (distance > DIST_SAFE) {
digitalWrite(GREEN, HIGH);
digitalWrite(YELLOW, LOW);
digitalWrite(RED, LOW);
digitalWrite(BUZZER, LOW);
lcd.setCursor(0, 1);
lcd.print("LID CLOSED ");
}
else if (distance > DIST_WARNING) {
digitalWrite(GREEN, LOW);
digitalWrite(YELLOW, HIGH);
digitalWrite(RED, LOW);
digitalWrite(BUZZER, LOW);
lcd.setCursor(0, 1);
lcd.print("Getting Close ");
}
else {
digitalWrite(GREEN, LOW);
digitalWrite(YELLOW, LOW);
digitalWrite(RED, HIGH);
digitalWrite(BUZZER, HIGH);
lcd.setCursor(0, 1);
lcd.print("LID OPEN ");
}
delay(300); // small delay for stability
}