* Arduino Uno
* Breadboard
* Fire de conectare
* Modul ultrasonic (ieşiri digitale cu întreruperi şi PWM)
* Motor servo
* LED-uri
* Coş de gunoi improvizat din carton
* Senzor de proximitate CJMCU VL53L0X (Time-of-Flight)
* LCD pe interfaţă I²C
* Display SPI
2. Breadboard & fire de conectare
3. Modul ultrasonic cu întreruperi şi PWM
4. Motor servo
5. LED-uri
6. Coş de gunoi improvizat din carton
7. Senzor de proximitate CJMCU VL53L0X
8. LCD pe interfaţă I²C
9. Display SPI
În ansamblu, Arduino citeşte întâi semnalul de prezenţă de la modulul ultrasonic ca să deschidă capacul via servo, apoi citeşte datele de la VL53L0X pentru nivelul de umplere şi trimite valorile atât către LCD (I²C) cât şi către display-ul SPI, plus controlează LED-urile colorate. Toate modulele sunt alimentate şi legate prin breadboard, iar coşul de carton ţine totul fix la locul lui.
Componentă | Rol succint | Conexiuni (ESP8266) |
————– | ——————————– | —————————————————– |
ESP32 | MCU (I²C, SPI, PWM, Wi-Fi) | 3V3, GND; VIN→5V servo |
HC-SR04 | Detectare mână ultrasonic | Trig→TX, Echo→RX; Vcc→3.3V, GND |
Servo | Deschidere capac | Sig→D0; Vcc→5V, GND |
VL53L0X | Măsurare nivel (ToF) | SDA→D2, SCL→D1; Vcc→3.3V, GND |
LCD ST7789V | Afișaj text & grafică | SCLK→D5, MOSI→D7, DC→D6, CS→D8, RST→D3; Vcc→3.3V, GND |
Breadboard | Protoboard prototipare | Rails: +3.3V, +5V, GND; jumper-e |
Alimentare | 3.3V (ESP/senzori/LCD), 5V servo | 3.3V USB/onboard, 5V VIN/external |
# Link-uri către componente
- Servo (FS90) https://www.optimusdigital.ro/en/servomotors/3165-fs90-micro-servomotor-with-plastic-reducing.html?search_query=servomotor&results=111
- LCD ST7789V (1.3″ SPI, 240×240 IPS) https://sigmanortec.ro/display-tft-13-ips-spi-65k-culori-lcd-st7789v-240x240-7p
# Software Design – SmartCan (ESP32)
## 1. Mediu de dezvoltare 1. Platformă: ESP32 (model generic compatibil cu Arduino) 2. IDE / Toolchain:
3. Limbaj: C/C++ (standard Arduino)
## 2. Librării și surse 3rd-party
Librărie | Scop | Observații |
———————- | ————————————— | ————————————————- |
TFT_eSPI | Controlul display-ului TFT | Configurată pentru SPI; pinii definiți în User_Setup.h |
ESP32Servo | Generare semnal PWM pentru servo | Suport ESP32 (evită conflict cu ledc) |
Wire | Comunicație I²C | Folosește pinii D21/D22, pull-up intern, 400 kHz |
Adafruit_VL53L0X | Senzor LIDAR Time-of-Flight (VL53L0X) | Wraper Adafruit; comunică prin I²C |
## 3. Algoritmi și structuri planificate
1. Citire senzori
float distUS = (duration > 0)
? (duration/2.0f) * 0.0343f : -1;
2. Mapare nivel [0…3] if (dist > 170) lvl = 0;
else if (dist <= 170 && dist > 120) lvl = 1; else if (dist <= 120 && dist > 70) lvl = 2; else lvl = 3;
3. Interfață grafică
void drawBarLevel(uint8_t lvl) {
const int barX = 20; const int barW = tft.width() - 40; const int barH = 20; const int barY = tft.height()/2 - barH/2; const int segW = barW / 3;
// Desenare segmente for (uint8_t i = 0; i < 3; i++) { uint16_t col = (i < lvl) ? TFT_GREEN : TFT_DARKGREY; tft.fillRect(barX + i*segW, barY, segW, barH, col); } // Contur tft.drawRect(barX, barY, barW, barH, TFT_WHITE);
// Text nivel tft.setTextDatum(TC_DATUM); tft.setTextColor(TFT_WHITE, TFT_NAVY); tft.drawString(String(lvl), tft.width()/2, barY + barH + 10, 4); } - **Mesaje header:** void showMessage(const String& msg) { tft.fillRect(0, 0, tft.width(), 20, TFT_BLACK); tft.fillRect(0, 20, tft.width(), tft.height()-20, TFT_NAVY); tft.setTextDatum(TC_DATUM); tft.setTextColor(TFT_WHITE); tft.drawString(msg, tft.width()/2, 2, 2); }
4. Control servo
void initServo() {
myServo.attach(14); myServo.write(0); // poziție de start } - **Unghi din nivel:** void setServoLevel(uint8_t lvl) { int angle = map(lvl, 0, 3, 0, 180); myServo.write(angle); } - **Mecanism de siguranță (US):** void safetyServo(float distUS) { if (distUS > 0 && distUS < 15.0f) { myServo.write(90); delay(5000); } else { myServo.write(0); } }
5. Etapa 3 – Surse și funcții implementate
Modul / Fișier | Funcții | Descriere |
—————— | ————————- | —————————————— |
main.cpp | `setup()`, `loop()` | Inițializări și bucla principală |
ui.hpp/.cpp | `showMessage()`, `drawBarLevel()` | Toate operațiunile grafice |
sensors.hpp | `initSensors()`, `readTOF()`, `readUS()` | Init și citire senzori VL53L0X + US |
servo.hpp | `initServo()`, `setServoLevel()`, `safetyServo()` | Control servo și fallback US |
### Scurtă descriere a funcțiilor: - `initSensors()` Configurează I²C (21/22, pull-up, 400 kHz), inițializează VL53L0X (0x30). - `readTOF()` → `uint16_t`
Rulează `sensor.rangingTest()` și returnează `RangeMilliMeter`.
- `readUS()` → `float`
Trimite trigger, citește `pulseIn()` și calculează cm sau -1.
- `setServoLevel(uint8_t lvl)` Mapează nivel → unghi și scrie la servo. - `safetyServo(float distUS)` Detectează obstacol < 15 cm și rotește servo la 90° în fallback.
—
1. Recapitularea obiectivelor Am urmărit implementarea unui sistem SmartCan pe bază de ESP32, capabil să măsoare nivelul de umplere cu senzorul VL53L0X și să afișeze progresul pe un ecran TFT.
2. Rezumatul principalelor rezultate
3. Evaluarea robusteții și stabilității
4. Limitări și lecții învățate
5. Îmbunătățiri și direcții viitoare
—