Arduino ile Akıllı Güneş Takip Sistemi

Güneş takip sistemleri,güneş panellerini, güneşten gelen radyasyonu en iyi şekilde alacak diklikte tutmaya çalışarak elde edilecek enerjiyi maksimum hale getirmeyi hedefler.  İdeal bir güneş takip sistemi, fotovoltaik güneş pilinin dosdoğru bir şekilde güneşe yöneltilmesini sağlamalıdır. Bunun için yatay ve düşeyde hareket edebilmelidir. Bu proje çalışmasında, gün içinde herhangi bir anda güneşin sürekli olarak 90 derecelik dik açı ile takibini iki eksendeki hareketi ile sağlayan ve bu sayede panellerin günlük verimini arttıran bir güneş takip sistemi tasarlanmıştır. Proje yapımı esnasında programlama, servo motor kontrolü, analog verilerin okunması, elektrik devreleri ve SolidCad ile üç boyutlu parça tasarımı gibi çalışma alanlarına ait birçok teknikten yararlanılmıştır.

Çalışma Mantığı

Yapılan projede gün içinde sistemin güneşe olan konumu LDR ler ile sağlanmış. Toplamda dört adet LDR kullanılmıştır. İki LDR yatay, diğer iki LDR dikey eksende hareketleri sağlamaktadır. Üst LDR ile alt LDR’nin referansları karşılaştırılır. Çıkan sonuca göre servoların konumu değiştirilir. Sağa sola dönme işlemi de aynı mantıkla gerçekleştirilir.

LDR’lerden gelen analog bilgilerin ölçülmesi için de Arduino Uno kullanılmıştır. Üzerindeki altı adet analog giriş sayesinde (A0, A1, A2, A3, A4, A5, A6) LDR lerden analog bilgilerin okunarak kıyaslanması sağlanmıştır. Ayrıca panellerden üretilen akım, gerilim ve güç değerleri de Arduino’nun analog girişleri ile gerçekleştirilmiştir. Arduino’nun girişleri 5V’a göre ayarlandığından girişlere gerilim bölücüler konulmuştur. Bu sayede daha yüksek gerilimlerin ölçümü gerçekleştirilmiştir.

Kullanılan Malzemeler

  • Arduino Uno
  • Servo Motor
  • LDR
  • Solar Panel
  • LCD Ekran
  • 10K Direnç
  • 100K Direnç
  • 220 R Direnç

Devre Şeması

 

 

 

 

Arduino Kodları

#include <Servo.h>
Servo YATAY;
Servo DIKEY;

int pos1 = 90; // servo1 başlangıç konumu
int pos2 = 90; // servo2 başlangıç konumu

const int LDR_SOL = A0; // mor
const int LDR_SAG = A1; // mavi
const int LDR_YUKARI = A2; // yeşil
const int LDR_ASAGI = A3; // sarı
const int pot_pin = A4;

int SOL = 0; 
int SAG = 0; 
int YUKARI = 0;
int ASAGI = 0;
int pot = 0;

void setup()
{
YATAY.attach(9); //alt motor
DIKEY.attach(10); //ust motor
Serial.begin(9600);
}

void loop()
{

SOL = analogRead(LDR_SOL);
SAG = analogRead(LDR_SAG);
YUKARI = analogRead(LDR_YUKARI);
ASAGI = analogRead(LDR_ASAGI);
pot = analogRead(pot_pin);
pot = map(pot, 0, 1023, 0, 50);

Serial.print("POT = ");
Serial.print(pot);
Serial.print(" LDR_SAG = ");
Serial.print(SAG);
Serial.print(" LDR_SOL = ");
Serial.print(SOL);
Serial.print(" LDR_UST = ");
Serial.print(YUKARI);
Serial.print(" LDR_ALT = ");
Serial.println(ASAGI);

//ldr analog (0-1024) bilgileri okur. 
//LDR bir ucu - de ise 
//bu değerler ışık şiddeti ile doğru orantılıdır.
//ışık artarsa değer de artar.

 if (SOL > ( SAG + pot ))
 {
 if (pos1 > 0)
 pos1 -= 1;
 YATAY.write(pos1);
 }
 
 if (SAG > ( SOL + pot ))
 {
 if ( pos1 < 180 )
 pos1++;
 YATAY.write(pos1);
 }

 if (YUKARI > ( ASAGI + pot ))
 {
 if ( pos2 > 0 )
 pos2 -= 1;
 DIKEY.write(pos2);
 }
 
 if (ASAGI > ( YUKARI + pot ))
 {
 if (pos2 < 180)
 pos2++;
 DIKEY.write(pos2);
 }

delay(60);
}

Güneş Panellerinden Gelen Değerlerin Ölçümü

Bu kısımda da panellerden gelen verilerin arduino da okunmasından bahsedeceğim.Yukarıda da bahsettiğimiz gibi arduino girişleri 5V a kadar okuma yapabildiği için daha yüksek değerleri okuyabilmek adına gerilim bölücü kullandım. Aşağıda bağlantı şeması ve panellerden gelen verileri ölçüp ekrana yazdığımız program mevcuttur. Şema da LCD ekran bağlantısı da bulunmakta ama proje sadece panellerin bağlantısı esas alınarak yapılmıştır.

 



//*************************************************
//********analog girişler belirleniyor*************
//*************************************************
int sabit = 5;
int hareketli = 4;
//*************************************************
//*****sabit olan panelin ölçümü yapılıyor*********
//*************************************************
float vout_sbt = 0.0;
float vin_sbt = 0.0;
float R1_sbt = 100000.0; // 100K DİRENÇ
float R2_sbt = 10000.0; // 10K DİRENÇ
float R1 = 100.0; // 100 ohm
int sbt = 0;
float sbt_akim = 0;
//*************************************************
//*****hareketli olan panelin ölçümü yapılıyor*****
//*************************************************
float vout_hrk = 0.0;
float vin_hrk = 0.0;
float R1_hrk = 100000.0; // 100K DİRENÇ
float R2_hrk = 10000.0; // 10K DİRENÇ
float R2 = 100.0; // 100 ohm
int hrk = 0;
float hrk_akim = 0;

void setup()
{
Serial.begin(9600);
pinMode(sabit, INPUT); // SABİT GİRİŞ OLARAK AYARLANDI
pinMode(hareketli, INPUT); // HAREKETLİ GİRİŞ OLARAK AYARLANDI
Serial.println(“***********************BU DEGERLER 10 DK ARA ILE OLCULMUSTUR***********************”);
Serial.println(“***********************************SAU MEKATRONIK**********************************”);
}

void loop()
{
sbt = analogRead(sabit);
hrk = analogRead(hareketli);

vout_sbt = sbt * (5.0 / 1024.0); // OKUNAN ANALOG DEĞER 0-1023 ARASINDA. AMA BİZ 0-5 ARASINA ORANLAMAMIZ LAZIM
vin_sbt = vout_sbt / (R2_sbt/(R1_sbt+R2_sbt)) + 0.3;

sbt_akim = vin_sbt / R1;

vout_hrk = hrk * (5.0 / 1024.0); // OKUNAN ANALOG DEĞER 0-1023 ARASINDA. AMA BİZ 0-5 ARASINA ORANLAMAMIZ LAZIM
vin_hrk = vout_hrk / (R2_hrk/(R1_hrk+R2_hrk)) + 0.3;

hrk_akim = vin_hrk / R2;

if (vin_sbt < 0.09)
{
vin_sbt = 0.0;
}

if (vin_hrk < 0.09)
{
vin_hrk = 0.0;
}

Serial.print(“sabit panel = “);
Serial.print(vin_sbt);
Serial.print(” volt “);
Serial.print(sbt_akim);
Serial.print(” mA”);
Serial.print(” hareketli panel = “);
Serial.print(vin_hrk);
Serial.print(” volt “);
Serial.print(hrk_akim);
Serial.println(” mA”);
delay(600000); //10 DK GECİKME…600 SANİYE
//delay(600000); //10 DK GECİKME…600 SANİYE
}

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir