A program to control a solar tracking platform to keep solar panels pointed at the sun. Details of the hardware can be found at mdpub.com.

Dependencies:   mbed

Revision:
0:c5d947408ea3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Jul 08 13:38:37 2013 +0000
@@ -0,0 +1,90 @@
+#include "mbed.h"
+
+//Program to control a sun tracking platform for solar panels.
+//Details of the hardware can be found at mdpub.com
+
+void stop();
+void moveW();
+void moveE();
+void resetE();
+void readcells();
+
+Serial pc(USBTX, USBRX); 
+AnalogIn Ecell(p19), Wcell(p20);
+DigitalIn ELimit(p5), WLimit(p6);
+InterruptIn EInt(p8), WInt(p9);
+DigitalOut MotorOn(p22), Direction(p21);
+DigitalOut MyLed1(LED1), MyLed2(LED2);
+int AtReset;
+float Sunup, Threshold, RunTime;
+float Eval, Wval, Ambval;
+
+void stop() { //Stop the drive motor. The interrupt calls this if either limit switch opens.
+    pc.printf("Stop!\n\r"); //Print "Stop!" to the serial terminal for calibration/troubleshooting purposes.
+    Direction = 0; //Open the direction and motor drive relays.
+    MotorOn = 0;
+}
+
+void moveW() { //Move the panel W.
+    Direction = 0; //Set direction to W.
+    MotorOn = 1; //Run the motor.
+    pc.printf("Motor on W!\n\r"); //Print "Motor on W!" to the serial terminal for calibration/troubleshooting purposes.
+    wait(RunTime); //Run the motor for RunTime.
+    MotorOn = 0; //Turn the motor off.
+    AtReset = 0; //Set AtReset to 0 because we are not all the way E.
+}
+
+void moveE() { //Move the panel E.
+    Direction = 1; //Set direction to E.
+    wait(0.5);
+    MotorOn = 1; //Run the motor.
+    pc.printf("Motor on E!\n\r"); //Print "Motor on E!" to the serial terminal for calibration/troubleshooting purposes.
+    wait(RunTime); //Run the motor for RunTime.
+    MotorOn = 0; //Open the motor power and direction relays.
+    Direction = 0;
+}    
+
+void resetE() { //Move the panel all the way E after dark so that the sun will shine on it after sunrise.
+    while (!ELimit) { //While the E limit switch is closed.
+        moveE();
+    }
+    AtReset = 1; //Set AtReset to 1 since we are now all the way E.
+}
+
+void readcells() {  //Read the values of the E & W cells 5 times each and average the values.
+    int i;
+    for(i = 0; i < 5; i++){ //Loop 5 times
+        Wval += Wcell.read(); //Read the values
+        Eval += Ecell.read();
+    }
+    Wval = Wval / 5; //Average the values
+    Eval = Eval / 5;
+}
+
+int main() {
+    pc.printf("Powered Up\n\r"); //Print "Powered Up" to the serial terminal for calibration/troubleshooting purposes.
+    EInt.rise(&stop); //Call motor stop if either limit switch opens.
+    WInt.rise(&stop);
+    AtReset = 0; //1=at E limit.
+    Sunup = 0.08; //Ambient light threshold at which sun is considered to be up.
+    Threshold = 0.035; //Max allowed difference between E & W inputs.
+    RunTime = 1.25; //How long the motor shold run on each move. (about 6 deg/sec after slight turn-on delay) 
+        while(1) {  //Loop forever.
+        readcells();  //Read the values of the E & W cells.
+        Ambval = Wval + Eval; //Find the ambient light level
+        MyLed1 = ELimit; MyLed2 = WLimit;
+        pc.printf("%f  %f  %f\r\n", Wval, Eval, Ambval); //Print the west, east, and ambient values to the serial terminal for calibration purposes.
+        if ((Ambval > (Sunup + 0.4)) ){ //If the sun is up ...
+            if (((Wval-Eval) > Threshold) && !WLimit){ //If the W cell is illuminated by more than the threshhold and the W limit swich is closed...
+                moveW(); //Move the panel W.
+            }
+            if (((Eval-Wval) > Threshold) && !ELimit){ //If the E cell is illuminated by more than the threshhold and the E limit swich is closed...
+                moveE(); //Move the panel E.
+            }            
+        }    
+        if ((Ambval < Sunup) && !AtReset) { //If the sun is down and the panel is not reset to the E...
+            resetE(); //Move the panel to the E reset position.
+        }
+        wait(60); //Kill time. Set to 5 seconds during calibration/testing.
+    }
+}