This shows you the differences between two versions of the page.
|
pm:prj2026:florin.stancu:bogdan.panaitiu [2026/05/08 18:44] bogdan.panaitiu created |
pm:prj2026:florin.stancu:bogdan.panaitiu [2026/05/24 12:47] (current) bogdan.panaitiu |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | + | ====== PlantPal ====== | |
| - | ====== Nume proiect ====== | + | |
| ===== Introducere ===== | ===== Introducere ===== | ||
| - | Prezentarea pe scurt a proiectului vostru: | + | **PlantPal** este un sistem inteligent de monitorizare a conditiilor de mediu pentru plante de apartament, construit pe platforma Arduino Uno. Dispozitivul masoara in timp real patru parametri esentiali pentru sanatatea unei plante - **temperatura aerului**, **umiditatea aerului**, **umiditatea solului** si **nivelul de lumina ambientala** - si ofera feedback multi-canal utilizatorului prin trei modalitati complementare: afisaj LCD, indicator vizual LED RGB si alerta sonora prin buzzer. |
| - | * ce face | + | |
| - | * care este scopul lui | + | |
| - | * care a fost ideea de la care aţi pornit | + | |
| - | * de ce credeţi că este util pentru alţii şi pentru voi | + | |
| - | ===== Descriere generală ===== | + | **Ce face proiectul:** |
| + | * Citeste continuu valorile de la trei senzori care masoara patru parametri (DHT22 pentru temperatura si umiditate aer, senzor capacitiv de sol, fotorezistor LDR) | ||
| + | * Compara valorile masurate cu praguri optime configurabile | ||
| + | * Afiseaza starea curenta pe un LCD 1602 prin interfata I2C | ||
| + | * Semnalizeaza vizual starea plantei printr-un LED RGB (verde = optim, galben = atentie, rosu = critic) | ||
| + | * Emite alerte sonore prin buzzer cand unul sau mai multi parametri ies din intervalul optim | ||
| + | * Permite configurarea pragurilor si activarea functiei de snooze prin butoane fizice | ||
| + | * Memoreaza istoricul ultimelor masuratori intr-un buffer circular si le afiseaza ciclic | ||
| - | O schemă bloc cu toate modulele proiectului vostru, atât software cât şi hardware însoţită de o descriere a acestora precum şi a modului în care interacţionează. | + | **Scopul proiectului:** |
| - | Exemplu de schemă bloc [[https://docs.google.com/drawings/d/1UpxRyJNfczJHhNRvWdeb5kh_7IEUy5173odk93W_GSA/edit?usp=sharing|aici]]. | + | Crearea unui dispozitiv autonom care reduce timpul de reactie al utilizatorului la conditii suboptime de mediu, prevenind astfel deteriorarea plantelor prin alerte proactive multi-canal. |
| + | |||
| + | ===== Descriere generala ===== | ||
| + | |||
| + | Sistemul este organizat in jurul microcontrollerului ATmega328P (Arduino Uno) care orchestreaza achizitia datelor de la senzori, evaluarea conditiilor si controlul interfetei de feedback. | ||
| + | |||
| + | ==== Schema bloc ==== | ||
| + | |||
| + | {{:pm:prj2026:florin.stancu:schemabloc_plantpal.png?400|Schema bloc PlantPal}} | ||
| + | |||
| + | ==== Module hardware ==== | ||
| + | |||
| + | * **Modul de achizitie senzori:** colecteaza date analogice (LDR, sol) prin ADC si date digitale (DHT22) printr-un protocol propriu peste GPIO | ||
| + | * **Modul de afisare:** LCD 1602 conectat prin I2C pentru afisarea valorilor curente, alertelor si istoricului | ||
| + | * **Modul de feedback vizual/sonor:** LED RGB controlat prin PWM (3 canale) si buzzer pasiv pentru semnalizare gradata | ||
| + | * **Modul de input utilizator:** 2 butoane cu pull-up pentru configurarea pragurilor si snooze alerta, conectate pe pini cu intreruperi externe | ||
| ===== Hardware Design ===== | ===== Hardware Design ===== | ||
| - | Aici puneţi tot ce ţine de hardware design: | + | ==== Lista de componente ==== |
| - | * listă de componente | + | |
| - | * scheme electrice. Recomandăm să folosiți o aplicație dedicată pentru desenarea schemei electrice (KiCAD, Altium, Fusion360 etc.) sau, în cel mai rău caz, o diagramă desenată în Fritzing, Wokwi sau Tinkercad. | + | ^ Componenta ^ Cantitate ^ |
| - | * diagrame de semnal | + | | Arduino Uno R3 (ATmega328P) | 1 | |
| - | * rezultatele simulării din Wokwi sau Tinkercad (dacă este posibilă simularea). | + | | Senzor DHT22 (temp + umid aer) | 1 | |
| + | | Senzor capacitiv umiditate sol | 1 | | ||
| + | | Fotorezistor LDR 5528 | 1 | | ||
| + | | LCD 1602 cu interfata I2C | 1 | | ||
| + | | LED RGB catod comun | 1 | | ||
| + | | Buzzer pasiv | 1 | | ||
| + | | Buton push-button | 2 | | ||
| + | | Rezistenta 220 ohm | 3 | | ||
| + | | Rezistenta 10k ohm | 2 | | ||
| + | | Rezistenta 1k ohm | 1 | | ||
| + | |||
| + | |||
| + | ==== Schema electrica ==== | ||
| + | |||
| + | {{:pm:prj2026:florin.stancu:schema_electrica_plantpal.png?600|Schema bloc PlantPal}} | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| - | Descrierea codului aplicaţiei (firmware): | + | ==== Mediu de dezvoltare ==== |
| - | * mediu de dezvoltare (if any) (e.g. AVR Studio, PlatformIO) | + | |
| - | * biblioteci şi surse 3rd-party folosite (e.g. Procyon AVRlib) | + | |
| - | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | |
| - | * (etapa 3) surse şi funcţii implementate | + | |
| - | ===== Rezultate Obţinute ===== | + | * **IDE:** Arduino IDE 2.x |
| + | * **Limbaj:** C/C++ (cu acces direct la registre AVR pentru ADC) | ||
| + | * **Toolchain:** avr-gcc (inclus in Arduino IDE) | ||
| + | * **Versionare:** Git + GitHub | ||
| - | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | ==== Biblioteci si surse third-party ==== |
| + | |||
| + | * **Wire.h** - comunicatie I2C cu LCD-ul (standard Arduino) | ||
| + | * **LiquidCrystal_I2C** by Frank de Brabander - control LCD 1602 prin I2C | ||
| + | * **DHT sensor library** by Adafruit - citire DHT11 (protocol propriu 1-wire) | ||
| + | * **Adafruit Unified Sensor** - dependinta a bibliotecii DHT | ||
| + | |||
| + | Restul codului (citire ADC bare-metal, control LED RGB, buzzer, butoane cu intreruperi, state machine, buffer circular istoric) este scris de la zero, cu acces direct la registre AVR acolo unde e relevant pentru exemplificarea conceptelor din laborator. | ||
| + | |||
| + | ==== Structura codului ==== | ||
| + | |||
| + | Codul este organizat modular in 7 fisiere pentru claritate si separarea responsabilitatilor: | ||
| + | |||
| + | * **PlantPal.ino** - fisier principal cu setup() si loop() | ||
| + | * **config.h** - constante, pini, calibrari senzori, timing | ||
| + | * **sensors.h** - citire senzori (ADC bare-metal pentru sol si LDR, DHT11 prin biblioteca) | ||
| + | * **display.h** - control LCD cu 5 pagini (main, sol/lumina, status, istoric, editare) | ||
| + | * **alerts.h** - control LED RGB si buzzer in functie de status | ||
| + | * **input.h** - butoane cu intreruperi hardware (INT1) si polling | ||
| + | * **state.h** - state machine, evaluare praguri, buffer circular istoric | ||
| + | |||
| + | ==== Functionalitati implementate ==== | ||
| + | |||
| + | * **Citire senzori non-blocking** la fiecare 2 secunde, folosind millis() pentru timing | ||
| + | * **Acces direct la registre ADC** (ADMUX, ADCSRA) pentru citire ~10us per canal, comparativ cu ~200us folosind analogRead() | ||
| + | * **Evaluare status pe 3 nivele** (OK / Atentie / Critic) cu praguri configurabile si buffer de toleranta | ||
| + | * **State machine** pentru ciclul SAMPLE -> EVALUATE -> HISTORY -> DISPLAY -> ALERT | ||
| + | * **5 pagini LCD** navigabile prin buton: principala, sol/lumina, status, istoric, editare praguri | ||
| + | * **Buffer circular** pentru ultimele 10 citiri, afisat ciclic in pagina istoric | ||
| + | * **Caractere LCD custom** (icoane pentru temperatura, umiditate, lumina, alerta) | ||
| + | * **Alerte multi-canal coordonate** - LED RGB cu severitate gradata si buzzer cu frecvente diferite | ||
| + | * **Snooze alerta** 30 secunde cu indicator vizual galben palpitant | ||
| + | * **Detectie apasare scurta vs lunga** pe butoane (prag 800ms) cu debouncing software | ||
| + | * **Mod editare praguri** runtime - utilizatorul poate ajusta din butoane pragurile pentru T max, T min, umiditate aer, sol si lumina | ||
| + | * **Profilare cod** - timpul de executie al rutinei de citire senzori este masurat cu micros() si afisat pe Serial | ||
| + | |||
| + | ==== Algoritmi cheie ==== | ||
| + | |||
| + | * **Citire ADC bare-metal** - configurarea manuala a registrelor ADMUX si ADCSRA pentru control complet asupra prescaler-ului si referintei de tensiune, urmata de pornirea conversiei prin setarea bitului ADSC si asteptarea finalizarii prin polling. Asta inlocuieste functia analogRead() din biblioteca standard cu o varianta de 3-5 ori mai rapida. | ||
| + | * **Buffer circular istoric** - structura de date cu auto-suprascriere care pastreaza ultimele N citiri fara alocare dinamica de memorie. Index-ul "head" avanseaza modulo dimensiunea buffer-ului, iar cele mai vechi date sunt suprascrise automat cand se depaseste capacitatea. | ||
| + | * **Detectie apasare scurta/lunga in ISR** - rutina de intrerupere masoara timpul intre frontul descendent (apasare) si cel ascendent (eliberare) folosind millis(), apoi compara durata cu pragul LONG_PRESS_MS pentru a decide tipul evenimentului. Debouncing-ul software se face prin ignorarea schimbarilor mai rapide de 50ms. | ||
| + | * **Evaluare status multi-parametru** - functia parcurge toti senzorii, numara cati parametri sunt in zona de atentie si cati in zona critica, apoi decide statusul global pe baza prioritatii (un singur critic transforma statusul global in critic). | ||
| + | * **Alerte cu severitate gradata** - LED-ul RGB foloseste PWM pentru tranzitii intre culori (verde stabil -> galben stabil -> rosu pulsator cu intensitate modulata), iar buzzer-ul are frecvente si intervale diferite in functie de severitate (1kHz la 3s pentru atentie, 2kHz la 1s pentru critic). | ||
| + | |||
| + | ===== Rezultate Obtinute ===== | ||
| + | |||
| + | {{:pm:prj2026:florin.stancu:bogdan_panaitiu_ansamblu.jpeg?400|Schema bloc PlantPal}} | ||
| ===== Concluzii ===== | ===== Concluzii ===== | ||
| + | |||
| + | Proiectul PlantPal a demonstrat ca un sistem util si functional poate fi construit cu componente accesibile si cunostinte acumulate in primele luni de la cursul de PM. Pe parcurs am invatat ca dezvoltarea unui proiect embedded nu inseamna doar scris cod, ci si planificarea atenta a conexiunilor hardware, calibrarea senzorilor, gestionarea timing-ului non-blocking si testarea incrementala a fiecarei componente in parte. | ||
| + | |||
| + | ==== Ce a mers bine ==== | ||
| + | |||
| + | * **Testarea incrementala** a fost cea mai utila decizie - in loc sa cablez tot odata si sa incerc sa pornesc proiectul intreg, am conectat si testat cate o componenta pe rand, ceea ce a redus semnificativ timpul de debug. | ||
| + | * **Simularea in Tinkercad inainte de montaj fizic** a ajutat sa identific cum trebuie conectate componentele si sa testez logica de baza inainte sa cumpar piesele. | ||
| + | * **Modulele cu electronica integrata** (KY-016 pentru LED RGB, senzor capacitiv sol, modul DHT11) au simplificat mult cablajul fata de varianta cu componente brute. | ||
| + | * **State machine non-blocking** cu millis() functioneaza fluent si permite executia simultana a mai multor task-uri (citire senzori, refresh display, alerte, butoane). | ||
| + | |||
| + | ==== Dificultati intampinate ==== | ||
| + | |||
| + | * **Initializarea LCD-ului** se bloca pana am adaugat manual Wire.begin() si Wire.setClock(100000) inainte de lcd.begin(), problema specifica versiunii bibliotecii folosite. | ||
| + | * **Tipul LED-ului RGB** (anod vs catod comun) a fost confundat initial - am rezolvat prin testarea ambelor logici si folosirea unui define LED_ANODE_COMMON pentru a face cod-ul reutilizabil. | ||
| + | * **Calibrarea senzorului capacitiv de sol** - valorile difera fata de senzorul rezistiv din Tinkercad (in real, valoare mica = umed, in Tinkercad invers). | ||
| + | |||
| + | ==== Reflectie personala ==== | ||
| + | |||
| + | A fost prima oara cand am construit un proiect embedded de la zero, plecand de la o idee si ajungand la un produs functional. Cea mai valoroasa lectie a fost importanta documentarii si planificarii inainte de a incepe sa lipesc fire pe breadboard. De asemenea, am inteles practic diferenta intre cod care "merge in simulare" si cod care "merge pe hardware real" - sunt suficiente diferente subtile (adresa I2C, tipul LED-ului, calibrarea senzorilor) ca sa te blocheze daca nu testezi pe fiecare etapa. | ||
| + | |||
| + | ===== Bibliografie / Resurse ===== | ||
| + | |||
| + | ==== Datasheet-uri ==== | ||
| + | |||
| + | * [[https://docs.arduino.cc/resources/datasheets/A000066-datasheet.pdf|Arduino Uno R3 Datasheet]] | ||
| + | * [[https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf|ATmega328P Datasheet]] | ||
| + | * [[https://components101.com/sites/default/files/component_datasheet/DHT11-Temperature-Sensor.pdf|DHT11 Datasheet]] | ||
| + | * [[https://www.alldatasheet.com/datasheet-pdf/pdf/22683/STMICROELECTRONICS/LM393.html|LM393 Datasheet (utilizat ca referinta)]] | ||
| + | |||
| + | ==== Documentatie biblioteci ==== | ||
| + | |||
| + | * [[https://github.com/johnrickman/LiquidCrystal_I2C|LiquidCrystal_I2C library]] | ||
| + | * [[https://github.com/adafruit/DHT-sensor-library|Adafruit DHT sensor library]] | ||
| + | * [[https://www.arduino.cc/reference/en/language/functions/communication/wire/|Arduino Wire library reference]] | ||
| + | |||
| + | ---- | ||
| + | |||
| + | **Repository GitHub:** [[https://github.com/rici029/PlantPal]] | ||