Differences

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

Link to this comparison view

pm:prj2026:atoader:mihaela.dimovska [2026/05/22 11:41]
mihaela.dimovska
pm:prj2026:atoader:mihaela.dimovska [2026/05/24 16:00] (current)
mihaela.dimovska [Resurse / Bibliografie]
Line 137: Line 137:
  
 ===== 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-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.1779439298.txt.gz · Last modified: 2026/05/22 11:41 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