Laboratoare folosite :
- USART : https://ocw.cs.pub.ro/courses/pm/lab/lab1-2023 (Folosit USART pentru debugging si pentru analizarea real-time a datelor inregistrate de senzori)
- Intreruperi : https://ocw.cs.pub.ro/courses/pm/lab/lab2-2023 (Folosim intreruperi pentru declansarea servomotorului pentru )
- I2C : https://ocw.cs.pub.ro/courses/pm/lab/lab6-2023-2024 (Folosim I2C in comunicarea cu ecranul LCD)
Calibrare senzori
În cadrul proiectului, am utilizat doi senzori: un senzor de lumină (implementat cu fotorezistori) și un senzor de tensiune. Pentru a folosi acești senzori, este necesar să înțelegem valorile pe care le pot înregistra și să ajustăm potentiometrul integrat fiecărui senzor sau cum putem interpreta valorile ldr-ului pentru a obține un input valid.
- Senzorul de Lumina : Senzorul este o fotorezistenta care poate inregistra valori in intervalul [ 1 MΩ, 10 kΩ]. O valoare mare poate indica lipsa de lumina, iar una mica poate reprezenta prezenta luminei in abundenta. Senzorul functioneaza pe baza a doua fotorezistoare care atunci cand au o diferenta foarte mare de valori peste o eroare, stim ca pe o parte avem mai multa lumina si rotim panoul solar spre ldr.
- Senzorul de tensiune :Senzorul de tensiune poate inregistra valori intre (0.02445V - 25V) iar conectand bornele panoului solar la cele de intrare ale senzorului am putut masura o valoarea de 5.5V (maximul pe care-l poate produce panoul) si am putut obtine un rezultat foarte precis astfel avand siguranta ca senzorul este calibrat bine.
Pini utilizati: Pentru senzorul de tensiune am folosit pinul A3 pentru a citi voltajul Pentru LCD pinii SDA si SCL au fost legati de A5 respectiv A4 pentru transferul datelor intre LCD si Microcontroller. Pentru Fotorezistori am folosit A0 si A1 pentru a lua valorile dupa care se face intreruperea pentru rotirea servoului. Pentru servomotor m-am folosit de pinul D11 pentru a trimite comanda de rotire deoarce serve-ul are nevoie doar de starea LOW sau HIGH pentru a efectua o manevra.
Pentru proiectarea placutei Arduino Uno am folosit Arduino IDE, folosind diverse functii si librarii.
- “Servo.h” : librarie pendru utilizarea servo-motoarelor folosita pentru a interactiona cu motor pentru determinarea rotirii acestuia
- “LiquidCrystal_I2C.h” : o librarie pentru ecrane LCD cu I2C, cu diverse functionalitati pentru afisaj (pozitionare cursor, crearea caracterelor custom, etc.)
- “SoftwareSerial.h” : Permite conexiunea prin bluetooth. De asemenea, putem transmite sau recepta date pe Bluetooth Serial catre Receiver.
- setup() : functie care initializeaza componentele.
Initializarea ecranului LCD {
lcd.init(); lcd.backlight(); lcd.clear();
}
Initializarea serialei pentru Bluetooth si cea normala{
BTSerial.begin(9600); Serial.begin(9600);
}
Initializarea si rotirea servoului in pozitia initiala {
servo.attach(11); servo.write(UnghiRotire);
}
- ShowPower() : functie care citeste si afiseaza pe LCD tensiunea produsa de Panoul Solar.
Citirea si convertirea Valorii din semnal analog in valoare numerica {
int PowerVar = analogRead(A2); voltage = PowerVar * (5.0 / 1023.0); // Calculam tensiunea obtinuta din semnalul analog Serial.print("Voltajul este : "); Serial.println(voltage);
}
Afisarea valorii pe LCD {
lcd.setCursor(0, 0); lcd.print("Avem Tensiunea de : "); lcd.print(voltage); lcd.print(" V");}
}
- Bluetooth() : Asemanator cu ShowPower doar ca aici valoarea este trimisa prin Bluetooth catre un receiver {
unsigned long TimpCurent = millis(); if (TimpCurent - TimpTrecut >= interval) { TimpTrecut = TimCurent; BTSerial.print("Am produs tensiunea de: "); BTSerial.println(voltage); }
}
- finMaxPower() : Citeste valorile de la cei doi fotorezistori si determina spre ce parte trebuie sa invartim placa pentru a obtine tensiunea maxima posibila {
int Fr1 = analogRead(Photorezistor1); int Fr2 = analogRead(Photorezistor2); Serial.print("Fr1: este "); Serial.println(Fr1); Serial.print("Fr2: este"); Serial.println(Fr2);
int diff = abs(Fr1 - Fr2);
if (diff <= eroareAcceptabila) { Serial.println("Ambele fotorezistoare primesc lumina intr-o masura egala."); servo.detach(); // Oprire fortata pentru servo } else { if (!servo.attached()) { servo.attach(11); // Reatasare servo pe pinul respectiv. } if (Fr1 < Fr2 && UnghiRotire > 85) { UnghiRotire = UnghiRotire - 1; if (UnghiRotire < 85) UnghiRotire = 85; } else if (Fr1 > Fr2 && UnghiRotire <=100) { UnghiRotire = UnghiRotire + 1; if (UnghiRotire > 100) UnghiRotire = 100; } servo.write(UnghiRotire); delay(80); }
}
- Loop() : apelam toate functiile folosite aici: {
findMaxPower(); ShowPower(voltage); Bluetooth(voltage);
}
Funcționare
Starea ecranului LCD:
Afișajul LCD este inițializat și setat să afișeze Tensiunea actuala produsa de panoul solar în starea actuala, care se schimba pe parcurs
Gestionarea unghiulea de refractie:
Continu vom citi valori de la doi fotorezistori si dupa cum stim, cu cat lumina este puternica cu atat valoarea fotorezistorului este una mai mica si vedem daca diferenta dintre cei doi este mai mare decat o eroare stabila, putem determina spre ce parte invartim servo-ul pentru a obtine panoului solar tensiunea maxima acordata de lumina.
Trimiterea mesajului pe bluetooth
În timpul buclei principale, dupa un timer vom trimite un mesaj utilizatorului cu tensiunea actuala produsa, pentru simplitate am pus cooldown-ul de 1 minut.
Am reusit sa fac miscarile sa fie mai rare folosindu-ma de delay-uri pentru a nu suprasolicita servoul si a lasa mai mult timp pentru a citi un set nou de valori.
Proiectul a atins obiectivele propuse, oferind un sistem de eficentizare a puterii produse de panouri reusind sa promoveze sursele de energie regenarabile si transmitand utilizatorului date despre valorile generate in functie de cele mai optime valori externe la momentul dat folosindu-se de rotire.
Resurse hardware:
Resurse software: