This shows you the differences between two versions of the page.
|
pm:prj2026:atoader:mihaela.dimovska [2026/05/22 11:42] mihaela.dimovska [Software Design] |
pm:prj2026:atoader:mihaela.dimovska [2026/05/24 16:00] (current) mihaela.dimovska [Resurse / Bibliografie] |
||
|---|---|---|---|
| Line 138: | Line 138: | ||
| ===== Software Design ===== | ===== Software Design ===== | ||
| - | Proiectul este implementat în C/C++ folosind framework-ul Arduino, în mediul Visual Studio Code cu PlatformIO. Codul rulează direct pe microcontroller și controlează senzorii, pompa, LED-ul RGB, butonul și display-ul OLED. | + | Proiectul este implementat în C/C++ folosind framework-ul Arduino, în mediul Visual Studio Code cu PlatformIO. Codul rulează direct pe microcontroller și controlează senzorii, pompa, LED-urile, butonul și display-ul OLED. |
| - | === Stadiul actual al implementării === | + | ==== Stadiul actual al implementării ==== |
| - | În stadiul actual, proiectul poate citi umiditatea solului și temperatura, poate calcula automat cantitatea de apă necesară și poate porni pompa prin releu. Sistemul permite și udare manuală prin apăsarea unui buton, tratată cu întrerupere externă. | + | În stadiul actual, proiectul poate citi umiditatea solului și temperatura, poate calcula automat cantitatea de apă necesară și poate porni pompa prin releu. Sistemul permite și udare manuală prin apăsarea unui buton tratat cu întrerupere externă. |
| - | === Biblioteci folosite === | + | ==== Biblioteci folosite ==== |
| - | * `Arduino.h` - utilizată pentru funcțiile de bază ale microcontrollerului, precum GPIO, ADC, PWM, temporizare și comunicație serială. | + | * **Arduino.h** - utilizată pentru funcțiile de bază ale microcontrollerului: GPIO, ADC, PWM, temporizare și comunicație serială; |
| - | * `Wire.h` - utilizată pentru comunicația I2C cu display-ul OLED. | + | * **Wire.h** - utilizată pentru comunicația I2C cu display-ul OLED; |
| - | * `Adafruit_GFX.h` - utilizată pentru funcțiile grafice de bază ale display-ului. | + | * **Adafruit_GFX.h** - utilizată pentru funcțiile grafice de bază ale display-ului; |
| - | * `Adafruit_SSD1306.h` - utilizată pentru controlul display-ului OLED SSD1306. | + | * **Adafruit_SSD1306.h** - utilizată pentru controlul display-ului OLED SSD1306; |
| - | * `avr/interrupt.h` - utilizată pentru configurarea și tratarea întreruperii externe a butonului. | + | * **avr/interrupt.h** - utilizată pentru configurarea și tratarea întreruperii externe a butonului. |
| - | === Funcționalități din laborator utilizate === | + | ==== Funcționalități din laborator utilizate ==== |
| - | * GPIO - folosit pentru controlul releului, LED-ului RGB și citirea butonului. | + | * **GPIO** - folosit pentru controlul releului, LED-urilor și butonului; |
| - | * ADC - folosit pentru citirea senzorului de umiditate a solului și a senzorului de temperatură. | + | * **ADC** - folosit pentru citirea senzorului de umiditate a solului și a senzorului de temperatură; |
| - | * PWM - folosit pentru controlul intensității LED-ului roșu prin `analogWrite()`. | + | * **PWM** - folosit pentru controlul intensității LED-ului roșu prin ''analogWrite()''; |
| - | * I2C - folosit pentru comunicația cu display-ul OLED. | + | * **I2C** - folosit pentru comunicația cu display-ul OLED; |
| - | * USART - folosit prin `Serial` pentru afișarea mesajelor de debug și monitorizare. | + | * **USART** - folosit prin ''Serial'' pentru mesaje de debug și monitorizare; |
| - | * Întreruperi - folosite prin `INT0` pentru detectarea apăsării butonului de udare manuală. | + | * **Întreruperi** - folosite prin ''INT0'' pentru detectarea apăsării butonului de udare manuală; |
| - | * Timere/temporizare - folosite prin `millis()` pentru debounce, stabilizare, durata udării și intervalele de afișare. | + | * **Timere / temporizare** - folosite prin ''millis()'' pentru debounce, stabilizare, durata udării și intervalele de afișare. |
| - | === Scheletul proiectului === | + | ==== Scheletul proiectului ==== |
| - | Logica proiectului este organizată ca o mașină de stări cu stările: `SYSTEM_STABILIZING`, `SYSTEM_OK`, `NEEDS_WATER`, `WATERING` și `WAIT_AFTER_WATERING`. | + | Logica proiectului este organizată ca o mașină de stări cu următoarele stări: |
| - | În `loop()` se citesc senzorii, se calculează umiditatea și temperatura, se verifică starea sistemului, se pornește sau se oprește pompa și se actualizează LED-urile, OLED-ul și mesajele trimise prin Serial. | + | * ''SYSTEM_STABILIZING'' - perioada inițială de stabilizare a senzorilor; |
| + | * ''SYSTEM_OK'' - starea normală de monitorizare; | ||
| + | * ''NEEDS_WATER'' - solul este detectat ca fiind uscat; | ||
| + | * ''WATERING'' - pompa este activă; | ||
| + | * ''WAIT_AFTER_WATERING'' - perioada de așteptare pentru absorbția apei. | ||
| - | === Validare === | + | În ''loop()'' se citesc senzorii, se calculează umiditatea și temperatura, se verifică starea sistemului, se pornește sau se oprește pompa și se actualizează LED-urile, OLED-ul și mesajele transmise prin Serial. |
| + | |||
| + | ==== Validare ==== | ||
| Funcționalitatea a fost validată prin verificarea valorilor ADC în Serial Monitor, testarea afișajului OLED, testarea releului și a pompei, verificarea LED-urilor și testarea butonului cu întrerupere. De asemenea, au fost testate tranzițiile dintre stările sistemului. | Funcționalitatea a fost validată prin verificarea valorilor ADC în Serial Monitor, testarea afișajului OLED, testarea releului și a pompei, verificarea LED-urilor și testarea butonului cu întrerupere. De asemenea, au fost testate tranzițiile dintre stările sistemului. | ||
| - | === Calibrarea senzorilor === | + | ==== Calibrarea senzorilor ==== |
| + | |||
| + | Senzorul de umiditate a fost calibrat experimental prin citirea valorilor ADC pentru sol uscat și sol umed. Valorile obținute au fost folosite ca praguri pentru ''SOIL_DRY_ADC'' și ''SOIL_WET_ADC'', iar apoi au fost transformate în procent de umiditate folosind ''map()''. | ||
| + | |||
| + | ==== Optimizări ==== | ||
| + | |||
| + | * media mai multor citiri ADC pentru reducerea zgomotului; | ||
| + | * debounce pentru buton; | ||
| + | * confirmarea mai multor citiri consecutive înainte de pornirea sau oprirea udării; | ||
| + | * limitarea timpului maxim de funcționare al pompei pentru protecție; | ||
| + | * organizarea logicii într-o mașină de stări pentru claritate și control mai bun. | ||
| + | |||
| + | ==== Arhivă proiect === | ||
| + | |||
| + | Fișierul atașat conține codul sursă, configurația proiectului și resursele folosite pentru implementarea sistemului automat de udare. | ||
| + | {{:pm:prj2026:atoader:sistem_de_udare.zip|Arhivă proiect}} | ||
| - | Senzorul de umiditate a fost calibrat experimental prin citirea valorilor ADC pentru sol uscat și sol umed. Valorile obținute au fost folosite ca praguri pentru `SOIL_DRY_ADC` și `SOIL_WET_ADC`, iar apoi au fost transformate în procent de umiditate folosind `map()`. | + | ===== Resurse / Bibliografie ===== |
| - | === Optimizări === | + | Pentru realizarea proiectului am folosit documentații tehnice și resurse online pentru componentele hardware și bibliotecile software utilizate. Documentația pentru microcontrolerul **ATmega328P** a fost folosită pentru înțelegerea pinilor disponibili, a intrărilor ADC, a pinilor digitali și a funcționării generale a microcontrolerului. Pentru senzorul de temperatură **LM35** am folosit fișa tehnică, deoarece aceasta explică faptul că senzorul are o ieșire analogică liniară de **10 mV/°C**, valoare folosită în conversia din ADC în grade Celsius. Pentru display-ul OLED cu controller **SSD1306** am folosit documentația bibliotecilor **Adafruit SSD1306** și **Adafruit GFX**, necesare pentru afișarea textului pe ecran prin interfața I2C. De asemenea, am folosit resurse Arduino pentru funcțiile de bază precum `pinMode()`, `digitalRead()`, `digitalWrite()`, `analogRead()`, `analogWrite()` și `millis()`, folosite în implementarea logicii de control, citirea senzorilor, PWM pentru LED-ul roșu și temporizarea fără blocare. Pentru controlul pompei am consultat resurse despre utilizarea unui modul releu cu Arduino, deoarece pompa nu poate fi alimentată direct dintr-un pin GPIO al microcontrolerului. |
| - | Am folosit media mai multor citiri ADC pentru reducerea zgomotului, debounce pentru buton, confirmarea mai multor citiri consecutive înainte de pornirea sau oprirea udării și limitarea timpului maxim de funcționare al pompei pentru protecție. | + | * **Microchip - ATmega328P Datasheet** - documentația microcontrolerului folosit pentru pini, ADC, GPIO și caracteristici electrice: https://www.microchip.com/en-us/product/atmega328p |
| + | * **ATmega328P Datasheet PDF** - fișă tehnică detaliată pentru microcontrolerul ATmega328P: https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf | ||
| + | * **Texas Instruments - LM35 Datasheet** - documentația senzorului de temperatură LM35 și relația de conversie 10 mV/°C: https://www.ti.com/lit/ds/symlink/lm35.pdf | ||
| + | * **Arduino Documentation - Analog Input Pins** - informații despre citirea valorilor analogice folosind pinii ADC: https://www.arduino.cc/en/Tutorial/AnalogInputPins | ||
| + | * **Arduino Reference - pinMode(), digitalRead(), digitalWrite(), analogRead(), analogWrite(), millis()** - funcții folosite pentru configurarea pinilor, citirea senzorilor, controlul LED-urilor și temporizări: https://docs.arduino.cc/language-reference/ | ||
| + | * **Adafruit SSD1306 Library** - bibliotecă folosită pentru controlul display-ului OLED SSD1306: https://docs.arduino.cc/libraries/adafruit-ssd1306/ | ||
| + | * **Adafruit GFX Library** - bibliotecă grafică folosită împreună cu Adafruit SSD1306 pentru afișarea textului și elementelor grafice: https://github.com/adafruit/Adafruit-GFX-Library | ||
| + | * **Adafruit Monochrome OLED Guide** - ghid pentru utilizarea display-urilor OLED cu controller SSD1306: https://learn.adafruit.com/monochrome-oled-breakouts/arduino-library-and-examples | ||
| + | * **Arduino / Relay Module Tutorials** - resurse generale pentru controlul unei pompe sau sarcini externe folosind un modul releu comandat de microcontroler: https://docs.arduino.cc/ | ||
| + | * **PlatformIO Documentation** - mediul folosit pentru compilarea, încărcarea și monitorizarea programului pe placa ATmega328P: https://docs.platformio.org/ | ||