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 |