Project aiming to make a self-controlled solar reflector

Dependencies:   Accelerometer LCD Inverter Algorithm MotorDriver Anemometer GUI ArduinoJson Misc Definitions Pushbutton WebSocketClient temp_fan

Revision:
0:74d6e93ec977
Child:
1:07f86b4db069
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Feb 10 00:01:15 2021 +0000
@@ -0,0 +1,214 @@
+/* 
+For settings of system behaviour, see Defs_sett.h
+For pin assignment list, see PinAssignment.h
+*/
+
+//INCLUDES
+#include "mbed.h"
+#include "Accelerometer.h"
+#include "Anemometer.h"
+#include "Algorithm.h"
+#include "MotorDriver.h"
+#include "Defs_Sett.h"
+#include "Pushbutton.h"
+
+#define timer_read_s(x)     chrono::duration_cast<chrono::seconds>((x).elapsed_time()).count()
+
+//Initialize Global Variables
+Accelerometer acc(40000); //Accelerometer
+Anemometer ane; //
+MotorDriver motor;
+LowPowerTimer t,t_mode;
+Ticker ti;
+int mode = OP_NORMAL;
+
+Pushbutton bt_fn(PIN_BT1,&mode);
+Pushbutton bt_inc(PIN_BT2);
+Pushbutton bt_dec(PIN_BT3);
+Pushbutton* Pushbutton::LastPressed = &bt_fn;
+
+//Function Declarations
+void checkWind();
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+int main()
+{
+float ang_P,ang_R;
+float ref_R1,ref_R2;
+int flag_time = 1, flag_idle = 0;
+int t_elapsed;
+int wthres = WIND_THRES_INIT;
+
+ti.attach(&checkWind,TICK_WIND);
+t.start(); //Start timer
+
+while(1)
+{
+    switch(mode)
+    {
+        case OP_NORMAL:
+            if(flag_time) //If delay interval has passed
+            {
+                ti.attach(&checkWind,TICK_WIND); //Enable Wind Safety
+                checkWind();
+                //Get Angle of Panel
+                ang_P = acc.getAngle(S_PANEL);
+                
+                //Calculate the Angle of Both Reflector
+                ref_R1 = Algorithm::calcAngle(1,ang_P);
+                ref_R2 = Algorithm::calcAngle(2,ang_P);
+                
+                //Moving Reflector 1
+                ang_R = acc.getAngle(S_R1);
+                while(ang_R <= ref_R1 && acc.checkAngle(ref_R1,ang_R))
+                {
+                    if(mode != OP_NORMAL) {break;}
+                    motor.moveForward(M1);
+                    ang_R = acc.getAngle(S_R1);
+                }
+                while(ang_R >= ref_R1 && acc.checkAngle(ref_R1,ang_R))
+                {
+                    if(mode != OP_NORMAL) {break;}
+                    motor.moveBackward(M1);
+                    ang_R = acc.getAngle(S_R1);
+                }
+                motor.stop();
+                
+                //Moving Reflector 2
+                ang_R = acc.getAngle(S_R2);
+                while(ang_R <= ref_R2 && acc.checkAngle(ref_R2,ang_R))
+                {
+                    if(mode != OP_NORMAL) {break;}
+                    motor.moveForward(M2);
+                    ang_R = acc.getAngle(S_R2);
+                }
+                while(ang_R >= ref_R2 && acc.checkAngle(ref_R2,ang_R))
+                {
+                    if(mode != OP_NORMAL) {break;}
+                    motor.moveBackward(M2);
+                    ang_R = acc.getAngle(S_R2);
+                }
+                motor.stop();
+                flag_time = 0; //Initiate delay
+                t.reset(); //Reset timer
+            }
+            t_elapsed = (int)timer_read_s(t);
+            flag_time = (t_elapsed >= TIME_NORMAL) ? 1 : 0; //Enable flag if delay interval has passed
+            break;
+////////////////////////////////////////////////////////////////////////////////
+        case OP_WIND:
+            //Move all motor backward
+            motor.moveBackward(M_ALL);
+            flag_time = 1; //Set the system in motion once windspeed has subsided
+            break;
+////////////////////////////////////////////////////////////////////////////////
+        case OP_MANUAL1:
+            ti.detach(); //Disable Wind Safety
+            
+            //TIMEOUT
+            ////////////////////////////////////////////////////////////////////
+            if(!bt_inc.read() && !bt_dec.read() && !flag_idle) //Check if button is not pressed
+            {
+                t_mode.reset();
+                t_mode.start();
+                flag_idle = 1; //Indicate idling
+            }
+            else if(timer_read_s(t_mode) > TIME_MANUAL_TIMEOUT)
+            {
+                mode = OP_NORMAL;
+            }
+            ////////////////////////////////////////////////////////////////////
+            
+            while(bt_inc.read()) //Extend
+            {
+                flag_idle = 0;
+                motor.moveForward(M1);
+            }
+            while(bt_dec.read()) //Retract
+            {
+                flag_idle = 0;
+                motor.moveBackward(M1);
+            }
+            if(!bt_inc.read() && !bt_dec.read())
+            {
+                motor.stop();
+            }
+            flag_time = 1; //Set the system in motion once done adjusting
+            break;
+////////////////////////////////////////////////////////////////////////////////
+        case OP_MANUAL2:
+            ti.detach(); //Disable Wind Safety
+            
+            //TIMEOUT
+            ////////////////////////////////////////////////////////////////////
+            if(!bt_inc.read() && !bt_dec.read() && !flag_idle) //Check if button is not pressed
+            {
+                t_mode.reset();
+                t_mode.start();
+                flag_idle = 1; //Indicate idling
+            }
+            else if(timer_read_s(t_mode) > TIME_MANUAL_TIMEOUT)
+            {
+                mode = OP_NORMAL;
+            }
+            ////////////////////////////////////////////////////////////////////
+            
+            while(bt_inc.read()) //Extend
+            {
+                flag_idle = 0;
+                motor.moveForward(M2);
+            }
+            while(bt_dec.read()) //Retract
+            {
+                flag_idle = 0;
+                motor.moveBackward(M2);
+            }
+            if(!bt_inc.read() && !bt_dec.read())
+            {
+                motor.stop();
+            }
+            flag_time = 1; //Set the system in motion once done adjusting
+            break;
+////////////////////////////////////////////////////////////////////////////////
+        case OP_WSETTING:
+            motor.stop();
+            ti.detach(); //Disable Wind Safety
+            
+            //TIMEOUT
+            ////////////////////////////////////////////////////////////////////
+            if(!bt_inc.read() && !bt_dec.read() && !flag_idle) //Check if button is not pressed
+            {
+                t_mode.reset();
+                t_mode.start();
+                flag_idle = 1; //Indicate idling
+            }
+            else if(timer_read_s(t_mode) > TIME_WSETTING_TIMEOUT)
+            {
+                mode = OP_NORMAL;
+            }
+            ////////////////////////////////////////////////////////////////////
+            
+            if(bt_inc.read() && wthres < WIND_THRES_MAX)
+            {
+                ane.setThres(++wthres);
+            }
+            else if(bt_inc.read() && wthres > WIND_THRES_MIN)
+            {
+                ane.setThres(--wthres);
+            }
+            
+            flag_time = 1; //Set the system in motion once done adjusting
+            break;
+    }
+}
+
+}
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+//FUNCTIONS
+void checkWind()
+{
+    ane.checkWind(&mode);
+}
\ No newline at end of file