Project aiming to make a self-controlled solar reflector
Dependencies: Accelerometer LCD Inverter Algorithm MotorDriver Anemometer GUI ArduinoJson Misc Definitions Pushbutton WebSocketClient temp_fan
main.cpp@1:07f86b4db069, 2021-02-15 (annotated)
- 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?
User | Revision | Line number | New 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 | } |