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 19 19:31:52 2021 +0000
Revision:
18:ee0aa6db3c8d
Parent:
17:238ccf7e3676
Child:
20:0a6609515810
Changed pins, not working

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 16:326404a7a8b8 19 #include "temp_fans.h"
khaiminhvn 6:0b7a6e51cdf8 20 #include <string>
jump_man 17:238ccf7e3676 21 #include "EthernetInterface.h"
jump_man 17:238ccf7e3676 22 #include "Inverter.h"
jump_man 17:238ccf7e3676 23 #include "GUI.h"
khaiminhvn 0:74d6e93ec977 24
khaiminhvn 0:74d6e93ec977 25 #define timer_read_s(x) chrono::duration_cast<chrono::seconds>((x).elapsed_time()).count()
khaiminhvn 11:2ade1ad7bad6 26 #define timer_read_ms(x) chrono::duration_cast<chrono::milliseconds>((x).elapsed_time()).count()
khaiminhvn 0:74d6e93ec977 27
khaiminhvn 0:74d6e93ec977 28 //Initialize Global Variables
khaiminhvn 7:2b6438e586e6 29 I2C i2c(PIN_SDA,PIN_SCL);
khaiminhvn 0:74d6e93ec977 30 Anemometer ane; //
khaiminhvn 11:2ade1ad7bad6 31 MotorDriver motor;
khaiminhvn 10:566529fff615 32 LowPowerTimer t,t_mode, t_disp;
khaiminhvn 7:2b6438e586e6 33 int mode = OP_CALIBRATION;
jump_man 17:238ccf7e3676 34 EthernetInterface eth;
khaiminhvn 0:74d6e93ec977 35
khaiminhvn 0:74d6e93ec977 36 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 37 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 38 int main()
khaiminhvn 0:74d6e93ec977 39 {
khaiminhvn 7:2b6438e586e6 40 i2c.frequency(I2C_FREQ);
khaiminhvn 10:566529fff615 41 Accelerometer acc(&i2c); //Accelerometer
khaiminhvn 7:2b6438e586e6 42 LCD lcd(&i2c);
khaiminhvn 16:326404a7a8b8 43 temp_fans fan;
khaiminhvn 7:2b6438e586e6 44
khaiminhvn 0:74d6e93ec977 45 float ang_P,ang_R;
khaiminhvn 0:74d6e93ec977 46 float ref_R1,ref_R2;
khaiminhvn 0:74d6e93ec977 47 int t_elapsed;
khaiminhvn 0:74d6e93ec977 48 int wthres = WIND_THRES_INIT;
khaiminhvn 6:0b7a6e51cdf8 49
khaiminhvn 8:a1481d5f0572 50 //FLAGS
khaiminhvn 8:a1481d5f0572 51 int flag_time = 1; //Normal mode time
khaiminhvn 8:a1481d5f0572 52 int flag_idle = 0; //Idling time
khaiminhvn 8:a1481d5f0572 53 int flag_disp = 1; //Anti-flickering
khaiminhvn 9:6e950b9a9a81 54 int flag_bres = 0; //Flag for checking button released
khaiminhvn 14:3989d03a8b98 55 int flag_flas = 1; //Flag for flashing symbol
jump_man 17:238ccf7e3676 56 bool flag_eth; //Flag for ethernet connection
jump_man 17:238ccf7e3676 57 bool flag_aTrack; //Flag for active tracking (0 - offline, 1 - online)
jump_man 17:238ccf7e3676 58 bool flag_powerOn;
khaiminhvn 8:a1481d5f0572 59
khaiminhvn 8:a1481d5f0572 60 //PUSH BUTTONS
khaiminhvn 8:a1481d5f0572 61 Pushbutton bt_fn(PIN_BTFN,&mode,&flag_disp);
khaiminhvn 8:a1481d5f0572 62 Pushbutton bt_inc(PIN_BTINC);
khaiminhvn 8:a1481d5f0572 63 Pushbutton bt_dec(PIN_BTDEC);
khaiminhvn 8:a1481d5f0572 64
khaiminhvn 11:2ade1ad7bad6 65 string topL = "INITIALIZING";
khaiminhvn 11:2ade1ad7bad6 66 string botL = "";
khaiminhvn 11:2ade1ad7bad6 67 lcd.LCD_display(topL, botL);
khaiminhvn 0:74d6e93ec977 68
jump_man 17:238ccf7e3676 69
jump_man 17:238ccf7e3676 70
jump_man 17:238ccf7e3676 71 eth.connect();
jump_man 17:238ccf7e3676 72 GUI gui("ws://int-sol-ref.herokuapp.com/", &eth, &flag_eth);
jump_man 17:238ccf7e3676 73 Inverter inverter("int-sol-ref.herokuapp.com", 80, &eth);
jump_man 17:238ccf7e3676 74
khaiminhvn 0:74d6e93ec977 75 t.start(); //Start timer
khaiminhvn 10:566529fff615 76 t_disp.start();
khaiminhvn 11:2ade1ad7bad6 77 wait_us(1000000);
khaiminhvn 0:74d6e93ec977 78
khaiminhvn 11:2ade1ad7bad6 79 topL = "PUT SENSORS IN";
khaiminhvn 11:2ade1ad7bad6 80 botL = "CALIBRATION SLOT";
khaiminhvn 6:0b7a6e51cdf8 81 lcd.LCD_display(topL, botL);
khaiminhvn 6:0b7a6e51cdf8 82
khaiminhvn 0:74d6e93ec977 83 while(1)
khaiminhvn 0:74d6e93ec977 84 {
khaiminhvn 0:74d6e93ec977 85 switch(mode)
khaiminhvn 0:74d6e93ec977 86 {
khaiminhvn 7:2b6438e586e6 87 case OP_PLACEMENT:{
khaiminhvn 8:a1481d5f0572 88 if(flag_disp){
khaiminhvn 11:2ade1ad7bad6 89 topL = "CALIBRATING";
khaiminhvn 11:2ade1ad7bad6 90 botL = "";
khaiminhvn 11:2ade1ad7bad6 91 lcd.LCD_display(topL,botL);
khaiminhvn 11:2ade1ad7bad6 92 acc.calibrate();
khaiminhvn 18:ee0aa6db3c8d 93 wait_us(1000000);
khaiminhvn 11:2ade1ad7bad6 94 topL = "PUT SENSOR ON";
khaiminhvn 11:2ade1ad7bad6 95 botL = "PANEL&REFLECTORS";
khaiminhvn 8:a1481d5f0572 96 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 97 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 98 }
khaiminhvn 7:2b6438e586e6 99
khaiminhvn 7:2b6438e586e6 100 break;
khaiminhvn 8:a1481d5f0572 101 }
khaiminhvn 0:74d6e93ec977 102 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 14:3989d03a8b98 103 case OP_CONFIRM:{
khaiminhvn 14:3989d03a8b98 104 while(mode == OP_CONFIRM){
khaiminhvn 14:3989d03a8b98 105 topL = "R1 || P || R2";
khaiminhvn 16:326404a7a8b8 106 botL = Misc::itos(acc.getAngle(S_R1),3) +
khaiminhvn 16:326404a7a8b8 107 "||" + Misc::itos(acc.getAngle(S_PANEL),3) +
khaiminhvn 16:326404a7a8b8 108 "||" + Misc::itos(acc.getAngle(S_R2),3);
khaiminhvn 14:3989d03a8b98 109 lcd.LCD_display(topL,botL);
khaiminhvn 14:3989d03a8b98 110 flag_disp = 0;
khaiminhvn 14:3989d03a8b98 111 wait_us(LCD_RRATE);
khaiminhvn 14:3989d03a8b98 112 }
khaiminhvn 14:3989d03a8b98 113 }
khaiminhvn 14:3989d03a8b98 114 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 115 case OP_NORMAL:{
jump_man 17:238ccf7e3676 116 if (flag_eth){gui.receives(&wthres, &flag_aTrack, &flag_powerOn);}
khaiminhvn 16:326404a7a8b8 117 fan.checkTemp(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 16:326404a7a8b8 118 ane.checkWind(&mode);if(mode != OP_NORMAL){break;}
jump_man 17:238ccf7e3676 119 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 12:14bac44e33b9 120 topL = "NORMAL:IDLING";
khaiminhvn 14:3989d03a8b98 121 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 16:326404a7a8b8 122 botL = Misc::itos(ane.getWind(&flag_disp),3) + "kph | " + Misc::itos(fan.getTemp()) + "C";
khaiminhvn 10:566529fff615 123 t_disp.reset();
khaiminhvn 10:566529fff615 124 t_disp.start();
khaiminhvn 10:566529fff615 125 }
khaiminhvn 8:a1481d5f0572 126 if(flag_disp){
khaiminhvn 8:a1481d5f0572 127 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 128 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 129 }
khaiminhvn 0:74d6e93ec977 130
khaiminhvn 12:14bac44e33b9 131 if(flag_time) //If delay interval has passed
khaiminhvn 12:14bac44e33b9 132 {
khaiminhvn 12:14bac44e33b9 133 ane.checkWind(&mode);
khaiminhvn 12:14bac44e33b9 134 //Get Angle of Panel
khaiminhvn 12:14bac44e33b9 135 ang_P = acc.getAngle(S_PANEL);
khaiminhvn 12:14bac44e33b9 136
khaiminhvn 12:14bac44e33b9 137 //Calculate the Angle of Both Reflector
khaiminhvn 12:14bac44e33b9 138 ref_R1 = Algorithm::calcAngle(1,ang_P);
khaiminhvn 12:14bac44e33b9 139 ref_R2 = Algorithm::calcAngle(2,ang_P);
khaiminhvn 12:14bac44e33b9 140
khaiminhvn 14:3989d03a8b98 141 //Moving Reflector 1
khaiminhvn 12:14bac44e33b9 142 ang_R = acc.getAngle(S_R1);
khaiminhvn 15:2b3b5d8bf692 143 while(ang_R <= ref_R1 && !acc.checkAngle(ref_R1,ang_R) && mode == OP_NORMAL)
khaiminhvn 12:14bac44e33b9 144 {
jump_man 17:238ccf7e3676 145 if (flag_eth){gui.receives(&wthres, &flag_aTrack, &flag_powerOn);}
jump_man 17:238ccf7e3676 146 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 16:326404a7a8b8 147 fan.checkTemp(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 16:326404a7a8b8 148 ane.checkWind(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 14:3989d03a8b98 149 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 150 topL = (flag_flas)? "NORMAL:R1 <=>" : "NORMAL:R1 <-=->";
khaiminhvn 14:3989d03a8b98 151 flag_flas = !flag_flas;
khaiminhvn 16:326404a7a8b8 152 botL = Misc::itos(ane.getWind(&flag_disp),3) + "kph | " + Misc::itos(fan.getTemp()) + "C";
khaiminhvn 14:3989d03a8b98 153 t_disp.reset();
khaiminhvn 14:3989d03a8b98 154 t_disp.start();
khaiminhvn 14:3989d03a8b98 155 }
khaiminhvn 14:3989d03a8b98 156 lcd.LCD_display(topL,botL);
khaiminhvn 12:14bac44e33b9 157 motor.moveForward(M1);
khaiminhvn 12:14bac44e33b9 158 ang_R = acc.getAngle(S_R1);
khaiminhvn 12:14bac44e33b9 159 }
khaiminhvn 15:2b3b5d8bf692 160 while(ang_R >= ref_R1 && !acc.checkAngle(ref_R1,ang_R) && mode == OP_NORMAL)
khaiminhvn 12:14bac44e33b9 161 {
jump_man 17:238ccf7e3676 162 if (flag_eth){gui.receives(&wthres, &flag_aTrack, &flag_powerOn);}
jump_man 17:238ccf7e3676 163 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 16:326404a7a8b8 164 fan.checkTemp(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 16:326404a7a8b8 165 ane.checkWind(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 14:3989d03a8b98 166 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 167 topL = (flag_flas)? "NORMAL:R1 > = < " : "NORMAL:R1 ->=<-";
khaiminhvn 14:3989d03a8b98 168 flag_flas = !flag_flas;
khaiminhvn 16:326404a7a8b8 169 botL = Misc::itos(ane.getWind(&flag_disp),3) + "kph | " + Misc::itos(fan.getTemp()) + "C";
khaiminhvn 14:3989d03a8b98 170 t_disp.reset();
khaiminhvn 14:3989d03a8b98 171 t_disp.start();
khaiminhvn 14:3989d03a8b98 172 }
khaiminhvn 14:3989d03a8b98 173 lcd.LCD_display(topL,botL);
khaiminhvn 12:14bac44e33b9 174 motor.moveBackward(M1);
khaiminhvn 12:14bac44e33b9 175 ang_R = acc.getAngle(S_R1);
khaiminhvn 12:14bac44e33b9 176 }
khaiminhvn 12:14bac44e33b9 177 motor.stop();
khaiminhvn 12:14bac44e33b9 178
khaiminhvn 12:14bac44e33b9 179 //Moving Reflector 2
khaiminhvn 12:14bac44e33b9 180 ang_R = acc.getAngle(S_R2);
khaiminhvn 15:2b3b5d8bf692 181 while(ang_R <= ref_R2 && !acc.checkAngle(ref_R2,ang_R) && mode == OP_NORMAL)
khaiminhvn 12:14bac44e33b9 182 {
jump_man 17:238ccf7e3676 183 if (flag_eth){gui.receives(&wthres, &flag_aTrack, &flag_powerOn);}
jump_man 17:238ccf7e3676 184 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 16:326404a7a8b8 185 fan.checkTemp(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 16:326404a7a8b8 186 ane.checkWind(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 14:3989d03a8b98 187 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 188 topL = (flag_flas)? "NORMAL:R2 <=>" : "NORMAL:R2 <-=->";
khaiminhvn 14:3989d03a8b98 189 flag_flas = !flag_flas;
khaiminhvn 16:326404a7a8b8 190 botL = Misc::itos(ane.getWind(&flag_disp),3) + "kph | " + Misc::itos(fan.getTemp()) + "C";
khaiminhvn 14:3989d03a8b98 191 t_disp.reset();
khaiminhvn 14:3989d03a8b98 192 t_disp.start();
khaiminhvn 14:3989d03a8b98 193 }
khaiminhvn 14:3989d03a8b98 194 lcd.LCD_display(topL,botL);
khaiminhvn 12:14bac44e33b9 195 motor.moveForward(M2);
khaiminhvn 12:14bac44e33b9 196 ang_R = acc.getAngle(S_R2);
khaiminhvn 12:14bac44e33b9 197 }
khaiminhvn 15:2b3b5d8bf692 198 while(ang_R >= ref_R2 && !acc.checkAngle(ref_R2,ang_R) && mode == OP_NORMAL)
khaiminhvn 12:14bac44e33b9 199 {
jump_man 17:238ccf7e3676 200 if (flag_eth){gui.receives(&wthres, &flag_aTrack, &flag_powerOn);}
jump_man 17:238ccf7e3676 201 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 16:326404a7a8b8 202 fan.checkTemp(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 16:326404a7a8b8 203 ane.checkWind(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 14:3989d03a8b98 204 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 205 topL = (flag_flas)? "NORMAL:R2 > = < " : "NORMAL:R2 ->=<-";
khaiminhvn 14:3989d03a8b98 206 flag_flas = !flag_flas;
khaiminhvn 16:326404a7a8b8 207 botL = Misc::itos(ane.getWind(&flag_disp),3) + "kph | " + Misc::itos(fan.getTemp()) + "C";
khaiminhvn 14:3989d03a8b98 208 t_disp.reset();
khaiminhvn 14:3989d03a8b98 209 t_disp.start();
khaiminhvn 14:3989d03a8b98 210 }
khaiminhvn 14:3989d03a8b98 211 lcd.LCD_display(topL,botL);
khaiminhvn 12:14bac44e33b9 212 motor.moveBackward(M2);
khaiminhvn 12:14bac44e33b9 213 ang_R = acc.getAngle(S_R2);
khaiminhvn 12:14bac44e33b9 214 }
khaiminhvn 12:14bac44e33b9 215 motor.stop();
khaiminhvn 12:14bac44e33b9 216 flag_time = 0; //Reset timer flag
khaiminhvn 12:14bac44e33b9 217 flag_disp = 1; //Reset display flag
khaiminhvn 12:14bac44e33b9 218 t.reset(); //Reset timer
khaiminhvn 12:14bac44e33b9 219 }
khaiminhvn 12:14bac44e33b9 220 t_elapsed = (int)timer_read_s(t);
khaiminhvn 12:14bac44e33b9 221 flag_time = (t_elapsed >= TIME_NORMAL) ? 1 : 0; //Enable flag if delay interval has passed
khaiminhvn 9:6e950b9a9a81 222 flag_idle = 0;
khaiminhvn 7:2b6438e586e6 223 break;
khaiminhvn 8:a1481d5f0572 224 }
khaiminhvn 7:2b6438e586e6 225 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 226 case OP_WIND:{
jump_man 17:238ccf7e3676 227 if (flag_eth){gui.receives(&wthres, &flag_aTrack, &flag_powerOn);}
jump_man 17:238ccf7e3676 228 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 16:326404a7a8b8 229 fan.checkTemp(&mode);if(mode != OP_WIND){break;}
khaiminhvn 16:326404a7a8b8 230 ane.checkWind(&mode);if(mode != OP_WIND){break;}
khaiminhvn 14:3989d03a8b98 231 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 232 topL = (flag_flas)? "WIND SAFETY *!*" : "WIND SAFETY";
khaiminhvn 15:2b3b5d8bf692 233 flag_flas = !flag_flas;
khaiminhvn 16:326404a7a8b8 234 botL = Misc::itos(ane.getWind(&flag_disp),3) + "kph | " + Misc::itos(fan.getTemp()) + "C";
khaiminhvn 10:566529fff615 235 t_disp.reset();
khaiminhvn 10:566529fff615 236 t_disp.start();
khaiminhvn 10:566529fff615 237 }
khaiminhvn 8:a1481d5f0572 238 if(flag_disp){
khaiminhvn 8:a1481d5f0572 239 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 240 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 241 }
khaiminhvn 0:74d6e93ec977 242
khaiminhvn 11:2ade1ad7bad6 243 //Move all motor backward
khaiminhvn 11:2ade1ad7bad6 244 motor.moveBackward(M_ALL);
khaiminhvn 11:2ade1ad7bad6 245 flag_time = 1; //Set the system in motion once windspeed has subsided
khaiminhvn 11:2ade1ad7bad6 246 break;
khaiminhvn 11:2ade1ad7bad6 247
khaiminhvn 9:6e950b9a9a81 248 flag_idle = 0;
khaiminhvn 7:2b6438e586e6 249 break;
khaiminhvn 8:a1481d5f0572 250 }
khaiminhvn 0:74d6e93ec977 251 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 252 case OP_MANUAL1:{
jump_man 17:238ccf7e3676 253 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 16:326404a7a8b8 254 fan.checkTemp(&mode);if(mode != OP_MANUAL1){break;}
khaiminhvn 15:2b3b5d8bf692 255 topL = "MANUAL:M1";
jump_man 17:238ccf7e3676 256 botL = Misc::itos(ane.getWind(&flag_disp)) + "kph*" + Misc::itos(fan.getTemp()) + "C*"
jump_man 17:238ccf7e3676 257 + ((flag_eth)?Misc::itos(inverter.getPower()):"---") + "W";
khaiminhvn 8:a1481d5f0572 258 if(flag_disp){
khaiminhvn 8:a1481d5f0572 259 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 260 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 261 }
khaiminhvn 0:74d6e93ec977 262
khaiminhvn 12:14bac44e33b9 263 //TIMEOUT
khaiminhvn 12:14bac44e33b9 264 ////////////////////////////////////////////////////////////////////
khaiminhvn 12:14bac44e33b9 265 if(!flag_idle) //Check if button is not pressed
khaiminhvn 12:14bac44e33b9 266 {
khaiminhvn 12:14bac44e33b9 267 t_mode.reset();
khaiminhvn 12:14bac44e33b9 268 t_mode.start();
khaiminhvn 12:14bac44e33b9 269 flag_idle = 1; //Indicate idling
khaiminhvn 12:14bac44e33b9 270 }
khaiminhvn 12:14bac44e33b9 271 else if(timer_read_s(t_mode) > TIME_MANUAL_TIMEOUT)
khaiminhvn 12:14bac44e33b9 272 {
khaiminhvn 12:14bac44e33b9 273 mode = OP_NORMAL;
khaiminhvn 12:14bac44e33b9 274 flag_disp = 1;
khaiminhvn 12:14bac44e33b9 275 break;
khaiminhvn 12:14bac44e33b9 276 }
khaiminhvn 12:14bac44e33b9 277 ////////////////////////////////////////////////////////////////////
khaiminhvn 12:14bac44e33b9 278
khaiminhvn 12:14bac44e33b9 279 while(bt_inc.read()) //Extend
khaiminhvn 12:14bac44e33b9 280 {
jump_man 17:238ccf7e3676 281 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 15:2b3b5d8bf692 282 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 283 topL = (flag_flas)? "MANUAL:M1 <=> " : "MANUAL:M1 <-=->";
khaiminhvn 15:2b3b5d8bf692 284 flag_flas = !flag_flas;
khaiminhvn 15:2b3b5d8bf692 285 t_disp.reset();
khaiminhvn 15:2b3b5d8bf692 286 t_disp.start();
khaiminhvn 12:14bac44e33b9 287 botL = "EXTENDING";
khaiminhvn 12:14bac44e33b9 288 lcd.LCD_display(topL,botL);
khaiminhvn 12:14bac44e33b9 289 }
khaiminhvn 15:2b3b5d8bf692 290
khaiminhvn 12:14bac44e33b9 291 flag_idle = 0;
khaiminhvn 12:14bac44e33b9 292 motor.moveForward(M1);
khaiminhvn 12:14bac44e33b9 293 }
khaiminhvn 12:14bac44e33b9 294 while(bt_dec.read()) //Retract
khaiminhvn 12:14bac44e33b9 295 {
jump_man 17:238ccf7e3676 296 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 15:2b3b5d8bf692 297 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 298 topL = (flag_flas)? "MANUAL:M1 > = <" : "MANUAL:M1 ->=<-";
khaiminhvn 15:2b3b5d8bf692 299 flag_flas = !flag_flas;
khaiminhvn 15:2b3b5d8bf692 300 t_disp.reset();
khaiminhvn 15:2b3b5d8bf692 301 t_disp.start();
khaiminhvn 12:14bac44e33b9 302 botL = "RETRACTING";
khaiminhvn 12:14bac44e33b9 303 lcd.LCD_display(topL,botL);
khaiminhvn 12:14bac44e33b9 304 }
khaiminhvn 12:14bac44e33b9 305 flag_idle = 0;
khaiminhvn 12:14bac44e33b9 306 motor.moveBackward(M1);
khaiminhvn 12:14bac44e33b9 307 }
khaiminhvn 12:14bac44e33b9 308 if(!bt_inc.read() && !bt_dec.read() && !flag_disp)
khaiminhvn 12:14bac44e33b9 309 {
khaiminhvn 12:14bac44e33b9 310 flag_disp = 1;
khaiminhvn 12:14bac44e33b9 311 motor.stop();
khaiminhvn 12:14bac44e33b9 312 }
khaiminhvn 15:2b3b5d8bf692 313 flag_time = 1;
khaiminhvn 7:2b6438e586e6 314 break;
khaiminhvn 8:a1481d5f0572 315 }
khaiminhvn 7:2b6438e586e6 316 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 317 case OP_MANUAL2:{
jump_man 17:238ccf7e3676 318 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 16:326404a7a8b8 319 fan.checkTemp(&mode);if(mode != OP_MANUAL2){break;}
khaiminhvn 15:2b3b5d8bf692 320 topL = "MANUAL:M2";
khaiminhvn 16:326404a7a8b8 321 botL = Misc::itos(ane.getWind(&flag_disp),3) + "kph | " + Misc::itos(fan.getTemp()) + "C";
khaiminhvn 8:a1481d5f0572 322 if(flag_disp){
khaiminhvn 8:a1481d5f0572 323 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 324 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 325 }
khaiminhvn 12:14bac44e33b9 326
khaiminhvn 12:14bac44e33b9 327 //TIMEOUT
khaiminhvn 12:14bac44e33b9 328 ////////////////////////////////////////////////////////////////////
khaiminhvn 12:14bac44e33b9 329 if(!flag_idle) //Check if button is not pressed
khaiminhvn 12:14bac44e33b9 330 {
khaiminhvn 12:14bac44e33b9 331 t_mode.reset();
khaiminhvn 12:14bac44e33b9 332 t_mode.start();
khaiminhvn 12:14bac44e33b9 333 flag_idle = 1; //Indicate idling
khaiminhvn 12:14bac44e33b9 334 }
khaiminhvn 12:14bac44e33b9 335 else if(timer_read_s(t_mode) > TIME_MANUAL_TIMEOUT)
khaiminhvn 12:14bac44e33b9 336 {
khaiminhvn 12:14bac44e33b9 337 mode = OP_NORMAL;
khaiminhvn 12:14bac44e33b9 338 flag_disp = 1;
khaiminhvn 12:14bac44e33b9 339 break;
khaiminhvn 12:14bac44e33b9 340 }
khaiminhvn 12:14bac44e33b9 341 ////////////////////////////////////////////////////////////////////
khaiminhvn 12:14bac44e33b9 342
khaiminhvn 12:14bac44e33b9 343 while(bt_inc.read()) //Extend
khaiminhvn 12:14bac44e33b9 344 {
jump_man 17:238ccf7e3676 345 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 15:2b3b5d8bf692 346 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 347 topL = (flag_flas)? "MANUAL:M2 <=> " : "MANUAL:M2 <-=->";
khaiminhvn 15:2b3b5d8bf692 348 flag_flas = !flag_flas;
khaiminhvn 15:2b3b5d8bf692 349 t_disp.reset();
khaiminhvn 15:2b3b5d8bf692 350 t_disp.start();
khaiminhvn 12:14bac44e33b9 351 botL = "EXTENDING";
khaiminhvn 12:14bac44e33b9 352 lcd.LCD_display(topL,botL);
khaiminhvn 12:14bac44e33b9 353 }
khaiminhvn 15:2b3b5d8bf692 354
khaiminhvn 12:14bac44e33b9 355 flag_idle = 0;
khaiminhvn 16:326404a7a8b8 356 motor.moveForward(M2);
khaiminhvn 12:14bac44e33b9 357 }
khaiminhvn 12:14bac44e33b9 358 while(bt_dec.read()) //Retract
khaiminhvn 12:14bac44e33b9 359 {
jump_man 17:238ccf7e3676 360 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 15:2b3b5d8bf692 361 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 362 topL = (flag_flas)? "MANUAL:M2 > = <" : "MANUAL:M2 ->=<-";
khaiminhvn 15:2b3b5d8bf692 363 flag_flas = !flag_flas;
khaiminhvn 15:2b3b5d8bf692 364 t_disp.reset();
khaiminhvn 15:2b3b5d8bf692 365 t_disp.start();
khaiminhvn 12:14bac44e33b9 366 botL = "RETRACTING";
khaiminhvn 12:14bac44e33b9 367 lcd.LCD_display(topL,botL);
khaiminhvn 12:14bac44e33b9 368 }
khaiminhvn 12:14bac44e33b9 369 flag_idle = 0;
khaiminhvn 16:326404a7a8b8 370 motor.moveBackward(M2);
khaiminhvn 12:14bac44e33b9 371 }
khaiminhvn 12:14bac44e33b9 372 if(!bt_inc.read() && !bt_dec.read() && !flag_disp)
khaiminhvn 12:14bac44e33b9 373 {
khaiminhvn 12:14bac44e33b9 374 flag_disp = 1;
khaiminhvn 12:14bac44e33b9 375 motor.stop();
khaiminhvn 12:14bac44e33b9 376 }
khaiminhvn 15:2b3b5d8bf692 377 flag_time = 1;
khaiminhvn 15:2b3b5d8bf692 378 break;
khaiminhvn 15:2b3b5d8bf692 379 }
khaiminhvn 15:2b3b5d8bf692 380 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 15:2b3b5d8bf692 381 case OP_MANUAL_ALL:{
jump_man 17:238ccf7e3676 382 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 16:326404a7a8b8 383 fan.checkTemp(&mode);if(mode != OP_MANUAL_ALL){break;}
khaiminhvn 15:2b3b5d8bf692 384 topL = "MANUAL:ALL";
khaiminhvn 16:326404a7a8b8 385 botL = Misc::itos(ane.getWind(&flag_disp),3) + "kph | " + Misc::itos(fan.getTemp()) + "C";
khaiminhvn 15:2b3b5d8bf692 386 if(flag_disp){
khaiminhvn 15:2b3b5d8bf692 387 lcd.LCD_display(topL,botL);
khaiminhvn 15:2b3b5d8bf692 388 flag_disp = 0;
khaiminhvn 15:2b3b5d8bf692 389 }
khaiminhvn 15:2b3b5d8bf692 390
khaiminhvn 15:2b3b5d8bf692 391 //TIMEOUT
khaiminhvn 15:2b3b5d8bf692 392 ////////////////////////////////////////////////////////////////////
khaiminhvn 15:2b3b5d8bf692 393 if(!flag_idle) //Check if button is not pressed
khaiminhvn 15:2b3b5d8bf692 394 {
khaiminhvn 15:2b3b5d8bf692 395 t_mode.reset();
khaiminhvn 15:2b3b5d8bf692 396 t_mode.start();
khaiminhvn 15:2b3b5d8bf692 397 flag_idle = 1; //Indicate idling
khaiminhvn 15:2b3b5d8bf692 398 }
khaiminhvn 15:2b3b5d8bf692 399 else if(timer_read_s(t_mode) > TIME_MANUAL_TIMEOUT)
khaiminhvn 15:2b3b5d8bf692 400 {
khaiminhvn 15:2b3b5d8bf692 401 mode = OP_NORMAL;
khaiminhvn 15:2b3b5d8bf692 402 flag_disp = 1;
khaiminhvn 15:2b3b5d8bf692 403 break;
khaiminhvn 15:2b3b5d8bf692 404 }
khaiminhvn 15:2b3b5d8bf692 405 ////////////////////////////////////////////////////////////////////
khaiminhvn 15:2b3b5d8bf692 406
khaiminhvn 15:2b3b5d8bf692 407 while(bt_inc.read()) //Extend
khaiminhvn 15:2b3b5d8bf692 408 {
jump_man 17:238ccf7e3676 409 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 15:2b3b5d8bf692 410 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 411 topL = (flag_flas)? "MANUAL:ALL <=> " : "MANUAL:ALL <-=->";
khaiminhvn 15:2b3b5d8bf692 412 flag_flas = !flag_flas;
khaiminhvn 15:2b3b5d8bf692 413 t_disp.reset();
khaiminhvn 15:2b3b5d8bf692 414 t_disp.start();
khaiminhvn 15:2b3b5d8bf692 415 botL = "EXTENDING";
khaiminhvn 15:2b3b5d8bf692 416 lcd.LCD_display(topL,botL);
khaiminhvn 15:2b3b5d8bf692 417 }
khaiminhvn 15:2b3b5d8bf692 418
khaiminhvn 15:2b3b5d8bf692 419 flag_idle = 0;
khaiminhvn 16:326404a7a8b8 420 motor.moveForward(M_ALL);
khaiminhvn 15:2b3b5d8bf692 421 }
khaiminhvn 15:2b3b5d8bf692 422 while(bt_dec.read()) //Retract
khaiminhvn 15:2b3b5d8bf692 423 {
jump_man 17:238ccf7e3676 424 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 15:2b3b5d8bf692 425 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 426 topL = (flag_flas)? "MANUAL:ALL > = <" : "MANUAL:ALL ->=<-";
khaiminhvn 15:2b3b5d8bf692 427 flag_flas = !flag_flas;
khaiminhvn 15:2b3b5d8bf692 428 t_disp.reset();
khaiminhvn 15:2b3b5d8bf692 429 t_disp.start();
khaiminhvn 15:2b3b5d8bf692 430 botL = "RETRACTING";
khaiminhvn 15:2b3b5d8bf692 431 lcd.LCD_display(topL,botL);
khaiminhvn 15:2b3b5d8bf692 432 }
khaiminhvn 15:2b3b5d8bf692 433 flag_idle = 0;
khaiminhvn 16:326404a7a8b8 434 motor.moveBackward(M_ALL);
khaiminhvn 15:2b3b5d8bf692 435 }
khaiminhvn 15:2b3b5d8bf692 436 if(!bt_inc.read() && !bt_dec.read() && !flag_disp)
khaiminhvn 15:2b3b5d8bf692 437 {
khaiminhvn 15:2b3b5d8bf692 438 flag_disp = 1;
khaiminhvn 15:2b3b5d8bf692 439 motor.stop();
khaiminhvn 15:2b3b5d8bf692 440 }
khaiminhvn 15:2b3b5d8bf692 441 flag_time = 1;
khaiminhvn 0:74d6e93ec977 442 break;
khaiminhvn 8:a1481d5f0572 443 }
khaiminhvn 7:2b6438e586e6 444 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 445 case OP_WSETTING:{
jump_man 17:238ccf7e3676 446 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 16:326404a7a8b8 447 fan.checkTemp(&mode);if(mode != OP_WSETTING){break;}
khaiminhvn 7:2b6438e586e6 448 topL = "Threshold:";
khaiminhvn 9:6e950b9a9a81 449 botL = Misc::itos(wthres) + " kph";
khaiminhvn 8:a1481d5f0572 450 if(flag_disp){
khaiminhvn 8:a1481d5f0572 451 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 452 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 453 }
khaiminhvn 0:74d6e93ec977 454
khaiminhvn 9:6e950b9a9a81 455 //TIMEOUT
khaiminhvn 9:6e950b9a9a81 456 ////////////////////////////////////////////////////////////////////
khaiminhvn 9:6e950b9a9a81 457 if(!flag_idle) //Check if button is not pressed
khaiminhvn 9:6e950b9a9a81 458 {
khaiminhvn 9:6e950b9a9a81 459 t_mode.reset();
khaiminhvn 9:6e950b9a9a81 460 t_mode.start();
khaiminhvn 9:6e950b9a9a81 461 flag_idle = 1; //Indicate idling
khaiminhvn 9:6e950b9a9a81 462 }
khaiminhvn 9:6e950b9a9a81 463 else if(timer_read_s(t_mode) > TIME_WSETTING_TIMEOUT)
khaiminhvn 9:6e950b9a9a81 464 {
khaiminhvn 9:6e950b9a9a81 465 mode = OP_NORMAL;
khaiminhvn 9:6e950b9a9a81 466 flag_disp = 1;
khaiminhvn 9:6e950b9a9a81 467 break;
khaiminhvn 9:6e950b9a9a81 468 }
khaiminhvn 9:6e950b9a9a81 469 ////////////////////////////////////////////////////////////////////
khaiminhvn 9:6e950b9a9a81 470
khaiminhvn 9:6e950b9a9a81 471 if(!(flag_bres == 1 && bt_inc.read()) && !(flag_bres == -1 && bt_dec.read())){
khaiminhvn 9:6e950b9a9a81 472 if(bt_inc.read() && wthres < WIND_THRES_MAX)
khaiminhvn 9:6e950b9a9a81 473 {
khaiminhvn 9:6e950b9a9a81 474 ane.setThres(++wthres);
jump_man 17:238ccf7e3676 475 if(flag_eth){gui.survivalSpeed(wthres);}
khaiminhvn 9:6e950b9a9a81 476 botL = Misc::itos(wthres) + " kph";
khaiminhvn 9:6e950b9a9a81 477 lcd.LCD_display(topL,botL);
khaiminhvn 9:6e950b9a9a81 478 flag_idle = 0;
khaiminhvn 9:6e950b9a9a81 479 flag_bres = 1;
khaiminhvn 9:6e950b9a9a81 480 }
khaiminhvn 9:6e950b9a9a81 481 else if(bt_dec.read() && wthres > WIND_THRES_MIN)
khaiminhvn 9:6e950b9a9a81 482 {
khaiminhvn 9:6e950b9a9a81 483 ane.setThres(--wthres);
jump_man 17:238ccf7e3676 484 if(flag_eth){gui.survivalSpeed(wthres);}
khaiminhvn 9:6e950b9a9a81 485 botL = Misc::itos(wthres) + " kph";
khaiminhvn 9:6e950b9a9a81 486 lcd.LCD_display(topL,botL);
khaiminhvn 9:6e950b9a9a81 487 flag_idle = 0;
khaiminhvn 9:6e950b9a9a81 488 flag_bres = -1;
khaiminhvn 9:6e950b9a9a81 489 }
khaiminhvn 9:6e950b9a9a81 490 else{
khaiminhvn 9:6e950b9a9a81 491 flag_bres = 0;
khaiminhvn 9:6e950b9a9a81 492 }
khaiminhvn 9:6e950b9a9a81 493 }
khaiminhvn 9:6e950b9a9a81 494
khaiminhvn 9:6e950b9a9a81 495 flag_time = 1; //Set the system in motion once done adjusting
khaiminhvn 7:2b6438e586e6 496 break;
khaiminhvn 8:a1481d5f0572 497 }
khaiminhvn 16:326404a7a8b8 498 ////////////////////////////////////////////////////////////////////////
khaiminhvn 16:326404a7a8b8 499 case OP_OVERHEAT:{
jump_man 17:238ccf7e3676 500 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 16:326404a7a8b8 501 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 16:326404a7a8b8 502 topL = (flag_flas)? "*!* OVERHEAT *!*": " OVERHEAT ";
khaiminhvn 16:326404a7a8b8 503 botL = (flag_flas)? " KEEP DISTANCE " : (" " + Misc::itos(fan.getTemp(),3) + "C");
khaiminhvn 16:326404a7a8b8 504 flag_flas = !flag_flas;
khaiminhvn 16:326404a7a8b8 505 t_disp.reset();
khaiminhvn 16:326404a7a8b8 506 t_disp.start();
khaiminhvn 16:326404a7a8b8 507 lcd.LCD_display(topL,botL);
khaiminhvn 16:326404a7a8b8 508 }
khaiminhvn 16:326404a7a8b8 509 motor.moveBackward(M_ALL);
khaiminhvn 16:326404a7a8b8 510 fan.checkTemp(&mode);
khaiminhvn 16:326404a7a8b8 511 flag_disp = 1;
khaiminhvn 16:326404a7a8b8 512 flag_time = 1;
khaiminhvn 16:326404a7a8b8 513 break;
khaiminhvn 16:326404a7a8b8 514 }
khaiminhvn 16:326404a7a8b8 515 ////////////////////////////////////////////////////////////////////////
khaiminhvn 16:326404a7a8b8 516 case OP_OVERHEAT_MAN:{
jump_man 17:238ccf7e3676 517 if (flag_eth){gui.windSpeed(ane.getWind());}
khaiminhvn 16:326404a7a8b8 518 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 16:326404a7a8b8 519 topL = (flag_flas)? "*!* OVERHEAT *!*": " OVERHEAT ";
khaiminhvn 16:326404a7a8b8 520 botL = (flag_flas)? " PRESS FN " : (" " + Misc::itos(fan.getTemp(),3) + "C");
khaiminhvn 16:326404a7a8b8 521 flag_flas = !flag_flas;
khaiminhvn 16:326404a7a8b8 522 t_disp.reset();
khaiminhvn 16:326404a7a8b8 523 t_disp.start();
khaiminhvn 16:326404a7a8b8 524 lcd.LCD_display(topL,botL);
khaiminhvn 16:326404a7a8b8 525 }
khaiminhvn 16:326404a7a8b8 526 motor.stop();
khaiminhvn 16:326404a7a8b8 527 flag_disp = 1;
khaiminhvn 16:326404a7a8b8 528 break;
khaiminhvn 16:326404a7a8b8 529 }
jump_man 17:238ccf7e3676 530 ////////////////////////////////////////////////////////////////////////
jump_man 17:238ccf7e3676 531 case OP_POWER_OFF:{
jump_man 17:238ccf7e3676 532 if (flag_eth){gui.receives(&wthres, &flag_aTrack, &flag_powerOn);}
jump_man 17:238ccf7e3676 533 if(mode != OP_POWER_OFF){break;}
jump_man 17:238ccf7e3676 534 if (flag_eth){gui.windSpeed(ane.getWind());}
jump_man 17:238ccf7e3676 535 fan.checkTemp(&mode);if(mode != OP_WIND){break;}
jump_man 17:238ccf7e3676 536 if(timer_read_ms(t_disp) >= LCD_RRATE){
jump_man 17:238ccf7e3676 537 topL = "SLEEP MODE";
jump_man 17:238ccf7e3676 538 flag_flas = !flag_flas;
jump_man 17:238ccf7e3676 539 botL = Misc::itos(ane.getWind(&flag_disp),3) + "kph | " + Misc::itos(fan.getTemp()) + "C";
jump_man 17:238ccf7e3676 540 t_disp.reset();
jump_man 17:238ccf7e3676 541 t_disp.start();
jump_man 17:238ccf7e3676 542 }
jump_man 17:238ccf7e3676 543 if(flag_disp){
jump_man 17:238ccf7e3676 544 lcd.LCD_display(topL,botL);
jump_man 17:238ccf7e3676 545 flag_disp = 0;
jump_man 17:238ccf7e3676 546 }
jump_man 17:238ccf7e3676 547
jump_man 17:238ccf7e3676 548 //Move all motor backward
jump_man 17:238ccf7e3676 549 motor.moveBackward(M_ALL);
jump_man 17:238ccf7e3676 550 flag_time = 1; //Set the system in motion once windspeed has subsided
jump_man 17:238ccf7e3676 551 break;
jump_man 17:238ccf7e3676 552
jump_man 17:238ccf7e3676 553 flag_idle = 0;
jump_man 17:238ccf7e3676 554 break;
jump_man 17:238ccf7e3676 555 }
khaiminhvn 0:74d6e93ec977 556 }
jump_man 17:238ccf7e3676 557
jump_man 17:238ccf7e3676 558 if (flag_eth){
jump_man 17:238ccf7e3676 559 gui.state(mode);
jump_man 17:238ccf7e3676 560 }
jump_man 17:238ccf7e3676 561
khaiminhvn 7:2b6438e586e6 562 wait_us(LOOP_DELAY);
jump_man 17:238ccf7e3676 563 flag_disp = 1;
khaiminhvn 0:74d6e93ec977 564 }
khaiminhvn 0:74d6e93ec977 565
khaiminhvn 0:74d6e93ec977 566 }
khaiminhvn 0:74d6e93ec977 567 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 568 ////////////////////////////////////////////////////////////////////////////////