Project aiming to make a self-controlled solar reflector

Dependencies:   Accelerometer LCD Inverter Algorithm MotorDriver Anemometer GUI ArduinoJson Misc Definitions Pushbutton WebSocketClient temp_fan

Revision:
26:b30a61a55b2f
Parent:
25:b04abb0930ef
Child:
27:26f41a320436
--- a/main.cpp	Thu Mar 25 01:17:46 2021 +0000
+++ b/main.cpp	Thu Mar 25 02:30:21 2021 +0000
@@ -29,7 +29,7 @@
 I2C i2c(PIN_SDA,PIN_SCL);
 Anemometer ane; //
 MotorDriver motor;
-LowPowerTimer t,t_mode, t_disp;
+LowPowerTimer t,t_mode, t_disp, t_recon;
 int mode = OP_CALIBRATION;
 EthernetInterface eth;
 
@@ -54,9 +54,9 @@
 int flag_bres = 0; //Flag for checking button released
 int flag_flas = 1; //Flag for flashing symbol
 int flag_cali = 0; //Flag for calibration
-bool flag_eth; //Flag for ethernet connection
+bool flag_eth = false; //Flag for ethernet connection
 bool flag_aTrack; //Flag for active tracking (0 - offline, 1 - online)
-bool flag_powerOn;
+bool flag_powerOn = true;
 float sun_angle;
 
 //PUSH BUTTONS
@@ -75,6 +75,7 @@
 
 t.start(); //Start timer
 t_disp.start();
+t_recon.start();
 if (flag_eth){gui.getSunAngle();}
 if (flag_eth){
     topL = "ETHERNET";
@@ -125,6 +126,7 @@
         case OP_NORMAL:{
             if (flag_eth){gui.getSunAngle();}
             if (flag_eth){gui.receives(&wthres, &flag_aTrack, &flag_powerOn,&sun_angle);}
+            mode = (flag_powerOn) ? mode : OP_POWER_OFF; if(mode != OP_NORMAL){break;}
             fan.checkTemp(&mode);if(mode != OP_NORMAL){break;}
             ane.checkWind(&mode);if(mode != OP_NORMAL){break;}
             if (flag_eth){gui.windSpeed(ane.getWind());}
@@ -149,6 +151,7 @@
                     ang_P = acc.getAngle(S_PANEL);
                 else{
                     if (flag_eth){gui.receives(&wthres, &flag_aTrack, &flag_powerOn,&sun_angle);}
+                    mode = (flag_powerOn) ? mode : OP_POWER_OFF; if(mode != OP_NORMAL){break;}
                     ang_P = sun_angle;
                 }
                 
@@ -161,6 +164,7 @@
                 while(ang_R <= ref_R1 && !acc.checkAngle(ref_R1,ang_R) && mode == OP_NORMAL)
                 {
                     if (flag_eth){gui.receives(&wthres, &flag_aTrack, &flag_powerOn,&sun_angle);}
+                    mode = (flag_powerOn) ? mode : OP_POWER_OFF; if(mode != OP_NORMAL){break;}
                     if (flag_eth){gui.windSpeed(ane.getWind());}
                     fan.checkTemp(&mode);if(mode != OP_NORMAL){break;}
                     ane.checkWind(&mode);if(mode != OP_NORMAL){break;}
@@ -180,6 +184,7 @@
                 while(ang_R >= ref_R1 && !acc.checkAngle(ref_R1,ang_R) && mode == OP_NORMAL)
                 {
                     if (flag_eth){gui.receives(&wthres, &flag_aTrack, &flag_powerOn,&sun_angle);}
+                    mode = (flag_powerOn) ? mode : OP_POWER_OFF; if(mode != OP_NORMAL){break;}
                     if (flag_eth){gui.windSpeed(ane.getWind());}
                     fan.checkTemp(&mode);if(mode != OP_NORMAL){break;}
                     ane.checkWind(&mode);if(mode != OP_NORMAL){break;}
@@ -203,6 +208,7 @@
                 while(ang_R <= ref_R2 && !acc.checkAngle(ref_R2,ang_R) && mode == OP_NORMAL)
                 {
                     if (flag_eth){gui.receives(&wthres, &flag_aTrack, &flag_powerOn,&sun_angle);}
+                    mode = (flag_powerOn) ? mode : OP_POWER_OFF; if(mode != OP_NORMAL){break;}
                     if (flag_eth){gui.windSpeed(ane.getWind());}
                     fan.checkTemp(&mode);if(mode != OP_NORMAL){break;}
                     ane.checkWind(&mode);if(mode != OP_NORMAL){break;}
@@ -222,6 +228,7 @@
                 while(ang_R >= ref_R2 && !acc.checkAngle(ref_R2,ang_R) && mode == OP_NORMAL)
                 {
                     if (flag_eth){gui.receives(&wthres, &flag_aTrack, &flag_powerOn,&sun_angle);}
+                    mode = (flag_powerOn) ? mode : OP_POWER_OFF; if(mode != OP_NORMAL){break;}
                     if (flag_eth){gui.windSpeed(ane.getWind());}
                     fan.checkTemp(&mode);if(mode != OP_NORMAL){break;}
                     ane.checkWind(&mode);if(mode != OP_NORMAL){break;}
@@ -251,6 +258,7 @@
 ////////////////////////////////////////////////////////////////////////////////
         case OP_WIND:{
             if (flag_eth){gui.receives(&wthres, &flag_aTrack, &flag_powerOn,&sun_angle);}
+            mode = (flag_powerOn) ? mode : OP_POWER_OFF; if(mode != OP_NORMAL){break;}
             if (flag_eth){gui.windSpeed(ane.getWind());}
             fan.checkTemp(&mode);if(mode != OP_WIND){break;}
             ane.checkWind(&mode);if(mode != OP_WIND){break;}
@@ -560,27 +568,25 @@
         case OP_POWER_OFF:{
             if (flag_eth){gui.receives(&wthres, &flag_aTrack, &flag_powerOn,&sun_angle);}
             if(mode != OP_POWER_OFF){break;}
+            if(flag_powerOn){
+                mode = OP_NORMAL;
+                break;
+            }
             if (flag_eth){gui.windSpeed(ane.getWind());}
-            fan.checkTemp(&mode);if(mode != OP_WIND){break;}
+            fan.checkTemp(&mode);if(mode != OP_POWER_OFF){break;}
             if(timer_read_ms(t_disp) >= LCD_RRATE){
                 topL = "SLEEP MODE";
                 flag_flas = !flag_flas;
                 botL = Misc::itos(ane.getWind(&flag_disp),3) + "kph  |  " + Misc::itos(fan.getTemp()) + "C";
                 t_disp.reset();
                 t_disp.start();
-            }
-            if(flag_disp){
                 lcd.LCD_display(topL,botL);
-                flag_disp = 0;
             }
             
             //Move all motor backward
             motor.moveBackward(M_ALL);
             flag_time = 1; //Set the system in motion once windspeed has subsided
             break;
-            
-            flag_idle = 0;
-            break;
         }
         ////////////////////////////////////////////////////////////////////////
         case OP_ATRACK:{
@@ -603,11 +609,15 @@
             topL = "CONNECTING";
             botL = "";
             lcd.LCD_display(topL,botL);
-            eth.connect();
-            gui.refreshConnection(URL,&flag_eth);
-            inverter.connect(URL, PORT);
+            
+            for(int i = 0; (i < CONN_N && !flag_eth); i++){
+                eth.connect();
+                gui.refreshConnection(URL,&flag_eth);
+                wait_us(1000000);
+                inverter.connect(URL, PORT);
+            }
+            wait_us(1000000);
             bt_fn.setConnected(flag_eth);
-            wait_us(1000000);
             
             if (flag_eth){gui.getSunAngle();}
             if (flag_eth){
@@ -632,6 +642,12 @@
     if (flag_eth){
         gui.state(mode);
     }
+    if(!flag_eth && timer_read_s(t_recon) >= TIME_RECON){
+        eth.connect();
+        gui.refreshConnection(URL,&flag_eth);
+        inverter.connect(URL, PORT);
+        bt_fn.setConnected(flag_eth);
+    }
         
     wait_us(LOOP_DELAY);
     flag_disp = 1;