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@15:2b3b5d8bf692, 2021-03-12 (annotated)
- Committer:
- khaiminhvn
- Date:
- Fri Mar 12 17:01:39 2021 +0000
- Revision:
- 15:2b3b5d8bf692
- Parent:
- 14:3989d03a8b98
- Child:
- 16:326404a7a8b8
Added manual mode for both motors, improved animation, improved modes witching detection
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 | 15:2b3b5d8bf692 | 104 | botL = Misc::itos((int)ane.getWind(&flag_disp),3) + "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 | 15:2b3b5d8bf692 | 125 | while(ang_R <= ref_R1 && !acc.checkAngle(ref_R1,ang_R) && mode == OP_NORMAL) |
khaiminhvn | 12:14bac44e33b9 | 126 | { |
khaiminhvn | 12:14bac44e33b9 | 127 | ane.checkWind(&mode); |
khaiminhvn | 14:3989d03a8b98 | 128 | if(timer_read_ms(t_disp) >= LCD_RRATE){ |
khaiminhvn | 15:2b3b5d8bf692 | 129 | topL = (flag_flas)? "NORMAL:R1 <=>" : "NORMAL:R1 <-=->"; |
khaiminhvn | 14:3989d03a8b98 | 130 | flag_flas = !flag_flas; |
khaiminhvn | 15:2b3b5d8bf692 | 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 | 15:2b3b5d8bf692 | 141 | while(ang_R >= ref_R1 && !acc.checkAngle(ref_R1,ang_R) && mode == OP_NORMAL) |
khaiminhvn | 12:14bac44e33b9 | 142 | { |
khaiminhvn | 12:14bac44e33b9 | 143 | ane.checkWind(&mode); |
khaiminhvn | 14:3989d03a8b98 | 144 | if(timer_read_ms(t_disp) >= LCD_RRATE){ |
khaiminhvn | 15:2b3b5d8bf692 | 145 | topL = (flag_flas)? "NORMAL:R1 > = < " : "NORMAL:R1 ->=<-"; |
khaiminhvn | 14:3989d03a8b98 | 146 | flag_flas = !flag_flas; |
khaiminhvn | 15:2b3b5d8bf692 | 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 | 15:2b3b5d8bf692 | 161 | while(ang_R <= ref_R2 && !acc.checkAngle(ref_R2,ang_R) && mode == OP_NORMAL) |
khaiminhvn | 12:14bac44e33b9 | 162 | { |
khaiminhvn | 12:14bac44e33b9 | 163 | ane.checkWind(&mode); |
khaiminhvn | 14:3989d03a8b98 | 164 | if(timer_read_ms(t_disp) >= LCD_RRATE){ |
khaiminhvn | 15:2b3b5d8bf692 | 165 | topL = (flag_flas)? "NORMAL:R2 <=>" : "NORMAL:R2 <-=->"; |
khaiminhvn | 14:3989d03a8b98 | 166 | flag_flas = !flag_flas; |
khaiminhvn | 15:2b3b5d8bf692 | 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 | 15:2b3b5d8bf692 | 177 | while(ang_R >= ref_R2 && !acc.checkAngle(ref_R2,ang_R) && mode == OP_NORMAL) |
khaiminhvn | 12:14bac44e33b9 | 178 | { |
khaiminhvn | 12:14bac44e33b9 | 179 | ane.checkWind(&mode); |
khaiminhvn | 14:3989d03a8b98 | 180 | if(timer_read_ms(t_disp) >= LCD_RRATE){ |
khaiminhvn | 15:2b3b5d8bf692 | 181 | topL = (flag_flas)? "NORMAL:R2 > = < " : "NORMAL:R2 ->=<-"; |
khaiminhvn | 14:3989d03a8b98 | 182 | flag_flas = !flag_flas; |
khaiminhvn | 15:2b3b5d8bf692 | 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 | 14:3989d03a8b98 | 206 | if(timer_read_ms(t_disp) >= LCD_RRATE){ |
khaiminhvn | 15:2b3b5d8bf692 | 207 | topL = (flag_flas)? "WIND SAFETY *!*" : "WIND SAFETY"; |
khaiminhvn | 15:2b3b5d8bf692 | 208 | flag_flas = !flag_flas; |
khaiminhvn | 15:2b3b5d8bf692 | 209 | botL = Misc::itos((int)ane.getWind(&flag_disp),3) + "kph"; |
khaiminhvn | 10:566529fff615 | 210 | t_disp.reset(); |
khaiminhvn | 10:566529fff615 | 211 | t_disp.start(); |
khaiminhvn | 10:566529fff615 | 212 | } |
khaiminhvn | 8:a1481d5f0572 | 213 | if(flag_disp){ |
khaiminhvn | 8:a1481d5f0572 | 214 | lcd.LCD_display(topL,botL); |
khaiminhvn | 8:a1481d5f0572 | 215 | flag_disp = 0; |
khaiminhvn | 8:a1481d5f0572 | 216 | } |
khaiminhvn | 0:74d6e93ec977 | 217 | |
khaiminhvn | 11:2ade1ad7bad6 | 218 | //Move all motor backward |
khaiminhvn | 11:2ade1ad7bad6 | 219 | motor.moveBackward(M_ALL); |
khaiminhvn | 11:2ade1ad7bad6 | 220 | flag_time = 1; //Set the system in motion once windspeed has subsided |
khaiminhvn | 11:2ade1ad7bad6 | 221 | break; |
khaiminhvn | 11:2ade1ad7bad6 | 222 | |
khaiminhvn | 9:6e950b9a9a81 | 223 | flag_idle = 0; |
khaiminhvn | 7:2b6438e586e6 | 224 | break; |
khaiminhvn | 8:a1481d5f0572 | 225 | } |
khaiminhvn | 0:74d6e93ec977 | 226 | //////////////////////////////////////////////////////////////////////////////// |
khaiminhvn | 7:2b6438e586e6 | 227 | case OP_MANUAL1:{ |
khaiminhvn | 15:2b3b5d8bf692 | 228 | topL = "MANUAL:M1"; |
khaiminhvn | 7:2b6438e586e6 | 229 | botL = ""; |
khaiminhvn | 8:a1481d5f0572 | 230 | if(flag_disp){ |
khaiminhvn | 8:a1481d5f0572 | 231 | lcd.LCD_display(topL,botL); |
khaiminhvn | 8:a1481d5f0572 | 232 | flag_disp = 0; |
khaiminhvn | 8:a1481d5f0572 | 233 | } |
khaiminhvn | 0:74d6e93ec977 | 234 | |
khaiminhvn | 12:14bac44e33b9 | 235 | //TIMEOUT |
khaiminhvn | 12:14bac44e33b9 | 236 | //////////////////////////////////////////////////////////////////// |
khaiminhvn | 12:14bac44e33b9 | 237 | if(!flag_idle) //Check if button is not pressed |
khaiminhvn | 12:14bac44e33b9 | 238 | { |
khaiminhvn | 12:14bac44e33b9 | 239 | t_mode.reset(); |
khaiminhvn | 12:14bac44e33b9 | 240 | t_mode.start(); |
khaiminhvn | 12:14bac44e33b9 | 241 | flag_idle = 1; //Indicate idling |
khaiminhvn | 12:14bac44e33b9 | 242 | } |
khaiminhvn | 12:14bac44e33b9 | 243 | else if(timer_read_s(t_mode) > TIME_MANUAL_TIMEOUT) |
khaiminhvn | 12:14bac44e33b9 | 244 | { |
khaiminhvn | 12:14bac44e33b9 | 245 | mode = OP_NORMAL; |
khaiminhvn | 12:14bac44e33b9 | 246 | flag_disp = 1; |
khaiminhvn | 12:14bac44e33b9 | 247 | break; |
khaiminhvn | 12:14bac44e33b9 | 248 | } |
khaiminhvn | 12:14bac44e33b9 | 249 | //////////////////////////////////////////////////////////////////// |
khaiminhvn | 12:14bac44e33b9 | 250 | |
khaiminhvn | 12:14bac44e33b9 | 251 | while(bt_inc.read()) //Extend |
khaiminhvn | 12:14bac44e33b9 | 252 | { |
khaiminhvn | 15:2b3b5d8bf692 | 253 | if(timer_read_ms(t_disp) >= LCD_RRATE){ |
khaiminhvn | 15:2b3b5d8bf692 | 254 | topL = (flag_flas)? "MANUAL:M1 <=> " : "MANUAL:M1 <-=->"; |
khaiminhvn | 15:2b3b5d8bf692 | 255 | flag_flas = !flag_flas; |
khaiminhvn | 15:2b3b5d8bf692 | 256 | t_disp.reset(); |
khaiminhvn | 15:2b3b5d8bf692 | 257 | t_disp.start(); |
khaiminhvn | 12:14bac44e33b9 | 258 | botL = "EXTENDING"; |
khaiminhvn | 12:14bac44e33b9 | 259 | lcd.LCD_display(topL,botL); |
khaiminhvn | 12:14bac44e33b9 | 260 | } |
khaiminhvn | 15:2b3b5d8bf692 | 261 | |
khaiminhvn | 12:14bac44e33b9 | 262 | flag_idle = 0; |
khaiminhvn | 12:14bac44e33b9 | 263 | motor.moveForward(M1); |
khaiminhvn | 12:14bac44e33b9 | 264 | } |
khaiminhvn | 12:14bac44e33b9 | 265 | while(bt_dec.read()) //Retract |
khaiminhvn | 12:14bac44e33b9 | 266 | { |
khaiminhvn | 15:2b3b5d8bf692 | 267 | if(timer_read_ms(t_disp) >= LCD_RRATE){ |
khaiminhvn | 15:2b3b5d8bf692 | 268 | topL = (flag_flas)? "MANUAL:M1 > = <" : "MANUAL:M1 ->=<-"; |
khaiminhvn | 15:2b3b5d8bf692 | 269 | flag_flas = !flag_flas; |
khaiminhvn | 15:2b3b5d8bf692 | 270 | t_disp.reset(); |
khaiminhvn | 15:2b3b5d8bf692 | 271 | t_disp.start(); |
khaiminhvn | 12:14bac44e33b9 | 272 | botL = "RETRACTING"; |
khaiminhvn | 12:14bac44e33b9 | 273 | lcd.LCD_display(topL,botL); |
khaiminhvn | 12:14bac44e33b9 | 274 | } |
khaiminhvn | 12:14bac44e33b9 | 275 | flag_idle = 0; |
khaiminhvn | 12:14bac44e33b9 | 276 | motor.moveBackward(M1); |
khaiminhvn | 12:14bac44e33b9 | 277 | } |
khaiminhvn | 12:14bac44e33b9 | 278 | if(!bt_inc.read() && !bt_dec.read() && !flag_disp) |
khaiminhvn | 12:14bac44e33b9 | 279 | { |
khaiminhvn | 12:14bac44e33b9 | 280 | flag_disp = 1; |
khaiminhvn | 12:14bac44e33b9 | 281 | motor.stop(); |
khaiminhvn | 12:14bac44e33b9 | 282 | } |
khaiminhvn | 15:2b3b5d8bf692 | 283 | flag_time = 1; |
khaiminhvn | 7:2b6438e586e6 | 284 | break; |
khaiminhvn | 8:a1481d5f0572 | 285 | } |
khaiminhvn | 7:2b6438e586e6 | 286 | //////////////////////////////////////////////////////////////////////////////// |
khaiminhvn | 7:2b6438e586e6 | 287 | case OP_MANUAL2:{ |
khaiminhvn | 15:2b3b5d8bf692 | 288 | topL = "MANUAL:M2"; |
khaiminhvn | 7:2b6438e586e6 | 289 | botL = ""; |
khaiminhvn | 8:a1481d5f0572 | 290 | if(flag_disp){ |
khaiminhvn | 8:a1481d5f0572 | 291 | lcd.LCD_display(topL,botL); |
khaiminhvn | 8:a1481d5f0572 | 292 | flag_disp = 0; |
khaiminhvn | 8:a1481d5f0572 | 293 | } |
khaiminhvn | 12:14bac44e33b9 | 294 | |
khaiminhvn | 12:14bac44e33b9 | 295 | //TIMEOUT |
khaiminhvn | 12:14bac44e33b9 | 296 | //////////////////////////////////////////////////////////////////// |
khaiminhvn | 12:14bac44e33b9 | 297 | if(!flag_idle) //Check if button is not pressed |
khaiminhvn | 12:14bac44e33b9 | 298 | { |
khaiminhvn | 12:14bac44e33b9 | 299 | t_mode.reset(); |
khaiminhvn | 12:14bac44e33b9 | 300 | t_mode.start(); |
khaiminhvn | 12:14bac44e33b9 | 301 | flag_idle = 1; //Indicate idling |
khaiminhvn | 12:14bac44e33b9 | 302 | } |
khaiminhvn | 12:14bac44e33b9 | 303 | else if(timer_read_s(t_mode) > TIME_MANUAL_TIMEOUT) |
khaiminhvn | 12:14bac44e33b9 | 304 | { |
khaiminhvn | 12:14bac44e33b9 | 305 | mode = OP_NORMAL; |
khaiminhvn | 12:14bac44e33b9 | 306 | flag_disp = 1; |
khaiminhvn | 12:14bac44e33b9 | 307 | break; |
khaiminhvn | 12:14bac44e33b9 | 308 | } |
khaiminhvn | 12:14bac44e33b9 | 309 | //////////////////////////////////////////////////////////////////// |
khaiminhvn | 12:14bac44e33b9 | 310 | |
khaiminhvn | 12:14bac44e33b9 | 311 | while(bt_inc.read()) //Extend |
khaiminhvn | 12:14bac44e33b9 | 312 | { |
khaiminhvn | 15:2b3b5d8bf692 | 313 | if(timer_read_ms(t_disp) >= LCD_RRATE){ |
khaiminhvn | 15:2b3b5d8bf692 | 314 | topL = (flag_flas)? "MANUAL:M2 <=> " : "MANUAL:M2 <-=->"; |
khaiminhvn | 15:2b3b5d8bf692 | 315 | flag_flas = !flag_flas; |
khaiminhvn | 15:2b3b5d8bf692 | 316 | t_disp.reset(); |
khaiminhvn | 15:2b3b5d8bf692 | 317 | t_disp.start(); |
khaiminhvn | 12:14bac44e33b9 | 318 | botL = "EXTENDING"; |
khaiminhvn | 12:14bac44e33b9 | 319 | lcd.LCD_display(topL,botL); |
khaiminhvn | 12:14bac44e33b9 | 320 | } |
khaiminhvn | 15:2b3b5d8bf692 | 321 | |
khaiminhvn | 12:14bac44e33b9 | 322 | flag_idle = 0; |
khaiminhvn | 15:2b3b5d8bf692 | 323 | motor.moveForward(M1); |
khaiminhvn | 12:14bac44e33b9 | 324 | } |
khaiminhvn | 12:14bac44e33b9 | 325 | while(bt_dec.read()) //Retract |
khaiminhvn | 12:14bac44e33b9 | 326 | { |
khaiminhvn | 15:2b3b5d8bf692 | 327 | if(timer_read_ms(t_disp) >= LCD_RRATE){ |
khaiminhvn | 15:2b3b5d8bf692 | 328 | topL = (flag_flas)? "MANUAL:M2 > = <" : "MANUAL:M2 ->=<-"; |
khaiminhvn | 15:2b3b5d8bf692 | 329 | flag_flas = !flag_flas; |
khaiminhvn | 15:2b3b5d8bf692 | 330 | t_disp.reset(); |
khaiminhvn | 15:2b3b5d8bf692 | 331 | t_disp.start(); |
khaiminhvn | 12:14bac44e33b9 | 332 | botL = "RETRACTING"; |
khaiminhvn | 12:14bac44e33b9 | 333 | lcd.LCD_display(topL,botL); |
khaiminhvn | 12:14bac44e33b9 | 334 | } |
khaiminhvn | 12:14bac44e33b9 | 335 | flag_idle = 0; |
khaiminhvn | 15:2b3b5d8bf692 | 336 | motor.moveBackward(M1); |
khaiminhvn | 12:14bac44e33b9 | 337 | } |
khaiminhvn | 12:14bac44e33b9 | 338 | if(!bt_inc.read() && !bt_dec.read() && !flag_disp) |
khaiminhvn | 12:14bac44e33b9 | 339 | { |
khaiminhvn | 12:14bac44e33b9 | 340 | flag_disp = 1; |
khaiminhvn | 12:14bac44e33b9 | 341 | motor.stop(); |
khaiminhvn | 12:14bac44e33b9 | 342 | } |
khaiminhvn | 15:2b3b5d8bf692 | 343 | flag_time = 1; |
khaiminhvn | 15:2b3b5d8bf692 | 344 | break; |
khaiminhvn | 15:2b3b5d8bf692 | 345 | } |
khaiminhvn | 15:2b3b5d8bf692 | 346 | //////////////////////////////////////////////////////////////////////////////// |
khaiminhvn | 15:2b3b5d8bf692 | 347 | case OP_MANUAL_ALL:{ |
khaiminhvn | 15:2b3b5d8bf692 | 348 | topL = "MANUAL:ALL"; |
khaiminhvn | 15:2b3b5d8bf692 | 349 | botL = ""; |
khaiminhvn | 15:2b3b5d8bf692 | 350 | if(flag_disp){ |
khaiminhvn | 15:2b3b5d8bf692 | 351 | lcd.LCD_display(topL,botL); |
khaiminhvn | 15:2b3b5d8bf692 | 352 | flag_disp = 0; |
khaiminhvn | 15:2b3b5d8bf692 | 353 | } |
khaiminhvn | 15:2b3b5d8bf692 | 354 | |
khaiminhvn | 15:2b3b5d8bf692 | 355 | //TIMEOUT |
khaiminhvn | 15:2b3b5d8bf692 | 356 | //////////////////////////////////////////////////////////////////// |
khaiminhvn | 15:2b3b5d8bf692 | 357 | if(!flag_idle) //Check if button is not pressed |
khaiminhvn | 15:2b3b5d8bf692 | 358 | { |
khaiminhvn | 15:2b3b5d8bf692 | 359 | t_mode.reset(); |
khaiminhvn | 15:2b3b5d8bf692 | 360 | t_mode.start(); |
khaiminhvn | 15:2b3b5d8bf692 | 361 | flag_idle = 1; //Indicate idling |
khaiminhvn | 15:2b3b5d8bf692 | 362 | } |
khaiminhvn | 15:2b3b5d8bf692 | 363 | else if(timer_read_s(t_mode) > TIME_MANUAL_TIMEOUT) |
khaiminhvn | 15:2b3b5d8bf692 | 364 | { |
khaiminhvn | 15:2b3b5d8bf692 | 365 | mode = OP_NORMAL; |
khaiminhvn | 15:2b3b5d8bf692 | 366 | flag_disp = 1; |
khaiminhvn | 15:2b3b5d8bf692 | 367 | break; |
khaiminhvn | 15:2b3b5d8bf692 | 368 | } |
khaiminhvn | 15:2b3b5d8bf692 | 369 | //////////////////////////////////////////////////////////////////// |
khaiminhvn | 15:2b3b5d8bf692 | 370 | |
khaiminhvn | 15:2b3b5d8bf692 | 371 | while(bt_inc.read()) //Extend |
khaiminhvn | 15:2b3b5d8bf692 | 372 | { |
khaiminhvn | 15:2b3b5d8bf692 | 373 | if(timer_read_ms(t_disp) >= LCD_RRATE){ |
khaiminhvn | 15:2b3b5d8bf692 | 374 | topL = (flag_flas)? "MANUAL:ALL <=> " : "MANUAL:ALL <-=->"; |
khaiminhvn | 15:2b3b5d8bf692 | 375 | flag_flas = !flag_flas; |
khaiminhvn | 15:2b3b5d8bf692 | 376 | t_disp.reset(); |
khaiminhvn | 15:2b3b5d8bf692 | 377 | t_disp.start(); |
khaiminhvn | 15:2b3b5d8bf692 | 378 | botL = "EXTENDING"; |
khaiminhvn | 15:2b3b5d8bf692 | 379 | lcd.LCD_display(topL,botL); |
khaiminhvn | 15:2b3b5d8bf692 | 380 | } |
khaiminhvn | 15:2b3b5d8bf692 | 381 | |
khaiminhvn | 15:2b3b5d8bf692 | 382 | flag_idle = 0; |
khaiminhvn | 15:2b3b5d8bf692 | 383 | motor.moveForward(M1); |
khaiminhvn | 15:2b3b5d8bf692 | 384 | } |
khaiminhvn | 15:2b3b5d8bf692 | 385 | while(bt_dec.read()) //Retract |
khaiminhvn | 15:2b3b5d8bf692 | 386 | { |
khaiminhvn | 15:2b3b5d8bf692 | 387 | if(timer_read_ms(t_disp) >= LCD_RRATE){ |
khaiminhvn | 15:2b3b5d8bf692 | 388 | topL = (flag_flas)? "MANUAL:ALL > = <" : "MANUAL:ALL ->=<-"; |
khaiminhvn | 15:2b3b5d8bf692 | 389 | flag_flas = !flag_flas; |
khaiminhvn | 15:2b3b5d8bf692 | 390 | t_disp.reset(); |
khaiminhvn | 15:2b3b5d8bf692 | 391 | t_disp.start(); |
khaiminhvn | 15:2b3b5d8bf692 | 392 | botL = "RETRACTING"; |
khaiminhvn | 15:2b3b5d8bf692 | 393 | lcd.LCD_display(topL,botL); |
khaiminhvn | 15:2b3b5d8bf692 | 394 | } |
khaiminhvn | 15:2b3b5d8bf692 | 395 | flag_idle = 0; |
khaiminhvn | 15:2b3b5d8bf692 | 396 | motor.moveBackward(M1); |
khaiminhvn | 15:2b3b5d8bf692 | 397 | } |
khaiminhvn | 15:2b3b5d8bf692 | 398 | if(!bt_inc.read() && !bt_dec.read() && !flag_disp) |
khaiminhvn | 15:2b3b5d8bf692 | 399 | { |
khaiminhvn | 15:2b3b5d8bf692 | 400 | flag_disp = 1; |
khaiminhvn | 15:2b3b5d8bf692 | 401 | motor.stop(); |
khaiminhvn | 15:2b3b5d8bf692 | 402 | } |
khaiminhvn | 15:2b3b5d8bf692 | 403 | flag_time = 1; |
khaiminhvn | 0:74d6e93ec977 | 404 | break; |
khaiminhvn | 8:a1481d5f0572 | 405 | } |
khaiminhvn | 7:2b6438e586e6 | 406 | //////////////////////////////////////////////////////////////////////////////// |
khaiminhvn | 7:2b6438e586e6 | 407 | case OP_WSETTING:{ |
khaiminhvn | 7:2b6438e586e6 | 408 | topL = "Threshold:"; |
khaiminhvn | 9:6e950b9a9a81 | 409 | botL = Misc::itos(wthres) + " kph"; |
khaiminhvn | 8:a1481d5f0572 | 410 | if(flag_disp){ |
khaiminhvn | 8:a1481d5f0572 | 411 | lcd.LCD_display(topL,botL); |
khaiminhvn | 8:a1481d5f0572 | 412 | flag_disp = 0; |
khaiminhvn | 8:a1481d5f0572 | 413 | } |
khaiminhvn | 0:74d6e93ec977 | 414 | |
khaiminhvn | 9:6e950b9a9a81 | 415 | //TIMEOUT |
khaiminhvn | 9:6e950b9a9a81 | 416 | //////////////////////////////////////////////////////////////////// |
khaiminhvn | 9:6e950b9a9a81 | 417 | if(!flag_idle) //Check if button is not pressed |
khaiminhvn | 9:6e950b9a9a81 | 418 | { |
khaiminhvn | 9:6e950b9a9a81 | 419 | t_mode.reset(); |
khaiminhvn | 9:6e950b9a9a81 | 420 | t_mode.start(); |
khaiminhvn | 9:6e950b9a9a81 | 421 | flag_idle = 1; //Indicate idling |
khaiminhvn | 9:6e950b9a9a81 | 422 | } |
khaiminhvn | 9:6e950b9a9a81 | 423 | else if(timer_read_s(t_mode) > TIME_WSETTING_TIMEOUT) |
khaiminhvn | 9:6e950b9a9a81 | 424 | { |
khaiminhvn | 9:6e950b9a9a81 | 425 | mode = OP_NORMAL; |
khaiminhvn | 9:6e950b9a9a81 | 426 | flag_disp = 1; |
khaiminhvn | 9:6e950b9a9a81 | 427 | break; |
khaiminhvn | 9:6e950b9a9a81 | 428 | } |
khaiminhvn | 9:6e950b9a9a81 | 429 | //////////////////////////////////////////////////////////////////// |
khaiminhvn | 9:6e950b9a9a81 | 430 | |
khaiminhvn | 9:6e950b9a9a81 | 431 | if(!(flag_bres == 1 && bt_inc.read()) && !(flag_bres == -1 && bt_dec.read())){ |
khaiminhvn | 9:6e950b9a9a81 | 432 | if(bt_inc.read() && wthres < WIND_THRES_MAX) |
khaiminhvn | 9:6e950b9a9a81 | 433 | { |
khaiminhvn | 9:6e950b9a9a81 | 434 | ane.setThres(++wthres); |
khaiminhvn | 9:6e950b9a9a81 | 435 | botL = Misc::itos(wthres) + " kph"; |
khaiminhvn | 9:6e950b9a9a81 | 436 | lcd.LCD_display(topL,botL); |
khaiminhvn | 9:6e950b9a9a81 | 437 | flag_idle = 0; |
khaiminhvn | 9:6e950b9a9a81 | 438 | flag_bres = 1; |
khaiminhvn | 9:6e950b9a9a81 | 439 | } |
khaiminhvn | 9:6e950b9a9a81 | 440 | else if(bt_dec.read() && wthres > WIND_THRES_MIN) |
khaiminhvn | 9:6e950b9a9a81 | 441 | { |
khaiminhvn | 9:6e950b9a9a81 | 442 | ane.setThres(--wthres); |
khaiminhvn | 9:6e950b9a9a81 | 443 | botL = Misc::itos(wthres) + " kph"; |
khaiminhvn | 9:6e950b9a9a81 | 444 | lcd.LCD_display(topL,botL); |
khaiminhvn | 9:6e950b9a9a81 | 445 | flag_idle = 0; |
khaiminhvn | 9:6e950b9a9a81 | 446 | flag_bres = -1; |
khaiminhvn | 9:6e950b9a9a81 | 447 | } |
khaiminhvn | 9:6e950b9a9a81 | 448 | else{ |
khaiminhvn | 9:6e950b9a9a81 | 449 | flag_bres = 0; |
khaiminhvn | 9:6e950b9a9a81 | 450 | } |
khaiminhvn | 9:6e950b9a9a81 | 451 | } |
khaiminhvn | 9:6e950b9a9a81 | 452 | |
khaiminhvn | 9:6e950b9a9a81 | 453 | flag_time = 1; //Set the system in motion once done adjusting |
khaiminhvn | 7:2b6438e586e6 | 454 | break; |
khaiminhvn | 8:a1481d5f0572 | 455 | } |
khaiminhvn | 0:74d6e93ec977 | 456 | } |
khaiminhvn | 7:2b6438e586e6 | 457 | wait_us(LOOP_DELAY); |
khaiminhvn | 0:74d6e93ec977 | 458 | } |
khaiminhvn | 0:74d6e93ec977 | 459 | |
khaiminhvn | 0:74d6e93ec977 | 460 | } |
khaiminhvn | 0:74d6e93ec977 | 461 | //////////////////////////////////////////////////////////////////////////////// |
khaiminhvn | 7:2b6438e586e6 | 462 | //////////////////////////////////////////////////////////////////////////////// |