Proiect realizat de: Ioana Ștefan, 332CA
SmartPot este un sistem embedded inteligent destinat îngrăjirii automate a plantelor de interior. Dispozitivul este capabil să monitorizeze umiditatea solului, să detecteze sursa principală de lumină, să rotească ghiveciul spre acea direcție și să ude planta doar atunci când este necesar. Informațiile despre stare sunt afișate pe un ecran LCD I2C, iar sistemul oferă feedback sonor și vizual prin buzzer și LED-uri. În plus, utilizatorul poate controla manual sistemul prin intermediul unei interfețe web WiFi. Proiectul aplică în mod direct concepte fundamentale din disciplinele de programare și modelare (PM), precum: ADC, PWM, I2C, UART, control motoare, ISR și design de sisteme reactive.
INCEPUT // Configurare inițială INITIALIZEAZĂ: Senzor_umiditate_sol ← pin analogic 32 Pompa ← pin digital 4 Senzor_nivel_apa ← pin digital 33 Buzzer ← pin digital 16 LED_rosu ← pin digital 15 LED_verde ← pin digital 2 LDR_stanga ← pin analogic 12 LDR_dreapta ← pin analogic 13 Motor_pas_cu_pas ← pini 14,27,26,25 LCD ← adresă I2C 0x27 Server_WiFi ← port 80 // Variabile globale mod_manual ← FALS udare_manuală ← FALS directie_rotatie ← 0 timp_start_pompa ← 0 MAX_TIMP_UDARE ← 10000 // 10 secunde // Conectare WiFi INCARCĂ_SETĂRI_WIFI("NUME_REȚEA", "PAROLA") AFIȘEAZĂ_LCD("Conectare WiFi...") CÂT_TIMP (STARE_WIFI() ≠ CONECTAT) AȘTEPTĂ(500) AFIȘEAZĂ_LCD("IP: " + GET_IP()) // Configurare server web CONFIGUREAZĂ_RUTE_SERVER: RUTA("/") → afiseaza_pagina_control RUTA("/water") → gestioneaza_udare RUTA("/rotate") → gestioneaza_rotatie // Buclă principală CÂT_TIMP (ADEVĂRAT) EXECUTĂ: GESTIONEAZĂ_CERERI_SERVER() DACĂ (mod_manual = FALS) ATUNCI: // Mod automat umiditate ← CITESTE_ANALOGIC(Senzor_umiditate_sol) nivel_apa ← CITESTE_DIGITAL(Senzor_nivel_apa) DACĂ (umiditate > 2500 ȘI nivel_apa = Înalt) ATUNCI: ACTIVEAZĂ_POMPA(ADEVĂRAT) ALTFEL: ACTIVEAZĂ_POMPA(FALS) diferenta_lumina ← CITESTE_ANALOGIC(LDR_dreapta) - CITESTE_ANALOGIC(LDR_stanga) DACĂ (ABS(diferenta_lumina) > 100) ATUNCI: ROTEȘTE_MOTOR(diferenta_lumina > 0 ? DREAPTA : STÂNGA) ALTFEL: // Mod manual ACTIVEAZĂ_POMPA(udare_manuală) ROTEȘTE_MOTOR(directie_rotatie * 50) DACĂ (udare_manuală ȘI (TIMP_CURENT() - timp_start_pompa > MAX_TIMP_UDARE)) ATUNCI: udare_manuală ← FALS ACTIVEAZĂ_POMPA(FALS) VERIFICĂ_NIVEL_APĂ() ACTUALIZEAZĂ_AFIȘAJ() AȘTEPTĂ(100 ms) SFÂRȘIT // Funcții auxiliare FUNCȚIE VERIFICĂ_NIVEL_APĂ(): nivel_scazut ← CITESTE_DIGITAL(Senzor_nivel_apa) = SCĂZUT DACĂ (nivel_scazut) ATUNCI: ACTIVEAZĂ_BUZZER(ADEVĂRAT) SETEAZĂ_LED(LED_rosu, INTERMITENT) SETEAZĂ_LED(LED_verde, FALS) OPREȘTE_POMPA() ALTFEL: ACTIVEAZĂ_BUZZER(FALS) SETEAZĂ_LED(LED_rosu, FALS) SETEAZĂ_LED(LED_verde, mod_manual ? FALS : ADEVĂRAT) FUNCȚIE ACTUALIZEAZĂ_AFIȘAJ(): SCRIE_LCD("Umid: " + MAPEAZĂ(umiditate, 0,4095,0,100) + "%") SCRIE_LCD_LINIA_2(mod_manual ? "MANUAL" : "AUTO " + (nivel_apa ? "OK" : "LOW")) // Handlere web FUNCȚIE afiseaza_pagina_control(): GENEREAZĂ_HTML cu butoane pentru control manual FUNCȚIE gestioneaza_udare(parametri): mod_manual ← ADEVĂRAT udare_manuală ← (parametri.enable = 1) timp_start_pompa ← TIMP_CURENT() FUNCȚIE gestioneaza_rotatie(parametri): mod_manual ← ADEVĂRAT directie_rotatie ← parametri.dir
Listă completă componente:
Componentă | Cantitate | Observații |
ESP32 DevKit v1 | 1 | Microcontroler central |
LCD 1602 I2C | 1 | Afișaj stare sistem |
Senzor umiditate capacitiv | 1 | Alimentare la 3.3V, ieșire analogică |
LDR + rezistențe 10kΩ | 2 + 2 | Pentru detectare lumină |
Senzor nivel apă (digital) | 1 | Contact simplu |
Releu 5V | 1 | Comută pompa pe 5V extern |
Pompiță 5V + furtun | 1 | Alimentare 4xAA |
Motor stepper 28BYJ-48 | 1 | Rotire controlată |
Driver ULN2003 | 1 | Control motor |
LED roșu + verde | 1 + 1 | Feedback stare rezervor |
Buzzer activ | 1 | Semnal sonor la eroare |
Breadboard + fire | - | Pentru conexiuni |
Structura logică extinsă:
- `setup()`:
- `loop()`:
Laborator PM | Aplicație concretă |
————– | ————————————————– |
Lab 1 | USART - debug prin port serial |
Lab 2 | Timere software, debounce, delay |
Lab 3 | PWM motor, LED-uri, buzzer control |
Lab 4 | ADC cu LDR și senzor umiditate |
Lab 5 | I2C - interfață LCD + eventual RTC |