Differences

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

Link to this comparison view

pm:prj2024:mdinica:iustina.caramida [2024/05/27 10:56]
iustina.caramida [Librării și Surse Terțe]
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.
Line 57: Line 71:
     * **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.     * **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 dispozitivuluiCodul 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ă 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 ​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 senzoriDacă 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 ​ajusta poziția servomotoruluiAlgoritmul 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 =====
  
pm/prj2024/mdinica/iustina.caramida.1716796599.txt.gz · Last modified: 2024/05/27 10:56 by iustina.caramida
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