This is an old revision of the document!
Table of Contents
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 |
==== 2.2. Software Components ==== By 32780
- 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.
====== 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 <Wire.h> #include <Adafruit_VL53L0X.h> #include <U8g2lib.h> #include <WiFi.h> #include <HTTPClient.h> #include <UniversalTelegramBot.h> #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
====== 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.
- External Link Trash Bin alert bot
- External Link Trash Bin Channel
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.
====== 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/