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:
Thu Apr 01 14:46:41 2021 +0000
Revision:
30:7fce3ae08754
Parent:
29:5b14b0ec5efc
Child:
32:7b58f5574b7a
Added interval option for sending the windspeed to the server

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 30:7fce3ae08754 32 LowPowerTimer t,t_mode, t_disp, t_recon, t_wind;
khaiminhvn 28:1b8e1d100b58 33 int mode = OP_ETHERNET;
khaiminhvn 27:26f41a320436 34 int prevm = mode;
jump_man 17:238ccf7e3676 35 EthernetInterface eth;
khaiminhvn 0:74d6e93ec977 36
khaiminhvn 0:74d6e93ec977 37 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 38 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 39 int main()
khaiminhvn 0:74d6e93ec977 40 {
khaiminhvn 7:2b6438e586e6 41 i2c.frequency(I2C_FREQ);
khaiminhvn 10:566529fff615 42 Accelerometer acc(&i2c); //Accelerometer
khaiminhvn 7:2b6438e586e6 43 LCD lcd(&i2c);
khaiminhvn 16:326404a7a8b8 44 temp_fans fan;
khaiminhvn 7:2b6438e586e6 45
khaiminhvn 0:74d6e93ec977 46 float ang_P,ang_R;
khaiminhvn 0:74d6e93ec977 47 float ref_R1,ref_R2;
khaiminhvn 0:74d6e93ec977 48 int t_elapsed;
khaiminhvn 0:74d6e93ec977 49 int wthres = WIND_THRES_INIT;
khaiminhvn 6:0b7a6e51cdf8 50
khaiminhvn 8:a1481d5f0572 51 //FLAGS
khaiminhvn 8:a1481d5f0572 52 int flag_time = 1; //Normal mode time
khaiminhvn 8:a1481d5f0572 53 int flag_idle = 0; //Idling time
khaiminhvn 8:a1481d5f0572 54 int flag_disp = 1; //Anti-flickering
khaiminhvn 9:6e950b9a9a81 55 int flag_bres = 0; //Flag for checking button released
khaiminhvn 14:3989d03a8b98 56 int flag_flas = 1; //Flag for flashing symbol
khaiminhvn 24:ea7abc25a697 57 int flag_cali = 0; //Flag for calibration
khaiminhvn 28:1b8e1d100b58 58 int flag_rec = 0; //Flag for auto reconnection
khaiminhvn 26:b30a61a55b2f 59 bool flag_eth = false; //Flag for ethernet connection
jump_man 17:238ccf7e3676 60 bool flag_aTrack; //Flag for active tracking (0 - offline, 1 - online)
khaiminhvn 26:b30a61a55b2f 61 bool flag_powerOn = true;
khaiminhvn 20:0a6609515810 62 float sun_angle;
khaiminhvn 8:a1481d5f0572 63
khaiminhvn 28:1b8e1d100b58 64 //PUSHBUTTONS
khaiminhvn 8:a1481d5f0572 65 Pushbutton bt_inc(PIN_BTINC);
khaiminhvn 8:a1481d5f0572 66 Pushbutton bt_dec(PIN_BTDEC);
khaiminhvn 20:0a6609515810 67 Pushbutton bt_fn(PIN_BTFN,&mode,&flag_disp,PIN_BTINC);
khaiminhvn 8:a1481d5f0572 68
khaiminhvn 28:1b8e1d100b58 69 //ETHERNET INTERFACE
khaiminhvn 28:1b8e1d100b58 70 GUI* gui;
khaiminhvn 28:1b8e1d100b58 71 Inverter* inverter;
khaiminhvn 28:1b8e1d100b58 72
khaiminhvn 11:2ade1ad7bad6 73 string topL = "INITIALIZING";
khaiminhvn 11:2ade1ad7bad6 74 string botL = "";
khaiminhvn 11:2ade1ad7bad6 75 lcd.LCD_display(topL, botL);
khaiminhvn 0:74d6e93ec977 76
khaiminhvn 0:74d6e93ec977 77 t.start(); //Start timer
khaiminhvn 10:566529fff615 78 t_disp.start();
khaiminhvn 30:7fce3ae08754 79 t_wind.start();
khaiminhvn 6:0b7a6e51cdf8 80
khaiminhvn 0:74d6e93ec977 81 while(1)
khaiminhvn 0:74d6e93ec977 82 {
khaiminhvn 0:74d6e93ec977 83 switch(mode)
khaiminhvn 0:74d6e93ec977 84 {
khaiminhvn 28:1b8e1d100b58 85 case OP_ETHERNET:{
khaiminhvn 28:1b8e1d100b58 86 topL = "CONNECT ONLINE?";
khaiminhvn 29:5b14b0ec5efc 87 botL = "NO[DE] YES[IN]";
khaiminhvn 28:1b8e1d100b58 88 lcd.LCD_display(topL,botL);
khaiminhvn 28:1b8e1d100b58 89 while(true){
khaiminhvn 28:1b8e1d100b58 90 if(bt_inc.read()){
khaiminhvn 29:5b14b0ec5efc 91 topL = "CONNECTING";
khaiminhvn 29:5b14b0ec5efc 92 botL = "";
khaiminhvn 29:5b14b0ec5efc 93 lcd.LCD_display(topL, botL);
khaiminhvn 28:1b8e1d100b58 94 flag_rec = 1;
khaiminhvn 28:1b8e1d100b58 95 eth.connect();
khaiminhvn 28:1b8e1d100b58 96 gui = new GUI("ws://int-sol-ref.herokuapp.com/", &eth, &flag_eth);
khaiminhvn 28:1b8e1d100b58 97 inverter = new Inverter("int-sol-ref.herokuapp.com", 80, &eth);
khaiminhvn 28:1b8e1d100b58 98 bt_fn.setConnected(flag_eth);
khaiminhvn 28:1b8e1d100b58 99
khaiminhvn 28:1b8e1d100b58 100 if (flag_eth){gui->getSunAngle();}
khaiminhvn 28:1b8e1d100b58 101 if (flag_eth){
khaiminhvn 28:1b8e1d100b58 102 topL = "ETHERNET";
khaiminhvn 28:1b8e1d100b58 103 botL = "CONNECTED";
khaiminhvn 28:1b8e1d100b58 104 lcd.LCD_display(topL, botL);
khaiminhvn 28:1b8e1d100b58 105 }
khaiminhvn 28:1b8e1d100b58 106 else{
khaiminhvn 28:1b8e1d100b58 107 topL = "ETHERNET";
khaiminhvn 28:1b8e1d100b58 108 botL = "NOT CONNECTED";
khaiminhvn 28:1b8e1d100b58 109 lcd.LCD_display(topL, botL);
khaiminhvn 28:1b8e1d100b58 110 }
khaiminhvn 28:1b8e1d100b58 111 wait_us(1000000);
khaiminhvn 28:1b8e1d100b58 112 t_recon.start();
khaiminhvn 28:1b8e1d100b58 113 break;
khaiminhvn 28:1b8e1d100b58 114 }
khaiminhvn 28:1b8e1d100b58 115 else if(bt_dec.read()){
khaiminhvn 28:1b8e1d100b58 116 flag_rec = 0;
khaiminhvn 28:1b8e1d100b58 117 break;
khaiminhvn 28:1b8e1d100b58 118 }
khaiminhvn 28:1b8e1d100b58 119 }
khaiminhvn 28:1b8e1d100b58 120
khaiminhvn 28:1b8e1d100b58 121 mode = OP_CALIBRATION;
khaiminhvn 28:1b8e1d100b58 122 break;
khaiminhvn 28:1b8e1d100b58 123 }
khaiminhvn 28:1b8e1d100b58 124 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 28:1b8e1d100b58 125 case OP_CALIBRATION:{
khaiminhvn 28:1b8e1d100b58 126 if(flag_disp){
khaiminhvn 28:1b8e1d100b58 127 topL = "PUT SENSORS IN";
khaiminhvn 28:1b8e1d100b58 128 botL = "CALIBRATION SLOT";
khaiminhvn 28:1b8e1d100b58 129 lcd.LCD_display(topL, botL);
khaiminhvn 28:1b8e1d100b58 130 flag_disp = 0;
khaiminhvn 28:1b8e1d100b58 131 }
khaiminhvn 28:1b8e1d100b58 132 break;
khaiminhvn 28:1b8e1d100b58 133 }
khaiminhvn 28:1b8e1d100b58 134 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 135 case OP_PLACEMENT:{
khaiminhvn 24:ea7abc25a697 136 if(flag_cali == 0){
khaiminhvn 24:ea7abc25a697 137 topL = "CALIBRATING";
khaiminhvn 24:ea7abc25a697 138 botL = "";
khaiminhvn 24:ea7abc25a697 139 lcd.LCD_display(topL,botL);
khaiminhvn 24:ea7abc25a697 140 acc.calibrate();
khaiminhvn 24:ea7abc25a697 141 topL = "PUT SENSOR ON";
khaiminhvn 24:ea7abc25a697 142 botL = "PANEL&REFLECTORS";
khaiminhvn 24:ea7abc25a697 143 lcd.LCD_display(topL,botL);
khaiminhvn 24:ea7abc25a697 144 flag_cali = 1;
khaiminhvn 24:ea7abc25a697 145 }
khaiminhvn 28:1b8e1d100b58 146 flag_disp = 1;
khaiminhvn 7:2b6438e586e6 147 break;
khaiminhvn 8:a1481d5f0572 148 }
khaiminhvn 0:74d6e93ec977 149 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 14:3989d03a8b98 150 case OP_CONFIRM:{
khaiminhvn 14:3989d03a8b98 151 while(mode == OP_CONFIRM){
khaiminhvn 14:3989d03a8b98 152 topL = "R1 || P || R2";
khaiminhvn 16:326404a7a8b8 153 botL = Misc::itos(acc.getAngle(S_R1),3) +
khaiminhvn 16:326404a7a8b8 154 "||" + Misc::itos(acc.getAngle(S_PANEL),3) +
khaiminhvn 16:326404a7a8b8 155 "||" + Misc::itos(acc.getAngle(S_R2),3);
khaiminhvn 14:3989d03a8b98 156 lcd.LCD_display(topL,botL);
khaiminhvn 14:3989d03a8b98 157 flag_disp = 0;
khaiminhvn 14:3989d03a8b98 158 wait_us(LCD_RRATE);
khaiminhvn 14:3989d03a8b98 159 }
khaiminhvn 14:3989d03a8b98 160 }
khaiminhvn 14:3989d03a8b98 161 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 162 case OP_NORMAL:{
khaiminhvn 28:1b8e1d100b58 163 if (flag_eth && prevm != mode){gui->state(mode);}
khaiminhvn 28:1b8e1d100b58 164 if (flag_eth){gui->getSunAngle();}
khaiminhvn 28:1b8e1d100b58 165 if (flag_eth){gui->receives(&wthres, &flag_aTrack, &flag_powerOn,&sun_angle);}
khaiminhvn 27:26f41a320436 166 prevm = mode;
khaiminhvn 26:b30a61a55b2f 167 mode = (flag_powerOn) ? mode : OP_POWER_OFF; if(mode != OP_NORMAL){break;}
khaiminhvn 16:326404a7a8b8 168 fan.checkTemp(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 16:326404a7a8b8 169 ane.checkWind(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 30:7fce3ae08754 170 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 12:14bac44e33b9 171 topL = "NORMAL:IDLING";
khaiminhvn 24:ea7abc25a697 172 topL = (flag_aTrack) ? topL : "*" + topL;
khaiminhvn 14:3989d03a8b98 173 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 29:5b14b0ec5efc 174 botL = Misc::itos(ane.getWind(&flag_disp)) + "kph " + Misc::itos(fan.getTemp()) + "C "
khaiminhvn 28:1b8e1d100b58 175 + ((flag_eth)?Misc::itos(inverter->getPower()):"---") + "W";
khaiminhvn 10:566529fff615 176 t_disp.reset();
khaiminhvn 10:566529fff615 177 t_disp.start();
khaiminhvn 8:a1481d5f0572 178 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 179 }
khaiminhvn 0:74d6e93ec977 180
khaiminhvn 12:14bac44e33b9 181 if(flag_time) //If delay interval has passed
khaiminhvn 12:14bac44e33b9 182 {
khaiminhvn 12:14bac44e33b9 183 ane.checkWind(&mode);
khaiminhvn 12:14bac44e33b9 184 //Get Angle of Panel
khaiminhvn 20:0a6609515810 185 if(flag_aTrack)
khaiminhvn 20:0a6609515810 186 ang_P = acc.getAngle(S_PANEL);
khaiminhvn 20:0a6609515810 187 else{
khaiminhvn 28:1b8e1d100b58 188 if (flag_eth){gui->receives(&wthres, &flag_aTrack, &flag_powerOn,&sun_angle);}
khaiminhvn 26:b30a61a55b2f 189 mode = (flag_powerOn) ? mode : OP_POWER_OFF; if(mode != OP_NORMAL){break;}
khaiminhvn 20:0a6609515810 190 ang_P = sun_angle;
khaiminhvn 20:0a6609515810 191 }
khaiminhvn 12:14bac44e33b9 192
khaiminhvn 12:14bac44e33b9 193 //Calculate the Angle of Both Reflector
khaiminhvn 12:14bac44e33b9 194 ref_R1 = Algorithm::calcAngle(1,ang_P);
khaiminhvn 12:14bac44e33b9 195 ref_R2 = Algorithm::calcAngle(2,ang_P);
khaiminhvn 12:14bac44e33b9 196
khaiminhvn 14:3989d03a8b98 197 //Moving Reflector 1
khaiminhvn 12:14bac44e33b9 198 ang_R = acc.getAngle(S_R1);
khaiminhvn 15:2b3b5d8bf692 199 while(ang_R <= ref_R1 && !acc.checkAngle(ref_R1,ang_R) && mode == OP_NORMAL)
khaiminhvn 12:14bac44e33b9 200 {
khaiminhvn 28:1b8e1d100b58 201 if (flag_eth){gui->receives(&wthres, &flag_aTrack, &flag_powerOn,&sun_angle);}
khaiminhvn 26:b30a61a55b2f 202 mode = (flag_powerOn) ? mode : OP_POWER_OFF; if(mode != OP_NORMAL){break;}
khaiminhvn 30:7fce3ae08754 203 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 16:326404a7a8b8 204 fan.checkTemp(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 16:326404a7a8b8 205 ane.checkWind(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 14:3989d03a8b98 206 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 207 topL = (flag_flas)? "NORMAL:R1 <=>" : "NORMAL:R1 <-=->";
khaiminhvn 24:ea7abc25a697 208 topL = (flag_aTrack) ? topL : "*" + topL;
khaiminhvn 14:3989d03a8b98 209 flag_flas = !flag_flas;
khaiminhvn 29:5b14b0ec5efc 210 botL = Misc::itos(ane.getWind(&flag_disp)) + "kph " + Misc::itos(fan.getTemp()) + "C "
khaiminhvn 28:1b8e1d100b58 211 + ((flag_eth)?Misc::itos(inverter->getPower()):"---") + "W";
khaiminhvn 14:3989d03a8b98 212 t_disp.reset();
khaiminhvn 14:3989d03a8b98 213 t_disp.start();
khaiminhvn 14:3989d03a8b98 214 }
khaiminhvn 14:3989d03a8b98 215 lcd.LCD_display(topL,botL);
khaiminhvn 12:14bac44e33b9 216 motor.moveForward(M1);
khaiminhvn 12:14bac44e33b9 217 ang_R = acc.getAngle(S_R1);
khaiminhvn 12:14bac44e33b9 218 }
khaiminhvn 15:2b3b5d8bf692 219 while(ang_R >= ref_R1 && !acc.checkAngle(ref_R1,ang_R) && mode == OP_NORMAL)
khaiminhvn 12:14bac44e33b9 220 {
khaiminhvn 28:1b8e1d100b58 221 if (flag_eth){gui->receives(&wthres, &flag_aTrack, &flag_powerOn,&sun_angle);}
khaiminhvn 26:b30a61a55b2f 222 mode = (flag_powerOn) ? mode : OP_POWER_OFF; if(mode != OP_NORMAL){break;}
khaiminhvn 30:7fce3ae08754 223 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 16:326404a7a8b8 224 fan.checkTemp(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 16:326404a7a8b8 225 ane.checkWind(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 14:3989d03a8b98 226 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 227 topL = (flag_flas)? "NORMAL:R1 > = < " : "NORMAL:R1 ->=<-";
khaiminhvn 24:ea7abc25a697 228 topL = (flag_aTrack) ? topL : "*" + topL;
khaiminhvn 14:3989d03a8b98 229 flag_flas = !flag_flas;
khaiminhvn 29:5b14b0ec5efc 230 botL = Misc::itos(ane.getWind(&flag_disp)) + "kph " + Misc::itos(fan.getTemp()) + "C "
khaiminhvn 28:1b8e1d100b58 231 + ((flag_eth)?Misc::itos(inverter->getPower()):"---") + "W";
khaiminhvn 14:3989d03a8b98 232 t_disp.reset();
khaiminhvn 14:3989d03a8b98 233 t_disp.start();
khaiminhvn 14:3989d03a8b98 234 }
khaiminhvn 14:3989d03a8b98 235 lcd.LCD_display(topL,botL);
khaiminhvn 12:14bac44e33b9 236 motor.moveBackward(M1);
khaiminhvn 12:14bac44e33b9 237 ang_R = acc.getAngle(S_R1);
khaiminhvn 12:14bac44e33b9 238 }
khaiminhvn 12:14bac44e33b9 239 motor.stop();
khaiminhvn 12:14bac44e33b9 240
khaiminhvn 12:14bac44e33b9 241 //Moving Reflector 2
khaiminhvn 12:14bac44e33b9 242 ang_R = acc.getAngle(S_R2);
khaiminhvn 15:2b3b5d8bf692 243 while(ang_R <= ref_R2 && !acc.checkAngle(ref_R2,ang_R) && mode == OP_NORMAL)
khaiminhvn 12:14bac44e33b9 244 {
khaiminhvn 28:1b8e1d100b58 245 if (flag_eth){gui->receives(&wthres, &flag_aTrack, &flag_powerOn,&sun_angle);}
khaiminhvn 26:b30a61a55b2f 246 mode = (flag_powerOn) ? mode : OP_POWER_OFF; if(mode != OP_NORMAL){break;}
khaiminhvn 30:7fce3ae08754 247 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 16:326404a7a8b8 248 fan.checkTemp(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 16:326404a7a8b8 249 ane.checkWind(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 14:3989d03a8b98 250 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 251 topL = (flag_flas)? "NORMAL:R2 <=>" : "NORMAL:R2 <-=->";
khaiminhvn 24:ea7abc25a697 252 topL = (flag_aTrack) ? topL : "*" + topL;
khaiminhvn 14:3989d03a8b98 253 flag_flas = !flag_flas;
khaiminhvn 29:5b14b0ec5efc 254 botL = Misc::itos(ane.getWind(&flag_disp)) + "kph " + Misc::itos(fan.getTemp()) + "C "
khaiminhvn 28:1b8e1d100b58 255 + ((flag_eth)?Misc::itos(inverter->getPower()):"---") + "W";
khaiminhvn 14:3989d03a8b98 256 t_disp.reset();
khaiminhvn 14:3989d03a8b98 257 t_disp.start();
khaiminhvn 14:3989d03a8b98 258 }
khaiminhvn 14:3989d03a8b98 259 lcd.LCD_display(topL,botL);
khaiminhvn 12:14bac44e33b9 260 motor.moveForward(M2);
khaiminhvn 12:14bac44e33b9 261 ang_R = acc.getAngle(S_R2);
khaiminhvn 12:14bac44e33b9 262 }
khaiminhvn 15:2b3b5d8bf692 263 while(ang_R >= ref_R2 && !acc.checkAngle(ref_R2,ang_R) && mode == OP_NORMAL)
khaiminhvn 12:14bac44e33b9 264 {
khaiminhvn 28:1b8e1d100b58 265 if (flag_eth){gui->receives(&wthres, &flag_aTrack, &flag_powerOn,&sun_angle);}
khaiminhvn 26:b30a61a55b2f 266 mode = (flag_powerOn) ? mode : OP_POWER_OFF; if(mode != OP_NORMAL){break;}
khaiminhvn 30:7fce3ae08754 267 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 16:326404a7a8b8 268 fan.checkTemp(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 16:326404a7a8b8 269 ane.checkWind(&mode);if(mode != OP_NORMAL){break;}
khaiminhvn 14:3989d03a8b98 270 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 271 topL = (flag_flas)? "NORMAL:R2 > = < " : "NORMAL:R2 ->=<-";
khaiminhvn 24:ea7abc25a697 272 topL = (flag_aTrack) ? topL : "*" + topL;
khaiminhvn 14:3989d03a8b98 273 flag_flas = !flag_flas;
khaiminhvn 29:5b14b0ec5efc 274 botL = Misc::itos(ane.getWind(&flag_disp)) + "kph " + Misc::itos(fan.getTemp()) + "C "
khaiminhvn 28:1b8e1d100b58 275 + ((flag_eth)?Misc::itos(inverter->getPower()):"---") + "W";
khaiminhvn 14:3989d03a8b98 276 t_disp.reset();
khaiminhvn 14:3989d03a8b98 277 t_disp.start();
khaiminhvn 14:3989d03a8b98 278 }
khaiminhvn 14:3989d03a8b98 279 lcd.LCD_display(topL,botL);
khaiminhvn 12:14bac44e33b9 280 motor.moveBackward(M2);
khaiminhvn 12:14bac44e33b9 281 ang_R = acc.getAngle(S_R2);
khaiminhvn 12:14bac44e33b9 282 }
khaiminhvn 12:14bac44e33b9 283 motor.stop();
khaiminhvn 12:14bac44e33b9 284 flag_time = 0; //Reset timer flag
khaiminhvn 12:14bac44e33b9 285 flag_disp = 1; //Reset display flag
khaiminhvn 12:14bac44e33b9 286 t.reset(); //Reset timer
khaiminhvn 12:14bac44e33b9 287 }
khaiminhvn 12:14bac44e33b9 288 t_elapsed = (int)timer_read_s(t);
khaiminhvn 12:14bac44e33b9 289 flag_time = (t_elapsed >= TIME_NORMAL) ? 1 : 0; //Enable flag if delay interval has passed
khaiminhvn 9:6e950b9a9a81 290 flag_idle = 0;
khaiminhvn 7:2b6438e586e6 291 break;
khaiminhvn 8:a1481d5f0572 292 }
khaiminhvn 7:2b6438e586e6 293 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 294 case OP_WIND:{
khaiminhvn 28:1b8e1d100b58 295 if (flag_eth && prevm != mode){gui->state(mode);}
khaiminhvn 28:1b8e1d100b58 296 if (flag_eth){gui->receives(&wthres, &flag_aTrack, &flag_powerOn,&sun_angle);}
khaiminhvn 29:5b14b0ec5efc 297 mode = (flag_powerOn) ? mode : OP_POWER_OFF; if(mode != OP_WIND){break;}
khaiminhvn 30:7fce3ae08754 298 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 27:26f41a320436 299 prevm = mode;
khaiminhvn 16:326404a7a8b8 300 fan.checkTemp(&mode);if(mode != OP_WIND){break;}
khaiminhvn 16:326404a7a8b8 301 ane.checkWind(&mode);if(mode != OP_WIND){break;}
khaiminhvn 14:3989d03a8b98 302 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 303 topL = (flag_flas)? "WIND SAFETY *!*" : "WIND SAFETY";
khaiminhvn 15:2b3b5d8bf692 304 flag_flas = !flag_flas;
khaiminhvn 29:5b14b0ec5efc 305 botL = Misc::itos(ane.getWind(&flag_disp)) + "kph " + Misc::itos(fan.getTemp()) + "C "
khaiminhvn 28:1b8e1d100b58 306 + ((flag_eth)?Misc::itos(inverter->getPower()):"---") + "W";
khaiminhvn 29:5b14b0ec5efc 307 lcd.LCD_display(topL,botL);
khaiminhvn 10:566529fff615 308 t_disp.reset();
khaiminhvn 10:566529fff615 309 t_disp.start();
khaiminhvn 10:566529fff615 310 }
khaiminhvn 0:74d6e93ec977 311
khaiminhvn 11:2ade1ad7bad6 312 //Move all motor backward
khaiminhvn 11:2ade1ad7bad6 313 motor.moveBackward(M_ALL);
khaiminhvn 11:2ade1ad7bad6 314 flag_time = 1; //Set the system in motion once windspeed has subsided
khaiminhvn 9:6e950b9a9a81 315 flag_idle = 0;
khaiminhvn 7:2b6438e586e6 316 break;
khaiminhvn 8:a1481d5f0572 317 }
khaiminhvn 0:74d6e93ec977 318 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 319 case OP_MANUAL1:{
khaiminhvn 28:1b8e1d100b58 320 if (flag_eth && prevm != mode){gui->state(mode);}
khaiminhvn 30:7fce3ae08754 321 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 27:26f41a320436 322 prevm = mode;
khaiminhvn 16:326404a7a8b8 323 fan.checkTemp(&mode);if(mode != OP_MANUAL1){break;}
khaiminhvn 15:2b3b5d8bf692 324 topL = "MANUAL:M1";
khaiminhvn 29:5b14b0ec5efc 325 botL = Misc::itos(ane.getWind(&flag_disp)) + "kph " + Misc::itos(fan.getTemp()) + "C "
khaiminhvn 29:5b14b0ec5efc 326 + Misc::itos(acc.getAngle(S_R1)) + "deg";
khaiminhvn 8:a1481d5f0572 327 if(flag_disp){
khaiminhvn 8:a1481d5f0572 328 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 329 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 330 }
khaiminhvn 0:74d6e93ec977 331
khaiminhvn 12:14bac44e33b9 332 //TIMEOUT
khaiminhvn 12:14bac44e33b9 333 ////////////////////////////////////////////////////////////////////
khaiminhvn 12:14bac44e33b9 334 if(!flag_idle) //Check if button is not pressed
khaiminhvn 12:14bac44e33b9 335 {
khaiminhvn 12:14bac44e33b9 336 t_mode.reset();
khaiminhvn 12:14bac44e33b9 337 t_mode.start();
khaiminhvn 12:14bac44e33b9 338 flag_idle = 1; //Indicate idling
khaiminhvn 12:14bac44e33b9 339 }
khaiminhvn 12:14bac44e33b9 340 else if(timer_read_s(t_mode) > TIME_MANUAL_TIMEOUT)
khaiminhvn 12:14bac44e33b9 341 {
khaiminhvn 12:14bac44e33b9 342 mode = OP_NORMAL;
khaiminhvn 12:14bac44e33b9 343 flag_disp = 1;
khaiminhvn 12:14bac44e33b9 344 break;
khaiminhvn 12:14bac44e33b9 345 }
khaiminhvn 12:14bac44e33b9 346 ////////////////////////////////////////////////////////////////////
khaiminhvn 12:14bac44e33b9 347
khaiminhvn 12:14bac44e33b9 348 while(bt_inc.read()) //Extend
khaiminhvn 12:14bac44e33b9 349 {
khaiminhvn 30:7fce3ae08754 350 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 15:2b3b5d8bf692 351 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 352 topL = (flag_flas)? "MANUAL:M1 <=> " : "MANUAL:M1 <-=->";
khaiminhvn 15:2b3b5d8bf692 353 flag_flas = !flag_flas;
khaiminhvn 15:2b3b5d8bf692 354 t_disp.reset();
khaiminhvn 15:2b3b5d8bf692 355 t_disp.start();
khaiminhvn 29:5b14b0ec5efc 356 botL = "EXTEND" + Misc::blank(5) + Misc::itos(acc.getAngle(S_R1)) + "deg";
khaiminhvn 12:14bac44e33b9 357 lcd.LCD_display(topL,botL);
khaiminhvn 12:14bac44e33b9 358 }
khaiminhvn 15:2b3b5d8bf692 359
khaiminhvn 12:14bac44e33b9 360 flag_idle = 0;
khaiminhvn 12:14bac44e33b9 361 motor.moveForward(M1);
khaiminhvn 12:14bac44e33b9 362 }
khaiminhvn 12:14bac44e33b9 363 while(bt_dec.read()) //Retract
khaiminhvn 12:14bac44e33b9 364 {
khaiminhvn 30:7fce3ae08754 365 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 15:2b3b5d8bf692 366 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 367 topL = (flag_flas)? "MANUAL:M1 > = <" : "MANUAL:M1 ->=<-";
khaiminhvn 15:2b3b5d8bf692 368 flag_flas = !flag_flas;
khaiminhvn 15:2b3b5d8bf692 369 t_disp.reset();
khaiminhvn 15:2b3b5d8bf692 370 t_disp.start();
khaiminhvn 29:5b14b0ec5efc 371 botL = "RETRACT"+ Misc::blank(4) + Misc::itos(acc.getAngle(S_R1)) + "deg";
khaiminhvn 12:14bac44e33b9 372 lcd.LCD_display(topL,botL);
khaiminhvn 12:14bac44e33b9 373 }
khaiminhvn 12:14bac44e33b9 374 flag_idle = 0;
khaiminhvn 12:14bac44e33b9 375 motor.moveBackward(M1);
khaiminhvn 12:14bac44e33b9 376 }
khaiminhvn 12:14bac44e33b9 377 if(!bt_inc.read() && !bt_dec.read() && !flag_disp)
khaiminhvn 12:14bac44e33b9 378 {
khaiminhvn 12:14bac44e33b9 379 flag_disp = 1;
khaiminhvn 12:14bac44e33b9 380 motor.stop();
khaiminhvn 12:14bac44e33b9 381 }
khaiminhvn 15:2b3b5d8bf692 382 flag_time = 1;
khaiminhvn 7:2b6438e586e6 383 break;
khaiminhvn 8:a1481d5f0572 384 }
khaiminhvn 7:2b6438e586e6 385 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 386 case OP_MANUAL2:{
khaiminhvn 28:1b8e1d100b58 387 if (flag_eth && prevm != mode){gui->state(mode);}
khaiminhvn 30:7fce3ae08754 388 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 27:26f41a320436 389 prevm = mode;
khaiminhvn 16:326404a7a8b8 390 fan.checkTemp(&mode);if(mode != OP_MANUAL2){break;}
khaiminhvn 15:2b3b5d8bf692 391 topL = "MANUAL:M2";
khaiminhvn 29:5b14b0ec5efc 392 botL = Misc::itos(ane.getWind(&flag_disp)) + "kph " + Misc::itos(fan.getTemp()) + "C "
khaiminhvn 29:5b14b0ec5efc 393 + Misc::itos(acc.getAngle(S_R2)) + "deg";
khaiminhvn 8:a1481d5f0572 394 if(flag_disp){
khaiminhvn 8:a1481d5f0572 395 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 396 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 397 }
khaiminhvn 12:14bac44e33b9 398
khaiminhvn 12:14bac44e33b9 399 //TIMEOUT
khaiminhvn 12:14bac44e33b9 400 ////////////////////////////////////////////////////////////////////
khaiminhvn 12:14bac44e33b9 401 if(!flag_idle) //Check if button is not pressed
khaiminhvn 12:14bac44e33b9 402 {
khaiminhvn 12:14bac44e33b9 403 t_mode.reset();
khaiminhvn 12:14bac44e33b9 404 t_mode.start();
khaiminhvn 12:14bac44e33b9 405 flag_idle = 1; //Indicate idling
khaiminhvn 12:14bac44e33b9 406 }
khaiminhvn 12:14bac44e33b9 407 else if(timer_read_s(t_mode) > TIME_MANUAL_TIMEOUT)
khaiminhvn 12:14bac44e33b9 408 {
khaiminhvn 12:14bac44e33b9 409 mode = OP_NORMAL;
khaiminhvn 12:14bac44e33b9 410 flag_disp = 1;
khaiminhvn 12:14bac44e33b9 411 break;
khaiminhvn 12:14bac44e33b9 412 }
khaiminhvn 12:14bac44e33b9 413 ////////////////////////////////////////////////////////////////////
khaiminhvn 12:14bac44e33b9 414
khaiminhvn 12:14bac44e33b9 415 while(bt_inc.read()) //Extend
khaiminhvn 12:14bac44e33b9 416 {
khaiminhvn 30:7fce3ae08754 417 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 15:2b3b5d8bf692 418 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 419 topL = (flag_flas)? "MANUAL:M2 <=> " : "MANUAL:M2 <-=->";
khaiminhvn 15:2b3b5d8bf692 420 flag_flas = !flag_flas;
khaiminhvn 15:2b3b5d8bf692 421 t_disp.reset();
khaiminhvn 15:2b3b5d8bf692 422 t_disp.start();
khaiminhvn 29:5b14b0ec5efc 423 botL = "EXTEND" + Misc::blank(5) + Misc::itos(acc.getAngle(S_R2)) + "deg";
khaiminhvn 12:14bac44e33b9 424 lcd.LCD_display(topL,botL);
khaiminhvn 12:14bac44e33b9 425 }
khaiminhvn 15:2b3b5d8bf692 426
khaiminhvn 12:14bac44e33b9 427 flag_idle = 0;
khaiminhvn 16:326404a7a8b8 428 motor.moveForward(M2);
khaiminhvn 12:14bac44e33b9 429 }
khaiminhvn 12:14bac44e33b9 430 while(bt_dec.read()) //Retract
khaiminhvn 12:14bac44e33b9 431 {
khaiminhvn 30:7fce3ae08754 432 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 15:2b3b5d8bf692 433 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 434 topL = (flag_flas)? "MANUAL:M2 > = <" : "MANUAL:M2 ->=<-";
khaiminhvn 15:2b3b5d8bf692 435 flag_flas = !flag_flas;
khaiminhvn 15:2b3b5d8bf692 436 t_disp.reset();
khaiminhvn 15:2b3b5d8bf692 437 t_disp.start();
khaiminhvn 29:5b14b0ec5efc 438 botL = "RETRACT" + Misc::blank(4) + Misc::itos(acc.getAngle(S_R2)) + "deg";
khaiminhvn 12:14bac44e33b9 439 lcd.LCD_display(topL,botL);
khaiminhvn 12:14bac44e33b9 440 }
khaiminhvn 12:14bac44e33b9 441 flag_idle = 0;
khaiminhvn 16:326404a7a8b8 442 motor.moveBackward(M2);
khaiminhvn 12:14bac44e33b9 443 }
khaiminhvn 12:14bac44e33b9 444 if(!bt_inc.read() && !bt_dec.read() && !flag_disp)
khaiminhvn 12:14bac44e33b9 445 {
khaiminhvn 12:14bac44e33b9 446 flag_disp = 1;
khaiminhvn 12:14bac44e33b9 447 motor.stop();
khaiminhvn 12:14bac44e33b9 448 }
khaiminhvn 15:2b3b5d8bf692 449 flag_time = 1;
khaiminhvn 15:2b3b5d8bf692 450 break;
khaiminhvn 15:2b3b5d8bf692 451 }
khaiminhvn 15:2b3b5d8bf692 452 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 15:2b3b5d8bf692 453 case OP_MANUAL_ALL:{
khaiminhvn 28:1b8e1d100b58 454 if (flag_eth && prevm != mode){gui->state(mode);}
khaiminhvn 30:7fce3ae08754 455 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 27:26f41a320436 456 prevm = mode;
khaiminhvn 16:326404a7a8b8 457 fan.checkTemp(&mode);if(mode != OP_MANUAL_ALL){break;}
khaiminhvn 15:2b3b5d8bf692 458 topL = "MANUAL:ALL";
khaiminhvn 29:5b14b0ec5efc 459 botL = Misc::itos(ane.getWind(&flag_disp)) + "kph " + Misc::itos(fan.getTemp()) + "C "
khaiminhvn 29:5b14b0ec5efc 460 + Misc::itos(acc.getAngle(S_R1)) + "|" + Misc::itos(acc.getAngle(S_R2));
khaiminhvn 15:2b3b5d8bf692 461 if(flag_disp){
khaiminhvn 15:2b3b5d8bf692 462 lcd.LCD_display(topL,botL);
khaiminhvn 15:2b3b5d8bf692 463 flag_disp = 0;
khaiminhvn 15:2b3b5d8bf692 464 }
khaiminhvn 15:2b3b5d8bf692 465
khaiminhvn 15:2b3b5d8bf692 466 //TIMEOUT
khaiminhvn 15:2b3b5d8bf692 467 ////////////////////////////////////////////////////////////////////
khaiminhvn 15:2b3b5d8bf692 468 if(!flag_idle) //Check if button is not pressed
khaiminhvn 15:2b3b5d8bf692 469 {
khaiminhvn 15:2b3b5d8bf692 470 t_mode.reset();
khaiminhvn 15:2b3b5d8bf692 471 t_mode.start();
khaiminhvn 15:2b3b5d8bf692 472 flag_idle = 1; //Indicate idling
khaiminhvn 15:2b3b5d8bf692 473 }
khaiminhvn 15:2b3b5d8bf692 474 else if(timer_read_s(t_mode) > TIME_MANUAL_TIMEOUT)
khaiminhvn 15:2b3b5d8bf692 475 {
khaiminhvn 15:2b3b5d8bf692 476 mode = OP_NORMAL;
khaiminhvn 15:2b3b5d8bf692 477 flag_disp = 1;
khaiminhvn 15:2b3b5d8bf692 478 break;
khaiminhvn 15:2b3b5d8bf692 479 }
khaiminhvn 15:2b3b5d8bf692 480 ////////////////////////////////////////////////////////////////////
khaiminhvn 15:2b3b5d8bf692 481
khaiminhvn 15:2b3b5d8bf692 482 while(bt_inc.read()) //Extend
khaiminhvn 15:2b3b5d8bf692 483 {
khaiminhvn 30:7fce3ae08754 484 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 15:2b3b5d8bf692 485 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 486 topL = (flag_flas)? "MANUAL:ALL <=> " : "MANUAL:ALL <-=->";
khaiminhvn 15:2b3b5d8bf692 487 flag_flas = !flag_flas;
khaiminhvn 15:2b3b5d8bf692 488 t_disp.reset();
khaiminhvn 15:2b3b5d8bf692 489 t_disp.start();
khaiminhvn 29:5b14b0ec5efc 490 botL = "EXTEND" + Misc::blank(5) + Misc::itos(acc.getAngle(S_R1)) + "|" + Misc::itos(acc.getAngle(S_R2));
khaiminhvn 15:2b3b5d8bf692 491 lcd.LCD_display(topL,botL);
khaiminhvn 15:2b3b5d8bf692 492 }
khaiminhvn 15:2b3b5d8bf692 493
khaiminhvn 15:2b3b5d8bf692 494 flag_idle = 0;
khaiminhvn 16:326404a7a8b8 495 motor.moveForward(M_ALL);
khaiminhvn 15:2b3b5d8bf692 496 }
khaiminhvn 15:2b3b5d8bf692 497 while(bt_dec.read()) //Retract
khaiminhvn 15:2b3b5d8bf692 498 {
khaiminhvn 30:7fce3ae08754 499 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 15:2b3b5d8bf692 500 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 15:2b3b5d8bf692 501 topL = (flag_flas)? "MANUAL:ALL > = <" : "MANUAL:ALL ->=<-";
khaiminhvn 15:2b3b5d8bf692 502 flag_flas = !flag_flas;
khaiminhvn 15:2b3b5d8bf692 503 t_disp.reset();
khaiminhvn 15:2b3b5d8bf692 504 t_disp.start();
khaiminhvn 29:5b14b0ec5efc 505 botL = "RETRACT" + Misc::blank(4) + Misc::itos(acc.getAngle(S_R1)) + "|" + Misc::itos(acc.getAngle(S_R2));
khaiminhvn 15:2b3b5d8bf692 506 lcd.LCD_display(topL,botL);
khaiminhvn 15:2b3b5d8bf692 507 }
khaiminhvn 15:2b3b5d8bf692 508 flag_idle = 0;
khaiminhvn 16:326404a7a8b8 509 motor.moveBackward(M_ALL);
khaiminhvn 15:2b3b5d8bf692 510 }
khaiminhvn 15:2b3b5d8bf692 511 if(!bt_inc.read() && !bt_dec.read() && !flag_disp)
khaiminhvn 15:2b3b5d8bf692 512 {
khaiminhvn 15:2b3b5d8bf692 513 flag_disp = 1;
khaiminhvn 15:2b3b5d8bf692 514 motor.stop();
khaiminhvn 15:2b3b5d8bf692 515 }
khaiminhvn 15:2b3b5d8bf692 516 flag_time = 1;
khaiminhvn 0:74d6e93ec977 517 break;
khaiminhvn 8:a1481d5f0572 518 }
khaiminhvn 7:2b6438e586e6 519 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 520 case OP_WSETTING:{
khaiminhvn 28:1b8e1d100b58 521 if (flag_eth && prevm != mode){gui->state(mode);}
khaiminhvn 30:7fce3ae08754 522 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 27:26f41a320436 523 prevm = mode;
khaiminhvn 16:326404a7a8b8 524 fan.checkTemp(&mode);if(mode != OP_WSETTING){break;}
khaiminhvn 7:2b6438e586e6 525 topL = "Threshold:";
khaiminhvn 9:6e950b9a9a81 526 botL = Misc::itos(wthres) + " kph";
khaiminhvn 8:a1481d5f0572 527 if(flag_disp){
khaiminhvn 8:a1481d5f0572 528 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 529 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 530 }
khaiminhvn 0:74d6e93ec977 531
khaiminhvn 9:6e950b9a9a81 532 //TIMEOUT
khaiminhvn 9:6e950b9a9a81 533 ////////////////////////////////////////////////////////////////////
khaiminhvn 9:6e950b9a9a81 534 if(!flag_idle) //Check if button is not pressed
khaiminhvn 9:6e950b9a9a81 535 {
khaiminhvn 9:6e950b9a9a81 536 t_mode.reset();
khaiminhvn 9:6e950b9a9a81 537 t_mode.start();
khaiminhvn 9:6e950b9a9a81 538 flag_idle = 1; //Indicate idling
khaiminhvn 9:6e950b9a9a81 539 }
khaiminhvn 9:6e950b9a9a81 540 else if(timer_read_s(t_mode) > TIME_WSETTING_TIMEOUT)
khaiminhvn 9:6e950b9a9a81 541 {
khaiminhvn 9:6e950b9a9a81 542 mode = OP_NORMAL;
khaiminhvn 9:6e950b9a9a81 543 flag_disp = 1;
khaiminhvn 9:6e950b9a9a81 544 break;
khaiminhvn 9:6e950b9a9a81 545 }
khaiminhvn 9:6e950b9a9a81 546 ////////////////////////////////////////////////////////////////////
khaiminhvn 9:6e950b9a9a81 547
khaiminhvn 9:6e950b9a9a81 548 if(!(flag_bres == 1 && bt_inc.read()) && !(flag_bres == -1 && bt_dec.read())){
khaiminhvn 9:6e950b9a9a81 549 if(bt_inc.read() && wthres < WIND_THRES_MAX)
khaiminhvn 9:6e950b9a9a81 550 {
khaiminhvn 24:ea7abc25a697 551 wthres += WIND_INC;
khaiminhvn 24:ea7abc25a697 552 ane.setThres(wthres);
khaiminhvn 28:1b8e1d100b58 553 if(flag_eth){gui->survivalSpeed(wthres);}
khaiminhvn 9:6e950b9a9a81 554 botL = Misc::itos(wthres) + " kph";
khaiminhvn 9:6e950b9a9a81 555 lcd.LCD_display(topL,botL);
khaiminhvn 9:6e950b9a9a81 556 flag_idle = 0;
khaiminhvn 9:6e950b9a9a81 557 flag_bres = 1;
khaiminhvn 9:6e950b9a9a81 558 }
khaiminhvn 9:6e950b9a9a81 559 else if(bt_dec.read() && wthres > WIND_THRES_MIN)
khaiminhvn 9:6e950b9a9a81 560 {
khaiminhvn 24:ea7abc25a697 561 wthres -= WIND_INC;
khaiminhvn 24:ea7abc25a697 562 ane.setThres(wthres);
khaiminhvn 28:1b8e1d100b58 563 if(flag_eth){gui->survivalSpeed(wthres);}
khaiminhvn 9:6e950b9a9a81 564 botL = Misc::itos(wthres) + " kph";
khaiminhvn 9:6e950b9a9a81 565 lcd.LCD_display(topL,botL);
khaiminhvn 9:6e950b9a9a81 566 flag_idle = 0;
khaiminhvn 9:6e950b9a9a81 567 flag_bres = -1;
khaiminhvn 9:6e950b9a9a81 568 }
khaiminhvn 9:6e950b9a9a81 569 else{
khaiminhvn 9:6e950b9a9a81 570 flag_bres = 0;
khaiminhvn 9:6e950b9a9a81 571 }
khaiminhvn 9:6e950b9a9a81 572 }
khaiminhvn 9:6e950b9a9a81 573
khaiminhvn 9:6e950b9a9a81 574 flag_time = 1; //Set the system in motion once done adjusting
khaiminhvn 7:2b6438e586e6 575 break;
khaiminhvn 8:a1481d5f0572 576 }
khaiminhvn 16:326404a7a8b8 577 ////////////////////////////////////////////////////////////////////////
khaiminhvn 16:326404a7a8b8 578 case OP_OVERHEAT:{
khaiminhvn 28:1b8e1d100b58 579 if (flag_eth && prevm != mode){gui->state(mode);}
khaiminhvn 30:7fce3ae08754 580 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 27:26f41a320436 581 prevm = mode;
khaiminhvn 16:326404a7a8b8 582 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 16:326404a7a8b8 583 topL = (flag_flas)? "*!* OVERHEAT *!*": " OVERHEAT ";
khaiminhvn 16:326404a7a8b8 584 botL = (flag_flas)? " KEEP DISTANCE " : (" " + Misc::itos(fan.getTemp(),3) + "C");
khaiminhvn 16:326404a7a8b8 585 flag_flas = !flag_flas;
khaiminhvn 16:326404a7a8b8 586 t_disp.reset();
khaiminhvn 16:326404a7a8b8 587 t_disp.start();
khaiminhvn 16:326404a7a8b8 588 lcd.LCD_display(topL,botL);
khaiminhvn 16:326404a7a8b8 589 }
khaiminhvn 16:326404a7a8b8 590 motor.moveBackward(M_ALL);
khaiminhvn 16:326404a7a8b8 591 fan.checkTemp(&mode);
khaiminhvn 16:326404a7a8b8 592 flag_disp = 1;
khaiminhvn 16:326404a7a8b8 593 flag_time = 1;
khaiminhvn 16:326404a7a8b8 594 break;
khaiminhvn 16:326404a7a8b8 595 }
khaiminhvn 16:326404a7a8b8 596 ////////////////////////////////////////////////////////////////////////
khaiminhvn 16:326404a7a8b8 597 case OP_OVERHEAT_MAN:{
khaiminhvn 28:1b8e1d100b58 598 if (flag_eth && prevm != mode){gui->state(mode);}
khaiminhvn 30:7fce3ae08754 599 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 27:26f41a320436 600 prevm = mode;
khaiminhvn 16:326404a7a8b8 601 if(timer_read_ms(t_disp) >= LCD_RRATE){
khaiminhvn 16:326404a7a8b8 602 topL = (flag_flas)? "*!* OVERHEAT *!*": " OVERHEAT ";
khaiminhvn 16:326404a7a8b8 603 botL = (flag_flas)? " PRESS FN " : (" " + Misc::itos(fan.getTemp(),3) + "C");
khaiminhvn 16:326404a7a8b8 604 flag_flas = !flag_flas;
khaiminhvn 16:326404a7a8b8 605 t_disp.reset();
khaiminhvn 16:326404a7a8b8 606 t_disp.start();
khaiminhvn 16:326404a7a8b8 607 lcd.LCD_display(topL,botL);
khaiminhvn 16:326404a7a8b8 608 }
khaiminhvn 16:326404a7a8b8 609 motor.stop();
khaiminhvn 16:326404a7a8b8 610 flag_disp = 1;
khaiminhvn 16:326404a7a8b8 611 break;
khaiminhvn 16:326404a7a8b8 612 }
jump_man 17:238ccf7e3676 613 ////////////////////////////////////////////////////////////////////////
jump_man 17:238ccf7e3676 614 case OP_POWER_OFF:{
khaiminhvn 28:1b8e1d100b58 615 if (flag_eth && prevm != mode){gui->state(mode);}
khaiminhvn 28:1b8e1d100b58 616 if (flag_eth){gui->receives(&wthres, &flag_aTrack, &flag_powerOn,&sun_angle);}
khaiminhvn 27:26f41a320436 617 prevm = mode;
jump_man 17:238ccf7e3676 618 if(mode != OP_POWER_OFF){break;}
khaiminhvn 26:b30a61a55b2f 619 if(flag_powerOn){
khaiminhvn 26:b30a61a55b2f 620 mode = OP_NORMAL;
khaiminhvn 26:b30a61a55b2f 621 break;
khaiminhvn 26:b30a61a55b2f 622 }
khaiminhvn 30:7fce3ae08754 623 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 26:b30a61a55b2f 624 fan.checkTemp(&mode);if(mode != OP_POWER_OFF){break;}
jump_man 17:238ccf7e3676 625 if(timer_read_ms(t_disp) >= LCD_RRATE){
jump_man 17:238ccf7e3676 626 topL = "SLEEP MODE";
jump_man 17:238ccf7e3676 627 flag_flas = !flag_flas;
jump_man 17:238ccf7e3676 628 botL = Misc::itos(ane.getWind(&flag_disp),3) + "kph | " + Misc::itos(fan.getTemp()) + "C";
jump_man 17:238ccf7e3676 629 t_disp.reset();
jump_man 17:238ccf7e3676 630 t_disp.start();
jump_man 17:238ccf7e3676 631 lcd.LCD_display(topL,botL);
jump_man 17:238ccf7e3676 632 }
jump_man 17:238ccf7e3676 633
jump_man 17:238ccf7e3676 634 //Move all motor backward
jump_man 17:238ccf7e3676 635 motor.moveBackward(M_ALL);
jump_man 17:238ccf7e3676 636 flag_time = 1; //Set the system in motion once windspeed has subsided
jump_man 17:238ccf7e3676 637 break;
jump_man 17:238ccf7e3676 638 }
khaiminhvn 20:0a6609515810 639 ////////////////////////////////////////////////////////////////////////
khaiminhvn 20:0a6609515810 640 case OP_ATRACK:{
khaiminhvn 28:1b8e1d100b58 641 if (flag_eth && prevm != mode){gui->state(mode);}
khaiminhvn 27:26f41a320436 642 prevm = mode;
khaiminhvn 20:0a6609515810 643 flag_aTrack = !flag_aTrack;
khaiminhvn 28:1b8e1d100b58 644 gui->activeTracking(flag_aTrack);
khaiminhvn 30:7fce3ae08754 645 if (flag_eth && timer_read_ms(t_wind) >= TIME_GUIWIND){gui->windSpeed(ane.getWind());t_wind.reset();t_wind.start();}
khaiminhvn 21:e9978d9823fe 646 fan.checkTemp(&mode);if(mode != OP_ATRACK){break;}
khaiminhvn 20:0a6609515810 647 topL = "TRACKING MODE:";
khaiminhvn 20:0a6609515810 648 botL = (flag_aTrack) ? "ACTIVE (ACC)" : "AUTO (ONLINE)";
khaiminhvn 20:0a6609515810 649 lcd.LCD_display(topL,botL);
khaiminhvn 20:0a6609515810 650 flag_disp = 0;
khaiminhvn 20:0a6609515810 651 wait_us(TIME_ATRACK_TIMEOUT);
khaiminhvn 20:0a6609515810 652
khaiminhvn 20:0a6609515810 653 mode = OP_NORMAL;
khaiminhvn 20:0a6609515810 654 flag_time = 1; //Set the system in motion once done adjusting
khaiminhvn 20:0a6609515810 655 break;
khaiminhvn 20:0a6609515810 656 }
khaiminhvn 20:0a6609515810 657 ////////////////////////////////////////////////////////////////////////
khaiminhvn 23:5dff9aed3727 658 case OP_RECONNECT:{
khaiminhvn 23:5dff9aed3727 659 topL = "CONNECTING";
khaiminhvn 23:5dff9aed3727 660 botL = "";
khaiminhvn 23:5dff9aed3727 661 lcd.LCD_display(topL,botL);
khaiminhvn 26:b30a61a55b2f 662
khaiminhvn 26:b30a61a55b2f 663 for(int i = 0; (i < CONN_N && !flag_eth); i++){
khaiminhvn 26:b30a61a55b2f 664 eth.connect();
khaiminhvn 28:1b8e1d100b58 665 gui->refreshConnection(URL,&flag_eth);
khaiminhvn 26:b30a61a55b2f 666 wait_us(1000000);
khaiminhvn 28:1b8e1d100b58 667 inverter->connect(URL, PORT);
khaiminhvn 26:b30a61a55b2f 668 }
khaiminhvn 26:b30a61a55b2f 669 wait_us(1000000);
khaiminhvn 23:5dff9aed3727 670 bt_fn.setConnected(flag_eth);
khaiminhvn 23:5dff9aed3727 671
khaiminhvn 28:1b8e1d100b58 672 if (flag_eth){gui->getSunAngle();}
khaiminhvn 23:5dff9aed3727 673 if (flag_eth){
khaiminhvn 23:5dff9aed3727 674 topL = "ETHERNET";
khaiminhvn 23:5dff9aed3727 675 botL = "CONNECTED";
khaiminhvn 23:5dff9aed3727 676 lcd.LCD_display(topL, botL);
khaiminhvn 23:5dff9aed3727 677 }
khaiminhvn 23:5dff9aed3727 678 else{
khaiminhvn 23:5dff9aed3727 679 topL = "ETHERNET";
khaiminhvn 23:5dff9aed3727 680 botL = "NOT CONNECTED";
khaiminhvn 23:5dff9aed3727 681 lcd.LCD_display(topL, botL);
khaiminhvn 23:5dff9aed3727 682 }
khaiminhvn 23:5dff9aed3727 683 wait_us(TIME_RECONNECT_TIMEOUT);
khaiminhvn 23:5dff9aed3727 684
khaiminhvn 23:5dff9aed3727 685 mode = OP_NORMAL;
khaiminhvn 23:5dff9aed3727 686 flag_time = 1; //Set the system in motion once done adjusting
khaiminhvn 23:5dff9aed3727 687 break;
khaiminhvn 23:5dff9aed3727 688 }
khaiminhvn 23:5dff9aed3727 689 ////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 690 }
khaiminhvn 28:1b8e1d100b58 691 if(!flag_eth && timer_read_s(t_recon) >= TIME_RECON && flag_rec){
khaiminhvn 26:b30a61a55b2f 692 eth.connect();
khaiminhvn 28:1b8e1d100b58 693 gui->refreshConnection(URL,&flag_eth);
khaiminhvn 28:1b8e1d100b58 694 inverter->connect(URL, PORT);
khaiminhvn 26:b30a61a55b2f 695 bt_fn.setConnected(flag_eth);
khaiminhvn 26:b30a61a55b2f 696 }
jump_man 17:238ccf7e3676 697
khaiminhvn 7:2b6438e586e6 698 wait_us(LOOP_DELAY);
khaiminhvn 0:74d6e93ec977 699 }
khaiminhvn 0:74d6e93ec977 700
khaiminhvn 0:74d6e93ec977 701 }
khaiminhvn 0:74d6e93ec977 702 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 703 ////////////////////////////////////////////////////////////////////////////////