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 15 18:47:41 2021 +0000
Revision:
35:aa4395b4a1a0
Parent:
32:7b58f5574b7a
Added power halting threshold

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