This shows you the differences between two versions of the page.
pm:prj2024:mdinica:iustina.caramida [2024/05/27 10:54] iustina.caramida [Mediul de Dezvoltare] |
pm:prj2024:mdinica:iustina.caramida [2024/05/27 11:14] (current) iustina.caramida [Software Design] |
||
---|---|---|---|
Line 49: | Line 49: | ||
</note> | </note> | ||
+ | Elementul de noutate al acestui proiect constă în integrarea controlului precis al unui panou solar utilizând senzori LDR pentru a maximiza eficiența energetică. Utilizarea întreruperilor pentru a realiza temporizări precise și gestionarea stării panoului printr-un buton de control reprezintă o abordare inovatoare pentru un sistem de urmărire a soarelui simplu și eficient. | ||
+ | |||
+ | În cadrul proiectului au fost utilizate următoarele funcționalități: | ||
+ | |||
+ | * **GPIO (General Purpose Input/Output)**: Utilizat pentru a controla pinul LED-ului și a citi starea butonului, esențial pentru interacțiunea hardware-software. | ||
+ | * **UART (Universal Asynchronous Receiver-Transmitter)**: Utilizat pentru comunicarea serială, permite monitorizarea și debug-ul sistemului prin afișarea mesajelor în Serial Monitor. | ||
+ | * **Interrupții**: Folosite pentru a implementa o temporizare precisă folosind Timer2, necesară pentru funcțiile de întârziere fără a bloca execuția. | ||
+ | * **Timere**: Timer2 a fost utilizat pentru a genera întreruperi la intervale precise de timp, esențiale pentru temporizările exacte în funcția delay_ms(). | ||
+ | * **ADC (Analog-to-Digital Converter)**: Folosit pentru a citi valorile analogice de la senzorii LDR și a le converti în valori digitale utilizabile în algoritmul de control al panoului. | ||
+ | |||
+ | Calibrarea senzorilor LDR a fost realizată prin determinarea valorilor minime și maxime de lumină detectate în diferite condiții de iluminare. Pragul de eroare (error) și valoarea epsilon (eps) au fost ajustate empiric pentru a asigura că panoul se poziționează corect în funcție de diferențele detectate între cei doi senzori. | ||
+ | |||
+ | Optimizările au fost realizate în următoarele moduri: | ||
+ | * **Utilizarea întreruperilor și a Timer2**: Acest lucru a permis implementarea unei funcții de întârziere precise (delay_ms()) fără a bloca execuția altor părți ale codului, optimizând astfel eficiența și responsivitatea sistemului. | ||
===== Mediul de Dezvoltare ===== | ===== Mediul de Dezvoltare ===== | ||
Codul Arduino este dezvoltat utilizând mediul Arduino IDE (Integrated Development Environment), un mediu software folosit pentru a scrie, compila și încărca codul pe plăcile de dezvoltare Arduino. Arduino IDE oferă o interfață simplă și intuitivă, suportând limbajul de programare C/C++ cu adăugiri specifice platformei Arduino. IDE-ul include un editor de cod, un monitor serial pentru debugging și multe alte instrumente utile pentru dezvoltarea de proiecte embedded. | Codul Arduino este dezvoltat utilizând mediul Arduino IDE (Integrated Development Environment), un mediu software folosit pentru a scrie, compila și încărca codul pe plăcile de dezvoltare Arduino. Arduino IDE oferă o interfață simplă și intuitivă, suportând limbajul de programare C/C++ cu adăugiri specifice platformei Arduino. IDE-ul include un editor de cod, un monitor serial pentru debugging și multe alte instrumente utile pentru dezvoltarea de proiecte embedded. | ||
===== Librării și Surse Terțe ===== | ===== Librării și Surse Terțe ===== | ||
- | Codul utilizează librăria `Servo.h` furnizată de Arduino, care simplifică controlul servo motorului. Această librărie gestionează generarea semnalelor PWM necesare pentru a controla un servo motor standard. Utilizarea librăriei reduce complexitatea codului și permite dezvoltatorului să se concentreze pe logica aplicației în loc să se ocupe de detalii de nivel jos. | + | În codul prezentat sunt utilizate două librării esențiale: |
+ | * **Servo.h**: Aceasta este o librărie standard în Arduino pentru controlul servomotoarelor. Permite utilizatorilor să controleze poziția unui servomotor folosind funcția write(). | ||
+ | * **avr/interrupt.h**: Aceasta este o librărie specifică microcontrolerelor AVR utilizate de multe plăci Arduino. Permite gestionarea întreruperilor, esențiale pentru implementarea unor funcții precum temporizări precise și reacții rapide la evenimente externe. | ||
===== Organizarea Codului ===== | ===== Organizarea Codului ===== | ||
- | Codul este structurat în două secțiuni principale: `setup()` și `loop()`. Secțiunea `setup()` este destinată inițializării componentelor hardware și configurării inițiale a sistemului, în timp ce `loop()` conține logica principală care se repetă continuu în timpul funcționării dispozitivului. Codul include următoarele elemente: | + | Codul este organizat logic în mai multe secțiuni: |
+ | |||
+ | ==== Importul librăriilor ==== | ||
+ | Importă librăriile necesare pentru funcționalitatea codului. | ||
+ | <code> | ||
+ | // ------------------- Import libraries -------------------- | ||
+ | // Include the servo motor library | ||
+ | #include <Servo.h> | ||
+ | // Include the interruption library | ||
+ | #include <avr/interrupt.h> | ||
+ | </code> | ||
+ | |||
+ | ==== Definirea pinilor și a erorilor ==== | ||
+ | Definirea pinilor pentru senzori și alte componente hardware, precum și valorile de eroare utilizate în algoritmi. | ||
+ | <code> | ||
+ | // ---------------- Define pins and errors ----------------- | ||
+ | // Define the LDR sensor pins | ||
+ | #define LDR1 A0 | ||
+ | #define LDR2 A1 | ||
+ | // Set epsilon value | ||
+ | #define eps 10 | ||
+ | // Set error code | ||
+ | #define error 1000 | ||
+ | // Starting point of the servo motor | ||
+ | int Spoint = 0; | ||
+ | // Create an object for the servo motor | ||
+ | Servo servo; | ||
+ | // Select the pin for the LED | ||
+ | const int ledPin = 12; | ||
+ | // Select the pin for the button | ||
+ | const int buttonPin = 13; | ||
+ | </code> | ||
+ | |||
+ | ==== Variabile globale ==== | ||
+ | Definirea variabilelor globale necesare pentru stocarea stării sistemului și a temporizărilor. | ||
+ | <code> | ||
+ | // ---------------- Define global variables ---------------- | ||
+ | // Global variable to count milliseconds | ||
+ | volatile unsigned int timer2_millis = 0; | ||
+ | // Global variable to count the time since last position has moved | ||
+ | volatile unsigned int lastPositionChange = 0; | ||
+ | // Global variable to check the button | ||
+ | volatile bool ifPressed = false; | ||
+ | </code> | ||
+ | |||
+ | ==== Funcții utile ==== | ||
+ | Implementarea funcțiilor esențiale pentru funcționarea programului, cum ar fi funcția de întrerupere pentru Timer2, funcția personalizată de întârziere, funcția de mișcare a servomotorului, mesaje pentru utilizatori și funcția de iluminare a LED-ului. | ||
+ | |||
+ | ==== Funcția setup() ==== | ||
+ | Configurarea inițială a hardware-ului, inclusiv atașarea servomotorului, configurarea pinilor și inițializarea temporizărilor. | ||
+ | |||
+ | ==== Funcția loop() ==== | ||
+ | Bucla principală care rulează continuu și care gestionează citirea datelor de la senzori, verificarea stării butonului, mișcarea servomotorului, afișarea mesajelor pentru utilizatori și controlul LED-ului. | ||
- | - **Include librării**: La început, codul include librăria Servo pentru a permite controlul unui servo motor. | ||
- | - **Definește constante**: Utilizează directive `#define` pentru a denumi pinii senzorilor LDR și pentru a seta o valoare de eroare. | ||
- | - **Inițializează variabile**: Declara variabile pentru a păstra starea inițială a servo motorului și pinii pentru LED. | ||
- | - **Configurare inițială (`setup()`)**: Inițializează comunicația serială, configurează pinul PWM pentru servo motor și setările inițiale pentru LED. | ||
- | - **Logica de control (`loop()`)**: Citirea valorilor de la senzorii LDR, compararea lor, ajustarea poziției servo motorului și controlul luminozității unui LED bazat pe intensitatea luminii detectate. | ||
===== Algoritmi și Structuri Implementate ===== | ===== Algoritmi și Structuri Implementate ===== | ||
- | - **Citirea senzorilor LDR**: Valorile de la doi senzori LDR sunt citite utilizând funcția `analogRead()`. Aceste valori sunt utilizate pentru a determina diferența de intensitate a luminii între cei doi senzori. | + | Codul utilizează mai mulți algoritmi și structuri pentru a controla mișcarea unui panou solar: |
- | - **Controlul servo motorului**: Poziția servo motorului este ajustată pe baza diferenței dintre valorile citite de la senzori. Dacă diferența este semnificativă, poziția motorului este incrementată sau decrementată pentru a orienta sistemul spre sursa de lumină mai puternică. | + | |
- | - **Controlul luminozității LED-ului**: Valorile sumate ale senzorilor LDR sunt mapate la o gamă de luminozitate pentru LED folosind funcția `map()`. LED-ul este apoi controlat utilizând `digitalWrite()`, care setează nivelul de luminozitate în funcție de intensitatea luminii detectate. | + | ==== Controlul Servomotorului ==== |
+ | Utilizând valori de la doi senzori LDR (Light Dependent Resistor), codul calculează diferența dintre citirile acestora pentru a ajusta poziția servomotorului. Algoritmul verifică dacă diferența este în limite acceptabile (epsilon), și ajustează poziția panoului solar în consecință. | ||
+ | |||
+ | ==== Gestionarea întreruperilor ==== | ||
+ | Utilizarea întreruperilor prin Timer2 pentru a crea o funcție de întârziere precisă. Acest lucru este esențial pentru temporizări precise fără a bloca execuția altor părți ale codului. | ||
+ | |||
+ | ==== Funcționalitate pe bază de stare ==== | ||
+ | Codul utilizează o variabilă globală `ifPressed` pentru a determina dacă panoul solar trebuie să se miște sau să rămână într-o poziție fixă, în funcție de starea butonului. | ||
+ | |||
+ | ==== Mesaje informative ==== | ||
+ | Pe baza poziției curente a panoului solar, sunt afișate mesaje informative pentru utilizatori, cum ar fi „Good Morning sunshine!” sau „Good Afternoon!”. | ||
+ | |||
+ | ==== Controlul LED-ului ==== | ||
+ | LED-ul este controlat în funcție de timpul scurs de la ultima mișcare a panoului solar, indicând astfel dacă panoul a găsit o poziție bună pentru a se încărca. | ||
+ | |||
+ | Aceste structuri și algoritmi combină citirea senzorilor, controlul precis al hardware-ului și feedback-ul pentru utilizator într-un mod coerent și eficient pentru a controla un panou solar. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||