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:
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?

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 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 ////////////////////////////////////////////////////////////////////////////////