Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2026:atoader:mihaela.dimovska [2026/05/16 17:16]
mihaela.dimovska [Schema electrică]
pm:prj2026:atoader:mihaela.dimovska [2026/05/24 16:00] (current)
mihaela.dimovska [Resurse / Bibliografie]
Line 50: Line 50:
  
 În stadiul actual, componentele principale ale sistemului sunt funcționale:​ senzorul de umiditate, senzorul de temperatură,​ display-ul OLED, LED-urile de stare, butonul manual, releul și pompa de apă. În stadiul actual, componentele principale ale sistemului sunt funcționale:​ senzorul de umiditate, senzorul de temperatură,​ display-ul OLED, LED-urile de stare, butonul manual, releul și pompa de apă.
 +
 Conexiunile principale folosite sunt: Conexiunile principale folosite sunt:
  
Line 63: Line 64:
 | LED albastru | D7 / PD7 | Indică faptul că pompa este activă | | LED albastru | D7 / PD7 | Indică faptul că pompa este activă |
 | Buton manual | D2 / PD2 / INT0 | Pornește udarea manuală | | Buton manual | D2 / PD2 / INT0 | Pornește udarea manuală |
-| Modul microSD | SPI: CS = PB2, MOSI = PB3, MISO = PB4, SCK = PB5 | Salvare opțională a datelor, în testare | 
 | USART / USB serial | TX/RX | Debug și monitorizare în terminal | | USART / USB serial | TX/RX | Debug și monitorizare în terminal |
  
Line 77: Line 77:
   * **LED-ul verde** este conectat la **D6 / PD6** și indică starea normală a sistemului sau perioada de așteptare după udare.   * **LED-ul verde** este conectat la **D6 / PD6** și indică starea normală a sistemului sau perioada de așteptare după udare.
   * **LED-ul albastru** este conectat la **D7 / PD7** și indică faptul că pompa este activă.   * **LED-ul albastru** este conectat la **D7 / PD7** și indică faptul că pompa este activă.
-  * **Modulul microSD** a fost conectat pe interfața **SPI** a microcontrolerului:​ **CS = PB2**, **MOSI = PB3**, **MISO = PB4**, **SCK = PB5**. Acesta este prevăzut pentru salvarea opțională a datelor, dar în stadiul actual rămâne în testare. 
  
 LED-urile sunt folosite pentru afișarea rapidă a stării sistemului: LED-urile sunt folosite pentru afișarea rapidă a stării sistemului:
Line 90: Line 89:
 În implementarea finală, LED-ul verde indică faptul că sistemul este în stare normală. LED-ul albastru indică activarea pompei. Pentru udarea manuală se aprinde doar LED-ul albastru, iar pentru udarea automată se aprinde LED-ul albastru împreună cu LED-ul roșu, care scade treptat în intensitate folosind PWM. În implementarea finală, LED-ul verde indică faptul că sistemul este în stare normală. LED-ul albastru indică activarea pompei. Pentru udarea manuală se aprinde doar LED-ul albastru, iar pentru udarea automată se aprinde LED-ul albastru împreună cu LED-ul roșu, care scade treptat în intensitate folosind PWM.
  
 +==== Schema electrică ====
 +
 +Schema electrică a sistemului este prezentată în figura de mai jos. Aceasta evidențiază conexiunile dintre placa ATmega328P-XMINI și modulele externe: senzorul de umiditate, senzorul de temperatură,​ display-ul OLED, modulul releu, pompa de apă, LED-urile de stare și butonul manual.
 +
 +{{ :​pm:​prj2026:​atoader:​pm-electric_scheme.png?​700 |Schema electrică a sistemului}}
 +
 +Schema electrică urmărește conexiunile reale folosite în montajul pe breadboard. Senzorii analogici sunt conectați la intrările ADC A0 și A1, display-ul OLED este conectat prin magistrala I2C, iar pompa este comandată printr-un modul releu conectat la pinul D4. LED-ul roșu este conectat la un pin PWM pentru a permite variația intensității luminoase, iar LED-urile verde și albastru sunt conectate la pini digitali simpli.
 +
 +==== Imagini ale montajului hardware ====
 +
 +În continuare sunt prezentate imagini din timpul realizării și testării montajului hardware.
 +
 +{{ :​pm:​prj2026:​atoader:​montaj_general.jpeg?​700 |Montaj general pe breadboard}}
 +
 +Figura 1 prezintă montajul general al sistemului pe breadboard. Se pot observa placa ATmega328P-XMINI,​ senzorii, LED-urile, butonul, display-ul OLED, modulul releu și conexiunile realizate cu fire Dupont.
 +
 +{{ :​pm:​prj2026:​atoader:​releu_pompa.jpeg?​700 |Modul releu și pompă de apă}}
 +
 +Figura 2 prezintă conexiunea dintre modulul releu și pompa de apă. Releul este comandat de microcontroler și permite pornirea sau oprirea pompei fără ca aceasta să fie alimentată direct dintr-un pin GPIO.
 +
 +{{ :​pm:​prj2026:​atoader:​oled_functionare.jpeg?​700 |Display OLED în funcționare}}
 +
 +Figura 3 prezintă display-ul OLED în timpul funcționării. Acesta afișează starea sistemului, valoarea umidității solului, valoarea ADC și temperatura măsurată.
 +
 +
 +==== Dovezi de funcționare ====
 +
 +Funcționarea sistemului a fost verificată prin mai multe teste:
 +
 +  * testarea senzorului de umiditate prin scoaterea și introducerea acestuia în apă sau în sol;
 +  * testarea senzorului de temperatură prin afișarea valorilor în terminal și pe OLED;
 +  * testarea LED-urilor pentru cele trei stări principale: OK, udare automată și udare manuală;
 +  * testarea releului și a pompei prin pornirea automată și manuală a udării;
 +  * testarea display-ului OLED prin afișarea mesajelor de stare.
 +
 +În urma testelor, sistemul poate detecta o valoare de umiditate corespunzătoare solului uscat și poate porni automat pompa. De asemenea, utilizatorul poate porni manual udarea prin apăsarea butonului. După udare, sistemul intră într-o stare de așteptare, pentru ca apa să se distribuie în sol, apoi revine la monitorizarea normală.
 +
 +==== Stadiul actual al implementării ====
 +
 +În stadiul actual, sistemul hardware principal este funcțional. Au fost conectate și testate următoarele componente: senzorul de umiditate a solului, senzorul de temperatură,​ display-ul OLED, butonul manual, LED-urile de stare, modulul releu și pompa de apă.
 +
 +Senzorul de umiditate este citit periodic prin ADC, iar valorile sunt afișate atât în terminalul serial, cât și pe display-ul OLED. Senzorul de temperatură este citit printr-un al doilea canal ADC și valoarea este convertită în grade Celsius.
 +
 +Pompa de apă este controlată prin releu. Sistemul poate porni udarea automat atunci când valorile senzorului indică sol uscat, dar poate porni și manual prin apăsarea butonului. După udare, sistemul intră într-o stare de așteptare pentru ca apa să se distribuie în sol.
 +
 +Display-ul OLED afișează starea sistemului: **ORCHID OK**, **AUTO WATERING**, **MANUAL WATER** sau **WAITING**. LED-urile oferă semnalizare vizuală rapidă: verde pentru stare normală, albastru pentru pompă activă și roșu pentru udare automată.
 +
 +===== 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-urile, butonul și display-ul OLED.
 +
 +==== 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ă.
 +
 +==== Biblioteci folosite ====
 +
 +  * **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;
 +  * **Adafruit_GFX.h** - utilizată pentru funcțiile grafice de bază ale display-ului;​
 +  * **Adafruit_SSD1306.h** - utilizată pentru controlul display-ului OLED SSD1306;
 +  * **avr/​interrupt.h** - utilizată pentru configurarea și tratarea întreruperii externe a butonului.
 +
 +==== Funcționalități din laborator utilizate ====
 +
 +  * **GPIO** - folosit pentru controlul releului, LED-urilor și butonului;
 +  * **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()'';​
 +  * **I2C** - folosit pentru comunicația cu display-ul OLED;
 +  * **USART** - folosit prin ''​Serial''​ pentru mesaje de debug și monitorizare;​
 +  * **Î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.
 +
 +==== Scheletul proiectului ====
 +
 +Logica proiectului este organizată ca o mașină de stări cu următoarele stări:
 +
 +  * ''​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.
 +
 +Î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.
 +
 +==== 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}}
 +
 +===== Resurse / Bibliografie =====
  
 +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.
  
 +  * **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/​
pm/prj2026/atoader/mihaela.dimovska.1778940975.txt.gz · Last modified: 2026/05/16 17:16 by mihaela.dimovska
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0