/* Solar Tracker Code with 4 buttons for manual orientation and
4 ldr sensors to automaticaly traking the sun.*/
//set constant pin numbers
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR 0x27
#define LCD_COLUMNS 20
#define LCD_LINES 4
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
Servo servohori;
int servoh = 0;
int servohLimitHigh = 180;
int servohLimitLow = 0;
Servo servoverti;
int servov = 0;
int servovLimitHigh = 180;
int servovLimitLow = 0;
int x_axis_degree = 90;
int y_axis_degree = 90;
int wbuttonPin = 4;
int ebuttonPin = 2;
int tbuttonPin = 8;
int bbuttonPin = 12;
int switch1Pin = 7;
int switch2Pin = 5;
int ldrtopl = A0; //top left LDR green
int ldrtopr = A1; //top right LDR yellow
int ldrbotl = A2; // bottom left LDR blue
int ldrbotr = A3; // bottom right LDR orange
#define left_joystick_x A4
#define left_joystick_y A5
/*int eldr = A0;
int wldr = A1;
int tldr = A2;
int bldr = A3;*/
/*Servo myservo1;
Servo myservo2;*/
//int IN1 = 13;
//int IN2 = 9;
//int IN3 = 10;
//int IN4 = 11;
int eastldr = 0;
int westldr = 0;
int topldr = 0;
int botldr = 0;
int error = 0;
int poserror = 0;
int tberror = 0;
int tbposerror = 0;
int westbutton = 0;
int eastbutton = 0;
int topbutton = 0;
int botbutton = 0;
int onoffswitch = 0;
int singledualswitch = 0;
void setup() {
servohori.attach(10);
servohori.write(0);
servoverti.attach(9);
servoverti.write(0);
delay(500);
pinMode (8, INPUT_PULLUP);
pinMode (12, INPUT_PULLUP);
pinMode (9, OUTPUT);
pinMode (10, OUTPUT);
pinMode (4, INPUT_PULLUP);
pinMode (2, INPUT_PULLUP);
pinMode (5, INPUT_PULLUP);
pinMode (7, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {Serial.print("start program");
//digitalWrite(IN1, LOW);
//digitalWrite(IN2, LOW);
//digitalWrite(IN3, LOW);
//digitalWrite(IN4, LOW);
/*DONE*/
onoffswitch = digitalRead(switch1Pin);
singledualswitch = digitalRead(switch2Pin);
while (onoffswitch == LOW ) { //manual rotating of the panel
eastldr = analogRead(A0);
westldr = analogRead(A1);
topldr = analogRead(A2);
botldr = analogRead(A3);
/*eastbutton = digitalRead(ebuttonPin);
if (eastbutton == HIGH){
myservo1.write(0);
myservo2.write(180);
//digitalWrite(IN1, HIGH);
//digitalWrite(IN2, LOW);
} // rotate to east side when you push the right button
else {
myservo1.write(0);
//digitalWrite(IN1, LOW);
}
westbutton = digitalRead(wbuttonPin);
if (westbutton == HIGH){
myservo1.write(180);
//digitalWrite(IN2, HIGH);
} //rotate to west side when you push the left button
else {
myservo1.write(0);
//digitalWrite(IN2, LOW);
}
topbutton = digitalRead(tbuttonPin);
if (topbutton == HIGH){
myservo2.write(90);
//digitalWrite(IN4, HIGH);
} //rotate to west side when you push the left button
else {
myservo2.write(0);
//digitalWrite(IN4, LOW);
}
botbutton = digitalRead(bbuttonPin);
if (botbutton == HIGH){
myservo2.write(90);
//digitalWrite(IN3, HIGH);
} //rotate to west side when you push the left button
else {
myservo2.write(0);
//digitalWrite(IN3, LOW);
}*/
int left_joystick_x_value = analogRead(left_joystick_x);
int left_joystick_y_value = analogRead(left_joystick_y);
//int right_joystick_x_value = analogRead(right_joystick_x);
//int right_joystick_y_value = analogRead(right_joystick_y);
if(left_joystick_x_value < 300) x_axis_degree -=7;
else if(left_joystick_x_value > 600) x_axis_degree +=7;
if(left_joystick_y_value < 340) y_axis_degree -=7;
else if(left_joystick_y_value > 680) y_axis_degree +=7;
//*************
//You should decide the max/min angles.
x_axis_degree = min(180, max(0, x_axis_degree));
y_axis_degree = min(180, max(0, y_axis_degree));
Serial.print("x_axis_degree : ");
Serial.print(x_axis_degree);
Serial.print(", y_axis_degree : ");
Serial.print(y_axis_degree);
servohori.write(x_axis_degree);
servoverti.write(y_axis_degree);
onoffswitch = digitalRead(switch1Pin);
singledualswitch = digitalRead(switch2Pin);
Serial.println(eastldr);
Serial.println(westldr);
Serial.println(topldr);
Serial.println(botldr);
//init
lcd.init();
lcd.backlight();
// Print something
lcd.setCursor(2, 0);
lcd.print("Manual Dual Axis");
lcd.setCursor(2, 1);
lcd.print("x_axis_degree:");
lcd.print(x_axis_degree);
lcd.setCursor(2, 2);
lcd.print("y_axis_degree:");
lcd.print(y_axis_degree);
//lcd.setCursor(6, 1);
//lcd.print();
//lcd.setCursor(3, 2);
//lcd.print();
} /*DONE*/
/*
onoffswitch = digitalRead(switch1Pin);
singledualswitch = digitalRead(switch2Pin);
while (onoffswitch == LOW ) { //manual rotating of the panel
//while (onoffswitch == LOW && singledualswitch == LOW ){ //Manual Single Axis
eastldr = analogRead(A0);
westldr = analogRead(A1);
topldr = analogRead(A2);
botldr = analogRead(A3);
/*eastbutton = digitalRead(ebuttonPin);
if (eastbutton == HIGH){
myservo1.write(0);
myservo2.write(180);
//digitalWrite(IN1, HIGH);
//digitalWrite(IN2, LOW);
} // rotate to east side when you push the right button
else {
myservo1.write(0);
//digitalWrite(IN1, LOW);
}
westbutton = digitalRead(wbuttonPin);
if (westbutton == HIGH){
myservo1.write(180);
//digitalWrite(IN2, HIGH);
} //rotate to west side when you push the left button
else {
myservo1.write(0);
//digitalWrite(IN2, LOW);
}
topbutton = digitalRead(tbuttonPin);
if (topbutton == HIGH){
myservo2.write(90);
//digitalWrite(IN4, HIGH);
} //rotate to west side when you push the left button
else {
myservo2.write(0);
//digitalWrite(IN4, LOW);
}
botbutton = digitalRead(bbuttonPin);
if (botbutton == HIGH){
myservo2.write(90);
//digitalWrite(IN3, HIGH);
} //rotate to west side when you push the left button
else {
myservo2.write(0);
//digitalWrite(IN3, LOW);
}*
int left_joystick_x_value = analogRead(left_joystick_x);
//int left_joystick_y_value = analogRead(left_joystick_y);
//int right_joystick_x_value = analogRead(right_joystick_x);
//int right_joystick_y_value = analogRead(right_joystick_y);
if(left_joystick_x_value < 300) x_axis_degree -=7;
else if(left_joystick_x_value > 600) x_axis_degree +=7;
//if(left_joystick_y_value < 340) y_axis_degree -=7;
//else if(left_joystick_y_value > 680) y_axis_degree +=7;
//*************
//You should decide the max/min angles.
x_axis_degree = min(180, max(0, x_axis_degree));
y_axis_degree = min(180, max(0, y_axis_degree));
Serial.print("x_axis_degree : ");
Serial.print(x_axis_degree);
Serial.print(", y_axis_degree : ");
Serial.print(y_axis_degree);
servohori.write(x_axis_degree);
servoverti.write(y_axis_degree);
onoffswitch = digitalRead(switch1Pin);
singledualswitch = digitalRead(switch2Pin);
Serial.println(eastldr);
Serial.println(westldr);
Serial.println(topldr);
Serial.println(botldr);
//init
lcd.init();
lcd.backlight();
// Print something
lcd.setCursor(6, 0);
lcd.print("Manual");
lcd.setCursor(2, 1);
lcd.print("x_axis_degree:");
lcd.print(x_axis_degree);
lcd.setCursor(2, 2);
lcd.print("y_axis_degree:");
lcd.print(y_axis_degree);
//lcd.setCursor(3, 2);
//lcd.print();
} */
//automaticaly rotating of the panel
//check east-west orientation first
/* if (eastldr < 400 && westldr < 400)
{digitalWrite(IN1,HIGH)
delay(7500)
digitalWrite(IN1,LOW)}*/
onoffswitch = digitalRead(switch1Pin);
singledualswitch = digitalRead(switch2Pin);
while (onoffswitch == HIGH && singledualswitch == LOW ){ //auto single axis
/*eastldr = analogRead(A0); //=ldr top r
westldr = analogRead(A1); //=ldr bot r
topldr = analogRead(A2); //=ldr top l
botldr = analogRead(A3); //=ldr bot l
error = (((eastldr+topldr)/2) - ((westldr+botldr)/2));
poserror = abs(error);
if (poserror > 10){
if (error > 0) {
myservo1.write(90);
//digitalWrite(IN2, HIGH);
// Serial.print("IN2 HIGH");
}
else if (error < 0){
myservo1.write(90);
//digitalWrite(IN1, HIGH);
//Serial.print("IN1 HIGH");
}}
else if (poserror <= 10 ) {
myservo2.write(0);
//digitalWrite(IN1, LOW);
//digitalWrite(IN2, LOW);
//Serial.print("LOW BOTH");
}
Serial.println(eastldr);
Serial.println(westldr);
Serial.println(topldr);
Serial.println(botldr);*/
servoh = servohori.read();
servov = servoverti.read();
//capturing analog values of each LDR
int topl = analogRead(ldrtopl);
int topr = analogRead(ldrtopr);
int botl = analogRead(ldrbotl);
int botr = analogRead(ldrbotr);
// calculating average
int avgtop = (topl + topr) / 2; //average of top LDRs
int avgbot = (botl + botr) / 2; //average of bottom LDRs
//int avgleft = (topl + botl) / 2; //average of left LDRs
//int avgright = (topr + botr) / 2; //average of right LDRs
if (avgtop < avgbot){
servoverti.write(servov +1);
if (servov > servovLimitHigh)
{
servov = servovLimitHigh;
}
delay(10);
}
else if (avgbot < avgtop){
servoverti.write(servov -1);
if (servov < servovLimitLow)
{
servov = servovLimitLow;
}
delay(10);
}
else{
servoverti.write(servov);
}
onoffswitch = digitalRead(switch1Pin);
singledualswitch = digitalRead(switch2Pin);
}
/*DONE*/
onoffswitch = digitalRead(switch1Pin);
singledualswitch = digitalRead(switch2Pin);
while (onoffswitch == HIGH & singledualswitch == HIGH ){ //auto dual axis
/*topldr = analogRead(A2);
botldr = analogRead(A3);
eastldr = analogRead(A0);
westldr = analogRead(A1);
tberror = (((topldr+westldr)/2) - ((botldr+eastldr)/2));
tbposerror = abs(tberror);
error = (((eastldr+topldr)/2) - ((westldr+botldr)/2));
poserror = abs(error);
if (poserror > 10){
if (error > 0) {
myservo1.write(90);;
//digitalWrite(IN2, HIGH);
// Serial.print("IN2 HIGH");
}
else if (error < 0) {
myservo1.write(90);
//digitalWrite(IN1, HIGH);
//Serial.print("IN1 HIGH");
}}
else if (poserror <= 10 ) {
myservo1.write(0);
//digitalWrite(IN1, LOW);
//digitalWrite(IN2, LOW);
}
Serial.println(eastldr);
Serial.println(westldr);
if (tbposerror > 10)
{ if (tberror > 0) {
myservo2.write(90);
//digitalWrite(IN4, HIGH);
} else if (tberror < 0) {
myservo2.write(90);
//digitalWrite(IN3, HIGH);
}
}
else if (poserror <= 10 ) {
myservo2.write(0);
//digitalWrite(IN4, LOW);
//digitalWrite(IN3, LOW);
}*/
servoh = servohori.read();
servov = servoverti.read();
//capturing analog values of each LDR
int topl = analogRead(ldrtopl);
int topr = analogRead(ldrtopr);
int botl = analogRead(ldrbotl);
int botr = analogRead(ldrbotr);
// calculating average
int avgtop = (topl + topr) / 2; //average of top LDRs
int avgbot = (botl + botr) / 2; //average of bottom LDRs
int avgleft = (topl + botl) / 2; //average of left LDRs
int avgright = (topr + botr) / 2; //average of right LDRs
if (avgtop < avgbot){
servoverti.write(servov +1);
if (servov > servovLimitHigh){
servov = servovLimitHigh;
}
delay(10);
}
else if (avgbot < avgtop)
{
servoverti.write(servov -1);
if (servov < servovLimitLow){
servov = servovLimitLow;
}
delay(10);
}
else{
servoverti.write(servov);
}
if (avgleft > avgright){
servohori.write(servoh +1);
if (servoh > servohLimitHigh){
servoh = servohLimitHigh;
}
delay(10);
}
else if (avgright > avgleft){
servohori.write(servoh -1);
if (servoh < servohLimitLow){
servoh = servohLimitLow;
}
delay(10);
}
else{
servohori.write(servoh);
}
delay(50);
Serial.print("LDR topl=");
Serial.println(topl);
Serial.print("LDR topr=");
Serial.println(topr);
Serial.print("LDR botl=");
Serial.println(botl);
Serial.print("LDR botr=");
Serial.println(botr);
onoffswitch = digitalRead(switch1Pin);
singledualswitch = digitalRead(switch2Pin);
}
/*DONE*/
onoffswitch = digitalRead(switch1Pin);
singledualswitch = digitalRead(switch2Pin);
delay(200);
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
}