Project aiming to make a self-controlled solar reflector

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

Committer:
khaiminhvn
Date:
Fri Mar 12 02:48:29 2021 +0000
Revision:
11:2ade1ad7bad6
Parent:
10:566529fff615
Child:
12:14bac44e33b9
Finished WIND mode

Who changed what in which revision?

UserRevisionLine numberNew contents of line
khaiminhvn 0:74d6e93ec977 1 /*
khaiminhvn 0:74d6e93ec977 2 For settings of system behaviour, see Defs_sett.h
khaiminhvn 0:74d6e93ec977 3 For pin assignment list, see PinAssignment.h
khaiminhvn 0:74d6e93ec977 4 */
khaiminhvn 0:74d6e93ec977 5
khaiminhvn 0:74d6e93ec977 6 //INCLUDES
khaiminhvn 0:74d6e93ec977 7 #include "mbed.h"
khaiminhvn 6:0b7a6e51cdf8 8 #include "stdio.h"
khaiminhvn 2:944511c6c55f 9 #include "string" // std::string, std::to_string
khaiminhvn 0:74d6e93ec977 10 #include "Accelerometer.h"
khaiminhvn 0:74d6e93ec977 11 #include "Anemometer.h"
khaiminhvn 0:74d6e93ec977 12 #include "Algorithm.h"
khaiminhvn 0:74d6e93ec977 13 #include "MotorDriver.h"
khaiminhvn 0:74d6e93ec977 14 #include "Defs_Sett.h"
khaiminhvn 0:74d6e93ec977 15 #include "Pushbutton.h"
khaiminhvn 7:2b6438e586e6 16 #include "PinAssignment.h"
khaiminhvn 2:944511c6c55f 17 #include "LCD.h"
khaiminhvn 9:6e950b9a9a81 18 #include "Misc.h"
khaiminhvn 6:0b7a6e51cdf8 19 #include <string>
khaiminhvn 0:74d6e93ec977 20
khaiminhvn 0:74d6e93ec977 21 #define timer_read_s(x) chrono::duration_cast<chrono::seconds>((x).elapsed_time()).count()
khaiminhvn 11:2ade1ad7bad6 22 #define timer_read_ms(x) chrono::duration_cast<chrono::milliseconds>((x).elapsed_time()).count()
khaiminhvn 0:74d6e93ec977 23
khaiminhvn 0:74d6e93ec977 24 //Initialize Global Variables
khaiminhvn 7:2b6438e586e6 25 I2C i2c(PIN_SDA,PIN_SCL);
khaiminhvn 0:74d6e93ec977 26 Anemometer ane; //
khaiminhvn 11:2ade1ad7bad6 27 MotorDriver motor;
khaiminhvn 10:566529fff615 28 LowPowerTimer t,t_mode, t_disp;
khaiminhvn 7:2b6438e586e6 29 int mode = OP_CALIBRATION;
khaiminhvn 0:74d6e93ec977 30
khaiminhvn 0:74d6e93ec977 31 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 32 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 33 int main()
khaiminhvn 0:74d6e93ec977 34 {
khaiminhvn 7:2b6438e586e6 35 i2c.frequency(I2C_FREQ);
khaiminhvn 10:566529fff615 36 Accelerometer acc(&i2c); //Accelerometer
khaiminhvn 7:2b6438e586e6 37 LCD lcd(&i2c);
khaiminhvn 7:2b6438e586e6 38
khaiminhvn 0:74d6e93ec977 39 float ang_P,ang_R;
khaiminhvn 0:74d6e93ec977 40 float ref_R1,ref_R2;
khaiminhvn 0:74d6e93ec977 41 int t_elapsed;
khaiminhvn 0:74d6e93ec977 42 int wthres = WIND_THRES_INIT;
khaiminhvn 6:0b7a6e51cdf8 43 char buffer[16];
khaiminhvn 6:0b7a6e51cdf8 44
khaiminhvn 8:a1481d5f0572 45 //FLAGS
khaiminhvn 8:a1481d5f0572 46 int flag_time = 1; //Normal mode time
khaiminhvn 8:a1481d5f0572 47 int flag_idle = 0; //Idling time
khaiminhvn 8:a1481d5f0572 48 int flag_disp = 1; //Anti-flickering
khaiminhvn 9:6e950b9a9a81 49 int flag_bres = 0; //Flag for checking button released
khaiminhvn 8:a1481d5f0572 50
khaiminhvn 8:a1481d5f0572 51 //PUSH BUTTONS
khaiminhvn 8:a1481d5f0572 52 Pushbutton bt_fn(PIN_BTFN,&mode,&flag_disp);
khaiminhvn 8:a1481d5f0572 53 Pushbutton bt_inc(PIN_BTINC);
khaiminhvn 8:a1481d5f0572 54 Pushbutton bt_dec(PIN_BTDEC);
khaiminhvn 8:a1481d5f0572 55
khaiminhvn 11:2ade1ad7bad6 56 string topL = "INITIALIZING";
khaiminhvn 11:2ade1ad7bad6 57 string botL = "";
khaiminhvn 11:2ade1ad7bad6 58 lcd.LCD_display(topL, botL);
khaiminhvn 0:74d6e93ec977 59
khaiminhvn 0:74d6e93ec977 60 t.start(); //Start timer
khaiminhvn 10:566529fff615 61 t_disp.start();
khaiminhvn 11:2ade1ad7bad6 62 wait_us(1000000);
khaiminhvn 0:74d6e93ec977 63
khaiminhvn 11:2ade1ad7bad6 64 topL = "PUT SENSORS IN";
khaiminhvn 11:2ade1ad7bad6 65 botL = "CALIBRATION SLOT";
khaiminhvn 6:0b7a6e51cdf8 66 lcd.LCD_display(topL, botL);
khaiminhvn 6:0b7a6e51cdf8 67
khaiminhvn 0:74d6e93ec977 68 while(1)
khaiminhvn 0:74d6e93ec977 69 {
khaiminhvn 0:74d6e93ec977 70 switch(mode)
khaiminhvn 0:74d6e93ec977 71 {
khaiminhvn 7:2b6438e586e6 72 case OP_PLACEMENT:{
khaiminhvn 8:a1481d5f0572 73 if(flag_disp){
khaiminhvn 11:2ade1ad7bad6 74 topL = "CALIBRATING";
khaiminhvn 11:2ade1ad7bad6 75 botL = "";
khaiminhvn 11:2ade1ad7bad6 76 lcd.LCD_display(topL,botL);
khaiminhvn 11:2ade1ad7bad6 77 acc.calibrate();
khaiminhvn 11:2ade1ad7bad6 78 topL = "PUT SENSOR ON";
khaiminhvn 11:2ade1ad7bad6 79 botL = "PANEL&REFLECTORS";
khaiminhvn 8:a1481d5f0572 80 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 81 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 82 }
khaiminhvn 7:2b6438e586e6 83
khaiminhvn 7:2b6438e586e6 84 break;
khaiminhvn 8:a1481d5f0572 85 }
khaiminhvn 0:74d6e93ec977 86 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 87 case OP_NORMAL:{
khaiminhvn 10:566529fff615 88 ane.checkWind(&mode);
khaiminhvn 7:2b6438e586e6 89 topL = "NORMAL";
khaiminhvn 11:2ade1ad7bad6 90 if(timer_read_ms(t_disp) >= LCD_WRATE){
khaiminhvn 10:566529fff615 91 botL = Misc::itos((int)ane.getWind(&flag_disp)) + " kph";
khaiminhvn 10:566529fff615 92 t_disp.reset();
khaiminhvn 10:566529fff615 93 t_disp.start();
khaiminhvn 10:566529fff615 94 }
khaiminhvn 8:a1481d5f0572 95 if(flag_disp){
khaiminhvn 8:a1481d5f0572 96 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 97 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 98 }
khaiminhvn 0:74d6e93ec977 99
khaiminhvn 9:6e950b9a9a81 100 flag_idle = 0;
khaiminhvn 7:2b6438e586e6 101 break;
khaiminhvn 8:a1481d5f0572 102 }
khaiminhvn 7:2b6438e586e6 103 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 104 case OP_WIND:{
khaiminhvn 7:2b6438e586e6 105 ane.checkWind(&mode);
khaiminhvn 7:2b6438e586e6 106 topL = "WIND SAFETY";
khaiminhvn 11:2ade1ad7bad6 107 if(timer_read_ms(t_disp) >= LCD_WRATE){
khaiminhvn 10:566529fff615 108 botL = Misc::itos((int)ane.getWind(&flag_disp)) + " kph";
khaiminhvn 10:566529fff615 109 t_disp.reset();
khaiminhvn 10:566529fff615 110 t_disp.start();
khaiminhvn 10:566529fff615 111 }
khaiminhvn 8:a1481d5f0572 112 if(flag_disp){
khaiminhvn 8:a1481d5f0572 113 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 114 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 115 }
khaiminhvn 0:74d6e93ec977 116
khaiminhvn 11:2ade1ad7bad6 117 //Move all motor backward
khaiminhvn 11:2ade1ad7bad6 118 motor.moveBackward(M_ALL);
khaiminhvn 11:2ade1ad7bad6 119 flag_time = 1; //Set the system in motion once windspeed has subsided
khaiminhvn 11:2ade1ad7bad6 120 break;
khaiminhvn 11:2ade1ad7bad6 121
khaiminhvn 9:6e950b9a9a81 122 flag_idle = 0;
khaiminhvn 7:2b6438e586e6 123 break;
khaiminhvn 8:a1481d5f0572 124 }
khaiminhvn 0:74d6e93ec977 125 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 126 case OP_MANUAL1:{
khaiminhvn 7:2b6438e586e6 127 topL = "MANUAL: M1";
khaiminhvn 7:2b6438e586e6 128 botL = "";
khaiminhvn 8:a1481d5f0572 129 if(flag_disp){
khaiminhvn 8:a1481d5f0572 130 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 131 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 132 }
khaiminhvn 0:74d6e93ec977 133
khaiminhvn 7:2b6438e586e6 134 break;
khaiminhvn 8:a1481d5f0572 135 }
khaiminhvn 7:2b6438e586e6 136 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 137 case OP_MANUAL2:{
khaiminhvn 7:2b6438e586e6 138 topL = "MANUAL: M2";
khaiminhvn 7:2b6438e586e6 139 botL = "";
khaiminhvn 8:a1481d5f0572 140 if(flag_disp){
khaiminhvn 8:a1481d5f0572 141 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 142 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 143 }
khaiminhvn 7:2b6438e586e6 144
khaiminhvn 0:74d6e93ec977 145 break;
khaiminhvn 8:a1481d5f0572 146 }
khaiminhvn 7:2b6438e586e6 147 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 148 case OP_WSETTING:{
khaiminhvn 7:2b6438e586e6 149 topL = "Threshold:";
khaiminhvn 9:6e950b9a9a81 150 botL = Misc::itos(wthres) + " kph";
khaiminhvn 8:a1481d5f0572 151 if(flag_disp){
khaiminhvn 8:a1481d5f0572 152 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 153 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 154 }
khaiminhvn 0:74d6e93ec977 155
khaiminhvn 9:6e950b9a9a81 156 //TIMEOUT
khaiminhvn 9:6e950b9a9a81 157 ////////////////////////////////////////////////////////////////////
khaiminhvn 9:6e950b9a9a81 158 if(!flag_idle) //Check if button is not pressed
khaiminhvn 9:6e950b9a9a81 159 {
khaiminhvn 9:6e950b9a9a81 160 t_mode.reset();
khaiminhvn 9:6e950b9a9a81 161 t_mode.start();
khaiminhvn 9:6e950b9a9a81 162 flag_idle = 1; //Indicate idling
khaiminhvn 9:6e950b9a9a81 163 }
khaiminhvn 9:6e950b9a9a81 164 else if(timer_read_s(t_mode) > TIME_WSETTING_TIMEOUT)
khaiminhvn 9:6e950b9a9a81 165 {
khaiminhvn 9:6e950b9a9a81 166 mode = OP_NORMAL;
khaiminhvn 9:6e950b9a9a81 167 flag_disp = 1;
khaiminhvn 9:6e950b9a9a81 168 break;
khaiminhvn 9:6e950b9a9a81 169 }
khaiminhvn 9:6e950b9a9a81 170 ////////////////////////////////////////////////////////////////////
khaiminhvn 9:6e950b9a9a81 171
khaiminhvn 9:6e950b9a9a81 172 if(!(flag_bres == 1 && bt_inc.read()) && !(flag_bres == -1 && bt_dec.read())){
khaiminhvn 9:6e950b9a9a81 173 if(bt_inc.read() && wthres < WIND_THRES_MAX)
khaiminhvn 9:6e950b9a9a81 174 {
khaiminhvn 9:6e950b9a9a81 175 ane.setThres(++wthres);
khaiminhvn 9:6e950b9a9a81 176 botL = Misc::itos(wthres) + " kph";
khaiminhvn 9:6e950b9a9a81 177 lcd.LCD_display(topL,botL);
khaiminhvn 9:6e950b9a9a81 178 flag_idle = 0;
khaiminhvn 9:6e950b9a9a81 179 flag_bres = 1;
khaiminhvn 9:6e950b9a9a81 180 }
khaiminhvn 9:6e950b9a9a81 181 else if(bt_dec.read() && wthres > WIND_THRES_MIN)
khaiminhvn 9:6e950b9a9a81 182 {
khaiminhvn 9:6e950b9a9a81 183 ane.setThres(--wthres);
khaiminhvn 9:6e950b9a9a81 184 botL = Misc::itos(wthres) + " kph";
khaiminhvn 9:6e950b9a9a81 185 lcd.LCD_display(topL,botL);
khaiminhvn 9:6e950b9a9a81 186 flag_idle = 0;
khaiminhvn 9:6e950b9a9a81 187 flag_bres = -1;
khaiminhvn 9:6e950b9a9a81 188 }
khaiminhvn 9:6e950b9a9a81 189 else{
khaiminhvn 9:6e950b9a9a81 190 flag_bres = 0;
khaiminhvn 9:6e950b9a9a81 191 }
khaiminhvn 9:6e950b9a9a81 192 }
khaiminhvn 9:6e950b9a9a81 193
khaiminhvn 9:6e950b9a9a81 194 flag_time = 1; //Set the system in motion once done adjusting
khaiminhvn 9:6e950b9a9a81 195
khaiminhvn 7:2b6438e586e6 196 break;
khaiminhvn 8:a1481d5f0572 197 }
khaiminhvn 0:74d6e93ec977 198 }
khaiminhvn 7:2b6438e586e6 199 wait_us(LOOP_DELAY);
khaiminhvn 0:74d6e93ec977 200 }
khaiminhvn 0:74d6e93ec977 201
khaiminhvn 0:74d6e93ec977 202 }
khaiminhvn 0:74d6e93ec977 203 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 204 ////////////////////////////////////////////////////////////////////////////////