Project aiming to make a self-controlled solar reflector

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

Committer:
khaiminhvn
Date:
Mon Feb 15 21:49:09 2021 +0000
Revision:
1:07f86b4db069
Parent:
0:74d6e93ec977
Child:
2:944511c6c55f
Added Calibration for MPU6050

Who changed what in which revision?

UserRevisionLine numberNew contents of line
khaiminhvn 0:74d6e93ec977 1 /*
khaiminhvn 0:74d6e93ec977 2 For settings of system behaviour, see Defs_sett.h
khaiminhvn 0:74d6e93ec977 3 For pin assignment list, see PinAssignment.h
khaiminhvn 0:74d6e93ec977 4 */
khaiminhvn 0:74d6e93ec977 5
khaiminhvn 0:74d6e93ec977 6 //INCLUDES
khaiminhvn 0:74d6e93ec977 7 #include "mbed.h"
khaiminhvn 0:74d6e93ec977 8 #include "Accelerometer.h"
khaiminhvn 0:74d6e93ec977 9 #include "Anemometer.h"
khaiminhvn 0:74d6e93ec977 10 #include "Algorithm.h"
khaiminhvn 0:74d6e93ec977 11 #include "MotorDriver.h"
khaiminhvn 0:74d6e93ec977 12 #include "Defs_Sett.h"
khaiminhvn 0:74d6e93ec977 13 #include "Pushbutton.h"
khaiminhvn 0:74d6e93ec977 14
khaiminhvn 0:74d6e93ec977 15 #define timer_read_s(x) chrono::duration_cast<chrono::seconds>((x).elapsed_time()).count()
khaiminhvn 0:74d6e93ec977 16
khaiminhvn 0:74d6e93ec977 17 //Initialize Global Variables
khaiminhvn 0:74d6e93ec977 18 Accelerometer acc(40000); //Accelerometer
khaiminhvn 0:74d6e93ec977 19 Anemometer ane; //
khaiminhvn 0:74d6e93ec977 20 MotorDriver motor;
khaiminhvn 0:74d6e93ec977 21 LowPowerTimer t,t_mode;
khaiminhvn 0:74d6e93ec977 22 Ticker ti;
khaiminhvn 0:74d6e93ec977 23 int mode = OP_NORMAL;
khaiminhvn 0:74d6e93ec977 24
khaiminhvn 1:07f86b4db069 25 Pushbutton bt_fn(PIN_BTFN,&mode);
khaiminhvn 1:07f86b4db069 26 Pushbutton bt_inc(PIN_BTINC);
khaiminhvn 1:07f86b4db069 27 Pushbutton bt_dec(PIN_BTDEC);
khaiminhvn 0:74d6e93ec977 28 Pushbutton* Pushbutton::LastPressed = &bt_fn;
khaiminhvn 0:74d6e93ec977 29
khaiminhvn 0:74d6e93ec977 30 //Function Declarations
khaiminhvn 0:74d6e93ec977 31 void checkWind();
khaiminhvn 0:74d6e93ec977 32
khaiminhvn 0:74d6e93ec977 33 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 34 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 35 int main()
khaiminhvn 0:74d6e93ec977 36 {
khaiminhvn 0:74d6e93ec977 37 float ang_P,ang_R;
khaiminhvn 0:74d6e93ec977 38 float ref_R1,ref_R2;
khaiminhvn 0:74d6e93ec977 39 int flag_time = 1, flag_idle = 0;
khaiminhvn 0:74d6e93ec977 40 int t_elapsed;
khaiminhvn 0:74d6e93ec977 41 int wthres = WIND_THRES_INIT;
khaiminhvn 0:74d6e93ec977 42
khaiminhvn 0:74d6e93ec977 43 ti.attach(&checkWind,TICK_WIND);
khaiminhvn 0:74d6e93ec977 44 t.start(); //Start timer
khaiminhvn 0:74d6e93ec977 45
khaiminhvn 0:74d6e93ec977 46 while(1)
khaiminhvn 0:74d6e93ec977 47 {
khaiminhvn 0:74d6e93ec977 48 switch(mode)
khaiminhvn 0:74d6e93ec977 49 {
khaiminhvn 0:74d6e93ec977 50 case OP_NORMAL:
khaiminhvn 0:74d6e93ec977 51 if(flag_time) //If delay interval has passed
khaiminhvn 0:74d6e93ec977 52 {
khaiminhvn 0:74d6e93ec977 53 ti.attach(&checkWind,TICK_WIND); //Enable Wind Safety
khaiminhvn 0:74d6e93ec977 54 checkWind();
khaiminhvn 0:74d6e93ec977 55 //Get Angle of Panel
khaiminhvn 0:74d6e93ec977 56 ang_P = acc.getAngle(S_PANEL);
khaiminhvn 0:74d6e93ec977 57
khaiminhvn 0:74d6e93ec977 58 //Calculate the Angle of Both Reflector
khaiminhvn 0:74d6e93ec977 59 ref_R1 = Algorithm::calcAngle(1,ang_P);
khaiminhvn 0:74d6e93ec977 60 ref_R2 = Algorithm::calcAngle(2,ang_P);
khaiminhvn 0:74d6e93ec977 61
khaiminhvn 0:74d6e93ec977 62 //Moving Reflector 1
khaiminhvn 0:74d6e93ec977 63 ang_R = acc.getAngle(S_R1);
khaiminhvn 0:74d6e93ec977 64 while(ang_R <= ref_R1 && acc.checkAngle(ref_R1,ang_R))
khaiminhvn 0:74d6e93ec977 65 {
khaiminhvn 0:74d6e93ec977 66 if(mode != OP_NORMAL) {break;}
khaiminhvn 0:74d6e93ec977 67 motor.moveForward(M1);
khaiminhvn 0:74d6e93ec977 68 ang_R = acc.getAngle(S_R1);
khaiminhvn 0:74d6e93ec977 69 }
khaiminhvn 0:74d6e93ec977 70 while(ang_R >= ref_R1 && acc.checkAngle(ref_R1,ang_R))
khaiminhvn 0:74d6e93ec977 71 {
khaiminhvn 0:74d6e93ec977 72 if(mode != OP_NORMAL) {break;}
khaiminhvn 0:74d6e93ec977 73 motor.moveBackward(M1);
khaiminhvn 0:74d6e93ec977 74 ang_R = acc.getAngle(S_R1);
khaiminhvn 0:74d6e93ec977 75 }
khaiminhvn 0:74d6e93ec977 76 motor.stop();
khaiminhvn 0:74d6e93ec977 77
khaiminhvn 0:74d6e93ec977 78 //Moving Reflector 2
khaiminhvn 0:74d6e93ec977 79 ang_R = acc.getAngle(S_R2);
khaiminhvn 0:74d6e93ec977 80 while(ang_R <= ref_R2 && acc.checkAngle(ref_R2,ang_R))
khaiminhvn 0:74d6e93ec977 81 {
khaiminhvn 0:74d6e93ec977 82 if(mode != OP_NORMAL) {break;}
khaiminhvn 0:74d6e93ec977 83 motor.moveForward(M2);
khaiminhvn 0:74d6e93ec977 84 ang_R = acc.getAngle(S_R2);
khaiminhvn 0:74d6e93ec977 85 }
khaiminhvn 0:74d6e93ec977 86 while(ang_R >= ref_R2 && acc.checkAngle(ref_R2,ang_R))
khaiminhvn 0:74d6e93ec977 87 {
khaiminhvn 0:74d6e93ec977 88 if(mode != OP_NORMAL) {break;}
khaiminhvn 0:74d6e93ec977 89 motor.moveBackward(M2);
khaiminhvn 0:74d6e93ec977 90 ang_R = acc.getAngle(S_R2);
khaiminhvn 0:74d6e93ec977 91 }
khaiminhvn 0:74d6e93ec977 92 motor.stop();
khaiminhvn 0:74d6e93ec977 93 flag_time = 0; //Initiate delay
khaiminhvn 0:74d6e93ec977 94 t.reset(); //Reset timer
khaiminhvn 0:74d6e93ec977 95 }
khaiminhvn 0:74d6e93ec977 96 t_elapsed = (int)timer_read_s(t);
khaiminhvn 0:74d6e93ec977 97 flag_time = (t_elapsed >= TIME_NORMAL) ? 1 : 0; //Enable flag if delay interval has passed
khaiminhvn 0:74d6e93ec977 98 break;
khaiminhvn 0:74d6e93ec977 99 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 100 case OP_WIND:
khaiminhvn 0:74d6e93ec977 101 //Move all motor backward
khaiminhvn 0:74d6e93ec977 102 motor.moveBackward(M_ALL);
khaiminhvn 0:74d6e93ec977 103 flag_time = 1; //Set the system in motion once windspeed has subsided
khaiminhvn 0:74d6e93ec977 104 break;
khaiminhvn 0:74d6e93ec977 105 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 106 case OP_MANUAL1:
khaiminhvn 0:74d6e93ec977 107 ti.detach(); //Disable Wind Safety
khaiminhvn 0:74d6e93ec977 108
khaiminhvn 0:74d6e93ec977 109 //TIMEOUT
khaiminhvn 0:74d6e93ec977 110 ////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 111 if(!bt_inc.read() && !bt_dec.read() && !flag_idle) //Check if button is not pressed
khaiminhvn 0:74d6e93ec977 112 {
khaiminhvn 0:74d6e93ec977 113 t_mode.reset();
khaiminhvn 0:74d6e93ec977 114 t_mode.start();
khaiminhvn 0:74d6e93ec977 115 flag_idle = 1; //Indicate idling
khaiminhvn 0:74d6e93ec977 116 }
khaiminhvn 0:74d6e93ec977 117 else if(timer_read_s(t_mode) > TIME_MANUAL_TIMEOUT)
khaiminhvn 0:74d6e93ec977 118 {
khaiminhvn 0:74d6e93ec977 119 mode = OP_NORMAL;
khaiminhvn 0:74d6e93ec977 120 }
khaiminhvn 0:74d6e93ec977 121 ////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 122
khaiminhvn 0:74d6e93ec977 123 while(bt_inc.read()) //Extend
khaiminhvn 0:74d6e93ec977 124 {
khaiminhvn 0:74d6e93ec977 125 flag_idle = 0;
khaiminhvn 0:74d6e93ec977 126 motor.moveForward(M1);
khaiminhvn 0:74d6e93ec977 127 }
khaiminhvn 0:74d6e93ec977 128 while(bt_dec.read()) //Retract
khaiminhvn 0:74d6e93ec977 129 {
khaiminhvn 0:74d6e93ec977 130 flag_idle = 0;
khaiminhvn 0:74d6e93ec977 131 motor.moveBackward(M1);
khaiminhvn 0:74d6e93ec977 132 }
khaiminhvn 0:74d6e93ec977 133 if(!bt_inc.read() && !bt_dec.read())
khaiminhvn 0:74d6e93ec977 134 {
khaiminhvn 0:74d6e93ec977 135 motor.stop();
khaiminhvn 0:74d6e93ec977 136 }
khaiminhvn 0:74d6e93ec977 137 flag_time = 1; //Set the system in motion once done adjusting
khaiminhvn 0:74d6e93ec977 138 break;
khaiminhvn 0:74d6e93ec977 139 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 140 case OP_MANUAL2:
khaiminhvn 0:74d6e93ec977 141 ti.detach(); //Disable Wind Safety
khaiminhvn 0:74d6e93ec977 142
khaiminhvn 0:74d6e93ec977 143 //TIMEOUT
khaiminhvn 0:74d6e93ec977 144 ////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 145 if(!bt_inc.read() && !bt_dec.read() && !flag_idle) //Check if button is not pressed
khaiminhvn 0:74d6e93ec977 146 {
khaiminhvn 0:74d6e93ec977 147 t_mode.reset();
khaiminhvn 0:74d6e93ec977 148 t_mode.start();
khaiminhvn 0:74d6e93ec977 149 flag_idle = 1; //Indicate idling
khaiminhvn 0:74d6e93ec977 150 }
khaiminhvn 0:74d6e93ec977 151 else if(timer_read_s(t_mode) > TIME_MANUAL_TIMEOUT)
khaiminhvn 0:74d6e93ec977 152 {
khaiminhvn 0:74d6e93ec977 153 mode = OP_NORMAL;
khaiminhvn 0:74d6e93ec977 154 }
khaiminhvn 0:74d6e93ec977 155 ////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 156
khaiminhvn 0:74d6e93ec977 157 while(bt_inc.read()) //Extend
khaiminhvn 0:74d6e93ec977 158 {
khaiminhvn 0:74d6e93ec977 159 flag_idle = 0;
khaiminhvn 0:74d6e93ec977 160 motor.moveForward(M2);
khaiminhvn 0:74d6e93ec977 161 }
khaiminhvn 0:74d6e93ec977 162 while(bt_dec.read()) //Retract
khaiminhvn 0:74d6e93ec977 163 {
khaiminhvn 0:74d6e93ec977 164 flag_idle = 0;
khaiminhvn 0:74d6e93ec977 165 motor.moveBackward(M2);
khaiminhvn 0:74d6e93ec977 166 }
khaiminhvn 0:74d6e93ec977 167 if(!bt_inc.read() && !bt_dec.read())
khaiminhvn 0:74d6e93ec977 168 {
khaiminhvn 0:74d6e93ec977 169 motor.stop();
khaiminhvn 0:74d6e93ec977 170 }
khaiminhvn 0:74d6e93ec977 171 flag_time = 1; //Set the system in motion once done adjusting
khaiminhvn 0:74d6e93ec977 172 break;
khaiminhvn 0:74d6e93ec977 173 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 174 case OP_WSETTING:
khaiminhvn 0:74d6e93ec977 175 motor.stop();
khaiminhvn 0:74d6e93ec977 176 ti.detach(); //Disable Wind Safety
khaiminhvn 0:74d6e93ec977 177
khaiminhvn 0:74d6e93ec977 178 //TIMEOUT
khaiminhvn 0:74d6e93ec977 179 ////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 180 if(!bt_inc.read() && !bt_dec.read() && !flag_idle) //Check if button is not pressed
khaiminhvn 0:74d6e93ec977 181 {
khaiminhvn 0:74d6e93ec977 182 t_mode.reset();
khaiminhvn 0:74d6e93ec977 183 t_mode.start();
khaiminhvn 0:74d6e93ec977 184 flag_idle = 1; //Indicate idling
khaiminhvn 0:74d6e93ec977 185 }
khaiminhvn 0:74d6e93ec977 186 else if(timer_read_s(t_mode) > TIME_WSETTING_TIMEOUT)
khaiminhvn 0:74d6e93ec977 187 {
khaiminhvn 0:74d6e93ec977 188 mode = OP_NORMAL;
khaiminhvn 0:74d6e93ec977 189 }
khaiminhvn 0:74d6e93ec977 190 ////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 191
khaiminhvn 0:74d6e93ec977 192 if(bt_inc.read() && wthres < WIND_THRES_MAX)
khaiminhvn 0:74d6e93ec977 193 {
khaiminhvn 0:74d6e93ec977 194 ane.setThres(++wthres);
khaiminhvn 0:74d6e93ec977 195 }
khaiminhvn 0:74d6e93ec977 196 else if(bt_inc.read() && wthres > WIND_THRES_MIN)
khaiminhvn 0:74d6e93ec977 197 {
khaiminhvn 0:74d6e93ec977 198 ane.setThres(--wthres);
khaiminhvn 0:74d6e93ec977 199 }
khaiminhvn 0:74d6e93ec977 200
khaiminhvn 0:74d6e93ec977 201 flag_time = 1; //Set the system in motion once done adjusting
khaiminhvn 0:74d6e93ec977 202 break;
khaiminhvn 0:74d6e93ec977 203 }
khaiminhvn 0:74d6e93ec977 204 }
khaiminhvn 0:74d6e93ec977 205
khaiminhvn 0:74d6e93ec977 206 }
khaiminhvn 0:74d6e93ec977 207 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 208 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 209
khaiminhvn 0:74d6e93ec977 210 //FUNCTIONS
khaiminhvn 0:74d6e93ec977 211 void checkWind()
khaiminhvn 0:74d6e93ec977 212 {
khaiminhvn 0:74d6e93ec977 213 ane.checkWind(&mode);
khaiminhvn 0:74d6e93ec977 214 }