// INCLUDING LIBRARIES
#include <Servo.h>
#include <LowPower.h>
// DEFINING VARIABLES
#define interruptPin 2
#define photo1 A0
#define photo2 A1
#define photo3 A2
#define photo4 A3
#define photo5 A4
#define photo6 A5
Servo servo1;
Servo servo2;
unsigned long currenttime = 0;
unsigned long previoustime = 0;
int photoreads[10] = {0,0,0,0,0,0,0,0,0,0};
int a1;
int a2;
int a3;
int a4;
int a5;
int a6;
double n1;
double n2;
double n3;
double n4;
double n5;
double n6;
boolean up1 = false;
boolean down1 = false;
boolean up2 = false;
boolean down2 = false;
boolean flat1 = false;
boolean flat2 = false;
boolean max1 = false;
boolean max2 = false;
boolean max3 = false;
boolean max4 = false;
boolean max5 = false;
boolean max6 = false;
// ATTACH SERVO MOTORS TO PINS AND BEGIN SERIAL DATA
void setup() {
servo1.attach(5);
servo2.attach(6);
Serial.begin(9600);
}
// THIS LOOP RUNS THE MAIN ALGORITHM REPEATEDLY
void loop() {
sunSet(16);
}
// A FUNCTION USED TO SET THE SERVO POSITION AT A CONTROLLED SPEED
void SetPosition(Servo servo, int pos) {
int dif = 0;
int posinitial = servo.read();
dif = abs(posinitial - pos);
for (int i=0;i<=dif;i++) {
if (posinitial < pos) {
servo.write(posinitial+i);
}
else if (posinitial > pos) {
servo.write(posinitial-i);
}
delay(25);
}
}
// A FUNCTION USED TO CALCULATE THE AVERAGE LIGHT SENSOR READING FROM 10 SAMPLES
int averageCalc(int p) {
int sum = 0;
for (int i=0;i<10;i++) {
photoreads[i] = analogRead(p);
}
for (int i=0;i<10;i++) {
sum = sum + photoreads[i];
}
sum = sum / 10;
return sum;
}
// SETS THE AVERAGE LIGHT READING FOR EACH LIGHT SENSOR
void setAverages() {
a1 = averageCalc(photo1);
a2 = averageCalc(photo2);
a3 = averageCalc(photo3);
a4 = averageCalc(photo4);
a5 = averageCalc(photo5);
a6 = averageCalc(photo6);
}
// MAIN ALGORITHM THAT POINTS SOLAR PANEL TOWARDS SUN
void sunSet(int sleepTime) {
servo1.attach(5);
servo2.attach(6);
currenttime = millis();
// TAKES READINGS AND ADJUSTS SOLAR PANEL IN 3 SECOND INTERVALS
if ((currenttime - previoustime) < 3000) {
setAverages();
findMax();
// CALCULATES SERVO 2 POSITIONS
if ((a1 > a2) && (a1-5 > a3)) {
up2 = true;
Serial.println("up2");
}
else if ((a2 > a1) && (a2 > a3)) {
flat2 = true;
Serial.println("flat2");
}
else if ((a3-5 > a1) && (a3 > a2)) {
down2 = true;
Serial.println("down2");
}
// CALCULATES SERVO 1 POSITIONS
if ((a4 > a5) && (a4-5 > a6)) {
up1 = true;
Serial.println("up1");
}
else if ((a5 > a4) && (a5 > a6)) {
flat1 = true;
Serial.println("flat1");
}
else if ((a6-5 > a4) && (a6 > a5)) {
down1 = true;
Serial.println("down1");
}
// SETS SOLARNAV IN 9 POSSIBLE POSITIONS BASED ON SENSOR READINGS
if (max1==true) {
//servo1.detach();
SetPosition(servo1,119);
SetPosition(servo2,50);
Serial.println("MAX1");
}
else if ((max2==true)||(max5==true)) {
SetPosition(servo1,112);
SetPosition(servo2,112);
Serial.println("MAX2 or MAX5");
}
else if (max3==true) {
//servo1.detach();
SetPosition(servo1,109);
SetPosition(servo2,190);
Serial.println("MAX3");
}
else if (max4==true) {
//servo2.detach();
SetPosition(servo2,113);
SetPosition(servo1,50);
Serial.println("MAX4");
}
else if (max6==true) {
//servo2.detach();
SetPosition(servo2,118);
SetPosition(servo1,190);
Serial.println("MAX6");
}
else if (down1==true && down2==true) {
SetPosition(servo1,145);
SetPosition(servo2,128);
Serial.println("DIAGNOL LEFT BACK");
}
else if (up1==true && up2==true) {
SetPosition(servo1,75);
SetPosition(servo2,80);
Serial.println("DIAGNOL RIGHT FRONT ");
}
else if (up1==true && down2==true) {
SetPosition(servo1,75);
SetPosition(servo2,150);
Serial.println("DIAGNOL LEFT FRONT");
}
else if (up2==true && down1==true) {
SetPosition(servo1,165);
SetPosition(servo2,110);
Serial.println("DIAGNOL LEFT BACK");
}
}
else {
previoustime = currenttime;
up1 = false;
down1 = false;
up2 = false;
down2 = false;
flat1 = false;
flat2 = false;
max1 = false;
max2 = false;
max3 = false;
max4 = false;
max5 = false;
max6 = false;
// PUTS THE ARDUINO IN SLEEP MODE FOR A GIVEN AMOUNT OF TIME BETWEEN READINGS
for (int i=0;i<sleepTime/8;i++) {
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}
}
}
// ENDS MAINS ALGORITHM
// FUNCTION FINDS WHICH LIGHT SENSOR HAS THE HIGHEST READING
void findMax() {
setAverages();
int temp = 0;
int reads[6] = {a1,a2,a3,a4,a5,a6};
// Get all readings and find the highest value
for (int i=0;i<6;i++) {
for (int j=i+1;j<7;j++) {
if (reads[i] > reads[j]) {
temp = reads[i];
reads[i] = reads[j];
reads[j] = temp;
}
}
}
// If highest value is 8 greater than all others, set solar panel in that direction
if ((reads[5]-5) > reads[4]) {
if (reads[5]==a1) {
max1 = true;
Serial.println("max1");
}
else if (reads[5]==a2) {
max2 = true;
Serial.println("max2");
}
else if (reads[5]==a3) {
max3 = true;
Serial.println("max3");
}
else if (reads[5]==a4) {
max4 = true;
Serial.println("max4");
}
else if (reads[5]==a5) {
max5 = true;
Serial.println("max5");
}
else if (reads[5]==a6) {
max6 = true;
Serial.println("max6");
}
}
}