Arduino Solar Tracker
Arduino Solar Tracker
Components
Name Quantity
Micro-servo Motor 2
Rpot1 1
Rotary potentiometer 2
Pushbutton 2
LDR 4
Working principle
It is based on a solar tracker that can be rotate automatically to track the sun with help of four LDR
sensors and two servomotors or manually using a potentiometer. To switch between the two modes, a
push button is used. Another push button is used to link either the up-down servo meter or left-right
servo meter to the potentiometer to control their movement. Moreover a computer is used as virtual
instrument to visualize the mode and current, voltage and power of the pv panel. Arduino Uno board is
utilized to implement all software requirement of the system.
Code
#include <Servo.h>
#include <Servo.h>
//Initialize variables
int mode = 0;
int axe = 0;
int buttonState1 = 0;
int buttonState2 = 0;
int prevButtonState1 = 0;
int prevButtonState2 = 0;
int topl = 0;
int topr = 0;
int botl = 0;
int botr = 0;
//Declare two servos
Servo servo_updown;
Servo servo_rightleft;
void setup()
Serial.begin(9600); //serial connection setup //opens serial port, sets data rate to
9600 bps
pinMode(A4, INPUT); //Potentiometer for right-left movement and for up-down movement
void loop()
// pv_power();
char Mode;
Serial.print(",");
Serial.print(",");
Serial.print(",");
// Serial.println(Mode);
buttonState1 = digitalRead(12);
if (buttonState1 != prevButtonState1) {
if (buttonState1 == HIGH) {
if (mode == 1) {
mode = 0;
} else {
mode = 1;
prevButtonState1 = buttonState1;
if (mode == 0) {
Mode='M';
manualsolartracker();
Serial.println(Mode);
void automaticsolartracker(){
// calculating average
int diffelev = avgtop - avgbot; //Get the different average betwen LDRs top and LDRs bot
int diffazi = avgright - avgleft; //Get the different average betwen LDRs right and LDRs left
if (abs(diffazi) >= threshold_value){ //Change position only if light difference is bigger then the
threshold_value
if (diffazi > 0) {
if (servo_rightleft.read() < 180) {
servo_rightleft.write((servo_updown.read() + 2));
if (diffazi < 0) {
if (servo_rightleft.read() > 0) {
servo_rightleft.write((servo_updown.read() - 2));
if (abs(diffelev) >= threshold_value){ //Change position only if light difference is bigger then
thethreshold_value
if (diffelev > 0) {
servo_updown.write((servo_rightleft.read() - 2));
if (diffelev < 0) {
if (servo_updown.read() > 0) {
servo_updown.write((servo_rightleft.read() + 2));
void manualsolartracker(){
buttonState2 = digitalRead(13);
if (buttonState2 != prevButtonState2) {
if (buttonState2 == HIGH) {
if (axe == 1) {
axe = 0;
} else {
axe = 1;
prevButtonState2 = buttonState2;