This is an old revision of the document!
Tranziția lumii către energie verde este un subiect de mare actualitate în ultima vreme, pentru a susține eforturile de a încetini și opri încălzirea globală. Modul în care doresc să contribui la acest efort este crearea unei metode de a îmbunătăți eficiența panourilor solare.
Din cauza costurilor mari ale unui panou solar (aproape 10.000 lei pentru a alimenta o gospodărie), un bun complementar care poate maximiza eficiența investiției este binevenit. Articulația propusă în cadrul acestui proiect va orienta automat panoul solar către soare, pentru a optimiza unghiul sub care razele soarelui cad pe acesta și pentru a maximiza producția de energie electrică. Modul de funcționare este inspirat de planta floarea soarelui și comportamentul articulației va fi aproape identic cu aceasta.
Pe lângă beneficiile ecologice ale unui asemenea sistem, articulația poate aduce și beneficii financiare cumpărătorului: creșterea producției de energie electrică a panoului fotovoltaic reduce semnificativ și costul facturilor la energie electrică. Astfel, dacă articulația are un cost de producție suficient de mic, ea poate deveni un bun indispensabil sistemelor fotoelectrice.
Mai jos prezint schema bloc a sistemului propus pentru articulația solară:
Listă de piese necesare:
După cum se poate observa, am conectat perifericele astfel:
Pentru dezvoltarea aplicației am folosit modulul PlatformIO integrat în aplicația Visual Studio Code.
Librăriile externe folosite sunt următoarele:
Înainte de a prezenta codul, este necesar să explic cum funcționează proiectul.
La pornire, acesta trece printr-o fază de inițializare în care modulul GPS caută semnal de la satelit. Conform datasheet, modulul GPS are nevoie de aproximativ 27s pentru a se conecta la sateliți, presupunând vedere clară a cerului. Căutarea semnalului durează maxim 90s, după care microcontroller-ul trece în faza următoare, știind locația și ora UTC. În cazul în care GPS-ul nu se poate conecta la satelit în cele 90s, este afișat un mesaj de eroare și se va folosi locația default a holului EC din Facultatea de Automatică și Calculatoare.
După ce se termină inițializarea, proiectul începe treaba efectivă de a stabiliza direcția panoului solar montat deasupra servomotorului. Pentru a face asta, se folosește de datele primite de la accelerometru, mai precis viteza unghiulară în jurul axei Oz (rotația stânga-dreapta a panoului). Având în vedere relația matematică dintre viteză și distanță, pot calcula unghiul cu care trebuie rotit panoul prin integrarea pulsației față de timp. La final, microcontroller-ul va comanda motorul pentru a roti panoul. În timp ce microcontroller-ul efectuează aceste operații, pe LCD vor fi afișate date despre tensiunea generată de panoul solar și ora locală.
La începutul fișierului am directivele de preprocesor pentru a include librăriile externe folosite în cadrul proiectului și declararea structurilor de date corespunzătoare diverselor periferice ca variabile globale. Spre exemplu, următoarea bucată de cod îmi inițializează o structura de comunicație cu display-ul având în vedere adresa slave-ului (0x27) și dimensiunea ecranului (2 linii a câte 16 coloane):
LiquidCrystal_I2C lcd(0x27, 16, 2);
Orice proiect Arduino are la bază 2 funcții: setup
, funcție care se rulează o singură dată la pornirea în execuție a codului, și loop
, funcție care se execută încontinuu cât timp microcontroller-ul este pornit și funcționează.
În cadrul funcției setup
încep prin a inițializa conexiunile cu perifericele. Spre exemplu, pentru LCD pornesc comunicația prin I2C cu următoarele funcții implementate în biblioteca LiquidCrystal I2C:
// Init LCD lcd.init(); lcd.backlight(); lcd.setCursor(0, 0);
În mod asemănător inițializez pe rând fiecare periferic, unele dintre ele afișând eventuale erori pe LCD, cum ar fi accelerometrul:
// Start the I2C bus for accelerometer, 0x68 address Wire.begin(); Wire.setClock(400000); imu.Config(&Wire, bfs::Mpu6500::I2C_ADDR_PRIM); /* Initialize and configure IMU */ if (!imu.Begin()) { lcd.print("Error initializing communication with IMU"); while (1) { } } /* Set the sample rate divider */ if (!imu.ConfigSrd(19)) { lcd.print("Error configured SRD"); while (1) { } }
În mod special merită menționată comunicația cu Serial Monitorul din VS Code. La începutul fișierului este definită o constantă care spune compilatorului dacă să includă zonele de cod legate de Serial Monitor în sursa finală, iar orice bucată de cod referitoare la Serial Monitor este înconjurată de directive de preprocesor, astfel:
#define DEBUG_SERIAL false #if DEBUG_SERIAL Serial.begin(9600); #endif
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.