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@14:3989d03a8b98, 2021-03-12 (annotated)
- Committer:
- khaiminhvn
- Date:
- Fri Mar 12 04:15:49 2021 +0000
- Revision:
- 14:3989d03a8b98
- Parent:
- 12:14bac44e33b9
- Child:
- 15:2b3b5d8bf692
Added calibration display, fixed normal mode, added indicator
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 | 7:2b6438e586e6 | 16 | #include "PinAssignment.h" |
khaiminhvn | 2:944511c6c55f | 17 | #include "LCD.h" |
khaiminhvn | 9:6e950b9a9a81 | 18 | #include "Misc.h" |
khaiminhvn | 6:0b7a6e51cdf8 | 19 | #include <string> |
khaiminhvn | 0:74d6e93ec977 | 20 | |
khaiminhvn | 0:74d6e93ec977 | 21 | #define timer_read_s(x) chrono::duration_cast<chrono::seconds>((x).elapsed_time()).count() |
khaiminhvn | 11:2ade1ad7bad6 | 22 | #define timer_read_ms(x) chrono::duration_cast<chrono::milliseconds>((x).elapsed_time()).count() |
khaiminhvn | 0:74d6e93ec977 | 23 | |
khaiminhvn | 0:74d6e93ec977 | 24 | //Initialize Global Variables |
khaiminhvn | 7:2b6438e586e6 | 25 | I2C i2c(PIN_SDA,PIN_SCL); |
khaiminhvn | 0:74d6e93ec977 | 26 | Anemometer ane; // |
khaiminhvn | 11:2ade1ad7bad6 | 27 | MotorDriver motor; |
khaiminhvn | 10:566529fff615 | 28 | LowPowerTimer t,t_mode, t_disp; |
khaiminhvn | 7:2b6438e586e6 | 29 | int mode = OP_CALIBRATION; |
khaiminhvn | 0:74d6e93ec977 | 30 | |
khaiminhvn | 0:74d6e93ec977 | 31 | //////////////////////////////////////////////////////////////////////////////// |
khaiminhvn | 0:74d6e93ec977 | 32 | //////////////////////////////////////////////////////////////////////////////// |
khaiminhvn | 0:74d6e93ec977 | 33 | int main() |
khaiminhvn | 0:74d6e93ec977 | 34 | { |
khaiminhvn | 7:2b6438e586e6 | 35 | i2c.frequency(I2C_FREQ); |
khaiminhvn | 10:566529fff615 | 36 | Accelerometer acc(&i2c); //Accelerometer |
khaiminhvn | 7:2b6438e586e6 | 37 | LCD lcd(&i2c); |
khaiminhvn | 7:2b6438e586e6 | 38 | |
khaiminhvn | 0:74d6e93ec977 | 39 | float ang_P,ang_R; |
khaiminhvn | 0:74d6e93ec977 | 40 | float ref_R1,ref_R2; |
khaiminhvn | 0:74d6e93ec977 | 41 | int t_elapsed; |
khaiminhvn | 0:74d6e93ec977 | 42 | int wthres = WIND_THRES_INIT; |
khaiminhvn | 6:0b7a6e51cdf8 | 43 | char buffer[16]; |
khaiminhvn | 6:0b7a6e51cdf8 | 44 | |
khaiminhvn | 8:a1481d5f0572 | 45 | //FLAGS |
khaiminhvn | 8:a1481d5f0572 | 46 | int flag_time = 1; //Normal mode time |
khaiminhvn | 8:a1481d5f0572 | 47 | int flag_idle = 0; //Idling time |
khaiminhvn | 8:a1481d5f0572 | 48 | int flag_disp = 1; //Anti-flickering |
khaiminhvn | 9:6e950b9a9a81 | 49 | int flag_bres = 0; //Flag for checking button released |
khaiminhvn | 14:3989d03a8b98 | 50 | int flag_flas = 1; //Flag for flashing symbol |
khaiminhvn | 8:a1481d5f0572 | 51 | |
khaiminhvn | 8:a1481d5f0572 | 52 | //PUSH BUTTONS |
khaiminhvn | 8:a1481d5f0572 | 53 | Pushbutton bt_fn(PIN_BTFN,&mode,&flag_disp); |
khaiminhvn | 8:a1481d5f0572 | 54 | Pushbutton bt_inc(PIN_BTINC); |
khaiminhvn | 8:a1481d5f0572 | 55 | Pushbutton bt_dec(PIN_BTDEC); |
khaiminhvn | 8:a1481d5f0572 | 56 | |
khaiminhvn | 11:2ade1ad7bad6 | 57 | string topL = "INITIALIZING"; |
khaiminhvn | 11:2ade1ad7bad6 | 58 | string botL = ""; |
khaiminhvn | 11:2ade1ad7bad6 | 59 | lcd.LCD_display(topL, botL); |
khaiminhvn | 0:74d6e93ec977 | 60 | |
khaiminhvn | 0:74d6e93ec977 | 61 | t.start(); //Start timer |
khaiminhvn | 10:566529fff615 | 62 | t_disp.start(); |
khaiminhvn | 11:2ade1ad7bad6 | 63 | wait_us(1000000); |
khaiminhvn | 0:74d6e93ec977 | 64 | |
khaiminhvn | 11:2ade1ad7bad6 | 65 | topL = "PUT SENSORS IN"; |
khaiminhvn | 11:2ade1ad7bad6 | 66 | botL = "CALIBRATION SLOT"; |
khaiminhvn | 6:0b7a6e51cdf8 | 67 | lcd.LCD_display(topL, botL); |
khaiminhvn | 6:0b7a6e51cdf8 | 68 | |
khaiminhvn | 0:74d6e93ec977 | 69 | while(1) |
khaiminhvn | 0:74d6e93ec977 | 70 | { |
khaiminhvn | 0:74d6e93ec977 | 71 | switch(mode) |
khaiminhvn | 0:74d6e93ec977 | 72 | { |
khaiminhvn | 7:2b6438e586e6 | 73 | case OP_PLACEMENT:{ |
khaiminhvn | 8:a1481d5f0572 | 74 | if(flag_disp){ |
khaiminhvn | 11:2ade1ad7bad6 | 75 | topL = "CALIBRATING"; |
khaiminhvn | 11:2ade1ad7bad6 | 76 | botL = ""; |
khaiminhvn | 11:2ade1ad7bad6 | 77 | lcd.LCD_display(topL,botL); |
khaiminhvn | 11:2ade1ad7bad6 | 78 | acc.calibrate(); |
khaiminhvn | 11:2ade1ad7bad6 | 79 | topL = "PUT SENSOR ON"; |
khaiminhvn | 11:2ade1ad7bad6 | 80 | botL = "PANEL&REFLECTORS"; |
khaiminhvn | 8:a1481d5f0572 | 81 | lcd.LCD_display(topL,botL); |
khaiminhvn | 8:a1481d5f0572 | 82 | flag_disp = 0; |
khaiminhvn | 8:a1481d5f0572 | 83 | } |
khaiminhvn | 7:2b6438e586e6 | 84 | |
khaiminhvn | 7:2b6438e586e6 | 85 | break; |
khaiminhvn | 8:a1481d5f0572 | 86 | } |
khaiminhvn | 0:74d6e93ec977 | 87 | //////////////////////////////////////////////////////////////////////////////// |
khaiminhvn | 14:3989d03a8b98 | 88 | case OP_CONFIRM:{ |
khaiminhvn | 14:3989d03a8b98 | 89 | while(mode == OP_CONFIRM){ |
khaiminhvn | 14:3989d03a8b98 | 90 | topL = "R1 || P || R2"; |
khaiminhvn | 14:3989d03a8b98 | 91 | botL = Misc::itos((int)acc.getAngle(S_R1),3) + |
khaiminhvn | 14:3989d03a8b98 | 92 | "||" + Misc::itos((int)acc.getAngle(S_PANEL),3) + |
khaiminhvn | 14:3989d03a8b98 | 93 | "||" + Misc::itos((int)acc.getAngle(S_R2),3); |
khaiminhvn | 14:3989d03a8b98 | 94 | lcd.LCD_display(topL,botL); |
khaiminhvn | 14:3989d03a8b98 | 95 | flag_disp = 0; |
khaiminhvn | 14:3989d03a8b98 | 96 | wait_us(LCD_RRATE); |
khaiminhvn | 14:3989d03a8b98 | 97 | } |
khaiminhvn | 14:3989d03a8b98 | 98 | } |
khaiminhvn | 14:3989d03a8b98 | 99 | //////////////////////////////////////////////////////////////////////////////// |
khaiminhvn | 7:2b6438e586e6 | 100 | case OP_NORMAL:{ |
khaiminhvn | 10:566529fff615 | 101 | ane.checkWind(&mode); |
khaiminhvn | 12:14bac44e33b9 | 102 | topL = "NORMAL:IDLING"; |
khaiminhvn | 14:3989d03a8b98 | 103 | if(timer_read_ms(t_disp) >= LCD_RRATE){ |
khaiminhvn | 10:566529fff615 | 104 | botL = Misc::itos((int)ane.getWind(&flag_disp)) + " kph"; |
khaiminhvn | 10:566529fff615 | 105 | t_disp.reset(); |
khaiminhvn | 10:566529fff615 | 106 | t_disp.start(); |
khaiminhvn | 10:566529fff615 | 107 | } |
khaiminhvn | 8:a1481d5f0572 | 108 | if(flag_disp){ |
khaiminhvn | 8:a1481d5f0572 | 109 | lcd.LCD_display(topL,botL); |
khaiminhvn | 8:a1481d5f0572 | 110 | flag_disp = 0; |
khaiminhvn | 8:a1481d5f0572 | 111 | } |
khaiminhvn | 0:74d6e93ec977 | 112 | |
khaiminhvn | 12:14bac44e33b9 | 113 | if(flag_time) //If delay interval has passed |
khaiminhvn | 12:14bac44e33b9 | 114 | { |
khaiminhvn | 12:14bac44e33b9 | 115 | ane.checkWind(&mode); |
khaiminhvn | 12:14bac44e33b9 | 116 | //Get Angle of Panel |
khaiminhvn | 12:14bac44e33b9 | 117 | ang_P = acc.getAngle(S_PANEL); |
khaiminhvn | 12:14bac44e33b9 | 118 | |
khaiminhvn | 12:14bac44e33b9 | 119 | //Calculate the Angle of Both Reflector |
khaiminhvn | 12:14bac44e33b9 | 120 | ref_R1 = Algorithm::calcAngle(1,ang_P); |
khaiminhvn | 12:14bac44e33b9 | 121 | ref_R2 = Algorithm::calcAngle(2,ang_P); |
khaiminhvn | 12:14bac44e33b9 | 122 | |
khaiminhvn | 14:3989d03a8b98 | 123 | //Moving Reflector 1 |
khaiminhvn | 12:14bac44e33b9 | 124 | ang_R = acc.getAngle(S_R1); |
khaiminhvn | 14:3989d03a8b98 | 125 | while(ang_R <= ref_R1 && !acc.checkAngle(ref_R1,ang_R)) |
khaiminhvn | 12:14bac44e33b9 | 126 | { |
khaiminhvn | 12:14bac44e33b9 | 127 | ane.checkWind(&mode); |
khaiminhvn | 14:3989d03a8b98 | 128 | if(timer_read_ms(t_disp) >= LCD_RRATE){ |
khaiminhvn | 14:3989d03a8b98 | 129 | topL = (flag_flas)? "NORMAL:R1 <->" : "NORMAL:R1 <<->>"; |
khaiminhvn | 14:3989d03a8b98 | 130 | flag_flas = !flag_flas; |
khaiminhvn | 14:3989d03a8b98 | 131 | botL = Misc::itos((int)ane.getWind(&flag_disp),3) + " kph"; |
khaiminhvn | 14:3989d03a8b98 | 132 | t_disp.reset(); |
khaiminhvn | 14:3989d03a8b98 | 133 | t_disp.start(); |
khaiminhvn | 14:3989d03a8b98 | 134 | } |
khaiminhvn | 14:3989d03a8b98 | 135 | lcd.LCD_display(topL,botL); |
khaiminhvn | 14:3989d03a8b98 | 136 | |
khaiminhvn | 12:14bac44e33b9 | 137 | if(mode != OP_NORMAL) {break;} |
khaiminhvn | 12:14bac44e33b9 | 138 | motor.moveForward(M1); |
khaiminhvn | 12:14bac44e33b9 | 139 | ang_R = acc.getAngle(S_R1); |
khaiminhvn | 12:14bac44e33b9 | 140 | } |
khaiminhvn | 14:3989d03a8b98 | 141 | while(ang_R >= ref_R1 && !acc.checkAngle(ref_R1,ang_R)) |
khaiminhvn | 12:14bac44e33b9 | 142 | { |
khaiminhvn | 12:14bac44e33b9 | 143 | ane.checkWind(&mode); |
khaiminhvn | 14:3989d03a8b98 | 144 | if(timer_read_ms(t_disp) >= LCD_RRATE){ |
khaiminhvn | 14:3989d03a8b98 | 145 | topL = (flag_flas)? "NORMAL:R1 >>-<<" : "NORMAL:R1 > - <"; |
khaiminhvn | 14:3989d03a8b98 | 146 | flag_flas = !flag_flas; |
khaiminhvn | 14:3989d03a8b98 | 147 | botL = Misc::itos((int)ane.getWind(&flag_disp),3) + " kph"; |
khaiminhvn | 14:3989d03a8b98 | 148 | t_disp.reset(); |
khaiminhvn | 14:3989d03a8b98 | 149 | t_disp.start(); |
khaiminhvn | 14:3989d03a8b98 | 150 | } |
khaiminhvn | 14:3989d03a8b98 | 151 | lcd.LCD_display(topL,botL); |
khaiminhvn | 14:3989d03a8b98 | 152 | |
khaiminhvn | 12:14bac44e33b9 | 153 | if(mode != OP_NORMAL) {break;} |
khaiminhvn | 12:14bac44e33b9 | 154 | motor.moveBackward(M1); |
khaiminhvn | 12:14bac44e33b9 | 155 | ang_R = acc.getAngle(S_R1); |
khaiminhvn | 12:14bac44e33b9 | 156 | } |
khaiminhvn | 12:14bac44e33b9 | 157 | motor.stop(); |
khaiminhvn | 12:14bac44e33b9 | 158 | |
khaiminhvn | 12:14bac44e33b9 | 159 | //Moving Reflector 2 |
khaiminhvn | 12:14bac44e33b9 | 160 | ang_R = acc.getAngle(S_R2); |
khaiminhvn | 14:3989d03a8b98 | 161 | while(ang_R <= ref_R2 && !acc.checkAngle(ref_R2,ang_R)) |
khaiminhvn | 12:14bac44e33b9 | 162 | { |
khaiminhvn | 12:14bac44e33b9 | 163 | ane.checkWind(&mode); |
khaiminhvn | 14:3989d03a8b98 | 164 | if(timer_read_ms(t_disp) >= LCD_RRATE){ |
khaiminhvn | 14:3989d03a8b98 | 165 | topL = (flag_flas)? "NORMAL:R2 <->" : "NORMAL:R2 <<->>"; |
khaiminhvn | 14:3989d03a8b98 | 166 | flag_flas = !flag_flas; |
khaiminhvn | 14:3989d03a8b98 | 167 | botL = Misc::itos((int)ane.getWind(&flag_disp),3) + " kph"; |
khaiminhvn | 14:3989d03a8b98 | 168 | t_disp.reset(); |
khaiminhvn | 14:3989d03a8b98 | 169 | t_disp.start(); |
khaiminhvn | 14:3989d03a8b98 | 170 | } |
khaiminhvn | 14:3989d03a8b98 | 171 | lcd.LCD_display(topL,botL); |
khaiminhvn | 14:3989d03a8b98 | 172 | |
khaiminhvn | 12:14bac44e33b9 | 173 | if(mode != OP_NORMAL) {break;} |
khaiminhvn | 12:14bac44e33b9 | 174 | motor.moveForward(M2); |
khaiminhvn | 12:14bac44e33b9 | 175 | ang_R = acc.getAngle(S_R2); |
khaiminhvn | 12:14bac44e33b9 | 176 | } |
khaiminhvn | 14:3989d03a8b98 | 177 | while(ang_R >= ref_R2 && !acc.checkAngle(ref_R2,ang_R)) |
khaiminhvn | 12:14bac44e33b9 | 178 | { |
khaiminhvn | 12:14bac44e33b9 | 179 | ane.checkWind(&mode); |
khaiminhvn | 14:3989d03a8b98 | 180 | if(timer_read_ms(t_disp) >= LCD_RRATE){ |
khaiminhvn | 14:3989d03a8b98 | 181 | topL = (flag_flas)? "NORMAL:R2 >>-<<" : "NORMAL:R2 > - <"; |
khaiminhvn | 14:3989d03a8b98 | 182 | flag_flas = !flag_flas; |
khaiminhvn | 14:3989d03a8b98 | 183 | botL = Misc::itos((int)ane.getWind(&flag_disp),3) + " kph"; |
khaiminhvn | 14:3989d03a8b98 | 184 | t_disp.reset(); |
khaiminhvn | 14:3989d03a8b98 | 185 | t_disp.start(); |
khaiminhvn | 14:3989d03a8b98 | 186 | } |
khaiminhvn | 14:3989d03a8b98 | 187 | lcd.LCD_display(topL,botL); |
khaiminhvn | 14:3989d03a8b98 | 188 | |
khaiminhvn | 12:14bac44e33b9 | 189 | if(mode != OP_NORMAL) {break;} |
khaiminhvn | 12:14bac44e33b9 | 190 | motor.moveBackward(M2); |
khaiminhvn | 12:14bac44e33b9 | 191 | ang_R = acc.getAngle(S_R2); |
khaiminhvn | 12:14bac44e33b9 | 192 | } |
khaiminhvn | 12:14bac44e33b9 | 193 | motor.stop(); |
khaiminhvn | 12:14bac44e33b9 | 194 | flag_time = 0; //Reset timer flag |
khaiminhvn | 12:14bac44e33b9 | 195 | flag_disp = 1; //Reset display flag |
khaiminhvn | 12:14bac44e33b9 | 196 | t.reset(); //Reset timer |
khaiminhvn | 12:14bac44e33b9 | 197 | } |
khaiminhvn | 12:14bac44e33b9 | 198 | t_elapsed = (int)timer_read_s(t); |
khaiminhvn | 12:14bac44e33b9 | 199 | flag_time = (t_elapsed >= TIME_NORMAL) ? 1 : 0; //Enable flag if delay interval has passed |
khaiminhvn | 9:6e950b9a9a81 | 200 | flag_idle = 0; |
khaiminhvn | 7:2b6438e586e6 | 201 | break; |
khaiminhvn | 8:a1481d5f0572 | 202 | } |
khaiminhvn | 7:2b6438e586e6 | 203 | //////////////////////////////////////////////////////////////////////////////// |
khaiminhvn | 7:2b6438e586e6 | 204 | case OP_WIND:{ |
khaiminhvn | 7:2b6438e586e6 | 205 | ane.checkWind(&mode); |
khaiminhvn | 7:2b6438e586e6 | 206 | topL = "WIND SAFETY"; |
khaiminhvn | 14:3989d03a8b98 | 207 | if(timer_read_ms(t_disp) >= LCD_RRATE){ |
khaiminhvn | 10:566529fff615 | 208 | botL = Misc::itos((int)ane.getWind(&flag_disp)) + " kph"; |
khaiminhvn | 10:566529fff615 | 209 | t_disp.reset(); |
khaiminhvn | 10:566529fff615 | 210 | t_disp.start(); |
khaiminhvn | 10:566529fff615 | 211 | } |
khaiminhvn | 8:a1481d5f0572 | 212 | if(flag_disp){ |
khaiminhvn | 8:a1481d5f0572 | 213 | lcd.LCD_display(topL,botL); |
khaiminhvn | 8:a1481d5f0572 | 214 | flag_disp = 0; |
khaiminhvn | 8:a1481d5f0572 | 215 | } |
khaiminhvn | 0:74d6e93ec977 | 216 | |
khaiminhvn | 11:2ade1ad7bad6 | 217 | //Move all motor backward |
khaiminhvn | 11:2ade1ad7bad6 | 218 | motor.moveBackward(M_ALL); |
khaiminhvn | 11:2ade1ad7bad6 | 219 | flag_time = 1; //Set the system in motion once windspeed has subsided |
khaiminhvn | 11:2ade1ad7bad6 | 220 | break; |
khaiminhvn | 11:2ade1ad7bad6 | 221 | |
khaiminhvn | 9:6e950b9a9a81 | 222 | flag_idle = 0; |
khaiminhvn | 7:2b6438e586e6 | 223 | break; |
khaiminhvn | 8:a1481d5f0572 | 224 | } |
khaiminhvn | 0:74d6e93ec977 | 225 | //////////////////////////////////////////////////////////////////////////////// |
khaiminhvn | 7:2b6438e586e6 | 226 | case OP_MANUAL1:{ |
khaiminhvn | 7:2b6438e586e6 | 227 | topL = "MANUAL: M1"; |
khaiminhvn | 7:2b6438e586e6 | 228 | botL = ""; |
khaiminhvn | 8:a1481d5f0572 | 229 | if(flag_disp){ |
khaiminhvn | 8:a1481d5f0572 | 230 | lcd.LCD_display(topL,botL); |
khaiminhvn | 8:a1481d5f0572 | 231 | flag_disp = 0; |
khaiminhvn | 8:a1481d5f0572 | 232 | } |
khaiminhvn | 0:74d6e93ec977 | 233 | |
khaiminhvn | 12:14bac44e33b9 | 234 | //TIMEOUT |
khaiminhvn | 12:14bac44e33b9 | 235 | //////////////////////////////////////////////////////////////////// |
khaiminhvn | 12:14bac44e33b9 | 236 | if(!flag_idle) //Check if button is not pressed |
khaiminhvn | 12:14bac44e33b9 | 237 | { |
khaiminhvn | 12:14bac44e33b9 | 238 | t_mode.reset(); |
khaiminhvn | 12:14bac44e33b9 | 239 | t_mode.start(); |
khaiminhvn | 12:14bac44e33b9 | 240 | flag_idle = 1; //Indicate idling |
khaiminhvn | 12:14bac44e33b9 | 241 | } |
khaiminhvn | 12:14bac44e33b9 | 242 | else if(timer_read_s(t_mode) > TIME_MANUAL_TIMEOUT) |
khaiminhvn | 12:14bac44e33b9 | 243 | { |
khaiminhvn | 12:14bac44e33b9 | 244 | mode = OP_NORMAL; |
khaiminhvn | 12:14bac44e33b9 | 245 | flag_disp = 1; |
khaiminhvn | 12:14bac44e33b9 | 246 | break; |
khaiminhvn | 12:14bac44e33b9 | 247 | } |
khaiminhvn | 12:14bac44e33b9 | 248 | //////////////////////////////////////////////////////////////////// |
khaiminhvn | 12:14bac44e33b9 | 249 | |
khaiminhvn | 12:14bac44e33b9 | 250 | flag_disp = 1; |
khaiminhvn | 12:14bac44e33b9 | 251 | while(bt_inc.read()) //Extend |
khaiminhvn | 12:14bac44e33b9 | 252 | { |
khaiminhvn | 12:14bac44e33b9 | 253 | if(flag_disp){ |
khaiminhvn | 12:14bac44e33b9 | 254 | botL = "EXTENDING"; |
khaiminhvn | 12:14bac44e33b9 | 255 | lcd.LCD_display(topL,botL); |
khaiminhvn | 12:14bac44e33b9 | 256 | } |
khaiminhvn | 12:14bac44e33b9 | 257 | flag_idle = 0; |
khaiminhvn | 12:14bac44e33b9 | 258 | flag_disp = 0; |
khaiminhvn | 12:14bac44e33b9 | 259 | motor.moveForward(M1); |
khaiminhvn | 12:14bac44e33b9 | 260 | } |
khaiminhvn | 12:14bac44e33b9 | 261 | while(bt_dec.read()) //Retract |
khaiminhvn | 12:14bac44e33b9 | 262 | { |
khaiminhvn | 12:14bac44e33b9 | 263 | if(flag_disp){ |
khaiminhvn | 12:14bac44e33b9 | 264 | botL = "RETRACTING"; |
khaiminhvn | 12:14bac44e33b9 | 265 | lcd.LCD_display(topL,botL); |
khaiminhvn | 12:14bac44e33b9 | 266 | } |
khaiminhvn | 12:14bac44e33b9 | 267 | flag_idle = 0; |
khaiminhvn | 12:14bac44e33b9 | 268 | flag_disp = 0; |
khaiminhvn | 12:14bac44e33b9 | 269 | motor.moveBackward(M1); |
khaiminhvn | 12:14bac44e33b9 | 270 | } |
khaiminhvn | 12:14bac44e33b9 | 271 | if(!bt_inc.read() && !bt_dec.read() && !flag_disp) |
khaiminhvn | 12:14bac44e33b9 | 272 | { |
khaiminhvn | 12:14bac44e33b9 | 273 | flag_disp = 1; |
khaiminhvn | 12:14bac44e33b9 | 274 | motor.stop(); |
khaiminhvn | 12:14bac44e33b9 | 275 | } |
khaiminhvn | 7:2b6438e586e6 | 276 | break; |
khaiminhvn | 8:a1481d5f0572 | 277 | } |
khaiminhvn | 7:2b6438e586e6 | 278 | //////////////////////////////////////////////////////////////////////////////// |
khaiminhvn | 7:2b6438e586e6 | 279 | case OP_MANUAL2:{ |
khaiminhvn | 7:2b6438e586e6 | 280 | topL = "MANUAL: M2"; |
khaiminhvn | 7:2b6438e586e6 | 281 | botL = ""; |
khaiminhvn | 8:a1481d5f0572 | 282 | if(flag_disp){ |
khaiminhvn | 8:a1481d5f0572 | 283 | lcd.LCD_display(topL,botL); |
khaiminhvn | 8:a1481d5f0572 | 284 | flag_disp = 0; |
khaiminhvn | 8:a1481d5f0572 | 285 | } |
khaiminhvn | 12:14bac44e33b9 | 286 | |
khaiminhvn | 12:14bac44e33b9 | 287 | //TIMEOUT |
khaiminhvn | 12:14bac44e33b9 | 288 | //////////////////////////////////////////////////////////////////// |
khaiminhvn | 12:14bac44e33b9 | 289 | if(!flag_idle) //Check if button is not pressed |
khaiminhvn | 12:14bac44e33b9 | 290 | { |
khaiminhvn | 12:14bac44e33b9 | 291 | t_mode.reset(); |
khaiminhvn | 12:14bac44e33b9 | 292 | t_mode.start(); |
khaiminhvn | 12:14bac44e33b9 | 293 | flag_idle = 1; //Indicate idling |
khaiminhvn | 12:14bac44e33b9 | 294 | } |
khaiminhvn | 12:14bac44e33b9 | 295 | else if(timer_read_s(t_mode) > TIME_MANUAL_TIMEOUT) |
khaiminhvn | 12:14bac44e33b9 | 296 | { |
khaiminhvn | 12:14bac44e33b9 | 297 | mode = OP_NORMAL; |
khaiminhvn | 12:14bac44e33b9 | 298 | flag_disp = 1; |
khaiminhvn | 12:14bac44e33b9 | 299 | break; |
khaiminhvn | 12:14bac44e33b9 | 300 | } |
khaiminhvn | 12:14bac44e33b9 | 301 | //////////////////////////////////////////////////////////////////// |
khaiminhvn | 12:14bac44e33b9 | 302 | |
khaiminhvn | 12:14bac44e33b9 | 303 | flag_disp = 1; |
khaiminhvn | 12:14bac44e33b9 | 304 | while(bt_inc.read()) //Extend |
khaiminhvn | 12:14bac44e33b9 | 305 | { |
khaiminhvn | 12:14bac44e33b9 | 306 | if(flag_disp){ |
khaiminhvn | 12:14bac44e33b9 | 307 | botL = "EXTENDING"; |
khaiminhvn | 12:14bac44e33b9 | 308 | lcd.LCD_display(topL,botL); |
khaiminhvn | 12:14bac44e33b9 | 309 | } |
khaiminhvn | 12:14bac44e33b9 | 310 | flag_idle = 0; |
khaiminhvn | 12:14bac44e33b9 | 311 | flag_disp = 0; |
khaiminhvn | 12:14bac44e33b9 | 312 | motor.moveForward(M2); |
khaiminhvn | 12:14bac44e33b9 | 313 | } |
khaiminhvn | 12:14bac44e33b9 | 314 | while(bt_dec.read()) //Retract |
khaiminhvn | 12:14bac44e33b9 | 315 | { |
khaiminhvn | 12:14bac44e33b9 | 316 | if(flag_disp){ |
khaiminhvn | 12:14bac44e33b9 | 317 | botL = "RETRACTING"; |
khaiminhvn | 12:14bac44e33b9 | 318 | lcd.LCD_display(topL,botL); |
khaiminhvn | 12:14bac44e33b9 | 319 | } |
khaiminhvn | 12:14bac44e33b9 | 320 | flag_idle = 0; |
khaiminhvn | 12:14bac44e33b9 | 321 | flag_disp = 0; |
khaiminhvn | 12:14bac44e33b9 | 322 | motor.moveBackward(M2); |
khaiminhvn | 12:14bac44e33b9 | 323 | } |
khaiminhvn | 12:14bac44e33b9 | 324 | if(!bt_inc.read() && !bt_dec.read() && !flag_disp) |
khaiminhvn | 12:14bac44e33b9 | 325 | { |
khaiminhvn | 12:14bac44e33b9 | 326 | flag_disp = 1; |
khaiminhvn | 12:14bac44e33b9 | 327 | motor.stop(); |
khaiminhvn | 12:14bac44e33b9 | 328 | } |
khaiminhvn | 0:74d6e93ec977 | 329 | break; |
khaiminhvn | 8:a1481d5f0572 | 330 | } |
khaiminhvn | 7:2b6438e586e6 | 331 | //////////////////////////////////////////////////////////////////////////////// |
khaiminhvn | 7:2b6438e586e6 | 332 | case OP_WSETTING:{ |
khaiminhvn | 7:2b6438e586e6 | 333 | topL = "Threshold:"; |
khaiminhvn | 9:6e950b9a9a81 | 334 | botL = Misc::itos(wthres) + " kph"; |
khaiminhvn | 8:a1481d5f0572 | 335 | if(flag_disp){ |
khaiminhvn | 8:a1481d5f0572 | 336 | lcd.LCD_display(topL,botL); |
khaiminhvn | 8:a1481d5f0572 | 337 | flag_disp = 0; |
khaiminhvn | 8:a1481d5f0572 | 338 | } |
khaiminhvn | 0:74d6e93ec977 | 339 | |
khaiminhvn | 9:6e950b9a9a81 | 340 | //TIMEOUT |
khaiminhvn | 9:6e950b9a9a81 | 341 | //////////////////////////////////////////////////////////////////// |
khaiminhvn | 9:6e950b9a9a81 | 342 | if(!flag_idle) //Check if button is not pressed |
khaiminhvn | 9:6e950b9a9a81 | 343 | { |
khaiminhvn | 9:6e950b9a9a81 | 344 | t_mode.reset(); |
khaiminhvn | 9:6e950b9a9a81 | 345 | t_mode.start(); |
khaiminhvn | 9:6e950b9a9a81 | 346 | flag_idle = 1; //Indicate idling |
khaiminhvn | 9:6e950b9a9a81 | 347 | } |
khaiminhvn | 9:6e950b9a9a81 | 348 | else if(timer_read_s(t_mode) > TIME_WSETTING_TIMEOUT) |
khaiminhvn | 9:6e950b9a9a81 | 349 | { |
khaiminhvn | 9:6e950b9a9a81 | 350 | mode = OP_NORMAL; |
khaiminhvn | 9:6e950b9a9a81 | 351 | flag_disp = 1; |
khaiminhvn | 9:6e950b9a9a81 | 352 | break; |
khaiminhvn | 9:6e950b9a9a81 | 353 | } |
khaiminhvn | 9:6e950b9a9a81 | 354 | //////////////////////////////////////////////////////////////////// |
khaiminhvn | 9:6e950b9a9a81 | 355 | |
khaiminhvn | 9:6e950b9a9a81 | 356 | if(!(flag_bres == 1 && bt_inc.read()) && !(flag_bres == -1 && bt_dec.read())){ |
khaiminhvn | 9:6e950b9a9a81 | 357 | if(bt_inc.read() && wthres < WIND_THRES_MAX) |
khaiminhvn | 9:6e950b9a9a81 | 358 | { |
khaiminhvn | 9:6e950b9a9a81 | 359 | ane.setThres(++wthres); |
khaiminhvn | 9:6e950b9a9a81 | 360 | botL = Misc::itos(wthres) + " kph"; |
khaiminhvn | 9:6e950b9a9a81 | 361 | lcd.LCD_display(topL,botL); |
khaiminhvn | 9:6e950b9a9a81 | 362 | flag_idle = 0; |
khaiminhvn | 9:6e950b9a9a81 | 363 | flag_bres = 1; |
khaiminhvn | 9:6e950b9a9a81 | 364 | } |
khaiminhvn | 9:6e950b9a9a81 | 365 | else if(bt_dec.read() && wthres > WIND_THRES_MIN) |
khaiminhvn | 9:6e950b9a9a81 | 366 | { |
khaiminhvn | 9:6e950b9a9a81 | 367 | ane.setThres(--wthres); |
khaiminhvn | 9:6e950b9a9a81 | 368 | botL = Misc::itos(wthres) + " kph"; |
khaiminhvn | 9:6e950b9a9a81 | 369 | lcd.LCD_display(topL,botL); |
khaiminhvn | 9:6e950b9a9a81 | 370 | flag_idle = 0; |
khaiminhvn | 9:6e950b9a9a81 | 371 | flag_bres = -1; |
khaiminhvn | 9:6e950b9a9a81 | 372 | } |
khaiminhvn | 9:6e950b9a9a81 | 373 | else{ |
khaiminhvn | 9:6e950b9a9a81 | 374 | flag_bres = 0; |
khaiminhvn | 9:6e950b9a9a81 | 375 | } |
khaiminhvn | 9:6e950b9a9a81 | 376 | } |
khaiminhvn | 9:6e950b9a9a81 | 377 | |
khaiminhvn | 9:6e950b9a9a81 | 378 | flag_time = 1; //Set the system in motion once done adjusting |
khaiminhvn | 9:6e950b9a9a81 | 379 | |
khaiminhvn | 7:2b6438e586e6 | 380 | break; |
khaiminhvn | 8:a1481d5f0572 | 381 | } |
khaiminhvn | 0:74d6e93ec977 | 382 | } |
khaiminhvn | 7:2b6438e586e6 | 383 | wait_us(LOOP_DELAY); |
khaiminhvn | 0:74d6e93ec977 | 384 | } |
khaiminhvn | 0:74d6e93ec977 | 385 | |
khaiminhvn | 0:74d6e93ec977 | 386 | } |
khaiminhvn | 0:74d6e93ec977 | 387 | //////////////////////////////////////////////////////////////////////////////// |
khaiminhvn | 7:2b6438e586e6 | 388 | //////////////////////////////////////////////////////////////////////////////// |