attempt to fix posible power issues with the sharp

Dependencies:   ADS1115 BME280 CronoDot SDFileSystem mbed

Fork of Outdoor_UPAS_v1_2_Tboard by scott kelleher

Committer:
jelord
Date:
Thu Mar 24 23:03:34 2016 +0000
Revision:
20:30a00cd18e21
Parent:
19:b835bfb61e35
Child:
21:bb10efc5bf57
Few lines of code added at top of main for testing the EEPROM.  Turns pumps on if EEPROM is NOT working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jelord 0:2cb2b2ea316f 1 #include "mbed.h"
jelord 2:88fcbfadec6a 2 #include "SDFileSystem.h"
jelord 2:88fcbfadec6a 3 #include "Adafruit_ADS1015.h"
jelord 2:88fcbfadec6a 4 #include "MCP40D17.h"
jelord 2:88fcbfadec6a 5 #include "STC3100.h"
jelord 2:88fcbfadec6a 6 #include "LSM303.h"
jelord 2:88fcbfadec6a 7 #include "BME280.h"
jelord 2:88fcbfadec6a 8 #include "SI1145.h"
jelord 2:88fcbfadec6a 9 #include "NCP5623BMUTBG.h"
jelord 2:88fcbfadec6a 10 #include "CronoDot.h"
jelord 2:88fcbfadec6a 11 #include "EEPROM.h"
caseyquinn 12:5b4f3245606a 12 #include "Calibration.h"
caseyquinn 12:5b4f3245606a 13 #include "MAX_M8.h"
caseyquinn 12:5b4f3245606a 14 #include "DRV8830.h"
caseyquinn 14:7cdb643da356 15
jelord 0:2cb2b2ea316f 16
caseyquinn 12:5b4f3245606a 17 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 18 //General Items
caseyquinn 12:5b4f3245606a 19 /////////////////////////////////////////////
caseyquinn 14:7cdb643da356 20 I2C i2c(PB_9, PB_8);//(D14, D15); SDA,SCL
caseyquinn 12:5b4f3245606a 21 Serial pc(USBTX, USBRX);
caseyquinn 18:41ef98db0423 22 DigitalOut pumps(PA_9, 0);//(D8, 0);
caseyquinn 12:5b4f3245606a 23 DigitalOut pbKill(PC_12, 1); // Digital input pin that conncect to the LTC2950 battery charger used to shutdown the UPAS
caseyquinn 13:455601f62aad 24 DigitalIn nINT(PA_15); //Connected but currently unused is a digital ouput pin from LTC2950 battery charger. http://cds.linear.com/docs/en/datasheet/295012fd.pdf
jelord 2:88fcbfadec6a 25 MCP40D17 DigPot(&i2c);
caseyquinn 12:5b4f3245606a 26 BME280 bmesensor(PB_9, PB_8);//(D14, D15);
caseyquinn 12:5b4f3245606a 27 NCP5623BMUTBG RGB_LED(PB_9, PB_8);//(D14, D15);
caseyquinn 17:3e6dda6e6335 28 CronoDot RTC_UPAS(PB_9, PB_8);//(D14, D15);
caseyquinn 12:5b4f3245606a 29 EEPROM E2PROM(PB_9, PB_8);//(D14, D15);
caseyquinn 12:5b4f3245606a 30 Calibration calibrations(1); //Default serial/calibration if there are no values for the selected option
caseyquinn 14:7cdb643da356 31
caseyquinn 12:5b4f3245606a 32
caseyquinn 12:5b4f3245606a 33 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 34 //RN4677 BT/BLE Module
caseyquinn 12:5b4f3245606a 35 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 36 Serial microChannel(PB_10, PB_11); // tx, rx
caseyquinn 4:5d004fd997d5 37 DigitalOut bleRTS(PB_14, 0);
caseyquinn 4:5d004fd997d5 38 DigitalOut bleCTS(PB_13, 0);
caseyquinn 12:5b4f3245606a 39 DigitalOut BT_IRST(PC_8, 0);
caseyquinn 12:5b4f3245606a 40 DigitalOut BT_SW(PA_12, 0);
caseyquinn 17:3e6dda6e6335 41
caseyquinn 13:455601f62aad 42
caseyquinn 12:5b4f3245606a 43 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 44 //Analog to Digital Converter
caseyquinn 12:5b4f3245606a 45 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 46 Adafruit_ADS1115 ads(&i2c);
caseyquinn 12:5b4f3245606a 47 //DigitalIn ADS_ALRT(PA_10); //Connected but currently unused. (ADS1115) http://www.ti.com/lit/ds/symlink/ads1115.pdf
caseyquinn 12:5b4f3245606a 48
caseyquinn 12:5b4f3245606a 49 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 50 //Battery Monitoring
caseyquinn 12:5b4f3245606a 51 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 52 STC3100 gasG(PB_9, PB_8);//(D14, D15); // http://www.st.com/web/en/resource/technical/document/datasheet/CD00219947.pdf
caseyquinn 12:5b4f3245606a 53 DigitalIn bcs1(PC_9); //Charge complete if High. Connected but currently unused. (MCP73871) http://www.mouser.com/ds/2/268/22090a-52174.pdf
caseyquinn 12:5b4f3245606a 54 DigitalIn bcs2(PA_8); //Batt charging if High. Connected but currently unused. (MCP73871) http://www.mouser.com/ds/2/268/22090a-52174.pdf
caseyquinn 12:5b4f3245606a 55
caseyquinn 12:5b4f3245606a 56 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 57 //Accelerometer and Magnometer
caseyquinn 12:5b4f3245606a 58 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 59 LSM303 movementsensor(PB_9, PB_8);//(D14, D15); // http://www.st.com/web/en/resource/technical/document/datasheet/DM00027543.pdf
caseyquinn 12:5b4f3245606a 60 //DigitalIn ACC_INT1(PC_7); //Connected but currently unused. (LSM303)
caseyquinn 12:5b4f3245606a 61 //DigitalIn ACC_INT2(PC_6); //Connected but currently unused. (LSM303)
caseyquinn 12:5b4f3245606a 62 //DigitalIn ACC_DRDY(PC_11); //Connected but currently unused. (LSM303)
jelord 0:2cb2b2ea316f 63
caseyquinn 12:5b4f3245606a 64 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 65 //UV and Visible Light Sensor
caseyquinn 12:5b4f3245606a 66 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 67 SI1145 lightsensor(PB_9, PB_8);//(D14, D15);
caseyquinn 12:5b4f3245606a 68 //DigitalIn UV_INT(PD_2); //Connected but currently unused nor configured (interupt). (SI1145) https://www.silabs.com/Support%20Documents/TechnicalDocs/Si1145-46-47.pdf
caseyquinn 9:8646fd501832 69
caseyquinn 12:5b4f3245606a 70 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 71 //GPS
caseyquinn 12:5b4f3245606a 72 /////////////////////////////////////////////
caseyquinn 17:3e6dda6e6335 73 DigitalOut gpsEN(PB_15, 0);
caseyquinn 12:5b4f3245606a 74 Max_M8 gps(PB_9, PB_8,(66<<1)); // this must be defnined in the int main (? Not sure if this is true)
caseyquinn 12:5b4f3245606a 75
caseyquinn 12:5b4f3245606a 76 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 77 //Hbridge Valve Control
caseyquinn 12:5b4f3245606a 78 /////////////////////////////////////////////
caseyquinn 14:7cdb643da356 79 /*
caseyquinn 12:5b4f3245606a 80 DRV8830 motor1(PB_9, PB_8, 0xC4);
caseyquinn 12:5b4f3245606a 81 DRV8830 motor2(PB_9, PB_8, 0xCA);
caseyquinn 12:5b4f3245606a 82 DRV8830 motor3(PB_9, PB_8, 0xCC);
caseyquinn 12:5b4f3245606a 83 DRV8830 motor4(PB_9, PB_8, 0xCE);
caseyquinn 12:5b4f3245606a 84 DigitalIn hb_fault1(PA_6);
caseyquinn 12:5b4f3245606a 85 DigitalIn hb_fault2(PA_7);
caseyquinn 12:5b4f3245606a 86 DigitalIn hb_fault3(PA_5);
caseyquinn 12:5b4f3245606a 87 DigitalIn hb_fault4(PA_4);
caseyquinn 14:7cdb643da356 88 */
caseyquinn 12:5b4f3245606a 89 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 90 //SD Card
caseyquinn 12:5b4f3245606a 91 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 92 char filename[] = "/sd/XXXX0000LOG000000000000---------------.txt";
caseyquinn 12:5b4f3245606a 93 SDFileSystem sd(PB_5, PB_4, PB_3, PB_6, "sd");//(D4, D5, D3, D10, "sd"); // (MOSI, MISO, SCK, SEL)
caseyquinn 12:5b4f3245606a 94 DigitalIn sdCD(PA_11);
caseyquinn 14:7cdb643da356 95
caseyquinn 12:5b4f3245606a 96 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 97 //Callbacks
caseyquinn 12:5b4f3245606a 98 /////////////////////////////////////////////
caseyquinn 9:8646fd501832 99 Ticker stop; //This is the stop callback object
caseyquinn 8:c4a8f9b67cee 100 Ticker logg; //This is the logging callback object
caseyquinn 9:8646fd501832 101 Ticker flowCtl; //This is the control loop callback object
jelord 3:122bfc998c4c 102
caseyquinn 12:5b4f3245606a 103 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 104 //Varible Definitions
caseyquinn 12:5b4f3245606a 105 /////////////////////////////////////////////
jelord 3:122bfc998c4c 106 uint16_t serial_num = 1; // Default serial/calibration number
jelord 3:122bfc998c4c 107 int RunReady =0;
jelord 3:122bfc998c4c 108
caseyquinn 4:5d004fd997d5 109 struct tm STtime;
caseyquinn 7:29b01d5812ee 110 char timestr[32];
jelord 3:122bfc998c4c 111
caseyquinn 9:8646fd501832 112 float press;
caseyquinn 9:8646fd501832 113 float temp;
caseyquinn 9:8646fd501832 114 float rh;
jelord 3:122bfc998c4c 115
caseyquinn 9:8646fd501832 116 int uv;
caseyquinn 9:8646fd501832 117 int vis;
caseyquinn 9:8646fd501832 118 int ir;
jelord 3:122bfc998c4c 119
caseyquinn 9:8646fd501832 120 float compass;
caseyquinn 9:8646fd501832 121 float accel_x;
caseyquinn 9:8646fd501832 122 float accel_y;
caseyquinn 9:8646fd501832 123 float accel_z;
caseyquinn 9:8646fd501832 124 float accel_comp;
caseyquinn 9:8646fd501832 125 float angle_x;
caseyquinn 9:8646fd501832 126 float angle_y;
caseyquinn 9:8646fd501832 127 float angle_z;
caseyquinn 9:8646fd501832 128 float mag_x;
caseyquinn 9:8646fd501832 129 float mag_y;
caseyquinn 9:8646fd501832 130 float mag_z;
jelord 3:122bfc998c4c 131
caseyquinn 9:8646fd501832 132 int vInReading;
caseyquinn 9:8646fd501832 133 int vBlowerReading;
caseyquinn 9:8646fd501832 134 int omronDiff;
caseyquinn 9:8646fd501832 135 float omronVolt; //V
caseyquinn 9:8646fd501832 136 int omronReading;
caseyquinn 9:8646fd501832 137 float atmoRho; //g/L
jelord 3:122bfc998c4c 138
caseyquinn 9:8646fd501832 139 float massflow; //g/min
caseyquinn 9:8646fd501832 140 float volflow; //L/min
jelord 3:122bfc998c4c 141 float volflowSet = 1.0; //L/min
caseyquinn 14:7cdb643da356 142 int logInerval = 5;//seconds
jelord 3:122bfc998c4c 143 double secondsD = 0;
jelord 3:122bfc998c4c 144 double lastsecondD = 0;
caseyquinn 9:8646fd501832 145 float massflowSet;
jelord 3:122bfc998c4c 146 float deltaVflow = 0.0;
jelord 3:122bfc998c4c 147 float deltaMflow = 0.0;
caseyquinn 9:8646fd501832 148 float gainFlow;
caseyquinn 9:8646fd501832 149 float sampledVol; //L, total sampled volume
jelord 3:122bfc998c4c 150
caseyquinn 14:7cdb643da356 151 int digital_pot_setpoint = 100; //min = 0x7F, max = 0x00
caseyquinn 9:8646fd501832 152 int digital_pot_set;
caseyquinn 9:8646fd501832 153 int digital_pot_change;
jelord 3:122bfc998c4c 154 int digitalpotMax = 127;
caseyquinn 9:8646fd501832 155 int digitalpotMin = 10;
jelord 3:122bfc998c4c 156
caseyquinn 12:5b4f3245606a 157 int dutyUp;
caseyquinn 12:5b4f3245606a 158 int dutyDown;
caseyquinn 12:5b4f3245606a 159
caseyquinn 12:5b4f3245606a 160 float flat = 0;
caseyquinn 12:5b4f3245606a 161 float flon = 0;
jelord 3:122bfc998c4c 162
caseyquinn 12:5b4f3245606a 163 uint8_t gpssatellites = 0;
caseyquinn 12:5b4f3245606a 164 double gpsspeed = 0.0;
caseyquinn 12:5b4f3245606a 165 double gpslatitude = 0.0;
caseyquinn 12:5b4f3245606a 166 double gpslongitude = 0.0;
caseyquinn 12:5b4f3245606a 167 float gpsaltitude = 0.0;
caseyquinn 12:5b4f3245606a 168 char gpslat = 'W';
caseyquinn 12:5b4f3245606a 169 char gpslon = 'N';
caseyquinn 12:5b4f3245606a 170
caseyquinn 12:5b4f3245606a 171
caseyquinn 12:5b4f3245606a 172 float home_lat = 40.580508;
caseyquinn 12:5b4f3245606a 173 float home_lon = -105.081823;
caseyquinn 12:5b4f3245606a 174 float work_lat = 40.594062; //40.569136;
caseyquinn 12:5b4f3245606a 175 float work_lon = -105.075683; //-105.081966;
caseyquinn 12:5b4f3245606a 176 int location = 0;
caseyquinn 12:5b4f3245606a 177
caseyquinn 12:5b4f3245606a 178 float homeDistance = 99999;
caseyquinn 12:5b4f3245606a 179 float workDistance = 99999;
caseyquinn 12:5b4f3245606a 180
jelord 3:122bfc998c4c 181 //*************************************************//
jelord 3:122bfc998c4c 182
jelord 2:88fcbfadec6a 183 void sendData();
caseyquinn 11:aa21628a9b15 184
caseyquinn 11:aa21628a9b15 185
caseyquinn 11:aa21628a9b15 186 void pc_recv(){
caseyquinn 11:aa21628a9b15 187 while(pc.readable()){
caseyquinn 11:aa21628a9b15 188 pc.getc();
caseyquinn 11:aa21628a9b15 189 }
caseyquinn 11:aa21628a9b15 190 }
caseyquinn 11:aa21628a9b15 191
jelord 0:2cb2b2ea316f 192 static uint8_t rx_buf[20];
jelord 0:2cb2b2ea316f 193 static uint8_t rx_len=0;
jelord 1:9fbb5b665068 194 static int haltBLE = 1;
jelord 1:9fbb5b665068 195 static int transmissionValue = 0;
jelord 2:88fcbfadec6a 196 uint8_t writeData[20] = {0,};
jelord 2:88fcbfadec6a 197 static uint8_t dataLength = 0;
jelord 3:122bfc998c4c 198 static int runReady = 0;
jelord 3:122bfc998c4c 199 static uint8_t startAndEndTime[12] = {0,};
caseyquinn 5:c3252e5d45ca 200
caseyquinn 9:8646fd501832 201 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 202 //BLE Functions
caseyquinn 9:8646fd501832 203 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 204
caseyquinn 9:8646fd501832 205 void uartMicro(){
jelord 3:122bfc998c4c 206 if(runReady!=1){
jelord 3:122bfc998c4c 207 haltBLE = 2;
jelord 3:122bfc998c4c 208 while(microChannel.readable()){
jelord 3:122bfc998c4c 209 rx_buf[rx_len++] = microChannel.getc();
jelord 2:88fcbfadec6a 210
jelord 3:122bfc998c4c 211 //Code block to verify what is being transmitted. To function correctly, all data must terminate with \0 or \n
jelord 3:122bfc998c4c 212 if(transmissionValue==0){
jelord 3:122bfc998c4c 213
caseyquinn 4:5d004fd997d5 214 if (rx_buf[0] == 0x01)transmissionValue = 1; //rtc
jelord 3:122bfc998c4c 215 else if(rx_buf[0] == 0x02)transmissionValue = 2; //sample start and end times
jelord 3:122bfc998c4c 216 else if(rx_buf[0] == 0x03)transmissionValue = 3; //sample name
jelord 3:122bfc998c4c 217 else if(rx_buf[0] == 0x04)transmissionValue = 4; //Send Data Check
jelord 3:122bfc998c4c 218
jelord 3:122bfc998c4c 219 else if(rx_buf[0] == 0x05)transmissionValue = 5; //log interval
jelord 3:122bfc998c4c 220 else if(rx_buf[0] == 0x06)transmissionValue = 6; //Flow Rate
jelord 3:122bfc998c4c 221 else if(rx_buf[0] == 0x07)transmissionValue = 7; //Serial Number
jelord 3:122bfc998c4c 222 else if(rx_buf[0] == 0x08)transmissionValue = 8; //Run Enable
jelord 3:122bfc998c4c 223 else transmissionValue = 100; //Not useful data
jelord 3:122bfc998c4c 224 }
jelord 3:122bfc998c4c 225
jelord 3:122bfc998c4c 226 if(rx_buf[rx_len-1]=='\0' || rx_buf[rx_len-1]=='\n' || rx_buf[rx_len-1] == 0xff){
jelord 3:122bfc998c4c 227 if((transmissionValue == 1 || transmissionValue == 2 || transmissionValue == 3 || transmissionValue == 4 || transmissionValue == 5 ||
jelord 3:122bfc998c4c 228 transmissionValue == 6 || transmissionValue == 7) && rx_buf[rx_len-1] != 0xff)
jelord 3:122bfc998c4c 229 {}else{
caseyquinn 12:5b4f3245606a 230 //if(transmissionValue == 4 ) sendData();
jelord 3:122bfc998c4c 231 if(transmissionValue == 8){
jelord 3:122bfc998c4c 232 runReady = 1;
jelord 3:122bfc998c4c 233 microChannel.attach(NULL,microChannel.RxIrq);
jelord 3:122bfc998c4c 234 }
jelord 3:122bfc998c4c 235 haltBLE = 1;
jelord 3:122bfc998c4c 236 transmissionValue = 0;
jelord 3:122bfc998c4c 237 dataLength = 0;
jelord 2:88fcbfadec6a 238
jelord 3:122bfc998c4c 239 }
jelord 2:88fcbfadec6a 240 }
jelord 1:9fbb5b665068 241 }
caseyquinn 12:5b4f3245606a 242
jelord 3:122bfc998c4c 243 if(haltBLE!=1){
jelord 2:88fcbfadec6a 244
jelord 3:122bfc998c4c 245 if((transmissionValue!=100) && (dataLength!= 0)) writeData[dataLength-1] = rx_buf[0];
jelord 3:122bfc998c4c 246
jelord 3:122bfc998c4c 247 if(transmissionValue ==100){
caseyquinn 10:06fbb1c9e3bd 248 pc.putc(rx_buf[0]);
jelord 2:88fcbfadec6a 249
jelord 3:122bfc998c4c 250 }else if(transmissionValue ==1){ //process and store RTC values
jelord 3:122bfc998c4c 251
caseyquinn 7:29b01d5812ee 252 //if(dataLength==6)RTC_UPAS.set_time(writeData[0],writeData[1],writeData[2],writeData[3],writeData[3],writeData[4],writeData[5]);//sets chronodot RTC
caseyquinn 7:29b01d5812ee 253 if(dataLength==6){
caseyquinn 17:3e6dda6e6335 254 RTC_UPAS.set_time(writeData[0],writeData[1],writeData[2],writeData[3],writeData[3],writeData[4],writeData[5]);//sets chronodot RTC
caseyquinn 12:5b4f3245606a 255 ///////////////////////
caseyquinn 7:29b01d5812ee 256 //sets ST RTC
caseyquinn 12:5b4f3245606a 257 //////////////////////
caseyquinn 7:29b01d5812ee 258 STtime.tm_sec = writeData[0]; // 0-59
caseyquinn 7:29b01d5812ee 259 STtime.tm_min = writeData[1]; // 0-59
caseyquinn 7:29b01d5812ee 260 STtime.tm_hour = writeData[2]; // 0-23
caseyquinn 7:29b01d5812ee 261 STtime.tm_mday = writeData[3]; // 1-31
caseyquinn 7:29b01d5812ee 262 STtime.tm_mon = writeData[4]-1; // 0-11
caseyquinn 7:29b01d5812ee 263 STtime.tm_year = 100+writeData[5]; // year since 1900 (116 = 2016)
caseyquinn 7:29b01d5812ee 264 time_t STseconds = mktime(&STtime);
caseyquinn 12:5b4f3245606a 265 set_time(STseconds); // Set RTC time
caseyquinn 7:29b01d5812ee 266 }
jelord 3:122bfc998c4c 267
caseyquinn 12:5b4f3245606a 268 }
caseyquinn 14:7cdb643da356 269 else if(transmissionValue ==2){ //process and store sample start/end
jelord 3:122bfc998c4c 270 if(dataLength ==12)E2PROM.write(0x00015, writeData, 12);
jelord 3:122bfc998c4c 271
jelord 3:122bfc998c4c 272 }else if(transmissionValue ==3){ //process and store sample name
jelord 3:122bfc998c4c 273 if(dataLength ==8)E2PROM.write(0x00001,writeData,8);
jelord 3:122bfc998c4c 274
jelord 3:122bfc998c4c 275 }else if(transmissionValue ==5){ //process and store Log Interval
jelord 3:122bfc998c4c 276 if(dataLength ==1)E2PROM.write(0x00014,writeData,1);
jelord 2:88fcbfadec6a 277
jelord 3:122bfc998c4c 278 }else if(transmissionValue ==6){ //process and store Flow Rate
jelord 3:122bfc998c4c 279 if(dataLength ==4)E2PROM.write(0x00010,writeData,4);
jelord 3:122bfc998c4c 280
jelord 3:122bfc998c4c 281 }else if(transmissionValue ==7){ //process and store Serial Number
jelord 3:122bfc998c4c 282 if(dataLength ==2)E2PROM.write(0x00034,writeData,2);
jelord 3:122bfc998c4c 283 }
caseyquinn 14:7cdb643da356 284
jelord 3:122bfc998c4c 285 dataLength++;
jelord 1:9fbb5b665068 286 }
jelord 3:122bfc998c4c 287
jelord 3:122bfc998c4c 288 rx_len = 0;
jelord 3:122bfc998c4c 289 }else{
jelord 3:122bfc998c4c 290 while(microChannel.readable())
jelord 3:122bfc998c4c 291 uint8_t extract = microChannel.getc();
jelord 3:122bfc998c4c 292 }
jelord 2:88fcbfadec6a 293
caseyquinn 12:5b4f3245606a 294
jelord 2:88fcbfadec6a 295 }
caseyquinn 14:7cdb643da356 296
jelord 2:88fcbfadec6a 297 void sendData(){
jelord 2:88fcbfadec6a 298
jelord 2:88fcbfadec6a 299 uint8_t sampleTimePassValues[13] = {0x01,};
jelord 2:88fcbfadec6a 300 uint8_t subjectLabelOriginal[9] = {0x02,};
jelord 2:88fcbfadec6a 301 uint8_t dataLogOriginal[2] = {0x03,};
jelord 2:88fcbfadec6a 302 uint8_t flowRateOriginal[5] = {0x04,};
jelord 2:88fcbfadec6a 303 //uint8_t presetRunModeCheck[1] = {0,}; Commented and currently unused to prevent mem issues
jelord 2:88fcbfadec6a 304 E2PROM.read(0x00015, sampleTimePassValues+1, 12);
jelord 2:88fcbfadec6a 305 E2PROM.read(0x00001, subjectLabelOriginal+1,8);
jelord 2:88fcbfadec6a 306 E2PROM.read(0x00014,dataLogOriginal+1,1);
jelord 2:88fcbfadec6a 307 E2PROM.read(0x00010,flowRateOriginal+1,4);
jelord 2:88fcbfadec6a 308
jelord 2:88fcbfadec6a 309 for(int i=0; i<13; i++){
jelord 2:88fcbfadec6a 310 microChannel.putc(sampleTimePassValues[i]);
jelord 2:88fcbfadec6a 311 }
jelord 2:88fcbfadec6a 312 wait(.25);
jelord 2:88fcbfadec6a 313
jelord 2:88fcbfadec6a 314 for(int i=0; i<9; i++){
jelord 2:88fcbfadec6a 315 microChannel.putc(subjectLabelOriginal[i]);
jelord 2:88fcbfadec6a 316 }
jelord 2:88fcbfadec6a 317 wait(.25);
jelord 2:88fcbfadec6a 318
jelord 2:88fcbfadec6a 319 for(int i=0; i<2; i++){
jelord 2:88fcbfadec6a 320 microChannel.putc(dataLogOriginal[i]);
jelord 2:88fcbfadec6a 321 }
jelord 2:88fcbfadec6a 322 wait(.25);
jelord 2:88fcbfadec6a 323
jelord 2:88fcbfadec6a 324 for(int i=0; i<5; i++){
jelord 2:88fcbfadec6a 325 microChannel.putc(flowRateOriginal[i]);
jelord 2:88fcbfadec6a 326 }
jelord 0:2cb2b2ea316f 327
jelord 2:88fcbfadec6a 328
jelord 2:88fcbfadec6a 329 }
caseyquinn 14:7cdb643da356 330
caseyquinn 12:5b4f3245606a 331 //////////////////////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 332 // GPS: Degree-minute format to decimal-degrees
caseyquinn 12:5b4f3245606a 333 //////////////////////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 334 double convertDegMinToDecDeg (float degMin)
caseyquinn 12:5b4f3245606a 335 {
caseyquinn 12:5b4f3245606a 336 double min = 0.0;
caseyquinn 12:5b4f3245606a 337 double decDeg = 0.0;
caseyquinn 12:5b4f3245606a 338
caseyquinn 12:5b4f3245606a 339 //get the minutes, fmod() requires double
caseyquinn 12:5b4f3245606a 340 min = fmod((double)degMin, 100.0);
caseyquinn 12:5b4f3245606a 341
caseyquinn 12:5b4f3245606a 342 //rebuild coordinates in decimal degrees
caseyquinn 12:5b4f3245606a 343 degMin = (int) ( degMin / 100 );
caseyquinn 12:5b4f3245606a 344 decDeg = degMin + ( min / 60 );
caseyquinn 12:5b4f3245606a 345
caseyquinn 12:5b4f3245606a 346 return decDeg;
caseyquinn 12:5b4f3245606a 347 }
caseyquinn 12:5b4f3245606a 348
caseyquinn 12:5b4f3245606a 349 //////////////////////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 350 // GPS: Calculate distance from target location
caseyquinn 12:5b4f3245606a 351 //////////////////////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 352 double GPSdistanceCalc (float tlat, float tlon)
caseyquinn 12:5b4f3245606a 353 {
caseyquinn 12:5b4f3245606a 354
caseyquinn 12:5b4f3245606a 355
caseyquinn 12:5b4f3245606a 356
caseyquinn 12:5b4f3245606a 357 float tlatrad, flatrad;
caseyquinn 12:5b4f3245606a 358 float sdlong, cdlong;
caseyquinn 12:5b4f3245606a 359 float sflat, cflat;
caseyquinn 12:5b4f3245606a 360 float stlat, ctlat;
caseyquinn 12:5b4f3245606a 361 float delta, denom;
caseyquinn 12:5b4f3245606a 362
caseyquinn 12:5b4f3245606a 363 double distance;
caseyquinn 12:5b4f3245606a 364 delta = (flon-tlon)*0.0174532925;
caseyquinn 12:5b4f3245606a 365 sdlong = sin(delta);
caseyquinn 12:5b4f3245606a 366 cdlong = cos(delta);
caseyquinn 12:5b4f3245606a 367 flatrad = (flat)*0.0174532925;
caseyquinn 12:5b4f3245606a 368 tlatrad = (tlat)*0.0174532925;
caseyquinn 12:5b4f3245606a 369 sflat = sin(flatrad);
caseyquinn 12:5b4f3245606a 370 cflat = cos(flatrad);
caseyquinn 12:5b4f3245606a 371 stlat = sin(tlatrad);
caseyquinn 12:5b4f3245606a 372 ctlat = cos(tlatrad);
caseyquinn 12:5b4f3245606a 373 delta = (cflat * stlat) - (sflat * ctlat * cdlong);
caseyquinn 12:5b4f3245606a 374 delta = pow(delta,2);
caseyquinn 12:5b4f3245606a 375 delta += pow(ctlat * sdlong,2);
caseyquinn 12:5b4f3245606a 376 delta = sqrt(delta);
caseyquinn 12:5b4f3245606a 377 denom = (sflat * stlat) + (cflat * ctlat * cdlong);
caseyquinn 12:5b4f3245606a 378 delta = atan2(delta, denom);
caseyquinn 12:5b4f3245606a 379 distance = delta * 6372795;
caseyquinn 12:5b4f3245606a 380 return distance;
caseyquinn 12:5b4f3245606a 381 }
caseyquinn 12:5b4f3245606a 382
caseyquinn 5:c3252e5d45ca 383
caseyquinn 9:8646fd501832 384 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 385 //Shutdown Function
caseyquinn 9:8646fd501832 386 //////////////////////////////////////////////////////////////
jelord 3:122bfc998c4c 387 void check_stop() // this checks if it's time to stop and shutdown
jelord 3:122bfc998c4c 388 {
caseyquinn 9:8646fd501832 389 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
caseyquinn 9:8646fd501832 390 //UPDATE THIS TO WORK WITH ST RTC INSTEAD
caseyquinn 9:8646fd501832 391 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
caseyquinn 17:3e6dda6e6335 392
jelord 3:122bfc998c4c 393 if(RTC_UPAS.compare(startAndEndTime[6], startAndEndTime[7], startAndEndTime[8], startAndEndTime[9], startAndEndTime[10], startAndEndTime[11])) {
jelord 3:122bfc998c4c 394 pbKill = 0; // this is were we shut everything down
caseyquinn 4:5d004fd997d5 395 //pc.printf("If you're reading this something has gone very wrong.");
jelord 3:122bfc998c4c 396 }
caseyquinn 17:3e6dda6e6335 397
jelord 3:122bfc998c4c 398 }
caseyquinn 5:c3252e5d45ca 399
caseyquinn 9:8646fd501832 400 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 401 //SD Logging Function
caseyquinn 9:8646fd501832 402 //////////////////////////////////////////////////////////////
jelord 3:122bfc998c4c 403 void log_data()
jelord 3:122bfc998c4c 404 {
caseyquinn 14:7cdb643da356 405
caseyquinn 14:7cdb643da356 406 RGB_LED.set_led(1,1,1);
caseyquinn 7:29b01d5812ee 407
caseyquinn 7:29b01d5812ee 408 time_t seconds = time(NULL);
caseyquinn 7:29b01d5812ee 409 strftime(timestr, 32, "%y%m%d%H%M%S", localtime(&seconds));
caseyquinn 13:455601f62aad 410
caseyquinn 17:3e6dda6e6335 411 RTC_UPAS.get_time();
caseyquinn 7:29b01d5812ee 412 press = bmesensor.getPressure();
caseyquinn 7:29b01d5812ee 413 temp = bmesensor.getTemperature()-5.0;
caseyquinn 7:29b01d5812ee 414 rh = bmesensor.getHumidity();
caseyquinn 7:29b01d5812ee 415 uv = lightsensor.getUV();
caseyquinn 14:7cdb643da356 416 movementsensor.getACCEL();
caseyquinn 14:7cdb643da356 417 movementsensor.getCOMPASS();
caseyquinn 14:7cdb643da356 418 compass = movementsensor.getCOMPASS_HEADING();
caseyquinn 14:7cdb643da356 419 accel_x = movementsensor.AccelData.x;
caseyquinn 14:7cdb643da356 420 accel_y = movementsensor.AccelData.y;
caseyquinn 14:7cdb643da356 421 accel_z = movementsensor.AccelData.z;
caseyquinn 14:7cdb643da356 422 accel_comp = pow(accel_x,(float)2)+pow(accel_y,(float)2)+pow(accel_z,(float)2)-1.0;
caseyquinn 14:7cdb643da356 423 mag_x = movementsensor.MagData.x;
caseyquinn 14:7cdb643da356 424 mag_y = movementsensor.MagData.y;
caseyquinn 14:7cdb643da356 425 mag_z = movementsensor.MagData.z;
caseyquinn 7:29b01d5812ee 426
caseyquinn 14:7cdb643da356 427 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 14:7cdb643da356 428 omronVolt = (omronReading*4.096)/(32768*2);
caseyquinn 14:7cdb643da356 429
caseyquinn 14:7cdb643da356 430 if(omronVolt<=calibrations.omronVMin) {
caseyquinn 14:7cdb643da356 431 massflow = calibrations.omronMFMin;
caseyquinn 14:7cdb643da356 432 } else if(omronVolt>=calibrations.omronVMax) {
caseyquinn 14:7cdb643da356 433 massflow = calibrations.omronMFMax;
caseyquinn 14:7cdb643da356 434 } else {
caseyquinn 14:7cdb643da356 435 massflow = calibrations.MF4*pow(omronVolt,(float)4)+calibrations.MF3*pow(omronVolt,(float)3)+calibrations.MF2*pow(omronVolt,(float)2)+calibrations.MF1*omronVolt+calibrations.MF0;
caseyquinn 14:7cdb643da356 436 }
caseyquinn 14:7cdb643da356 437
caseyquinn 14:7cdb643da356 438 atmoRho = ((press-((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)))*100)/(287.0531*(temp+273.15))+((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)*100)/(461.4964*(temp+273.15));
caseyquinn 14:7cdb643da356 439 volflow = massflow/atmoRho;
caseyquinn 14:7cdb643da356 440 sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
caseyquinn 14:7cdb643da356 441 deltaVflow = volflow-volflowSet;
caseyquinn 14:7cdb643da356 442 massflowSet = volflowSet*atmoRho;
caseyquinn 14:7cdb643da356 443 deltaMflow = massflow-massflowSet;
caseyquinn 14:7cdb643da356 444
caseyquinn 14:7cdb643da356 445 vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0
caseyquinn 14:7cdb643da356 446 vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0
caseyquinn 14:7cdb643da356 447 omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3
caseyquinn 17:3e6dda6e6335 448
caseyquinn 17:3e6dda6e6335 449 if(gpsEN ==1){
caseyquinn 12:5b4f3245606a 450 gps.read(1);
caseyquinn 16:577cb22cec99 451 RGB_LED.set_led(1,1,0);
caseyquinn 12:5b4f3245606a 452 gpsspeed = gps.speed;
caseyquinn 12:5b4f3245606a 453 gpssatellites = gps.satellites;
caseyquinn 12:5b4f3245606a 454 gpslatitude = gps.lat;
caseyquinn 12:5b4f3245606a 455 // gpslat = 'N'; //gps.lat; need to fix this (if statement?)
caseyquinn 12:5b4f3245606a 456 gpslongitude = gps.lon;
caseyquinn 12:5b4f3245606a 457 // gpslon = 'W'; //gps.lon; need to fix this (if statement?)
caseyquinn 12:5b4f3245606a 458 gpsaltitude = gps.altitude;
caseyquinn 12:5b4f3245606a 459
caseyquinn 16:577cb22cec99 460 /*
caseyquinn 16:577cb22cec99 461 if (abs(gpslatitude) > 0 && abs(gpslongitude) > 0) {
caseyquinn 12:5b4f3245606a 462
caseyquinn 12:5b4f3245606a 463 if(gpslat == 'S')
caseyquinn 12:5b4f3245606a 464 {
caseyquinn 12:5b4f3245606a 465 flat = convertDegMinToDecDeg (gpslatitude) * -1;
caseyquinn 12:5b4f3245606a 466 }
caseyquinn 12:5b4f3245606a 467 else
caseyquinn 12:5b4f3245606a 468 {
caseyquinn 12:5b4f3245606a 469 flat = convertDegMinToDecDeg (gpslatitude);
caseyquinn 12:5b4f3245606a 470 }
caseyquinn 12:5b4f3245606a 471
caseyquinn 12:5b4f3245606a 472 if(gpslon == 'W')
caseyquinn 12:5b4f3245606a 473 {
caseyquinn 12:5b4f3245606a 474 flon = convertDegMinToDecDeg (gpslongitude) * -1;
caseyquinn 12:5b4f3245606a 475 }
caseyquinn 12:5b4f3245606a 476 else
caseyquinn 12:5b4f3245606a 477 {
caseyquinn 12:5b4f3245606a 478 flon = convertDegMinToDecDeg (gpslongitude);
caseyquinn 12:5b4f3245606a 479 }
caseyquinn 12:5b4f3245606a 480
caseyquinn 12:5b4f3245606a 481 workDistance = GPSdistanceCalc (work_lat, work_lon);
caseyquinn 12:5b4f3245606a 482 homeDistance = GPSdistanceCalc (home_lat, home_lon);
caseyquinn 12:5b4f3245606a 483 }
caseyquinn 12:5b4f3245606a 484
caseyquinn 12:5b4f3245606a 485 if (homeDistance == 99999 && workDistance == 99999) {
caseyquinn 12:5b4f3245606a 486 // digitalWrite (work_yellow_led, HIGH);
caseyquinn 12:5b4f3245606a 487 // digitalWrite (home_green_led, HIGH);
caseyquinn 12:5b4f3245606a 488 // digitalWrite (travel_red_led, HIGH);
caseyquinn 12:5b4f3245606a 489 location = 0;
caseyquinn 12:5b4f3245606a 490 }
caseyquinn 12:5b4f3245606a 491
caseyquinn 12:5b4f3245606a 492 else if (workDistance < 30) {
caseyquinn 12:5b4f3245606a 493 // digitalWrite (work_yellow_led, HIGH);
caseyquinn 12:5b4f3245606a 494 // digitalWrite (home_green_led, LOW);
caseyquinn 12:5b4f3245606a 495 // digitalWrite (travel_red_led, LOW);
caseyquinn 12:5b4f3245606a 496 location = 1;
caseyquinn 12:5b4f3245606a 497 }
caseyquinn 12:5b4f3245606a 498
caseyquinn 12:5b4f3245606a 499 else if (homeDistance < 20) {
caseyquinn 12:5b4f3245606a 500 // digitalWrite (work_yellow_led, LOW);
caseyquinn 12:5b4f3245606a 501 // digitalWrite (home_green_led, HIGH);
caseyquinn 12:5b4f3245606a 502 // digitalWrite (travel_red_led, LOW);
caseyquinn 12:5b4f3245606a 503 location = 2;
caseyquinn 12:5b4f3245606a 504 }
caseyquinn 12:5b4f3245606a 505
caseyquinn 12:5b4f3245606a 506 else {
caseyquinn 12:5b4f3245606a 507 // digitalWrite (work_yellow_led, LOW);
caseyquinn 12:5b4f3245606a 508 // digitalWrite (home_green_led, LOW);
caseyquinn 12:5b4f3245606a 509 // digitalWrite (travel_red_led, HIGH);
caseyquinn 12:5b4f3245606a 510 location = 3;
caseyquinn 12:5b4f3245606a 511 }
caseyquinn 16:577cb22cec99 512 */
caseyquinn 16:577cb22cec99 513
caseyquinn 17:3e6dda6e6335 514 }
caseyquinn 17:3e6dda6e6335 515
caseyquinn 7:29b01d5812ee 516 FILE *fp = fopen(filename, "a");
caseyquinn 19:b835bfb61e35 517 //fprintf(fp, "%02d,%02d,%02d,%02d,%02d,%02d,",RTC_UPAS.year, RTC_UPAS.month,RTC_UPAS.date,RTC_UPAS.hour,RTC_UPAS.minutes,RTC_UPAS.seconds);
caseyquinn 7:29b01d5812ee 518 fprintf(fp, "%s,", timestr);
caseyquinn 7:29b01d5812ee 519 fprintf(fp, "%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,", omronVolt,massflow,temp,press,rh,atmoRho);
caseyquinn 7:29b01d5812ee 520 fprintf(fp, "%1.3f,%5.1f,%1.1f,%1.1f,%1.1f,%1.1f,", volflow, sampledVol, accel_x, accel_y, accel_z, accel_comp);
caseyquinn 7:29b01d5812ee 521 fprintf(fp, "%.1f,%.1f,%.1f,%.3f,%.3f,%.3f,%.1f,", angle_x,angle_y,angle_z,mag_x, mag_y, mag_z,compass);
caseyquinn 7:29b01d5812ee 522 fprintf(fp, "%d,%d,%d,%d,%d,%d," ,uv,omronReading, vInReading, vBlowerReading, omronDiff,gasG.getAmps());
caseyquinn 16:577cb22cec99 523 fprintf(fp, "%d,%d,%d,%1.3f,%1.3f,", gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow);
caseyquinn 16:577cb22cec99 524 //fprintf(fp, "%f,%f,%06d,%06d\r\n", gps.lat, gps.lon, (long)gps.date, (long)gps.utc); // test and add in speed, etc that Josh added in to match the adafruit GPS
caseyquinn 16:577cb22cec99 525 fprintf(fp, "%f,%f,%06d,%06d,%f,%d,%f\r\n", gps.lat, gps.lon, (long)gps.date, (long)gps.utc, gpsspeed, gpssatellites, gpsaltitude); // test and add in speed, etc that Josh added in to match the adafruit GPS
caseyquinn 7:29b01d5812ee 526 fclose(fp);
caseyquinn 7:29b01d5812ee 527 free(fp);
caseyquinn 14:7cdb643da356 528 RGB_LED.set_led(0,1,0);
caseyquinn 14:7cdb643da356 529
caseyquinn 12:5b4f3245606a 530
caseyquinn 12:5b4f3245606a 531 pc.printf("%s,", timestr);
caseyquinn 12:5b4f3245606a 532
jelord 3:122bfc998c4c 533
jelord 3:122bfc998c4c 534 }
caseyquinn 8:c4a8f9b67cee 535
caseyquinn 9:8646fd501832 536 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 537 //Flow Control Function
caseyquinn 9:8646fd501832 538 //////////////////////////////////////////////////////////////
caseyquinn 8:c4a8f9b67cee 539 void flowControl()
caseyquinn 8:c4a8f9b67cee 540 {
caseyquinn 12:5b4f3245606a 541 /*
caseyquinn 8:c4a8f9b67cee 542 RGB_LED.set_led(0,1,0);
caseyquinn 8:c4a8f9b67cee 543 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 8:c4a8f9b67cee 544 omronVolt = (omronReading*4.096)/(32768*2);
caseyquinn 8:c4a8f9b67cee 545
caseyquinn 8:c4a8f9b67cee 546 if(omronVolt<=calibrations.omronVMin) {
caseyquinn 8:c4a8f9b67cee 547 massflow = calibrations.omronMFMin;
caseyquinn 8:c4a8f9b67cee 548 } else if(omronVolt>=calibrations.omronVMax) {
caseyquinn 8:c4a8f9b67cee 549 massflow = calibrations.omronMFMax;
caseyquinn 8:c4a8f9b67cee 550 } else {
caseyquinn 8:c4a8f9b67cee 551 massflow = calibrations.MF4*pow(omronVolt,(float)4)+calibrations.MF3*pow(omronVolt,(float)3)+calibrations.MF2*pow(omronVolt,(float)2)+calibrations.MF1*omronVolt+calibrations.MF0;
caseyquinn 8:c4a8f9b67cee 552 }
caseyquinn 8:c4a8f9b67cee 553
caseyquinn 8:c4a8f9b67cee 554 atmoRho = ((press-((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)))*100)/(287.0531*(temp+273.15))+((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)*100)/(461.4964*(temp+273.15));
caseyquinn 8:c4a8f9b67cee 555 volflow = massflow/atmoRho;
caseyquinn 8:c4a8f9b67cee 556 sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
caseyquinn 8:c4a8f9b67cee 557 deltaVflow = volflow-volflowSet;
caseyquinn 8:c4a8f9b67cee 558 massflowSet = volflowSet*atmoRho;
caseyquinn 8:c4a8f9b67cee 559 deltaMflow = massflow-massflowSet;
caseyquinn 12:5b4f3245606a 560
caseyquinn 8:c4a8f9b67cee 561 if(abs(deltaMflow)>.025) {
caseyquinn 8:c4a8f9b67cee 562 digital_pot_change = (int)(gainFlow*deltaMflow);
caseyquinn 8:c4a8f9b67cee 563
caseyquinn 8:c4a8f9b67cee 564
caseyquinn 12:5b4f3245606a 565 if(abs(digital_pot_change)>=10) {
caseyquinn 12:5b4f3245606a 566 digital_pot_set = (int)(digital_pot_set+ (int)(1*deltaMflow));
caseyquinn 12:5b4f3245606a 567 RGB_LED.set_led(1,0,0);
caseyquinn 12:5b4f3245606a 568 } else {
caseyquinn 8:c4a8f9b67cee 569 digital_pot_set = (digital_pot_set+ digital_pot_change);
caseyquinn 12:5b4f3245606a 570 RGB_LED.set_led(1,1,0);
caseyquinn 8:c4a8f9b67cee 571 }
caseyquinn 8:c4a8f9b67cee 572
caseyquinn 12:5b4f3245606a 573 if(digital_pot_set>=digitalpotMax) {
caseyquinn 12:5b4f3245606a 574 digital_pot_set = digitalpotMax;
caseyquinn 12:5b4f3245606a 575 RGB_LED.set_led(1,0,0);
caseyquinn 12:5b4f3245606a 576 } else if(digital_pot_set<=digitalpotMin) {
caseyquinn 12:5b4f3245606a 577 digital_pot_set = digitalpotMin;
caseyquinn 12:5b4f3245606a 578 RGB_LED.set_led(1,0,0);
caseyquinn 12:5b4f3245606a 579 }
caseyquinn 8:c4a8f9b67cee 580
caseyquinn 8:c4a8f9b67cee 581 DigPot.writeRegister(digital_pot_set);
caseyquinn 12:5b4f3245606a 582
caseyquinn 8:c4a8f9b67cee 583 } else {
caseyquinn 12:5b4f3245606a 584 RGB_LED.set_led(0,1,0);
caseyquinn 8:c4a8f9b67cee 585 }
caseyquinn 12:5b4f3245606a 586
caseyquinn 12:5b4f3245606a 587 */
caseyquinn 8:c4a8f9b67cee 588 }
caseyquinn 9:8646fd501832 589 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 590 //Main Function
caseyquinn 9:8646fd501832 591 //////////////////////////////////////////////////////////////
jelord 1:9fbb5b665068 592 int main(){
caseyquinn 14:7cdb643da356 593
caseyquinn 19:b835bfb61e35 594 //gpsEN = 1;
caseyquinn 19:b835bfb61e35 595 //wait(1);
caseyquinn 17:3e6dda6e6335 596 BT_SW = 1;
caseyquinn 17:3e6dda6e6335 597 wait(1);
caseyquinn 17:3e6dda6e6335 598 BT_IRST = 1;
caseyquinn 17:3e6dda6e6335 599 wait(1);
caseyquinn 17:3e6dda6e6335 600
jelord 20:30a00cd18e21 601 //CODE ADDED TO TEST EEPROM
jelord 20:30a00cd18e21 602 //////////////////////////////////////////
jelord 20:30a00cd18e21 603 uint8_t serialNumWriter [2] = {0x00,0x11};
jelord 20:30a00cd18e21 604 uint8_t putDataInMe[2] = {0x02,0x00};
jelord 20:30a00cd18e21 605 E2PROM.write(0x00034,serialNumWriter,2);
jelord 20:30a00cd18e21 606 wait(.5);
jelord 20:30a00cd18e21 607 E2PROM.read(0x00034,putDataInMe,2);
jelord 20:30a00cd18e21 608 if(putDataInMe[0] == 0x02)pumps=1;
jelord 20:30a00cd18e21 609 //////////////////////////////////////////
jelord 20:30a00cd18e21 610 //END CODE ADDED TO TEST EEPROM
jelord 20:30a00cd18e21 611
caseyquinn 14:7cdb643da356 612 RGB_LED.set_led(0,0,1);
caseyquinn 14:7cdb643da356 613 STtime.tm_sec = 10; // 0-59
caseyquinn 15:e564c8031c47 614 STtime.tm_min = 30; // 0-59
caseyquinn 19:b835bfb61e35 615 STtime.tm_hour = 13; // 0-23
caseyquinn 19:b835bfb61e35 616 STtime.tm_mday = 24; // 1-31
caseyquinn 15:e564c8031c47 617 STtime.tm_mon = 2; // 0-11
caseyquinn 15:e564c8031c47 618 STtime.tm_year = 116; // year since 1900
caseyquinn 14:7cdb643da356 619 time_t seconds = mktime(&STtime);
caseyquinn 15:e564c8031c47 620 set_time(seconds); // Set RTC time to 16 December 2013 10:05:23 UTC
caseyquinn 14:7cdb643da356 621 wait(5);
caseyquinn 7:29b01d5812ee 622
caseyquinn 12:5b4f3245606a 623 /*
caseyquinn 16:577cb22cec99 624 motor1.getFault();
caseyquinn 16:577cb22cec99 625 wait(5);
caseyquinn 16:577cb22cec99 626 RGB_LED.set_led(0,0,0);
caseyquinn 16:577cb22cec99 627 motor2.getFault();
caseyquinn 16:577cb22cec99 628 wait(5);
caseyquinn 16:577cb22cec99 629 RGB_LED.set_led(1,0,0);
caseyquinn 16:577cb22cec99 630 motor3.getFault();
caseyquinn 16:577cb22cec99 631 wait(5);
caseyquinn 16:577cb22cec99 632 RGB_LED.set_led(0,0,0);
caseyquinn 16:577cb22cec99 633 motor4.getFault();
caseyquinn 16:577cb22cec99 634 wait(5);
caseyquinn 16:577cb22cec99 635 RGB_LED.set_led(1,0,0);
caseyquinn 16:577cb22cec99 636
caseyquinn 16:577cb22cec99 637 RGB_LED.set_led(1,0,0);
caseyquinn 12:5b4f3245606a 638 motor1.drive(254); //closed = 253, open = 254
caseyquinn 16:577cb22cec99 639 wait(10);
caseyquinn 12:5b4f3245606a 640 motor1.stop();
caseyquinn 16:577cb22cec99 641 RGB_LED.set_led(0,0,0);
caseyquinn 16:577cb22cec99 642
caseyquinn 16:577cb22cec99 643
caseyquinn 16:577cb22cec99 644 motor2.drive(254); //closed = 253, open = 254
caseyquinn 16:577cb22cec99 645 wait(10);
caseyquinn 12:5b4f3245606a 646 motor2.stop();
caseyquinn 16:577cb22cec99 647 RGB_LED.set_led(1,0,0);
caseyquinn 16:577cb22cec99 648
caseyquinn 16:577cb22cec99 649 motor3.drive(254); //closed = 253, open = 254
caseyquinn 16:577cb22cec99 650 wait(10);
caseyquinn 12:5b4f3245606a 651 motor3.stop();
caseyquinn 16:577cb22cec99 652 RGB_LED.set_led(0,0,0);
caseyquinn 16:577cb22cec99 653
caseyquinn 16:577cb22cec99 654
caseyquinn 16:577cb22cec99 655 motor4.drive(254); //closed = 253, open = 254
caseyquinn 16:577cb22cec99 656 wait(10);
caseyquinn 12:5b4f3245606a 657 motor4.stop();
caseyquinn 16:577cb22cec99 658 RGB_LED.set_led(0,0,1);
caseyquinn 16:577cb22cec99 659
caseyquinn 17:3e6dda6e6335 660 */
caseyquinn 13:455601f62aad 661
caseyquinn 12:5b4f3245606a 662
caseyquinn 10:06fbb1c9e3bd 663 pc.baud(115200); // set what you want here depending on your terminal program speed
caseyquinn 10:06fbb1c9e3bd 664 pc.printf("\f\n\r-------------Startup-------------\n\r");
jelord 1:9fbb5b665068 665 wait(0.5);
caseyquinn 5:c3252e5d45ca 666
caseyquinn 12:5b4f3245606a 667
jelord 20:30a00cd18e21 668 uint8_t serialNumberAndType[6] = {0x50,0x53,};
caseyquinn 13:455601f62aad 669
jelord 3:122bfc998c4c 670 E2PROM.read(0x00034,serialNumberAndType+2,2);
caseyquinn 4:5d004fd997d5 671
jelord 3:122bfc998c4c 672 int tempSerialNum = serialNumberAndType[2]+serialNumberAndType[3];
jelord 3:122bfc998c4c 673 int serialNumDigits[4];
jelord 3:122bfc998c4c 674 serialNumDigits[0] = tempSerialNum / 1000 % 10;
jelord 3:122bfc998c4c 675 serialNumDigits[1] = tempSerialNum / 100 % 10;
jelord 3:122bfc998c4c 676 serialNumDigits[2] = tempSerialNum / 10 % 10;
jelord 3:122bfc998c4c 677 serialNumDigits[3] = tempSerialNum % 10;
jelord 3:122bfc998c4c 678
jelord 3:122bfc998c4c 679 serialNumberAndType[2] = serialNumDigits[0]+48;
jelord 3:122bfc998c4c 680 serialNumberAndType[3] = serialNumDigits[1]+48;
jelord 3:122bfc998c4c 681 serialNumberAndType[4] = serialNumDigits[2]+48;
jelord 3:122bfc998c4c 682 serialNumberAndType[5] = serialNumDigits[3]+48;
caseyquinn 12:5b4f3245606a 683
caseyquinn 5:c3252e5d45ca 684 RGB_LED.set_led(0,1,0);
caseyquinn 13:455601f62aad 685
caseyquinn 10:06fbb1c9e3bd 686 pc.attach(pc_recv);
jelord 1:9fbb5b665068 687 microChannel.attach(uartMicro,microChannel.RxIrq);
jelord 3:122bfc998c4c 688 microChannel.baud(115200);
jelord 1:9fbb5b665068 689 microChannel.printf("$$$");
jelord 3:122bfc998c4c 690 wait(0.5);
jelord 3:122bfc998c4c 691 microChannel.printf("SN,");
jelord 3:122bfc998c4c 692 for(int i=0;i<6;i++)microChannel.putc(serialNumberAndType[i]);
jelord 3:122bfc998c4c 693 microChannel.printf("\r");
jelord 3:122bfc998c4c 694 wait(0.5);
jelord 1:9fbb5b665068 695 microChannel.printf("A\r");
jelord 3:122bfc998c4c 696 wait(0.5);
jelord 2:88fcbfadec6a 697 microChannel.printf("---\r");
jelord 3:122bfc998c4c 698 wait(0.5);
jelord 2:88fcbfadec6a 699
caseyquinn 18:41ef98db0423 700 RGB_LED.set_led(1,1,1);
jelord 3:122bfc998c4c 701 while(runReady!=1) {
jelord 3:122bfc998c4c 702 wait(1);
caseyquinn 11:aa21628a9b15 703 pc.printf("Waiting for BLE instruction");
jelord 3:122bfc998c4c 704
jelord 3:122bfc998c4c 705 }
jelord 3:122bfc998c4c 706
caseyquinn 14:7cdb643da356 707
jelord 3:122bfc998c4c 708 E2PROM.read(0x00015, startAndEndTime, 12); //Grab start and end times from EEPROM
jelord 3:122bfc998c4c 709 RGB_LED.set_led(0,1,0);
caseyquinn 14:7cdb643da356 710
caseyquinn 7:29b01d5812ee 711 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
caseyquinn 7:29b01d5812ee 712 //UPDATE THIS TO WORK WITH ST RTC INSTEAD
caseyquinn 7:29b01d5812ee 713 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
caseyquinn 14:7cdb643da356 714
jelord 3:122bfc998c4c 715 while(!RTC_UPAS.compare(startAndEndTime[0], startAndEndTime[1], startAndEndTime[2], startAndEndTime[3], startAndEndTime[4], startAndEndTime[5])) { // this while waits for the start time by looping until the start time
jelord 3:122bfc998c4c 716 wait(0.5);
jelord 3:122bfc998c4c 717
jelord 3:122bfc998c4c 718 RTC_UPAS.get_time();
jelord 3:122bfc998c4c 719
jelord 3:122bfc998c4c 720 }
caseyquinn 14:7cdb643da356 721
caseyquinn 14:7cdb643da356 722
jelord 3:122bfc998c4c 723
jelord 3:122bfc998c4c 724 //Get the proper serial number
jelord 3:122bfc998c4c 725 uint8_t serialBytes[2] = {0,};
jelord 3:122bfc998c4c 726 E2PROM.read(0x00034, serialBytes,2);
jelord 3:122bfc998c4c 727 serial_num = ((uint16_t)serialBytes[1] << 8) | serialBytes[0];
jelord 3:122bfc998c4c 728 calibrations.initialize(serial_num);
jelord 3:122bfc998c4c 729
jelord 3:122bfc998c4c 730 uint8_t logByte[1] = {0,};
jelord 3:122bfc998c4c 731 E2PROM.read(0x00014,logByte,1);
jelord 3:122bfc998c4c 732 logInerval = logByte[0];
jelord 3:122bfc998c4c 733
jelord 3:122bfc998c4c 734 //Use the flow rate value stored in eeprom
jelord 3:122bfc998c4c 735 uint8_t flowRateBytes[4] = {0,};
jelord 3:122bfc998c4c 736 E2PROM.read(0x00010,flowRateBytes,4);
jelord 3:122bfc998c4c 737 E2PROM.byteToFloat(flowRateBytes, &volflowSet);
jelord 3:122bfc998c4c 738
jelord 3:122bfc998c4c 739 if(volflowSet<=1.0) {
jelord 3:122bfc998c4c 740 gainFlow = 100;
jelord 3:122bfc998c4c 741 } else if(volflowSet>=2.0) {
jelord 3:122bfc998c4c 742 gainFlow = 25;
jelord 3:122bfc998c4c 743 } else {
jelord 3:122bfc998c4c 744 gainFlow = 25;
jelord 0:2cb2b2ea316f 745 }
caseyquinn 17:3e6dda6e6335 746
jelord 3:122bfc998c4c 747 RGB_LED.set_led(1,0,0);
jelord 3:122bfc998c4c 748 press = bmesensor.getPressure();
jelord 3:122bfc998c4c 749 temp = bmesensor.getTemperature();
jelord 3:122bfc998c4c 750 rh = bmesensor.getHumidity();
jelord 3:122bfc998c4c 751
jelord 3:122bfc998c4c 752 atmoRho = ((press-((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)))*100)/(287.0531*(temp+273.15))+((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)*100)/(461.4964*(temp+273.15));
jelord 3:122bfc998c4c 753 massflowSet = volflowSet*atmoRho;
jelord 3:122bfc998c4c 754
jelord 3:122bfc998c4c 755 DigPot.writeRegister(digital_pot_setpoint);
jelord 3:122bfc998c4c 756 wait(1);
caseyquinn 18:41ef98db0423 757 pumps = 1;
jelord 3:122bfc998c4c 758
jelord 3:122bfc998c4c 759 uint8_t subjectLabelOriginal[8] = {0,};
caseyquinn 4:5d004fd997d5 760 E2PROM.read(0x00001, subjectLabelOriginal,8);
caseyquinn 12:5b4f3245606a 761
caseyquinn 13:455601f62aad 762
caseyquinn 12:5b4f3245606a 763
caseyquinn 14:7cdb643da356 764 seconds = time(NULL);
caseyquinn 4:5d004fd997d5 765 strftime(timestr, 32, "%y-%m-%d-%H=%M=%S", localtime(&seconds));
caseyquinn 13:455601f62aad 766
caseyquinn 9:8646fd501832 767 //sprintf(filename, "/sd/UPAS%04dLOG_%02d-%02d-%02d_%02d=%02d=%02d_%c%c%c%c%c%c%c%c.txt",serial_num,RTC_UPAS.year,RTC_UPAS.month,RTC_UPAS.date,RTC_UPAS.hour,RTC_UPAS.minutes,RTC_UPAS.seconds,subjectLabelOriginal[0],subjectLabelOriginal[1],subjectLabelOriginal[2],subjectLabelOriginal[3],subjectLabelOriginal[4],subjectLabelOriginal[5],subjectLabelOriginal[6],subjectLabelOriginal[7]);
caseyquinn 19:b835bfb61e35 768 //sprintf(filename, "/sd/UPAS_TboardtestLog_%s_%c%c%c%c%c%c%c%c.txt", timestr,subjectLabelOriginal[0],subjectLabelOriginal[1],subjectLabelOriginal[2],subjectLabelOriginal[3],subjectLabelOriginal[4],subjectLabelOriginal[5],subjectLabelOriginal[6],subjectLabelOriginal[7]);
caseyquinn 19:b835bfb61e35 769 sprintf(filename, "/sd/UPAS_TboardtestLog_%s.txt", timestr);
jelord 3:122bfc998c4c 770 FILE *fp = fopen(filename, "w");
jelord 3:122bfc998c4c 771 fclose(fp);
jelord 3:122bfc998c4c 772
caseyquinn 14:7cdb643da356 773 /*
caseyquinn 12:5b4f3245606a 774 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 12:5b4f3245606a 775 omronVolt = (omronReading*4.096)/(32768*2);
caseyquinn 12:5b4f3245606a 776 if(omronVolt<=calibrations.omronVMin) {
caseyquinn 12:5b4f3245606a 777 massflow = calibrations.omronMFMin;
caseyquinn 12:5b4f3245606a 778 } else if(omronVolt>=calibrations.omronVMax) {
caseyquinn 12:5b4f3245606a 779 massflow = calibrations.omronMFMax;
caseyquinn 12:5b4f3245606a 780 } else {
caseyquinn 12:5b4f3245606a 781 massflow = calibrations.MF4*pow(omronVolt,(float)4)+calibrations.MF3*pow(omronVolt,(float)3)+calibrations.MF2*pow(omronVolt,(float)2)+calibrations.MF1*omronVolt+calibrations.MF0;
caseyquinn 12:5b4f3245606a 782 }
caseyquinn 12:5b4f3245606a 783 deltaMflow = massflow-massflowSet;
caseyquinn 12:5b4f3245606a 784 digital_pot_set = digital_pot_setpoint;
caseyquinn 12:5b4f3245606a 785 wait(5);
caseyquinn 12:5b4f3245606a 786
caseyquinn 12:5b4f3245606a 787 //---------------------------------------------------------------------------------------------//
caseyquinn 12:5b4f3245606a 788 //Sets the flow withen +-1.5% of the desired flow rate based on mass flow
caseyquinn 12:5b4f3245606a 789
caseyquinn 12:5b4f3245606a 790 while(abs(deltaMflow)>.025) {
caseyquinn 12:5b4f3245606a 791
caseyquinn 12:5b4f3245606a 792 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 12:5b4f3245606a 793 omronVolt = (omronReading*4.096)/(32768*2);
caseyquinn 12:5b4f3245606a 794 //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
caseyquinn 12:5b4f3245606a 795 if(omronVolt<=calibrations.omronVMin) {
caseyquinn 12:5b4f3245606a 796 massflow = calibrations.omronMFMin;
caseyquinn 12:5b4f3245606a 797 } else if(omronVolt>=calibrations.omronVMax) {
caseyquinn 12:5b4f3245606a 798 massflow = calibrations.omronMFMax;
caseyquinn 12:5b4f3245606a 799 } else {
caseyquinn 12:5b4f3245606a 800 massflow = calibrations.MF4*pow(omronVolt,(float)4)+calibrations.MF3*pow(omronVolt,(float)3)+calibrations.MF2*pow(omronVolt,(float)2)+calibrations.MF1*omronVolt+calibrations.MF0;
caseyquinn 12:5b4f3245606a 801 }
caseyquinn 12:5b4f3245606a 802
caseyquinn 12:5b4f3245606a 803 atmoRho = ((press-((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)))*100)/(287.0531*(temp+273.15))+((6.1078*pow((float)10,(float)((7.5*temp)/(237.3+temp))))*(rh/100)*100)/(461.4964*(temp+273.15));
caseyquinn 12:5b4f3245606a 804 volflow = massflow/atmoRho;
caseyquinn 12:5b4f3245606a 805 massflowSet = volflowSet*atmoRho;
caseyquinn 12:5b4f3245606a 806 deltaMflow = massflow-massflowSet;
caseyquinn 12:5b4f3245606a 807
caseyquinn 12:5b4f3245606a 808 digital_pot_set = (int)(digital_pot_set+(int)((gainFlow*deltaMflow)));
caseyquinn 12:5b4f3245606a 809 if(digital_pot_set>=digitalpotMax) {
caseyquinn 12:5b4f3245606a 810 digital_pot_set = digitalpotMax;
caseyquinn 12:5b4f3245606a 811 } else if(digital_pot_set<=digitalpotMin) {
caseyquinn 12:5b4f3245606a 812 digital_pot_set = digitalpotMin;
caseyquinn 12:5b4f3245606a 813 }
caseyquinn 12:5b4f3245606a 814
caseyquinn 12:5b4f3245606a 815 wait(2);
caseyquinn 12:5b4f3245606a 816 DigPot.writeRegister(digital_pot_set);
caseyquinn 12:5b4f3245606a 817 pc.printf("%d,\r\n", digital_pot_set);
caseyquinn 12:5b4f3245606a 818 wait(1);
caseyquinn 12:5b4f3245606a 819
caseyquinn 12:5b4f3245606a 820
caseyquinn 12:5b4f3245606a 821 }
caseyquinn 14:7cdb643da356 822 */
jelord 3:122bfc998c4c 823 sampledVol = 0.0;
jelord 3:122bfc998c4c 824 RGB_LED.set_led(0,1,0);
caseyquinn 14:7cdb643da356 825
caseyquinn 18:41ef98db0423 826 stop.attach(&check_stop, 9); // check if we should shut down every 9 number seconds, starting after the start.
caseyquinn 14:7cdb643da356 827 logg.attach(&log_data, logInerval);
caseyquinn 12:5b4f3245606a 828 //flowCtl.attach(&flowControl, 1);
caseyquinn 7:29b01d5812ee 829
jelord 3:122bfc998c4c 830
jelord 3:122bfc998c4c 831 //** end of initalization **//
jelord 3:122bfc998c4c 832 //---------------------------------------------------------------------------------------------//
jelord 3:122bfc998c4c 833 //---------------------------------------------------------------------------------------------//
jelord 3:122bfc998c4c 834 // Main Control Loop
jelord 3:122bfc998c4c 835
caseyquinn 7:29b01d5812ee 836 while (1) {
caseyquinn 7:29b01d5812ee 837 // Do other things...
caseyquinn 14:7cdb643da356 838 /*
caseyquinn 18:41ef98db0423 839 pumps = 1;
caseyquinn 13:455601f62aad 840 wait(5);
caseyquinn 18:41ef98db0423 841 pumps = 0;
caseyquinn 13:455601f62aad 842 wait(5);
caseyquinn 14:7cdb643da356 843 */
caseyquinn 7:29b01d5812ee 844 }
caseyquinn 7:29b01d5812ee 845
caseyquinn 8:c4a8f9b67cee 846
caseyquinn 4:5d004fd997d5 847
jelord 3:122bfc998c4c 848
jelord 0:2cb2b2ea316f 849 }