Table of Contents

Smart Solar panel

Introducere

Prezentarea pe scurt a proiectului vostru:

  • Scopul proiectului este de a maximiza puterea produsa de panourile solare prin intermediul rotirii panoului dupa directia soarelui.
  • Optimizarea productie de curent electric poate duce la un profit mai mare si ar promova puterea regenerabila indemnand la dezvoltarea acesteia

Descriere generală

Smart Solar panel-ul meu o sa optimeze puterea obtinuta din panouri solare folosindu-se de niste servomotarea pentru a se misca in functie de pozitia soarelui. Modelul o sa trimita la finalul zilei utilizatorului un mesaj cu statisticiile obtinute pentru ziua respectiva. Aparatul in sine va afisa si in timp real un fel de benchmark pe un lcd

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)

Hardware Design

LISTA COMPONENTELOR

  • PCB
  • BreadBoard
  • fire
  • lcd
  • Mini panou fotovoltaic
  • LED
  • modul bluetooth HC-06
  • ServoMotor
  • 2 fotorezistori
  • senzor de tensiune

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.

Software Design

Mediu de dezvoltare

Pentru proiectarea placutei Arduino Uno am folosit Arduino IDE, folosind diverse functii si librarii.

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.

Functii

- 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.

Diagrama UML

Optimizari

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.

Demo https://www.youtube.com/shorts/oDgjvE7BQhg

Rezultate Obţinute

În urma realizării acestui proiect, am obținut următoarele rezultate:

  1. Afisarea tensiunii produse intr-un mod eficient si actualizarea rapida a valorii pentru schimbari.
  2. Calibrarea servo motorului pentru a se rotii doar pentru unghiuri adecvate si pentru a determina pozitia unde lumina e cea mai puternica
  3. Utilizarea Protocolului Bluetooth pentru ai permite utilizatorului sa citeasca curentul produs de la distanta
  4. Actionarea foarte rapida a schimbarii de intensitate a luminii.

Concluzii

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.

Download

neacsu_iulian_331cd_pm.zip

Jurnal

M-am incadrat din timp in toate deadline-uri si la final am aranjat ocw-ul. Am avut cateva dificultati cu realiarea proiectului in special ajustarea servomotorului si interpretarii datelor de la fotorezistente precum si cu modulul bluetooth ce a fost achizitionat recent pentru dispozitivele Android.

Bibliografie/Resurse

tiny.cc/n5t7yz

Resurse hardware:

Resurse software:

Atmega328P Export to PDF