====== Smart Trash Bin Monitoring System ====== **Emir Talha Fidan (32780)** **Ilker Bakikol (31706)** ====== 1. Introduction ====== ''By 32780'' Every year, inefficient waste-collection leads to unnecessary pickups, added CO₂ emissions, and overflowing public bins. Our **Smart Trash-Bin Fill-Level Monitoring System** uses a VL53L0X Time-of-Flight sensor mounted inside a 41 × 35 × 60 cm³ bin to measure the fill height, displays the percentage full on an SH1106 OLED, and—when a user-configurable threshold is exceeded—sends alerts via a Telegram bot. This document walks through each step—hardware assembly (breadboard layout), Arduino IDE firmware, Node-RED flow, Telegram-bot config, and ESP32 simulation—so you can reproduce and extend the system today, then evolve it for outdoor use tomorrow. ---- ====== 2. Materials & System Overview ====== ''By 32780'' ==== 2.1. Hardware Components ==== ^ Component ^ Purpose ^ | ESP32-S3-DevKitC-1 | Main MCU, Wi-Fi, GPIOs | | VL53L0X ToF sensor | Measures distance from bin top to contents | | SH1106 128×64 I²C OLED (U8g2 lib) | Displays distance (cm) & fill (%) | | LED (GPIO 2) | Visual “almost full” warning | | Powerbank (5 V USB) | Supplies 5 V to ESP32 for portable operation | | Wires, breadboard, connectors | Prototyping and wiring | {{:amc:ss2025:group-t:pxl_20250729_115627332.jpg?400|}} ---- ==== 2.2. Software Components ==== * **Arduino IDE** (v2.x) * **Libraries** ** * Adafruit_VL53L0X – Time-of-Flight sensor ** * U8g2lib – SH1106 OLED driver ** * WiFi.h / HTTPClient.h – Wi-Fi & HTTP POST ** * UniversalTelegramBot.h – Telegram Bot API * **Node-RED** (v3.x) on 192.168.10.50:1880 — receives HTTP alerts, dashboards fill percentage, logs events * **Telegram Bot** (“TrashAlertBot”) configured with token `xxxx:YYYY` and chat ID ---- ====== 3. Hardware Assembly ====== ''By 32780'' ==== 3.1. Breadboard Layout ==== * **ESP32**: VIN ← 5 V (from powerbank USB→5 V regulator), GND ← GND, SDA ← GPIO 8, SCL ← GPIO 9. * **VL53L0X**: VCC ← 3.3 V (ESP32 3V3 pin), GND ← GND, SDA/SCL as belove. * **OLED (SH1106)**: VCC ← 3.3 V, GND ← GND, SDA/SCL as belove. * **LED**: Anode ← GPIO 2 (with 220 Ω resistor), Cathode ← GND. *All I²C peripherals (ToF sensor, OLED) share ESP32’s **SDA**/**SCL** pins and 3.3 V/GND rails. * Secure ToF sensor at bin’s top interior, facing directly downward without obstruction. * Mount OLED on exterior lid for clear visibility. * Use onboard LED—no additional external LED wiring. * ESP32 uses internal antenna for Wi-Fi; no extra antennas needed. {{:amc:ss2025:group-t:wokwi_arduino.png?400|}} ---- ====== 4. Arduino IDE Firmware ====== ''By 32780'' Below is the main sketch. **Please replace** `YOUR_SSID`, `YOUR_PASS`, `NODE_RED_URL`, and `BOT_TOKEN` with your actual credentials. #include #include #include #include #include #include #define I2C_SDA 8 #define I2C_SCL 9 #define LED_PIN 2 #define BIN_HEIGHT_CM 60.0 #define DISTANCE_OFFSET_CM -3.0 // Wi-Fi const char* ssid = "YOUR_SSID"; const char* password = "YOUR_PASS"; // Node-RED endpoint const char* alert_url = "http://YOUR_IP_ADDRESS/bin-alert"; // Telegram const char* telegram_token = "BOT_TOKEN"; String chat_id = "CHAT_ID"; U8G2_SH1106_128X64_NONAME_F_HW_I2C display(U8G2_R0, U8X8_PIN_NONE, I2C_SCL, I2C_SDA); Adafruit_VL53L0X lox = Adafruit_VL53L0X(); WiFiClientSecure secured_client; UniversalTelegramBot bot(telegram_token, secured_client); unsigned long lastAlertTime = 0, lastSignalTime = 0; const unsigned long signalInterval = 30000; float lastDistance = 0, lastPercentage = 0; bool updatesEnabled = true; void setup() { Serial.begin(115200); Wire.begin(I2C_SDA, I2C_SCL); // Initialize display display.begin(); display.clearBuffer(); display.setFont(u8g2_font_ncenB08_tr); display.drawStr(0,10,"Init Display"); display.sendBuffer(); // Initialize sensor if (!lox.begin()) while (1); pinMode(LED_PIN, OUTPUT); // Connect Wi-Fi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print('.'); } Serial.println("\\nWiFi OK"); secured_client.setInsecure(); } void loop() { VL53L0X_RangingMeasurementData_t m; lox.rangingTest(&m, false); if (m.RangeStatus != 4) { float d = m.RangeMilliMeter/10.0 + DISTANCE_OFFSET_CM; float p = constrain(100.0 - (d/BIN_HEIGHT_CM)*100.0, 0.0, 100.0); lastDistance = d; lastPercentage = p; // Update OLED display.clearBuffer(); display.setCursor(0,12); display.print("Dist: "); display.print(d,1); display.print("cm"); display.setCursor(0,30); display.print("Fill: "); display.print((int)p); display.print("%"); int w = map((int)p,0,100,0,120); display.drawFrame(0,45,120,10); display.drawBox(0,45,w,10); display.sendBuffer(); // Alert on ≥80% if (p >= 80.0) { digitalWrite(LED_PIN, HIGH); if (millis() - lastAlertTime > 15000) { sendWarning(d, p); lastAlertTime = millis(); } } else { digitalWrite(LED_PIN, LOW); } } // Periodic update if (millis() - lastSignalTime > signalInterval) { if (updatesEnabled) sendRegularUpdate(lastDistance, lastPercentage); lastSignalTime = millis(); } // Telegram commands static unsigned long lastBot = 0; if (millis() - lastBot > 1000) { int n = bot.getUpdates(bot.last_message_received + 1); while (n) { handleNewMessages(n); n = bot.getUpdates(bot.last_message_received + 1); } lastBot = millis(); } delay(500); } // ... (sendWarning, sendRegularUpdate, handleNewMessages functions) ---- ===== Code Summary ===== 1. **Initialization (setup)** - Serial debug +Wire.begin()for I²C - lox.begin() for ToF sensor and OLED splash - Connect to Wi-Fi (SSID/password) - Initialize HTTPClient & Telegram bot - On failure (sensor or Wi-Fi), print/display error 2. **Main Loop** - Ranging measurement via lox.rangingTest() - If valid, calculate `fill % = ((BIN_HEIGHT_CM − distance_cm) / BIN_HEIGHT_CM) × 100` - Update OLED: distance, fill %, bar graph - LED Alert: ON if ≥ 80 %, OFF if below (with hysteresis) - HTTP POST to Node-RED every 30 s - Telegram: one-time warning on threshold cross; optional periodic updates - Handle Telegram commands (/start,/status,/stop, etc.) - Delay to regulate loop frequency ---- ====== 5. Node-RED Flow ====== ''By 32780'' Our Node-RED instance handles incoming HTTP POSTs at `/bin-alert` and: * Parses JSON (distance, fill_percentage) * Switch: if `fill_percentage ≥ 80` → trigger email/SMS, else log * Dashboard: updates a gauge node {{:amc:ss2025:group-t:screenshot_2025-07-29_132917.png?500|}} ---- ====== 6. Telegram Bot Configuration ====== ''By 32780'' * Create bot with BotFather → get `BOT_TOKEN`. * Invite to your group/channel → note the `chat_id`. * Grant it message-reading rights. * [[http://t.me/Trashbinalertbot|External Link]] Trash Bin alert bot * [[http://t.me/klajf0239j2390d|External Link]] Trash Bin Channel {{:amc:ss2025:group-t:telegram_page.png?500|}} **Commands**: * /start - Start bot * /status - Get current bin fill * /stop - Stop regular update messages * /startupdates - Resume regular updates * /help - Show this message ---- ====== 7. Results ====== ''By 31706'' * **OLED display**: real-time distance & fill bar (tested up to 85%). * **LED**: lights when fill ≥ 80%. * **Telegram**: immediate alert with bin status. * **Node-RED dashboard**: gauge plotting fill percentage. * **Distance & Fill Readout** - OLED updates in real time: * “Distance: 21.8 cm” * “Fill: 63 %” - Fill percentage = ((60 cm − measured_distance) / 60 cm) × 100 %. * **Visual & Remote Alerts** - At ≥ 80 % capacity (trash within ~12 cm of lid): * Onboard LED lights (e.g., red). * Node-RED receives JSON payload: {"bin":"Kitchen","fill":85,"status":"Nearly Full"} * Telegram message: “⚠ Alert: The kitchen trash bin is 85 % full. Please empty it soon.” - Regular status updates (e.g., every 30 s) are also sent. - On sensor error, OLED shows “Sensor error” and that cycle’s data is skipped; an error flag can be forwarded. ---- {{ :amc:ss2025:group-t:screenshot_2025-07-29_160455.png?200|}} {{:amc:ss2025:group-t:pxl_20250729_093131148.jpg?200 |}} {{:amc:ss2025:group-t:pxl_20250729_093110023.jpg?200|}} ---- ====== 8. Discussion & Lessons Learned ====== ''By 31706'' * **Portable power**: using a USB powerbank delivers ~8 hrs runtime; for longer operation, a solar-powered Li-Po pack is recommended. * **Connectivity**: outdoors Wi-Fi drops; consider fallback via GSM/LTE or LoRaWAN. * **Enclosure**: no weatherproof housing yet—future 3D-printed case should protect electronics from dust and moisture. * **Sleep modes**: ESP32 deep-sleep between measurements can drastically reduce power draw. * **Multi-sensor**: adding ambient temperature/humidity could enable smarter waste-decomposition predictions. * **Predictive analytics**: log historical fill data (via MQTT or cloud DB) to forecast optimal pickup schedules. * **Firmware OTA**: integrate over-the-air updates for remote code maintenance. * **Scalability**: mesh-network multiple bins to central server for fleet management. * **Limitations** * Single-point ToF measurement may miss uneven trash piles. * Reliance on Wi-Fi: network outages disrupt remote updates. * Continuous power requirement; no battery or power-saving implemented. * **Improvements** * Multiple sensors or servo-mounted scanning for holistic fill measurement. * Offline data buffering and reconnection logic for network resilience. * Deep-sleep between measurements for battery operation. * **Future Enhancements** * A GPS module (for geo-tagged alerts) * A solar-rechargeable Li-Po power supply (with charge controller) * A weatherproof 3D-printed enclosure * Load cell weight sensor for complementary metrics. * Audible buzzer for local full-bin alarms. * Expanded Node-RED flows: email notifications, historical logging/analytics. * Interactive Telegram bot commands for on-demand status. ---- ====== 9. Conclusion ====== ''By 31706'' Deploying multiple units in smart buildings or campuses enables optimized waste collection scheduling, reduces overflow incidents, and contributes to smarter urban infrastructure by leveraging low-cost sensors and Wi-Fi connectivity. This project demonstrates a practical IoT solution for everyday problems, with clear pathways for scaling and enhancement. ---- ====== 10. References ====== ''By 31706'' * **STMicroelectronics VL53L0X Datasheet** * **U8g2 SH1106 OLED driver** – https://github.com/olikraus/u8g2 * **UniversalTelegramBot Library** – https://github.com/witnessmenow/Universal-Arduino-Telegram-Bot * **Node-RED Documentation** – https://nodered.org/docs/ {{youtube>2MH0t_iPs9k?}}