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:
Mon Mar 08 18:25:47 2021 +0000
Revision:
6:0b7a6e51cdf8
Parent:
2:944511c6c55f
Child:
7:2b6438e586e6
Updated LCD Library

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 2:944511c6c55f 16 #include "LCD.h"
khaiminhvn 6:0b7a6e51cdf8 17 #include <string>
khaiminhvn 0:74d6e93ec977 18
khaiminhvn 0:74d6e93ec977 19 #define timer_read_s(x) chrono::duration_cast<chrono::seconds>((x).elapsed_time()).count()
khaiminhvn 0:74d6e93ec977 20
khaiminhvn 0:74d6e93ec977 21 //Initialize Global Variables
khaiminhvn 2:944511c6c55f 22 Accelerometer acc; //Accelerometer
khaiminhvn 0:74d6e93ec977 23 Anemometer ane; //
khaiminhvn 0:74d6e93ec977 24 MotorDriver motor;
khaiminhvn 2:944511c6c55f 25 LCD lcd;
khaiminhvn 0:74d6e93ec977 26 LowPowerTimer t,t_mode;
khaiminhvn 0:74d6e93ec977 27 Ticker ti;
khaiminhvn 2:944511c6c55f 28 int mode = OP_CALLIBRATION;
khaiminhvn 0:74d6e93ec977 29
khaiminhvn 1:07f86b4db069 30 Pushbutton bt_fn(PIN_BTFN,&mode);
khaiminhvn 1:07f86b4db069 31 Pushbutton bt_inc(PIN_BTINC);
khaiminhvn 1:07f86b4db069 32 Pushbutton bt_dec(PIN_BTDEC);
khaiminhvn 0:74d6e93ec977 33
khaiminhvn 0:74d6e93ec977 34 //Function Declarations
khaiminhvn 0:74d6e93ec977 35 void checkWind();
khaiminhvn 0:74d6e93ec977 36
khaiminhvn 0:74d6e93ec977 37 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 38 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 39 int main()
khaiminhvn 0:74d6e93ec977 40 {
khaiminhvn 0:74d6e93ec977 41 float ang_P,ang_R;
khaiminhvn 0:74d6e93ec977 42 float ref_R1,ref_R2;
khaiminhvn 0:74d6e93ec977 43 int flag_time = 1, flag_idle = 0;
khaiminhvn 0:74d6e93ec977 44 int t_elapsed;
khaiminhvn 0:74d6e93ec977 45 int wthres = WIND_THRES_INIT;
khaiminhvn 6:0b7a6e51cdf8 46 char buffer[16];
khaiminhvn 6:0b7a6e51cdf8 47
khaiminhvn 6:0b7a6e51cdf8 48 string topL = "CALIBRATE";
khaiminhvn 6:0b7a6e51cdf8 49 string botL = "PRESS FN";
khaiminhvn 0:74d6e93ec977 50
khaiminhvn 0:74d6e93ec977 51 ti.attach(&checkWind,TICK_WIND);
khaiminhvn 0:74d6e93ec977 52 t.start(); //Start timer
khaiminhvn 0:74d6e93ec977 53
khaiminhvn 6:0b7a6e51cdf8 54 lcd.LCD_display(topL, botL);
khaiminhvn 6:0b7a6e51cdf8 55
khaiminhvn 0:74d6e93ec977 56 while(1)
khaiminhvn 0:74d6e93ec977 57 {
khaiminhvn 0:74d6e93ec977 58 switch(mode)
khaiminhvn 0:74d6e93ec977 59 {
khaiminhvn 0:74d6e93ec977 60 case OP_NORMAL:
khaiminhvn 2:944511c6c55f 61 lcd.LCD_display("NORMAL","");
khaiminhvn 0:74d6e93ec977 62 if(flag_time) //If delay interval has passed
khaiminhvn 0:74d6e93ec977 63 {
khaiminhvn 0:74d6e93ec977 64 ti.attach(&checkWind,TICK_WIND); //Enable Wind Safety
khaiminhvn 0:74d6e93ec977 65 checkWind();
khaiminhvn 0:74d6e93ec977 66 //Get Angle of Panel
khaiminhvn 0:74d6e93ec977 67 ang_P = acc.getAngle(S_PANEL);
khaiminhvn 0:74d6e93ec977 68
khaiminhvn 0:74d6e93ec977 69 //Calculate the Angle of Both Reflector
khaiminhvn 0:74d6e93ec977 70 ref_R1 = Algorithm::calcAngle(1,ang_P);
khaiminhvn 0:74d6e93ec977 71 ref_R2 = Algorithm::calcAngle(2,ang_P);
khaiminhvn 0:74d6e93ec977 72
khaiminhvn 0:74d6e93ec977 73 //Moving Reflector 1
khaiminhvn 0:74d6e93ec977 74 ang_R = acc.getAngle(S_R1);
khaiminhvn 0:74d6e93ec977 75 while(ang_R <= ref_R1 && acc.checkAngle(ref_R1,ang_R))
khaiminhvn 0:74d6e93ec977 76 {
khaiminhvn 0:74d6e93ec977 77 if(mode != OP_NORMAL) {break;}
khaiminhvn 0:74d6e93ec977 78 motor.moveForward(M1);
khaiminhvn 0:74d6e93ec977 79 ang_R = acc.getAngle(S_R1);
khaiminhvn 0:74d6e93ec977 80 }
khaiminhvn 0:74d6e93ec977 81 while(ang_R >= ref_R1 && acc.checkAngle(ref_R1,ang_R))
khaiminhvn 0:74d6e93ec977 82 {
khaiminhvn 0:74d6e93ec977 83 if(mode != OP_NORMAL) {break;}
khaiminhvn 0:74d6e93ec977 84 motor.moveBackward(M1);
khaiminhvn 0:74d6e93ec977 85 ang_R = acc.getAngle(S_R1);
khaiminhvn 0:74d6e93ec977 86 }
khaiminhvn 0:74d6e93ec977 87 motor.stop();
khaiminhvn 0:74d6e93ec977 88
khaiminhvn 0:74d6e93ec977 89 //Moving Reflector 2
khaiminhvn 0:74d6e93ec977 90 ang_R = acc.getAngle(S_R2);
khaiminhvn 0:74d6e93ec977 91 while(ang_R <= ref_R2 && acc.checkAngle(ref_R2,ang_R))
khaiminhvn 0:74d6e93ec977 92 {
khaiminhvn 0:74d6e93ec977 93 if(mode != OP_NORMAL) {break;}
khaiminhvn 0:74d6e93ec977 94 motor.moveForward(M2);
khaiminhvn 0:74d6e93ec977 95 ang_R = acc.getAngle(S_R2);
khaiminhvn 0:74d6e93ec977 96 }
khaiminhvn 0:74d6e93ec977 97 while(ang_R >= ref_R2 && acc.checkAngle(ref_R2,ang_R))
khaiminhvn 0:74d6e93ec977 98 {
khaiminhvn 0:74d6e93ec977 99 if(mode != OP_NORMAL) {break;}
khaiminhvn 0:74d6e93ec977 100 motor.moveBackward(M2);
khaiminhvn 0:74d6e93ec977 101 ang_R = acc.getAngle(S_R2);
khaiminhvn 0:74d6e93ec977 102 }
khaiminhvn 0:74d6e93ec977 103 motor.stop();
khaiminhvn 2:944511c6c55f 104 flag_time = 0; //Reset timer flag
khaiminhvn 0:74d6e93ec977 105 t.reset(); //Reset timer
khaiminhvn 0:74d6e93ec977 106 }
khaiminhvn 0:74d6e93ec977 107 t_elapsed = (int)timer_read_s(t);
khaiminhvn 0:74d6e93ec977 108 flag_time = (t_elapsed >= TIME_NORMAL) ? 1 : 0; //Enable flag if delay interval has passed
khaiminhvn 0:74d6e93ec977 109 break;
khaiminhvn 0:74d6e93ec977 110 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 111 case OP_WIND:
khaiminhvn 2:944511c6c55f 112 lcd.LCD_display("WIND SAFETY","");
khaiminhvn 0:74d6e93ec977 113 //Move all motor backward
khaiminhvn 0:74d6e93ec977 114 motor.moveBackward(M_ALL);
khaiminhvn 0:74d6e93ec977 115 flag_time = 1; //Set the system in motion once windspeed has subsided
khaiminhvn 0:74d6e93ec977 116 break;
khaiminhvn 0:74d6e93ec977 117 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 118 case OP_MANUAL1:
khaiminhvn 2:944511c6c55f 119 lcd.LCD_display("MOTOR 1","");
khaiminhvn 0:74d6e93ec977 120 ti.detach(); //Disable Wind Safety
khaiminhvn 0:74d6e93ec977 121
khaiminhvn 0:74d6e93ec977 122 //TIMEOUT
khaiminhvn 0:74d6e93ec977 123 ////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 124 if(!bt_inc.read() && !bt_dec.read() && !flag_idle) //Check if button is not pressed
khaiminhvn 0:74d6e93ec977 125 {
khaiminhvn 0:74d6e93ec977 126 t_mode.reset();
khaiminhvn 0:74d6e93ec977 127 t_mode.start();
khaiminhvn 0:74d6e93ec977 128 flag_idle = 1; //Indicate idling
khaiminhvn 0:74d6e93ec977 129 }
khaiminhvn 0:74d6e93ec977 130 else if(timer_read_s(t_mode) > TIME_MANUAL_TIMEOUT)
khaiminhvn 0:74d6e93ec977 131 {
khaiminhvn 0:74d6e93ec977 132 mode = OP_NORMAL;
khaiminhvn 0:74d6e93ec977 133 }
khaiminhvn 0:74d6e93ec977 134 ////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 135
khaiminhvn 0:74d6e93ec977 136 while(bt_inc.read()) //Extend
khaiminhvn 0:74d6e93ec977 137 {
khaiminhvn 0:74d6e93ec977 138 flag_idle = 0;
khaiminhvn 0:74d6e93ec977 139 motor.moveForward(M1);
khaiminhvn 0:74d6e93ec977 140 }
khaiminhvn 0:74d6e93ec977 141 while(bt_dec.read()) //Retract
khaiminhvn 0:74d6e93ec977 142 {
khaiminhvn 0:74d6e93ec977 143 flag_idle = 0;
khaiminhvn 0:74d6e93ec977 144 motor.moveBackward(M1);
khaiminhvn 0:74d6e93ec977 145 }
khaiminhvn 0:74d6e93ec977 146 if(!bt_inc.read() && !bt_dec.read())
khaiminhvn 0:74d6e93ec977 147 {
khaiminhvn 0:74d6e93ec977 148 motor.stop();
khaiminhvn 0:74d6e93ec977 149 }
khaiminhvn 0:74d6e93ec977 150 flag_time = 1; //Set the system in motion once done adjusting
khaiminhvn 0:74d6e93ec977 151 break;
khaiminhvn 0:74d6e93ec977 152 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 153 case OP_MANUAL2:
khaiminhvn 2:944511c6c55f 154 lcd.LCD_display("MOTOR 2","");
khaiminhvn 0:74d6e93ec977 155 ti.detach(); //Disable Wind Safety
khaiminhvn 0:74d6e93ec977 156
khaiminhvn 0:74d6e93ec977 157 //TIMEOUT
khaiminhvn 0:74d6e93ec977 158 ////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 159 if(!bt_inc.read() && !bt_dec.read() && !flag_idle) //Check if button is not pressed
khaiminhvn 0:74d6e93ec977 160 {
khaiminhvn 0:74d6e93ec977 161 t_mode.reset();
khaiminhvn 0:74d6e93ec977 162 t_mode.start();
khaiminhvn 0:74d6e93ec977 163 flag_idle = 1; //Indicate idling
khaiminhvn 0:74d6e93ec977 164 }
khaiminhvn 0:74d6e93ec977 165 else if(timer_read_s(t_mode) > TIME_MANUAL_TIMEOUT)
khaiminhvn 0:74d6e93ec977 166 {
khaiminhvn 0:74d6e93ec977 167 mode = OP_NORMAL;
khaiminhvn 0:74d6e93ec977 168 }
khaiminhvn 0:74d6e93ec977 169 ////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 170
khaiminhvn 0:74d6e93ec977 171 while(bt_inc.read()) //Extend
khaiminhvn 0:74d6e93ec977 172 {
khaiminhvn 0:74d6e93ec977 173 flag_idle = 0;
khaiminhvn 0:74d6e93ec977 174 motor.moveForward(M2);
khaiminhvn 0:74d6e93ec977 175 }
khaiminhvn 0:74d6e93ec977 176 while(bt_dec.read()) //Retract
khaiminhvn 0:74d6e93ec977 177 {
khaiminhvn 0:74d6e93ec977 178 flag_idle = 0;
khaiminhvn 0:74d6e93ec977 179 motor.moveBackward(M2);
khaiminhvn 0:74d6e93ec977 180 }
khaiminhvn 0:74d6e93ec977 181 if(!bt_inc.read() && !bt_dec.read())
khaiminhvn 0:74d6e93ec977 182 {
khaiminhvn 0:74d6e93ec977 183 motor.stop();
khaiminhvn 0:74d6e93ec977 184 }
khaiminhvn 0:74d6e93ec977 185 flag_time = 1; //Set the system in motion once done adjusting
khaiminhvn 0:74d6e93ec977 186 break;
khaiminhvn 0:74d6e93ec977 187 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 188 case OP_WSETTING:
khaiminhvn 6:0b7a6e51cdf8 189 lcd.LCD_display("Threshold:","");
khaiminhvn 0:74d6e93ec977 190 motor.stop();
khaiminhvn 0:74d6e93ec977 191 ti.detach(); //Disable Wind Safety
khaiminhvn 0:74d6e93ec977 192
khaiminhvn 0:74d6e93ec977 193 //TIMEOUT
khaiminhvn 0:74d6e93ec977 194 ////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 195 if(!bt_inc.read() && !bt_dec.read() && !flag_idle) //Check if button is not pressed
khaiminhvn 0:74d6e93ec977 196 {
khaiminhvn 0:74d6e93ec977 197 t_mode.reset();
khaiminhvn 0:74d6e93ec977 198 t_mode.start();
khaiminhvn 0:74d6e93ec977 199 flag_idle = 1; //Indicate idling
khaiminhvn 0:74d6e93ec977 200 }
khaiminhvn 0:74d6e93ec977 201 else if(timer_read_s(t_mode) > TIME_WSETTING_TIMEOUT)
khaiminhvn 0:74d6e93ec977 202 {
khaiminhvn 0:74d6e93ec977 203 mode = OP_NORMAL;
khaiminhvn 2:944511c6c55f 204 break;
khaiminhvn 0:74d6e93ec977 205 }
khaiminhvn 0:74d6e93ec977 206 ////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 207
khaiminhvn 0:74d6e93ec977 208 if(bt_inc.read() && wthres < WIND_THRES_MAX)
khaiminhvn 0:74d6e93ec977 209 {
khaiminhvn 0:74d6e93ec977 210 ane.setThres(++wthres);
khaiminhvn 6:0b7a6e51cdf8 211 lcd.LCD_display("Threshold:","");
khaiminhvn 0:74d6e93ec977 212 }
khaiminhvn 0:74d6e93ec977 213 else if(bt_inc.read() && wthres > WIND_THRES_MIN)
khaiminhvn 0:74d6e93ec977 214 {
khaiminhvn 0:74d6e93ec977 215 ane.setThres(--wthres);
khaiminhvn 6:0b7a6e51cdf8 216 lcd.LCD_display("Threshold:","");
khaiminhvn 0:74d6e93ec977 217 }
khaiminhvn 0:74d6e93ec977 218
khaiminhvn 0:74d6e93ec977 219 flag_time = 1; //Set the system in motion once done adjusting
khaiminhvn 0:74d6e93ec977 220 break;
khaiminhvn 0:74d6e93ec977 221 }
khaiminhvn 0:74d6e93ec977 222 }
khaiminhvn 0:74d6e93ec977 223
khaiminhvn 0:74d6e93ec977 224 }
khaiminhvn 0:74d6e93ec977 225 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 226 ////////////////////////////////////////////////////////////////////////////////
khaiminhvn 0:74d6e93ec977 227
khaiminhvn 0:74d6e93ec977 228 //FUNCTIONS
khaiminhvn 0:74d6e93ec977 229 void checkWind()
khaiminhvn 0:74d6e93ec977 230 {
khaiminhvn 0:74d6e93ec977 231 ane.checkWind(&mode);
khaiminhvn 0:74d6e93ec977 232 }