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

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