ldr ve arduino ile güneş takip programı etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Arduino ve ldr kullanılarak gerçekleştirilmiş güzel bir güneş takip sistemi.
Sistemde güneşün pozisyonu algılamak için 4 adet ldr kullanılmış.Ldr lerden gelecek olan ışık şiddeti verilerine görede 2 adet servo motor yardımı ile en verimli güneş açısına eksen hareketleri sağlanmış.
Ldr ler güneşi takip açısından sağ üst - sağ alt - sol üst - sol alt olarak yerleştirilmiş ve aralarına plaka konularak birbirlerinden izole edilmiş.
Peki sistem nasıl çalışır ?
diyelim ki sağ üst köşede en fazla güneş ışığı yakaladık bu durumda sağ üst ldr miz dışında diğer ldr ler gölgede kalacağından en fazla ışığı sağ üst ldrmiz alacak ve bize bilgiyi verecektir.Bizde motorlarımızı tüm ldr ler aynı derecede ışık siddeti alıncaya kadar (belirli bir tölerans altında) servo motorlarımızı döndüreceğiz.
#include <Servo.h> // Servo kütüphanesini ekledik
Servo horizontal; // yatay hareket motoru
int servoh = 90; // yatay limit
Servo vertical; // dikey hareket motoru
int servov = 90; // dikey limit
// LDR pinlerini belirliyoruz
int ldrlt = 0; //LDR sol üst ldr
int ldrrt = 1; //LDR sağ üst ldr
int ldrld = 2; //LDR sol alt ldr
int ldrrd = 3; //LDR sağ alt ldr
void setup()
{
Serial.begin(9600);
// servo connections
// name.attacht(pin);
horizontal.attach(9);
vertical.attach(10);
}
void loop()
{
int lt = analogRead(ldrlt); // üst sol ldr okuma
int rt = analogRead(ldrrt); // üst sağ ldr okuma
int ld = analogRead(ldrld); // alt sol ldr okuma
int rd = analogRead(ldrrd); // alt sağ ldr okuma
int dtime = analogRead(4)/20; // pot ayarları
int tol = analogRead(5)/4;// tolerans belirliyoruz
int avt = (lt + rt) / 2; // üst ldr değerleri ortalaması
int avd = (ld + rd) / 2; // alt ldr değerler ortalaması
int avl = (lt + ld) / 2; // sol ldr değerler ortalaması
int avr = (rt + rd) / 2; // sağ ldr değerler ortalaması
int dvert = avt - avd; // üst ve alt ldr değerleri farkı
int dhoriz = avl - avr;// sol ve sağ ldr değerleri farkı
if (-1*tol > dvert || dvert > tol) // dikey hareket için tolerans değerleri ile karşılaştırma
{
if (avt > avd)//üst tarafa alt taraftan daha fazla ışık geliyorsa
{
servov = ++servov;// yukarı hareket sağla
if (servov > 180)
{
servov = 180;
}
}
else if (avt < avd)//alt tarafa üst taraftan daha fazla ışık geliyorsa
{
servov= --servov;// aşağı hareket sağla
if (servov < 0)
{
servov = 0;
}
}
vertical.write(servov);
}
if (-1*tol > dhoriz || dhoriz > tol) // yatay hareket için tolerans değerleri kontrolü
{
if (avl > avr)//sol tarafta ışık daha fazla ise
{
servoh = --servoh;//sola hareket sağla
if (servoh < 0)
{
servoh = 0;
}
}
else if (avl < avr)// sağ tarafta ışık daha fazla ise
{
servoh = ++servoh;//sağa hareketi sağla
if (servoh > 180)
{
servoh = 180;
}
}
else if (avl == avr)//ışık şiddetli eşit ise sabit kal
{
// nothing
}
horizontal.write(servoh);
}
delay(dtime);
}