Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Solar Panel Movement Project Using Arduino

Download as pdf or txt
Download as pdf or txt
You are on page 1of 6

instructables

Solar Panel Movement Project Using Arduino

by Code Black Zone

Well from when I was kid to till now I always kept on wondering is it possible to make something that allows us to make
the most e cient use of solar light using solar panels as solar panels had a xed shape and when sun was on another
side from which it faced they produced very little electricity
Supplies:

So for this project we need this material


SOLAR PANEL
LI-ION BATTERY
ARDUINO NANO
L293D DRIVER
7806 TRANSISTOR
10K RESISTORS
LDRs
SERVO MOTORS
MALE & FEMALE HEADERS
N20 GEAR MOTOR

Solar Panel Movement Project Using Arduino: Page 1


Step 1: How It Works

The project is based on LDR sensor, I made the rotatable Solar system which has the home position during night time but
when the light is available in day time the solar system automatically waking up through sensing the light presence and
all the solar panels rotate counter clockwise and open like a sun ower and follow the sun rotation, after the sun fallen
down all the solar panels are automatically rotate clockwise and go to the home position for next day sun light

Step 2: What Is a LDR

Light depending resistor is a photo-resistor, which decrease the resistance when the light increases.
An LDR or photo-resistor is made any semiconductor material with a high resistance. It has a high resistance because
there are very few electrons that are free and able to move – the vast majority of the electrons are locked into the crystal
lattice and unable to move. Therefore in this state there is a high LDR resistance.
As light falls on the semiconductor, the light photons are absorbed by the semiconductor lattice and some of their
energy is transferred to the electrons. This gives some of them su cient energy to break free from the crystal lattice so
that they can then conduct electricity. This results in a lowering of the resistance of the semiconductor and hence the
overall LDR resistance.
The process is progressive, and as more light shines on the LDR semiconductor, so more electrons are released to
conduct electricity and the resistance falls further.

Solar Panel Movement Project Using Arduino: Page 2


Step 3: How Does It Calculates the Position of the Sun

As you can see in the above gure that I have placed a sensor in the middle this is why
When the light is minimum, the micro controller Arduino read the resistance value and the the threshold value is sated in
the coding section, when the light is available and the threshold level breaks, the Arduino rotate the n20 gear motor
anticlockwise through the L293D Driver till the limit switch level high, when anticlockwise limit switch pressed the panel
stop rotating and panel is fully opened position when the button is pressed, now the main work is going to progress,
according the sun rotation other 4 LDRs sense the light and send data to the Arduino, and Arduino process the data then
rotate the servo motors according the sun rotation, the rotation position of the servo is max 170 degrees,when the sun
goes down the fth LDR sense data again and this time the process is reverse condition, the LDR data goes down blow
the threshold level and Arduino Rotate the N20 motor clockwise till the 2nd limit switch press and run the servo in home
position, when light is available in next day the same process goes on again.

Solar Panel Movement Project Using Arduino: Page 3


Step 4: The Schematic

Step 5: The Code

#include <Servo.h>

Servo horizontal; // horizontal servo


int servoh = 180;
int servohLimitHigh = 175;
int servohLimitLow = 5;
// 65 degrees MAX

Servo vertical; // vertical servo


int servov = 0;
int servovLimitHigh = 60;
int servovLimitLow = 0;

// LDR pin connections


// name = analogpin;
int ldrlt = A1; //LDR top left - BOTTOM LEFT <--- BDG
int ldrrt = A2; //LDR top rigt - BOTTOM RIGHT
int ldrld = A3; //LDR down left - TOP LEFT
int ldrrd = A4; //ldr down rigt - TOP RIGHT
int ldrmt = A5;

const int button1 = 9;


const int button2 = 10;
const int motorA = 7;
const int motorB = 8;
int buttonStateA = 0;
int buttonStateB = 0;

int pos = 0;
int pos2 = 0;
int oldvalue;
int oldvalue2;

Solar Panel Movement Project Using Arduino: Page 4


void setup(){

horizontal.attach(5);
vertical.attach(6);
horizontal.write(180);
vertical.write(0);
pinMode(motorA, OUTPUT);
pinMode(motorB, OUTPUT);
pinMode(button1, INPUT);
pinMode(button1, INPUT);
delay(2500);
}
void loop() {
int ldrStatus = analogRead(ldrmt);
if (ldrStatus >30) {
buttonStateA = digitalRead(button1);
if (buttonStateA == LOW) {

digitalWrite(motorA, HIGH); //COUNTER clockwise


digitalWrite(motorB, LOW);
}else{digitalWrite(motorA, LOW);
digitalWrite(motorB, LOW);
}

int lt = analogRead(ldrlt); // top left


int rt = analogRead(ldrrt); // top right
int ld = analogRead(ldrld); // down left
int rd = analogRead(ldrrd); // down right
int dtime = 10; int tol = 90; // dtime=diffirence time, tol=toleransi
int avt = (lt + rt) / 2; // average value top
int avd = (ld + rd) / 2; // average value down
int avl = (lt + ld) / 2; // average value left
int avr = (rt + rd) / 2; // average value right
int dvert = avt - avd; // check the diffirence of up and down
int dhoriz = avl - avr;// check the diffirence og left and rigt

//if(lt>90){
//if(Switch_a==LOW){
// digitalWrite(9==HIGH);
// digitalWrite(10==LOW);
// delay(1000);
//}}

if (-1*tol > dvert || dvert > tol)


{
if (avt > avd)
{
servov = ++servov;
if (servov > servovLimitHigh)
{servov = servovLimitHigh;}
}
else if (avt < avd)
{servov= --servov;
if (servov < servovLimitLow)
{ servov = servovLimitLow;}
}
vertical.write(servov);
}
if (-1*tol > dhoriz || dhoriz > tol) // check if the diffirence is in the tolerance else change horizontal angle
{
if (avl > avr)
{
servoh = --servoh;
if (servoh < servohLimitLow)
{
servoh = servohLimitLow;
}
}
else if (avl < avr)
{
servoh = ++servoh;
if (servoh > servohLimitHigh)
{
servoh = servohLimitHigh;
Solar Panel Movement Project Using Arduino: Page 5
}
}
else if (avl = avr)
{
delay(10);
}
horizontal.write(servoh);
}

delay(dtime);

else{
oldvalue = horizontal.read();
oldvalue2 = vertical.read();

for (pos = oldvalue; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
horizontal.write(pos);
delay(15);
}
for (pos2 = oldvalue2; pos2 <= 0; pos2 += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree

vertical.write(pos2); // tell servo to go to position in variable 'pos'


delay(15);}
buttonStateB = digitalRead(button2);
if (buttonStateB == LOW) {

digitalWrite(motorA, LOW); //clockwise


digitalWrite(motorB, HIGH);
}else{digitalWrite(motorA, LOW);
digitalWrite(motorB, LOW);
}}}

Solar Panel Movement Project Using Arduino: Page 6

You might also like