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

Files at this revision

API Documentation at this revision

Comitter:
omegageek64
Date:
Mon Jul 08 13:38:37 2013 +0000
Commit message:
Tested in the field. Working.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r c5d947408ea3 main.cpp
--- /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.
+    }
+}
diff -r 000000000000 -r c5d947408ea3 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon Jul 08 13:38:37 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/cd19af002ccc
\ No newline at end of file