#include <ESP32Servo.h>
// --- PINS (Matches your wiring) ---
#define SERVO1_PIN 13 // Bin 1 Lid
#define TRIG1_PIN 27
#define ECHO1_PIN 26
#define SERVO2_PIN 12 // Bin 2 Lid
#define TRIG2_PIN 25
#define ECHO2_PIN 33
#define SERVO3_PIN 14 // Bin 3 Lid
#define TRIG3_PIN 32
#define ECHO3_PIN 35
// --- CONFIGURATION ---
const int FULL_LEVEL_CM = 10; // If trash is closer than 10cm, bin is FULL
const int OPEN_TIME_MS = 3000; // How long the lid stays open (3 seconds)
Servo servo1;
Servo servo2;
Servo servo3;
// Variables
long duration;
int dist1, dist2, dist3;
void setup() {
Serial.begin(115200);
Serial.println("--- SMART RECYCLING BIN STARTED ---");
Serial.println("1. Type '1', '2', or '3' to simulate AI Camera detecting waste.");
Serial.println("2. Use Sliders on Sensors to simulate bin fullness.");
servo1.attach(SERVO1_PIN);
servo2.attach(SERVO2_PIN);
servo3.attach(SERVO3_PIN);
// Close all lids initially
closeAllLids();
// Setup Sensors
pinMode(TRIG1_PIN, OUTPUT); pinMode(ECHO1_PIN, INPUT);
pinMode(TRIG2_PIN, OUTPUT); pinMode(ECHO2_PIN, INPUT);
pinMode(TRIG3_PIN, OUTPUT); pinMode(ECHO3_PIN, INPUT);
}
void loop() {
// --- TASK 1: MONITOR BIN LEVELS (Ultrasonic) ---
checkBinLevels();
// --- TASK 2: LISTEN FOR AI CAMERA (Serial Input) ---
if (Serial.available() > 0) {
char wasteType = Serial.read();
// If we receive a newline character, ignore it
if (wasteType == '\n' || wasteType == '\r') return;
if (wasteType == '1') {
Serial.println("[AI CAM] Detected PLASTIC. Opening Bin 1...");
openBin(servo1);
}
else if (wasteType == '2') {
Serial.println("[AI CAM] Detected PAPER. Opening Bin 2...");
openBin(servo2);
}
else if (wasteType == '3') {
Serial.println("[AI CAM] Detected METAL. Opening Bin 3...");
openBin(servo3);
}
}
delay(200); // Small delay for stability
}
// --- HELPER FUNCTIONS ---
void checkBinLevels() {
// Read all sensors
dist1 = getDistance(TRIG1_PIN, ECHO1_PIN);
delay(10);
dist2 = getDistance(TRIG2_PIN, ECHO2_PIN);
delay(10);
dist3 = getDistance(TRIG3_PIN, ECHO3_PIN);
// Check Bin 1
if (dist1 < FULL_LEVEL_CM) {
Serial.print("⚠️ ALERT: Bin 1 is FULL! (Level: ");
Serial.print(dist1);
Serial.println("cm) -> Sending Telegram...");
}
// Check Bin 2
if (dist2 < FULL_LEVEL_CM) {
Serial.print("⚠️ ALERT: Bin 2 is FULL! (Level: ");
Serial.print(dist2);
Serial.println("cm) -> Sending Telegram...");
}
// Check Bin 3
if (dist3 < FULL_LEVEL_CM) {
Serial.print("⚠️ ALERT: Bin 3 is FULL! (Level: ");
Serial.print(dist3);
Serial.println("cm) -> Sending Telegram...");
}
}
void openBin(Servo &servo) {
servo.write(90); // Open Lid
delay(OPEN_TIME_MS); // Wait for user to drop trash
servo.write(0); // Close Lid
Serial.println(" -> Bin Closed.");
}
void closeAllLids() {
servo1.write(0);
servo2.write(0);
servo3.write(0);
}
int getDistance(int trigPin, int echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
return duration * 0.034 / 2;
}