Arduino Solar Tracker





Introduction: Arduino Solar Tracker

About: Hello, I'm Bruce. I'm a student in Belgium. I have a wide variety of interests: electronics, computers, technology, ... In my spare time I spend a lot of time on: projects, exploring the internet, cycling. ...

Step 1: How It Works

How it works:
I'd made a sensor of 4 LDRs with sheets between them

The white dots are the LDRs

When the stick on top is righted to the sun or the brightest point
the four LDRs get the same amount of light on them.

Example1 when the light is left on top:
right-top, right-down, left-down are in the shadow
and left-top get the most light

Example2 when the light is on top
left and right down are in the shadow and top is in the light

Step 2: Parts List

Step 3: The Set-up

Just hot glue it together!!! 

Step 4: The Circuitry

Step 5: The Code

you can download the code down this page

/* this code is written by geobruce
for more info check my site
#include <Servo.h> // include Servo library 

Servo horizontal; // horizontal servo
int servoh = 90; // stand horizontal servo

Servo vertical; // vertical servo 
int servov = 90; // stand vertical servo

// LDR pin connections
// name = analogpin;
int ldrlt = 0; //LDR top left
int ldrrt = 1; //LDR top rigt
int ldrld = 2; //LDR down left
int ldrrd = 3; //ldr down rigt

void setup()
// servo connections
// name.attacht(pin);

void loop() 
  int lt = analogRead(ldrlt); // top left
  int rt = analogRead(ldrrt); // top right
  int ld = analogRead(ldrld); // down left
  int rd = analogRead(ldrrd); // down rigt

  int dtime = analogRead(4)/20; // read potentiometers
int tol = analogRead(5)/4;

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 (-1*tol > dvert || dvert > tol) // check if the diffirence is in the tolerance else change vertical angle
if (avt > avd)
servov = ++servov;
if (servov > 180)
servov = 180;
else if (avt < avd)
servov= --servov;
if (servov < 0)
servov = 0;

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 < 0)
servoh = 0;
else if (avl < avr)
servoh = ++servoh;
if (servoh > 180)
servoh = 180;
else if (avl == avr)
// nothing

Celestron Space Challenge

Runner Up in the
Celestron Space Challenge

17 People Made This Project!


  • Planter Challenge

    Planter Challenge
  • Oil Contest

    Oil Contest
  • Casting Contest

    Casting Contest

We have a be nice policy.
Please be positive and constructive.


6 Questions

hi.thanks for this amazing tutorial.i was wondering what program do u use to make the picture in step4???

the one of the circuit and the components.


If the sun go downunder into the west wat wll happen the next day if the sun comes up into the east ?

Is it possible to set after sun down (LDR's get no light) the panel turn in 45h/90v degrees, so the next day the solartracker can track to the first (sun) light ?

I'm curious to know if this Arduino has the same capability as the Uno when it comes to control systems. Do you need to have the Uno hooked up to a laptop?

Dear Bruce plz advice me how to adjust the speed and tolerance values also please send me the code my email is

Dear sir is it required to calibrate the servo motor if so please instruct me how to calibrate it

Hi there! I am doing this project and after following all the steps it keeps moving and shaking in different directions. Anyone any idea why?
Thanks :)


Just finished it and got it debugged. Really cool. Now I'm going to try to use it to build a Solar Forge and or a Solar Sand Sinter 3D Printer. Should be a snap. ;-)

14 replies

Hey Tom, We are right now making a Solar sand sinter 3D printer. We have finished making the coordinate plate and are working on the tracking system now. Would like to get your inputs. Best,

hi dude ,

what is the rate and power of servo motor which u have used.. can u give me some details.. i have to do this as mini project

Good luck with your project. I have not been able to pursue this one so not much more to add. Everything you need should be available online now. Except time and money. You'll have to come up with those. ;-)

cool! :p
can you show us some video's or pictures?


Another development, I used a Makerbot Replicator to print a replacement for the foam core sensor holder. Here is the Sketchup pic of it. The two pieces glue together. The center top hole is for a fifth sensor to shut the system down if clouds block the sun so it doesn't try to point at the brightest cloud.

Pyramid 3.png

nice upload your design to

What are the results and conclusions

What are the results and conclusions

*videos *thanks

Sure, here is the link to the YouTube clip I made:


It's cool to see your instructable finished by someone else :D
it means i've helped someone ^^ or someone liked my project! :D

It's really helpful to get me started toward my other goals.
Next I want to modify the code to operate some 12V drill motors with a MotorShield or the like if I can find one that will handle the 3-4A current.

Hello,after I upload the code into my arduino uno, my vertical servo motor keep rotating, it just rotate and rotate non stop. I have no idea what is the problem, can anyone give me some idea

1 reply

this answer is probably too late but this answer is for future viewers, the reason it keeps rotating is either you're using a continuos servo instead of a micro servo

dude, your design almost killed us

Is it possible to do this without a potentiometer? Im a very noobish beginner at these things, can you help?


You can use deep sleep to run your script not everytime but every 30 minutes. You can do a robust solar charge like that.