Student: Andrada-Ioana Cojocaru
Grupa: 332CA
Asistent: Victor Stoica
Proiectul consta intr-un panou solar ce urmareste unda de lumina maxima prin intermediul celor 4 fotorezistori,se
poate misca atat pe lungime cat si pe latime prin intermediul a 2 servomotoare. Sistemul va colecta date despre
sistem si va determina perioada zilei.
Am ales sa implementez un proiect ce se bazeaza pe un panou solar, deoarece sustin energia alternativa sustenabila,
iar cea solara este cea mai raspandita si cunoscuta. Trebuie sa invatat sa profitam de acest tip de energie inepuizabila.
Panourile solare sunt destul de costisitoare, de aceea este important sa le folosim la maxim, iar prin acest mecanism
propus, captarea energie creste exponential.
Am pornit de la un video, pe care l-am vazut pe youtube cu un proiect facut pentru un targ stiintific:
proiect_targ_stiintific , iar apoi am decis sa continui dupa o alta idee interesanta: proiect_final si sa includ si o
parte de analiza a datelor pentru a studia diversi factori ce influenteaza captarea energiei solare.
Panoul solar va fi insotit de o componenta ce va contine fotorezistoarele care detecteaza
intensitatea luminoasa cea mai mare si transmite microcontroller-ului datele pentru a comanda
cele 2 servomotoare sa se miste in directia indicata.
Prin acest tip de ansamblu se maximizeaza productia de energie solara. Fata de un panou fix, energia captata de acest tip de ansamblu este de 40% mai mult. Panourile solare sunt costisitoare, astfel prin introducerea fotorezistoarelor si celor 2 servomotoare se imbunatateste randamentul ansamblului.
Lcd-ul va primi detalii despre perioada zilei in functie de directia din care este primita lumina sau absenta ei.
Declararea bibliotecilor
#include <Wire.h> #include <LiquidCrystal_I2C.h>
Setam lcd -ul
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
</code>
Declararea define urilor
#define SERVO_RIGHT_LEFT_PIN 9 #define SERVO_UP_DOWN_PIN 10 #define SERVO_RIGHT_LEFT_REG OCR1A #define SERVO_UP_DOWN_REG OCR1B #define LDR_TOP_LEFT_PIN A0 #define LDR_TOP_RIGHT_PIN A1 #define LDR_BOTTOM_LEFT_PIN A2 #define LDR_BOTTOM_RIGHT_PIN A3 #define TOLERANCE 10
Declararea variabilelor globale pentru miscarea servo-motoarelor - de aici pornesc
int servoRightLeftPos = 35; int servoUpDownPos = 76;
Functie pentru miscarea servomotoarelor in functie de pin si valoare
void setServoAngle(int servoPin, int angle) { float pulseWidthMs = 1.0 + (float)angle / 180.0 * 1.0; // Map angle to pulse width between 1ms and 2ms int pulseWidthTicks = pulseWidthMs * 20000 / 20; // Convert pulse width to ticks for 20ms period if (servoPin == SERVO_RIGHT_LEFT_PIN) { SERVO_RIGHT_LEFT_REG = pulseWidthTicks; } else if (servoPin == SERVO_UP_DOWN_PIN) { SERVO_UP_DOWN_REG = pulseWidthTicks; } }
Setup - configuram lcd ul sa afiseze masajul de pe primul rand, configuram registri corespunzatori si pozitionam servo-motoarele in pozitia de start
void setup() { // write message on lcd lcd.init(); lcd.backlight(); lcd.setCursor(3, 0); lcd.print("Hello"); analogReference(DEFAULT); // Configure Timer1 for servo control // Set OC1A/OC1B on compare match, clear OC1A/OC1B at BOTTOM (inverting mode) TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM11); // clkI/O/8 (from prescaler) TCCR1B = _BV(WGM13) | _BV(CS11); ICR1 = 20000; // 20ms period for PWM DDRB |= _BV(PB1) | _BV(PB2); // Set servo pins as outputs PORTB &= ~(_BV(PB1) | _BV(PB2)); // Set servo pins low // set where the servo start servoRightLeftPos = 35; servoUpDownPos = 76; setServoAngle(SERVO_RIGHT_LEFT_PIN, servoRightLeftPos); setServoAngle(SERVO_UP_DOWN_PIN, servoUpDownPos); delay(1000); }
Loop - citim ldr-urile si in functie de valorile obtinute calculam media celor de sus, de jos, dreapta, stanga si apoi diferenta dreapta-stanga, sus-jos si observam daca valoarea e mai mare decat toleranta, caz in care trebuie sa mutam pozitia ansamblului.
Am determinat experimental valorile intre care trebuie servo-motoarele mutate:
In functie de pozitia soarelui sau absenta lui am afisat mesaje relevante pe lcd:
void loop() { // read data from ldr int topl = analogRead(LDR_TOP_LEFT_PIN); int topr = analogRead(LDR_TOP_RIGHT_PIN); int botl = analogRead(LDR_BOTTOM_LEFT_PIN); int botr = analogRead(LDR_BOTTOM_RIGHT_PIN); // calculating average int avgtop = (topr + topl) / 2; // average of top LDRs int avgbot = (botr + botl) / 2; // average of bottom LDRs int avgleft = (topl + botl) / 2; // average of left LDRs int avgright = (topr + botr) / 2; // average of right LDRs // Get the differences int difftopbottom = avgtop - avgbot; // difference between average of top LDRs and bottom LDRs int diffrightleft = avgright - avgleft; // difference between average of right LDRs and left LDRs // left-right movement of solar tracker if (abs(diffrightleft) >= TOLERANCE) { if (diffrightleft < 0) { if (servoRightLeftPos <= 60) { servoRightLeftPos++; setServoAngle(SERVO_RIGHT_LEFT_PIN, servoRightLeftPos); } } else if (diffrightleft > 0) { if (servoRightLeftPos >= -10) { servoRightLeftPos--; setServoAngle(SERVO_RIGHT_LEFT_PIN, servoRightLeftPos); } } } // up-down movement of solar tracker if (abs(difftopbottom) >= TOLERANCE) { if (difftopbottom < 0) { if (servoUpDownPos <= 96) { servoUpDownPos+=5; setServoAngle(SERVO_UP_DOWN_PIN, servoUpDownPos); } } else if (difftopbottom > 0) { if (servoUpDownPos >= 76) { servoUpDownPos-=5; setServoAngle(SERVO_UP_DOWN_PIN, servoUpDownPos); } } } // get time of the day by sun position String direction, position; if (topr > topl) { direction = "East"; } else { direction = "West"; } if (botr > topr) { position = "High"; } else { position = "Low"; } // display to the lcd the day time lcd.setCursor(0, 1); lcd.print(" "); if (direction == "East" and position == "Low") { lcd.setCursor(8, 1); lcd.println("Morning!"); } else if ( direction == "West" and position == "Low") { lcd.setCursor(8, 1); lcd.println("Evening!"); } else if (direction == "East" and position == "High") { lcd.setCursor(9, 1); lcd.println("Midday!"); } else { lcd.setCursor(5, 1); lcd.println("Good night!"); } delay(100); }
Conform analizelor descoperite online, solar tracker-ul pe 2 axe prezinta mereu rezultate mai bune decat celelalte 2 variante (varianta fixa si cea pe o singura axa), deoarece urmareste soarele de la rasarit la apus si pe tot parcursul zilei.
Proiectul a fost unul cat se poate de interesant, ce m-a facut sa ma adaptez in diverse situatii.
Initial mi-am dorit sa integrez o analiza de date a valorilor obtinute de panoul solar de-a lungul zilei, insa am avut dificultati cu cardul sd (ce afisa caractere random) si a trebuit sa renunt la idee pentru ca nu m-as fi incadrat in timp, insa am incercat sa compensez prin afisarea pe display a momentului zilei in functie de pozitia soarelui.
O alta problema intampinata a fost pozitionarea ansamblului panou solar - fotorezistoare ce initial a fost pozitionat prea jos, astfel ca servo-motorul sus-jos avea probleme in deplasare blocandu-se in partea de jos.
Pe viitor as vrea sa continui proiectul prin studiul valorilor obtinute de acest timp de ansamblu comparativ cu varianta fixa si sa gandesc o varianta si mai eficienta. De asemenea, mi-ar placea sa conectez niste acumulatori pentru a putea folosi in mod practic.
Cred foarte mult in energia alternartiva, desi momentan nu este foarte raspandita din cauza costurilor mai piperate. Este foarte important sa gasim metode prin care sa putem folosi resursele la maxim, mai ales cele ce ne tin planeta protejata de poluare.
Video functionare: