amc:ss2025:group-t:start
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
amc:ss2025:group-t:start [2025/07/29 01:04] – created emir-talha.fidan | amc:ss2025:group-t:start [2025/07/29 21:59] (current) – emir-talha.fidan | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | STDOUT/ | + | ====== |
- | # 1. Introduction | + | |
- | Every year, inefficient waste-collection leads to unnecessary pickups, added CO₂ emissions, and overflowing public bins. Our **Smart Trash-Bin Fill-Level | + | |
- | - A different Wi-Fi server | + | **Emir Talha Fidan (32780)** |
- | - A GPS module | + | **Ilker Bakikol |
- | - A solar-rechargeable Li-Po power supply | + | |
- | - A 3D-printed, weatherproof enclosure | + | |
- | 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 yourself. | + | ====== 1. Introduction ====== |
+ | '' | ||
+ | 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. | ||
- | # 2. Materials & System Overview | ||
- | ## 2.1. Hardware Components | + | |
- | | Component | + | 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 ====== | ||
+ | '' | ||
+ | |||
+ | ==== 2.1. Hardware Components | ||
+ | ^ Component | ||
| ESP32-S3-DevKitC-1 | | ESP32-S3-DevKitC-1 | ||
| VL53L0X ToF sensor | | VL53L0X ToF sensor | ||
| SH1106 128×64 I²C OLED (U8g2 lib) | Displays distance (cm) & fill (%) | | | SH1106 128×64 I²C OLED (U8g2 lib) | Displays distance (cm) & fill (%) | | ||
| LED (GPIO 2) | Visual “almost full” warning | | LED (GPIO 2) | Visual “almost full” warning | ||
- | | GPS module | + | | Powerbank |
- | | Li-Po battery + solar charge IC | Outdoor power source; charges from solar panel | | + | |
- | | 3D-printed enclosure | + | |
| Wires, breadboard, connectors | | Wires, breadboard, connectors | ||
- | *(ℹ️ Please confirm the GPS module part number and its RX/TX pin mapping so I can update the wiring diagram precisely.)* | + | {{: |
+ | |||
+ | ---- | ||
- | ## 2.2. Software Components | + | ==== 2.2. Software Components |
- | - **Arduino IDE** (v2.x) | + | |
- | - **Libraries**: | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | - `UniversalTelegramBot.h` – Telegram Bot API | + | |
- | - **Node-RED** (v3.x) on 192.168.10.50: | + | |
- | - **Telegram Bot** (“TrashAlertBot”) configured with token `xxxx:YYYY` and chat ID `-1001234567890` | + | |
- | # 3. Hardware Assembly | + | ---- |
- | ## 3.1. Breadboard Layout | + | ====== |
- | 1. **Power rails**: +5 V from Li-Po-Solar charger to 5 V rail; 3.3 V regulator feeding 3.3 V rail. | + | '' |
- | 2. **ESP32**: VIN ← 5 V, GND ← GND, SDA ← GPIO 8, SCL ← GPIO 9. | + | |
- | 3. **VL53L0X**: | + | |
- | 4. **OLED (SH1106)**: VCC ← 3.3 V, GND ← GND, SDA/SCL as above. | + | |
- | 5. **GPS module**: | + | |
- | - VCC ← 5 V | + | |
- | - GND ← GND | + | |
- | - TX ← ESP32 RX (GPIO 16?) | + | |
- | - RX ← ESP32 TX (GPIO 17?) | + | |
- | | + | |
- | 6. **LED**: Anode ← GPIO 2 (with 330 Ω resistor), Cathode ← GND. | + | |
- | < | + | ==== 3.1. Breadboard Layout ==== |
- | | + | * **ESP32**: VIN ← 5 V (from powerbank USB→5 V regulator), GND ← GND, SDA ← GPIO 8, SCL ← GPIO 9. |
- | | + | |
- | </figure> | + | |
+ | * **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 | + | ---- |
+ | ====== 4. Arduino IDE Firmware ====== | ||
+ | '' | ||
Below is the main sketch. **Please replace** `YOUR_SSID`, | Below is the main sketch. **Please replace** `YOUR_SSID`, | ||
- | ```cpp | + | < |
#include < | #include < | ||
#include < | #include < | ||
Line 67: | Line 69: | ||
#include < | #include < | ||
#include < | #include < | ||
- | #include < | ||
#include < | #include < | ||
Line 81: | Line 82: | ||
const char* password | const char* password | ||
// Node-RED endpoint | // Node-RED endpoint | ||
- | const char* alert_url | + | const char* alert_url |
- | + | ||
- | // GPS on Serial1 | + | |
- | HardwareSerial gpsSerial(1); | + | |
- | TinyGPSPlus gps; | + | |
// Telegram | // Telegram | ||
const char* telegram_token = " | const char* telegram_token = " | ||
- | String chat_id = "-1001234567890"; | + | String chat_id = "CHAT_ID"; |
- | U8G2_SH1106_128X64_NONAME_F_HW_I2C display(U8G2_R0, | + | U8G2_SH1106_128X64_NONAME_F_HW_I2C display(U8G2_R0, |
Adafruit_VL53L0X lox = Adafruit_VL53L0X(); | Adafruit_VL53L0X lox = Adafruit_VL53L0X(); | ||
WiFiClientSecure secured_client; | WiFiClientSecure secured_client; | ||
Line 98: | Line 95: | ||
unsigned long lastAlertTime = 0, lastSignalTime = 0; | unsigned long lastAlertTime = 0, lastSignalTime = 0; | ||
const unsigned long signalInterval = 30000; | const unsigned long signalInterval = 30000; | ||
- | |||
float lastDistance = 0, lastPercentage = 0; | float lastDistance = 0, lastPercentage = 0; | ||
bool updatesEnabled = true; | bool updatesEnabled = true; | ||
Line 105: | Line 101: | ||
Serial.begin(115200); | Serial.begin(115200); | ||
Wire.begin(I2C_SDA, | Wire.begin(I2C_SDA, | ||
+ | // Initialize display | ||
display.begin(); | display.begin(); | ||
- | display.clearBuffer(); | + | display.clearBuffer(); |
- | display.drawStr(0, | + | |
- | if (!lox.begin()) | + | display.drawStr(0, |
+ | | ||
+ | // Initialize sensor | ||
+ | if (!lox.begin()) while (1); | ||
pinMode(LED_PIN, | pinMode(LED_PIN, | ||
- | | + | // Connect Wi-Fi |
WiFi.begin(ssid, | WiFi.begin(ssid, | ||
- | while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print(' | + | while (WiFi.status() != WL_CONNECTED) { |
- | Serial.println(" | + | |
- | WiFi OK"); | + | |
+ | | ||
+ | Serial.println(" | ||
secured_client.setInsecure(); | secured_client.setInsecure(); | ||
} | } | ||
void loop() { | void loop() { | ||
- | while (gpsSerial.available()) gps.encode(gpsSerial.read()); | ||
VL53L0X_RangingMeasurementData_t m; | VL53L0X_RangingMeasurementData_t m; | ||
lox.rangingTest(& | lox.rangingTest(& | ||
Line 126: | Line 127: | ||
float p = constrain(100.0 - (d/ | float p = constrain(100.0 - (d/ | ||
lastDistance = d; lastPercentage = p; | lastDistance = d; lastPercentage = p; | ||
+ | // Update OLED | ||
display.clearBuffer(); | display.clearBuffer(); | ||
display.setCursor(0, | display.setCursor(0, | ||
Line 135: | Line 137: | ||
display.drawBox(0, | display.drawBox(0, | ||
display.sendBuffer(); | display.sendBuffer(); | ||
+ | // Alert on ≥80% | ||
if (p >= 80.0) { | if (p >= 80.0) { | ||
digitalWrite(LED_PIN, | digitalWrite(LED_PIN, | ||
Line 145: | Line 148: | ||
} | } | ||
} | } | ||
+ | // Periodic update | ||
if (millis() - lastSignalTime > signalInterval) { | if (millis() - lastSignalTime > signalInterval) { | ||
if (updatesEnabled) sendRegularUpdate(lastDistance, | if (updatesEnabled) sendRegularUpdate(lastDistance, | ||
lastSignalTime = millis(); | lastSignalTime = millis(); | ||
} | } | ||
- | static unsigned long lastBot=0; | + | |
- | if (millis()-lastBot> | + | |
- | int n = bot.getUpdates(bot.last_message_received+1); | + | if (millis() - lastBot > 1000) { |
- | while (n) { handleNewMessages(n); | + | int n = bot.getUpdates(bot.last_message_received + 1); |
+ | while (n) { | ||
+ | | ||
+ | | ||
+ | | ||
lastBot = millis(); | lastBot = millis(); | ||
} | } | ||
Line 159: | Line 167: | ||
// ... (sendWarning, | // ... (sendWarning, | ||
- | ``` | + | </code> |
- | (ℹ️ Please verify your GPS-serial pins (16/17 above) and your Node-RED URL.) | + | |
- | # 5. Node-RED Flow | ||
- | Our Node-RED instance (on 192.168.10.50: | ||
- | 1. Parses JSON (distance, fill_percentage, | + | ---- |
- | 2. Conditions: if `fill_percentage ≥ 80` → send email or SMS, else just log | + | |
- | 3. Dashboard: updates a gauge & map node | + | |
- | < | ||
- | <img src=" | ||
- | < | ||
- | </ | ||
- | *(ℹ️ Could you share the JSON of your function node or the exact switch thresholds? | + | ===== Code Summary ===== |
- | # 6. Telegram Bot Configuration | + | 1. **Initialization (setup)** |
- | 1. Create bot with BotFather → get `BOT_TOKEN`. | + | - Serial debug +< |
- | 2. Invite to your group/ | + | - < |
- | 3. Grant it message-reading rights. | + | - Connect to Wi-Fi (SSID/ |
+ | - Initialize HTTPClient & Telegram bot | ||
+ | - On failure (sensor or Wi-Fi), print/ | ||
+ | |||
+ | 2. **Main Loop** | ||
+ | - Ranging measurement via < | ||
+ | - 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 (< | ||
+ | - Delay to regulate loop frequency | ||
+ | |||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | |||
+ | ====== 5. Node-RED Flow ====== | ||
+ | '' | ||
+ | Our Node-RED instance handles incoming HTTP POSTs at `/ | ||
+ | |||
+ | * Parses JSON (distance, fill_percentage) | ||
+ | * Switch: if `fill_percentage ≥ 80` → trigger email/SMS, else log | ||
+ | * Dashboard: updates a gauge node | ||
+ | |||
+ | {{: | ||
+ | |||
+ | ---- | ||
+ | |||
+ | ====== | ||
+ | '' | ||
+ | * Create bot with BotFather → get `BOT_TOKEN`. | ||
+ | | ||
+ | | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | {{: | ||
- | < | ||
- | <img src=" | ||
- | < | ||
- | </ | ||
**Commands**: | **Commands**: | ||
- | - `/status` — current distance & fill | + | * / |
- | - `/stop` & `/start` | + | * / |
- | - `/help` — list commands | + | * /stop - Stop regular update messages |
+ | * / | ||
+ | * /help - Show this message | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | ====== 7. Results ====== | ||
+ | '' | ||
+ | * **OLED display**: real-time | ||
+ | * **LED**: lights when fill ≥ 80%. | ||
+ | * **Telegram**: | ||
+ | * **Node-RED dashboard**: | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | * **Distance & Fill Readout** | ||
+ | - OLED updates in real time: | ||
+ | * “Distance: | ||
+ | * “Fill: 63 %” | ||
+ | - Fill percentage = ((60 cm − measured_distance) | ||
+ | |||
+ | * **Visual | ||
+ | - At ≥ 80 % capacity (trash within ~12 cm of lid): | ||
+ | * Onboard LED lights (e.g., red). | ||
+ | * Node-RED receives JSON payload: | ||
+ | < | ||
+ | * 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 ====== | ||
+ | '' | ||
+ | * **Portable power**: using a USB powerbank delivers ~8 hrs runtime; for longer operation, a solar-powered Li-Po pack is recommended. | ||
+ | * **Connectivity**: | ||
+ | * **Enclosure**: | ||
+ | * **Sleep modes**: ESP32 deep-sleep between measurements can drastically reduce power draw. | ||
+ | * **Multi-sensor**: | ||
+ | * **Predictive analytics**: | ||
+ | * **Firmware OTA**: integrate over-the-air | ||
+ | * **Scalability**: | ||
+ | |||
+ | * **Limitations** | ||
+ | * Single-point ToF measurement may miss uneven trash piles. | ||
+ | * Reliance on Wi-Fi: network outages disrupt remote updates. | ||
+ | * Continuous power requirement; | ||
+ | |||
+ | * **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. | ||
- | # 7. ESP32 Simulation | + | * **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, | ||
+ | * Interactive Telegram bot commands for on-demand status. | ||
- | We used Wokwi ESP32 simulator to validate I²C wiring and basic code logic before hardware prototyping. | + | ---- |
- | < | + | ====== 9. Conclusion ====== |
- | <img src=" | + | '' |
- | < | + | |
- | </ | + | |
- | *(ℹ️ Do you want me to include the `.wokwi` | + | Deploying multiple units in smart buildings or campuses enables optimized waste collection scheduling, reduces overflow incidents, and contributes |
- | # 8. Results | + | ---- |
- | - **OLED display** shows real-time distance & fill bar (tested up to 85%). | + | |
- | - **LED** lights when fill ≥ 80%. | + | |
- | - **Telegram**: | + | |
- | - **Node-RED dashboard**: | + | |
- | # 9. Discussion & Lessons Learned | + | ====== 10. References ====== |
- | - **GPS accuracy** under canopy dropped to ±10 m; consider adding GLONASS support. | + | '' |
- | - **Power management**: Li-Po lasted only ~2 days without solar; MPPT charge controller recommended. | + | |
- | - **Network dropouts** outdoors; a fallback to GSM/LTE or LoRaWAN could improve reliability. | + | |
- | - **Sensor placement**: VL53L0X needs a clear line of sight; condensation inside enclosure can scatter photons. | + | * **UniversalTelegramBot Library** – https://github.com/ |
+ | * **Node-RED Documentation** – https://nodered.org/ | ||
- | **Potential improvements**: | ||
- | - Solar panel + MPPT for true off-grid operation | ||
- | - Adaptive sleep (ESP32 deep sleep between readings) | ||
- | - Multiple bins: multiplex sensors or use mesh networking | ||
- | - Smart analytics: predict fill times & schedule pickups | ||
- | # 10. Conclusion | + | {{youtube> |
- | This project demonstrates an end-to-end IoT solution for smart waste monitoring: from hardware (ESP32, ToF, GPS, OLED) through firmware (Arduino IDE) to cloud dashboards (Node-RED) and user alerts (Telegram). With a weatherproof 3D-printed enclosure and solar power, it can operate outdoors, helping cities optimize waste collection and reduce emissions. | + | |
- | # 11. References | ||
- | 1. **STMicroelectronics VL53L0X Datasheet** | ||
- | 2. **U8g2 SH1106 OLED driver** – https:// | ||
- | 3. **TinyGPSPlus Library** – https:// | ||
- | 4. **UniversalTelegramBot Library** – https:// | ||
- | 5. **Node-RED Documentation** – https:// |
amc/ss2025/group-t/start.1753743842.txt.gz · Last modified: 2025/07/29 01:04 by emir-talha.fidan