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