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 01:45:00 2021 +0000
Revision:
9:6e950b9a9a81
Parent:
8:a1481d5f0572
Child:
10:566529fff615
Finished functionality for WTHRES 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 0:74d6e93ec977 22
khaiminhvn 0:74d6e93ec977 23 //Initialize Global Variables
khaiminhvn 7:2b6438e586e6 24 I2C i2c(PIN_SDA,PIN_SCL);
khaiminhvn 0:74d6e93ec977 25 Anemometer ane; //
khaiminhvn 7:2b6438e586e6 26 //MotorDriver motor;
khaiminhvn 0:74d6e93ec977 27 LowPowerTimer t,t_mode;
khaiminhvn 7:2b6438e586e6 28 int mode = OP_CALIBRATION;
khaiminhvn 0:74d6e93ec977 29
khaiminhvn 0:74d6e93ec977 30 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 31 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 32 int main()
khaiminhvn 0:74d6e93ec977 33 {
khaiminhvn 7:2b6438e586e6 34 i2c.frequency(I2C_FREQ);
khaiminhvn 7:2b6438e586e6 35 //Accelerometer acc(&i2c); //Accelerometer
khaiminhvn 7:2b6438e586e6 36 LCD lcd(&i2c);
khaiminhvn 7:2b6438e586e6 37
khaiminhvn 0:74d6e93ec977 38 float ang_P,ang_R;
khaiminhvn 0:74d6e93ec977 39 float ref_R1,ref_R2;
khaiminhvn 0:74d6e93ec977 40 int t_elapsed;
khaiminhvn 0:74d6e93ec977 41 int wthres = WIND_THRES_INIT;
khaiminhvn 6:0b7a6e51cdf8 42 char buffer[16];
khaiminhvn 6:0b7a6e51cdf8 43
khaiminhvn 8:a1481d5f0572 44 //FLAGS
khaiminhvn 8:a1481d5f0572 45 int flag_time = 1; //Normal mode time
khaiminhvn 8:a1481d5f0572 46 int flag_idle = 0; //Idling time
khaiminhvn 8:a1481d5f0572 47 int flag_disp = 1; //Anti-flickering
khaiminhvn 9:6e950b9a9a81 48 int flag_bres = 0; //Flag for checking button released
khaiminhvn 8:a1481d5f0572 49
khaiminhvn 8:a1481d5f0572 50 //PUSH BUTTONS
khaiminhvn 8:a1481d5f0572 51 Pushbutton bt_fn(PIN_BTFN,&mode,&flag_disp);
khaiminhvn 8:a1481d5f0572 52 Pushbutton bt_inc(PIN_BTINC);
khaiminhvn 8:a1481d5f0572 53 Pushbutton bt_dec(PIN_BTDEC);
khaiminhvn 8:a1481d5f0572 54
khaiminhvn 7:2b6438e586e6 55 string topL = "PUT SENSORS IN";
khaiminhvn 7:2b6438e586e6 56 string botL = "CALIBRATION SLOT";
khaiminhvn 0:74d6e93ec977 57
khaiminhvn 0:74d6e93ec977 58 t.start(); //Start timer
khaiminhvn 0:74d6e93ec977 59
khaiminhvn 6:0b7a6e51cdf8 60 lcd.LCD_display(topL, botL);
khaiminhvn 6:0b7a6e51cdf8 61
khaiminhvn 0:74d6e93ec977 62 while(1)
khaiminhvn 0:74d6e93ec977 63 {
khaiminhvn 0:74d6e93ec977 64 switch(mode)
khaiminhvn 0:74d6e93ec977 65 {
khaiminhvn 7:2b6438e586e6 66 case OP_PLACEMENT:{
khaiminhvn 7:2b6438e586e6 67 topL = "PUT SENSOR ON";
khaiminhvn 7:2b6438e586e6 68 botL = "PANEL&REFLECTORS";
khaiminhvn 8:a1481d5f0572 69 if(flag_disp){
khaiminhvn 8:a1481d5f0572 70 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 71 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 72 }
khaiminhvn 7:2b6438e586e6 73
khaiminhvn 7:2b6438e586e6 74 break;
khaiminhvn 8:a1481d5f0572 75 }
khaiminhvn 0:74d6e93ec977 76 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 77 case OP_NORMAL:{
khaiminhvn 7:2b6438e586e6 78 topL = "NORMAL";
khaiminhvn 7:2b6438e586e6 79 botL = "";
khaiminhvn 8:a1481d5f0572 80 if(flag_disp){
khaiminhvn 8:a1481d5f0572 81 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 82 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 83 }
khaiminhvn 0:74d6e93ec977 84
khaiminhvn 9:6e950b9a9a81 85 flag_idle = 0;
khaiminhvn 7:2b6438e586e6 86 break;
khaiminhvn 8:a1481d5f0572 87 }
khaiminhvn 7:2b6438e586e6 88 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 89 case OP_WIND:{
khaiminhvn 7:2b6438e586e6 90 ane.checkWind(&mode);
khaiminhvn 7:2b6438e586e6 91 topL = "WIND SAFETY";
khaiminhvn 7:2b6438e586e6 92 botL = "";
khaiminhvn 8:a1481d5f0572 93 if(flag_disp){
khaiminhvn 8:a1481d5f0572 94 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 95 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 96 }
khaiminhvn 0:74d6e93ec977 97
khaiminhvn 9:6e950b9a9a81 98 flag_idle = 0;
khaiminhvn 7:2b6438e586e6 99 break;
khaiminhvn 8:a1481d5f0572 100 }
khaiminhvn 0:74d6e93ec977 101 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 102 case OP_MANUAL1:{
khaiminhvn 7:2b6438e586e6 103 topL = "MANUAL: M1";
khaiminhvn 7:2b6438e586e6 104 botL = "";
khaiminhvn 8:a1481d5f0572 105 if(flag_disp){
khaiminhvn 8:a1481d5f0572 106 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 107 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 108 }
khaiminhvn 0:74d6e93ec977 109
khaiminhvn 7:2b6438e586e6 110 break;
khaiminhvn 8:a1481d5f0572 111 }
khaiminhvn 7:2b6438e586e6 112 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 113 case OP_MANUAL2:{
khaiminhvn 7:2b6438e586e6 114 topL = "MANUAL: M2";
khaiminhvn 7:2b6438e586e6 115 botL = "";
khaiminhvn 8:a1481d5f0572 116 if(flag_disp){
khaiminhvn 8:a1481d5f0572 117 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 118 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 119 }
khaiminhvn 7:2b6438e586e6 120
khaiminhvn 0:74d6e93ec977 121 break;
khaiminhvn 8:a1481d5f0572 122 }
khaiminhvn 7:2b6438e586e6 123 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 124 case OP_WSETTING:{
khaiminhvn 7:2b6438e586e6 125 topL = "Threshold:";
khaiminhvn 9:6e950b9a9a81 126 botL = Misc::itos(wthres) + " kph";
khaiminhvn 8:a1481d5f0572 127 if(flag_disp){
khaiminhvn 8:a1481d5f0572 128 lcd.LCD_display(topL,botL);
khaiminhvn 8:a1481d5f0572 129 flag_disp = 0;
khaiminhvn 8:a1481d5f0572 130 }
khaiminhvn 0:74d6e93ec977 131
khaiminhvn 9:6e950b9a9a81 132 //TIMEOUT
khaiminhvn 9:6e950b9a9a81 133 ////////////////////////////////////////////////////////////////////
khaiminhvn 9:6e950b9a9a81 134 if(!flag_idle) //Check if button is not pressed
khaiminhvn 9:6e950b9a9a81 135 {
khaiminhvn 9:6e950b9a9a81 136 t_mode.reset();
khaiminhvn 9:6e950b9a9a81 137 t_mode.start();
khaiminhvn 9:6e950b9a9a81 138 flag_idle = 1; //Indicate idling
khaiminhvn 9:6e950b9a9a81 139 }
khaiminhvn 9:6e950b9a9a81 140 else if(timer_read_s(t_mode) > TIME_WSETTING_TIMEOUT)
khaiminhvn 9:6e950b9a9a81 141 {
khaiminhvn 9:6e950b9a9a81 142 mode = OP_NORMAL;
khaiminhvn 9:6e950b9a9a81 143 flag_disp = 1;
khaiminhvn 9:6e950b9a9a81 144 break;
khaiminhvn 9:6e950b9a9a81 145 }
khaiminhvn 9:6e950b9a9a81 146 ////////////////////////////////////////////////////////////////////
khaiminhvn 9:6e950b9a9a81 147
khaiminhvn 9:6e950b9a9a81 148 if(!(flag_bres == 1 && bt_inc.read()) && !(flag_bres == -1 && bt_dec.read())){
khaiminhvn 9:6e950b9a9a81 149 if(bt_inc.read() && wthres < WIND_THRES_MAX)
khaiminhvn 9:6e950b9a9a81 150 {
khaiminhvn 9:6e950b9a9a81 151 ane.setThres(++wthres);
khaiminhvn 9:6e950b9a9a81 152 botL = Misc::itos(wthres) + " kph";
khaiminhvn 9:6e950b9a9a81 153 lcd.LCD_display(topL,botL);
khaiminhvn 9:6e950b9a9a81 154 flag_idle = 0;
khaiminhvn 9:6e950b9a9a81 155 flag_bres = 1;
khaiminhvn 9:6e950b9a9a81 156 }
khaiminhvn 9:6e950b9a9a81 157 else if(bt_dec.read() && wthres > WIND_THRES_MIN)
khaiminhvn 9:6e950b9a9a81 158 {
khaiminhvn 9:6e950b9a9a81 159 ane.setThres(--wthres);
khaiminhvn 9:6e950b9a9a81 160 botL = Misc::itos(wthres) + " kph";
khaiminhvn 9:6e950b9a9a81 161 lcd.LCD_display(topL,botL);
khaiminhvn 9:6e950b9a9a81 162 flag_idle = 0;
khaiminhvn 9:6e950b9a9a81 163 flag_bres = -1;
khaiminhvn 9:6e950b9a9a81 164 }
khaiminhvn 9:6e950b9a9a81 165 else{
khaiminhvn 9:6e950b9a9a81 166 flag_bres = 0;
khaiminhvn 9:6e950b9a9a81 167 }
khaiminhvn 9:6e950b9a9a81 168 }
khaiminhvn 9:6e950b9a9a81 169
khaiminhvn 9:6e950b9a9a81 170 flag_time = 1; //Set the system in motion once done adjusting
khaiminhvn 9:6e950b9a9a81 171
khaiminhvn 7:2b6438e586e6 172 break;
khaiminhvn 8:a1481d5f0572 173 }
khaiminhvn 0:74d6e93ec977 174 }
khaiminhvn 7:2b6438e586e6 175 wait_us(LOOP_DELAY);
khaiminhvn 0:74d6e93ec977 176 }
khaiminhvn 0:74d6e93ec977 177
khaiminhvn 0:74d6e93ec977 178 }
khaiminhvn 0:74d6e93ec977 179 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 7:2b6438e586e6 180 ////////////////////////////////////////////////////////////////////////////////