Project aiming to make a self-controlled solar reflector
Dependencies: Accelerometer LCD Inverter Algorithm MotorDriver Anemometer GUI ArduinoJson Misc Definitions Pushbutton WebSocketClient temp_fan
main.cpp@11:2ade1ad7bad6, 2021-03-12 (annotated)
- 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?
User | Revision | Line number | New 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 | //////////////////////////////////////////////////////////////////////////////// |