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
}