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:
caseyquinn
Date:
Sat May 07 18:43:33 2016 +0000
Revision:
48:45d29f874b23
Parent:
47:fe50d72c7adc
Only run flow control if pumps are on. This will hopefully eliminate the issue of getting stuck out of flow and running full power.....

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 43:05aa1fb68946 14 //#include "DRV8830.h"
jelord 39:f1ebecfb32ca 15 #include "Tb_SD_Reader.h"
caseyquinn 14:7cdb643da356 16
jelord 0:2cb2b2ea316f 17
caseyquinn 12:5b4f3245606a 18 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 19 //General Items
caseyquinn 12:5b4f3245606a 20 /////////////////////////////////////////////
caseyquinn 14:7cdb643da356 21 I2C i2c(PB_9, PB_8);//(D14, D15); SDA,SCL
caseyquinn 12:5b4f3245606a 22 Serial pc(USBTX, USBRX);
caseyquinn 18:41ef98db0423 23 DigitalOut pumps(PA_9, 0);//(D8, 0);
caseyquinn 12:5b4f3245606a 24 DigitalOut pbKill(PC_12, 1); // Digital input pin that conncect to the LTC2950 battery charger used to shutdown the UPAS
caseyquinn 13:455601f62aad 25 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 26 MCP40D17 DigPot(&i2c);
caseyquinn 12:5b4f3245606a 27 BME280 bmesensor(PB_9, PB_8);//(D14, D15);
caseyquinn 12:5b4f3245606a 28 NCP5623BMUTBG RGB_LED(PB_9, PB_8);//(D14, D15);
caseyquinn 17:3e6dda6e6335 29 CronoDot RTC_UPAS(PB_9, PB_8);//(D14, D15);
caseyquinn 12:5b4f3245606a 30 EEPROM E2PROM(PB_9, PB_8);//(D14, D15);
caseyquinn 12:5b4f3245606a 31 Calibration calibrations(1); //Default serial/calibration if there are no values for the selected option
caseyquinn 14:7cdb643da356 32
caseyquinn 12:5b4f3245606a 33
caseyquinn 12:5b4f3245606a 34 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 35 //RN4677 BT/BLE Module
caseyquinn 12:5b4f3245606a 36 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 37 Serial microChannel(PB_10, PB_11); // tx, rx
caseyquinn 4:5d004fd997d5 38 DigitalOut bleRTS(PB_14, 0);
caseyquinn 4:5d004fd997d5 39 DigitalOut bleCTS(PB_13, 0);
caseyquinn 12:5b4f3245606a 40 DigitalOut BT_IRST(PC_8, 0);
caseyquinn 12:5b4f3245606a 41 DigitalOut BT_SW(PA_12, 0);
caseyquinn 17:3e6dda6e6335 42
caseyquinn 13:455601f62aad 43
caseyquinn 12:5b4f3245606a 44 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 45 //Analog to Digital Converter
caseyquinn 12:5b4f3245606a 46 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 47 Adafruit_ADS1115 ads(&i2c);
caseyquinn 12:5b4f3245606a 48 //DigitalIn ADS_ALRT(PA_10); //Connected but currently unused. (ADS1115) http://www.ti.com/lit/ds/symlink/ads1115.pdf
caseyquinn 12:5b4f3245606a 49
caseyquinn 12:5b4f3245606a 50 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 51 //Battery Monitoring
caseyquinn 12:5b4f3245606a 52 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 53 STC3100 gasG(PB_9, PB_8);//(D14, D15); // http://www.st.com/web/en/resource/technical/document/datasheet/CD00219947.pdf
caseyquinn 28:42932d3b105d 54 InterruptIn bcs1(PC_9); //Charge complete if High. Connected but currently unused. (MCP73871) http://www.mouser.com/ds/2/268/22090a-52174.pdf
caseyquinn 28:42932d3b105d 55 InterruptIn 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 56
caseyquinn 12:5b4f3245606a 57 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 58 //Accelerometer and Magnometer
caseyquinn 12:5b4f3245606a 59 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 60 LSM303 movementsensor(PB_9, PB_8);//(D14, D15); // http://www.st.com/web/en/resource/technical/document/datasheet/DM00027543.pdf
caseyquinn 12:5b4f3245606a 61 //DigitalIn ACC_INT1(PC_7); //Connected but currently unused. (LSM303)
caseyquinn 12:5b4f3245606a 62 //DigitalIn ACC_INT2(PC_6); //Connected but currently unused. (LSM303)
caseyquinn 12:5b4f3245606a 63 //DigitalIn ACC_DRDY(PC_11); //Connected but currently unused. (LSM303)
jelord 0:2cb2b2ea316f 64
caseyquinn 12:5b4f3245606a 65 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 66 //UV and Visible Light Sensor
caseyquinn 12:5b4f3245606a 67 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 68 SI1145 lightsensor(PB_9, PB_8);//(D14, D15);
caseyquinn 12:5b4f3245606a 69 //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 70
caseyquinn 12:5b4f3245606a 71 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 72 //GPS
caseyquinn 12:5b4f3245606a 73 /////////////////////////////////////////////
caseyquinn 17:3e6dda6e6335 74 DigitalOut gpsEN(PB_15, 0);
caseyquinn 23:1ca41779b8ec 75 Max_M8 gps(PB_9, PB_8,(0x84));
caseyquinn 12:5b4f3245606a 76
caseyquinn 43:05aa1fb68946 77 /*
caseyquinn 12:5b4f3245606a 78 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 79 //Hbridge Valve Control
caseyquinn 12:5b4f3245606a 80 /////////////////////////////////////////////
caseyquinn 36:2e344db70d35 81 DRV8830 schoolF1(PB_9, PB_8, 0xC4); //Work/School Filter A HB1
caseyquinn 36:2e344db70d35 82 DRV8830 homeF2(PB_9, PB_8, 0xCA); //Home Filter B HB2
caseyquinn 36:2e344db70d35 83 DRV8830 transitF3(PB_9, PB_8, 0xCC); //Transit Filter C HB3
caseyquinn 36:2e344db70d35 84 DRV8830 blankF4(PB_9, PB_8, 0xCE); //Blank Filter D HB4
caseyquinn 28:42932d3b105d 85 DigitalIn hb1_school(PA_6);
caseyquinn 28:42932d3b105d 86 DigitalIn hb2_home(PA_7);
caseyquinn 28:42932d3b105d 87 DigitalIn hb3_transit(PA_5);
caseyquinn 28:42932d3b105d 88 DigitalIn hb4_blank(PA_4);
caseyquinn 43:05aa1fb68946 89 */
caseyquinn 23:1ca41779b8ec 90
caseyquinn 12:5b4f3245606a 91 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 92 //SD Card
caseyquinn 12:5b4f3245606a 93 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 94 char filename[] = "/sd/XXXX0000LOG000000000000---------------.txt";
caseyquinn 12:5b4f3245606a 95 SDFileSystem sd(PB_5, PB_4, PB_3, PB_6, "sd");//(D4, D5, D3, D10, "sd"); // (MOSI, MISO, SCK, SEL)
jelord 39:f1ebecfb32ca 96 Tb_SD_Reader sdReader;
caseyquinn 28:42932d3b105d 97 DigitalIn sdCD(PA_11, PullUp);
jelord 39:f1ebecfb32ca 98 char fileTest[] = "test.txt";
caseyquinn 14:7cdb643da356 99
caseyquinn 12:5b4f3245606a 100 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 101 //Callbacks
caseyquinn 12:5b4f3245606a 102 /////////////////////////////////////////////
caseyquinn 9:8646fd501832 103 Ticker stop; //This is the stop callback object
caseyquinn 8:c4a8f9b67cee 104 Ticker logg; //This is the logging callback object
caseyquinn 9:8646fd501832 105 Ticker flowCtl; //This is the control loop callback object
jelord 3:122bfc998c4c 106
caseyquinn 12:5b4f3245606a 107 /////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 108 //Varible Definitions
caseyquinn 12:5b4f3245606a 109 /////////////////////////////////////////////
jelord 3:122bfc998c4c 110 uint16_t serial_num = 1; // Default serial/calibration number
jelord 3:122bfc998c4c 111 int RunReady =0;
jelord 3:122bfc998c4c 112
caseyquinn 25:fbf7d44e7da4 113 bool ledOn = 0;
caseyquinn 25:fbf7d44e7da4 114
caseyquinn 4:5d004fd997d5 115 struct tm STtime;
caseyquinn 7:29b01d5812ee 116 char timestr[32];
caseyquinn 43:05aa1fb68946 117 char yrstr[4];
caseyquinn 43:05aa1fb68946 118 char mostr[4];
caseyquinn 43:05aa1fb68946 119 char daystr[4];
caseyquinn 43:05aa1fb68946 120 char hrstr[4];
caseyquinn 43:05aa1fb68946 121 char minstr[4];
caseyquinn 43:05aa1fb68946 122 char secstr[4];
caseyquinn 43:05aa1fb68946 123
caseyquinn 43:05aa1fb68946 124 int stYr, stMo, stDay, stHr, stMin, stSec;
jelord 3:122bfc998c4c 125
caseyquinn 36:2e344db70d35 126
caseyquinn 9:8646fd501832 127 float press;
caseyquinn 9:8646fd501832 128 float temp;
caseyquinn 9:8646fd501832 129 float rh;
jelord 3:122bfc998c4c 130
caseyquinn 9:8646fd501832 131 int uv;
caseyquinn 9:8646fd501832 132 int vis;
caseyquinn 9:8646fd501832 133 int ir;
jelord 3:122bfc998c4c 134
caseyquinn 9:8646fd501832 135 float compass;
caseyquinn 9:8646fd501832 136 float accel_x;
caseyquinn 9:8646fd501832 137 float accel_y;
caseyquinn 9:8646fd501832 138 float accel_z;
caseyquinn 9:8646fd501832 139 float accel_comp;
caseyquinn 9:8646fd501832 140 float angle_x;
caseyquinn 9:8646fd501832 141 float angle_y;
caseyquinn 9:8646fd501832 142 float angle_z;
caseyquinn 9:8646fd501832 143 float mag_x;
caseyquinn 9:8646fd501832 144 float mag_y;
caseyquinn 9:8646fd501832 145 float mag_z;
jelord 3:122bfc998c4c 146
caseyquinn 9:8646fd501832 147 int vInReading;
caseyquinn 25:fbf7d44e7da4 148 int vInReadingLast;
caseyquinn 9:8646fd501832 149 int vBlowerReading;
caseyquinn 9:8646fd501832 150 int omronDiff;
caseyquinn 9:8646fd501832 151 float omronVolt; //V
caseyquinn 9:8646fd501832 152 int omronReading;
caseyquinn 9:8646fd501832 153 float atmoRho; //g/L
jelord 3:122bfc998c4c 154
caseyquinn 25:fbf7d44e7da4 155 int amps;
caseyquinn 25:fbf7d44e7da4 156 int bVolt;
caseyquinn 25:fbf7d44e7da4 157 int bFuel;
caseyquinn 25:fbf7d44e7da4 158 //bool pumpOn;
caseyquinn 9:8646fd501832 159 float massflow; //g/min
caseyquinn 9:8646fd501832 160 float volflow; //L/min
jelord 3:122bfc998c4c 161 float volflowSet = 1.0; //L/min
caseyquinn 14:7cdb643da356 162 int logInerval = 5;//seconds
jelord 3:122bfc998c4c 163 double secondsD = 0;
jelord 3:122bfc998c4c 164 double lastsecondD = 0;
caseyquinn 9:8646fd501832 165 float massflowSet;
jelord 3:122bfc998c4c 166 float deltaVflow = 0.0;
jelord 3:122bfc998c4c 167 float deltaMflow = 0.0;
caseyquinn 9:8646fd501832 168 float gainFlow;
caseyquinn 9:8646fd501832 169 float sampledVol; //L, total sampled volume
jelord 3:122bfc998c4c 170
caseyquinn 29:fd74725294d5 171 int digital_pot_setpoint = 30; //min = 0x7F, max = 0x00
caseyquinn 9:8646fd501832 172 int digital_pot_set;
caseyquinn 9:8646fd501832 173 int digital_pot_change;
jelord 3:122bfc998c4c 174 int digitalpotMax = 127;
caseyquinn 9:8646fd501832 175 int digitalpotMin = 10;
jelord 3:122bfc998c4c 176
caseyquinn 46:99d129bfdbbd 177 //int dutyUp;
caseyquinn 46:99d129bfdbbd 178 //int dutyDown;
caseyquinn 46:99d129bfdbbd 179 int dutycycleSecOn;
caseyquinn 46:99d129bfdbbd 180 int dutyCycleI;
caseyquinn 12:5b4f3245606a 181
caseyquinn 23:1ca41779b8ec 182 bool gpsFix;
caseyquinn 12:5b4f3245606a 183 uint8_t gpssatellites = 0;
caseyquinn 23:1ca41779b8ec 184 double gpsspeed = 0.0;
caseyquinn 28:42932d3b105d 185 double gpscourse = 0.0;
caseyquinn 23:1ca41779b8ec 186 double gpslatitude = 0.0;
caseyquinn 23:1ca41779b8ec 187 double gpslongitude = 0.0;
caseyquinn 23:1ca41779b8ec 188 float gpsaltitude = 0.0;
caseyquinn 12:5b4f3245606a 189
caseyquinn 26:6aa294d83af4 190 float home_lat = 40.00000; //40.580508;
caseyquinn 26:6aa294d83af4 191 float home_lon = -105.000000; //-105.081823;
caseyquinn 36:2e344db70d35 192 float home_lat2 = 40.00000; //40.580508;
caseyquinn 36:2e344db70d35 193 float home_lon2 = -105.000000; //-105.081823;
caseyquinn 26:6aa294d83af4 194 float work_lat = 40.100000; //40.594062; //40.569136;
caseyquinn 26:6aa294d83af4 195 float work_lon = -105.100000; //-105.075683; //-105.081966;
caseyquinn 12:5b4f3245606a 196 int location = 0;
caseyquinn 12:5b4f3245606a 197
caseyquinn 12:5b4f3245606a 198 float homeDistance = 99999;
caseyquinn 36:2e344db70d35 199 float home2Distance = 99999;
caseyquinn 12:5b4f3245606a 200 float workDistance = 99999;
caseyquinn 12:5b4f3245606a 201
jelord 3:122bfc998c4c 202 //*************************************************//
jelord 3:122bfc998c4c 203
jelord 2:88fcbfadec6a 204 void sendData();
jelord 39:f1ebecfb32ca 205 void Read_File(char[]);
caseyquinn 11:aa21628a9b15 206
caseyquinn 11:aa21628a9b15 207 void pc_recv(){
caseyquinn 11:aa21628a9b15 208 while(pc.readable()){
caseyquinn 11:aa21628a9b15 209 pc.getc();
caseyquinn 11:aa21628a9b15 210 }
caseyquinn 11:aa21628a9b15 211 }
caseyquinn 11:aa21628a9b15 212
jelord 0:2cb2b2ea316f 213 static uint8_t rx_buf[20];
jelord 0:2cb2b2ea316f 214 static uint8_t rx_len=0;
jelord 1:9fbb5b665068 215 static int haltBLE = 1;
jelord 1:9fbb5b665068 216 static int transmissionValue = 0;
jelord 2:88fcbfadec6a 217 uint8_t writeData[20] = {0,};
jelord 2:88fcbfadec6a 218 static uint8_t dataLength = 0;
jelord 3:122bfc998c4c 219 static int runReady = 0;
jelord 3:122bfc998c4c 220 static uint8_t startAndEndTime[12] = {0,};
jelord 39:f1ebecfb32ca 221 static uint8_t fileTransferLock = 0;
caseyquinn 5:c3252e5d45ca 222
caseyquinn 9:8646fd501832 223 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 224 //BLE Functions
caseyquinn 9:8646fd501832 225 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 226
caseyquinn 9:8646fd501832 227 void uartMicro(){
caseyquinn 25:fbf7d44e7da4 228
jelord 3:122bfc998c4c 229 if(runReady!=1){
jelord 3:122bfc998c4c 230 haltBLE = 2;
jelord 3:122bfc998c4c 231 while(microChannel.readable()){
jelord 3:122bfc998c4c 232 rx_buf[rx_len++] = microChannel.getc();
jelord 2:88fcbfadec6a 233
jelord 3:122bfc998c4c 234 //Code block to verify what is being transmitted. To function correctly, all data must terminate with \0 or \n
jelord 3:122bfc998c4c 235 if(transmissionValue==0){
jelord 3:122bfc998c4c 236
caseyquinn 4:5d004fd997d5 237 if (rx_buf[0] == 0x01)transmissionValue = 1; //rtc
jelord 3:122bfc998c4c 238 else if(rx_buf[0] == 0x02)transmissionValue = 2; //sample start and end times
jelord 3:122bfc998c4c 239 else if(rx_buf[0] == 0x03)transmissionValue = 3; //sample name
jelord 3:122bfc998c4c 240 else if(rx_buf[0] == 0x04)transmissionValue = 4; //Send Data Check
jelord 3:122bfc998c4c 241
jelord 3:122bfc998c4c 242 else if(rx_buf[0] == 0x05)transmissionValue = 5; //log interval
jelord 3:122bfc998c4c 243 else if(rx_buf[0] == 0x06)transmissionValue = 6; //Flow Rate
jelord 3:122bfc998c4c 244 else if(rx_buf[0] == 0x07)transmissionValue = 7; //Serial Number
jelord 3:122bfc998c4c 245 else if(rx_buf[0] == 0x08)transmissionValue = 8; //Run Enable
caseyquinn 25:fbf7d44e7da4 246 else if(rx_buf[0] == 0x0A)transmissionValue = 10; //GPS Coordinates
jelord 33:03d0e7f5ef0a 247 else if(rx_buf[0] == 0x0B)transmissionValue = 11; //GPS Coordinates (Second Set)
jelord 38:65ae9771f1e3 248 else if(rx_buf[0] == 0x0C)transmissionValue = 12; //Cartridge ID
jelord 38:65ae9771f1e3 249 else if(rx_buf[0] == 0x0D)transmissionValue = 13; //Duty Cycle
jelord 39:f1ebecfb32ca 250 else if (rx_buf[0] == 0x0F)transmissionValue = 15; //BT TRANSFER TEST
caseyquinn 25:fbf7d44e7da4 251 //else if(rx_buf[0] == 0x30)RGB_LED.set_led(1,0,0);
jelord 3:122bfc998c4c 252 else transmissionValue = 100; //Not useful data
jelord 3:122bfc998c4c 253 }
jelord 3:122bfc998c4c 254
jelord 38:65ae9771f1e3 255 if(rx_buf[rx_len-1]=='\0' || rx_buf[rx_len-1]=='\n' || rx_buf[rx_len-1] == 0xff || transmissionValue==15){
jelord 3:122bfc998c4c 256 if((transmissionValue == 1 || transmissionValue == 2 || transmissionValue == 3 || transmissionValue == 4 || transmissionValue == 5 ||
jelord 38:65ae9771f1e3 257 transmissionValue == 6 || transmissionValue == 7 || transmissionValue ==10 || transmissionValue ==11 || transmissionValue ==12) && rx_buf[rx_len-1] != 0xff)
jelord 3:122bfc998c4c 258 {}else{
caseyquinn 21:bb10efc5bf57 259 if(transmissionValue == 4 ) sendData();
jelord 39:f1ebecfb32ca 260 if(transmissionValue == 15){
jelord 39:f1ebecfb32ca 261 if(fileTransferLock==0){
jelord 39:f1ebecfb32ca 262 fileTransferLock=1;
jelord 39:f1ebecfb32ca 263 Read_File(fileTest);
jelord 39:f1ebecfb32ca 264 fileTransferLock=0;
jelord 39:f1ebecfb32ca 265 RGB_LED.set_led(1,1,1);
jelord 39:f1ebecfb32ca 266 }
jelord 39:f1ebecfb32ca 267 }
jelord 3:122bfc998c4c 268 if(transmissionValue == 8){
jelord 3:122bfc998c4c 269 runReady = 1;
jelord 3:122bfc998c4c 270 microChannel.attach(NULL,microChannel.RxIrq);
jelord 3:122bfc998c4c 271 }
jelord 3:122bfc998c4c 272 haltBLE = 1;
jelord 3:122bfc998c4c 273 transmissionValue = 0;
jelord 3:122bfc998c4c 274 dataLength = 0;
caseyquinn 25:fbf7d44e7da4 275 //if(fileWrite == 1){
caseyquinn 25:fbf7d44e7da4 276 //FILE *fp = fopen(gpsConfigFilename, "a");
caseyquinn 25:fbf7d44e7da4 277 //fprintf(fp,"HELLO");
caseyquinn 25:fbf7d44e7da4 278 //fclose(fp);
caseyquinn 25:fbf7d44e7da4 279 //free(fp);
caseyquinn 25:fbf7d44e7da4 280 //fileWrite=0;
caseyquinn 25:fbf7d44e7da4 281 //}
jelord 3:122bfc998c4c 282 }
jelord 2:88fcbfadec6a 283 }
jelord 1:9fbb5b665068 284 }
caseyquinn 12:5b4f3245606a 285
jelord 3:122bfc998c4c 286 if(haltBLE!=1){
jelord 2:88fcbfadec6a 287
jelord 3:122bfc998c4c 288 if((transmissionValue!=100) && (dataLength!= 0)) writeData[dataLength-1] = rx_buf[0];
jelord 3:122bfc998c4c 289
jelord 3:122bfc998c4c 290 if(transmissionValue ==100){
caseyquinn 10:06fbb1c9e3bd 291 pc.putc(rx_buf[0]);
jelord 2:88fcbfadec6a 292
jelord 3:122bfc998c4c 293 }else if(transmissionValue ==1){ //process and store RTC values
jelord 3:122bfc998c4c 294
caseyquinn 7:29b01d5812ee 295 //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 296 if(dataLength==6){
caseyquinn 17:3e6dda6e6335 297 RTC_UPAS.set_time(writeData[0],writeData[1],writeData[2],writeData[3],writeData[3],writeData[4],writeData[5]);//sets chronodot RTC
caseyquinn 12:5b4f3245606a 298 ///////////////////////
caseyquinn 7:29b01d5812ee 299 //sets ST RTC
caseyquinn 12:5b4f3245606a 300 //////////////////////
caseyquinn 7:29b01d5812ee 301 STtime.tm_sec = writeData[0]; // 0-59
caseyquinn 7:29b01d5812ee 302 STtime.tm_min = writeData[1]; // 0-59
caseyquinn 7:29b01d5812ee 303 STtime.tm_hour = writeData[2]; // 0-23
caseyquinn 7:29b01d5812ee 304 STtime.tm_mday = writeData[3]; // 1-31
caseyquinn 7:29b01d5812ee 305 STtime.tm_mon = writeData[4]-1; // 0-11
caseyquinn 7:29b01d5812ee 306 STtime.tm_year = 100+writeData[5]; // year since 1900 (116 = 2016)
caseyquinn 7:29b01d5812ee 307 time_t STseconds = mktime(&STtime);
caseyquinn 12:5b4f3245606a 308 set_time(STseconds); // Set RTC time
caseyquinn 7:29b01d5812ee 309 }
jelord 3:122bfc998c4c 310
caseyquinn 12:5b4f3245606a 311 }
caseyquinn 14:7cdb643da356 312 else if(transmissionValue ==2){ //process and store sample start/end
jelord 3:122bfc998c4c 313 if(dataLength ==12)E2PROM.write(0x00015, writeData, 12);
jelord 3:122bfc998c4c 314
jelord 3:122bfc998c4c 315 }else if(transmissionValue ==3){ //process and store sample name
jelord 39:f1ebecfb32ca 316 if(dataLength ==15)E2PROM.write(0x00001,writeData,15);
jelord 3:122bfc998c4c 317
jelord 3:122bfc998c4c 318 }else if(transmissionValue ==5){ //process and store Log Interval
jelord 3:122bfc998c4c 319 if(dataLength ==1)E2PROM.write(0x00014,writeData,1);
jelord 2:88fcbfadec6a 320
jelord 3:122bfc998c4c 321 }else if(transmissionValue ==6){ //process and store Flow Rate
jelord 3:122bfc998c4c 322 if(dataLength ==4)E2PROM.write(0x00010,writeData,4);
jelord 3:122bfc998c4c 323
jelord 3:122bfc998c4c 324 }else if(transmissionValue ==7){ //process and store Serial Number
jelord 3:122bfc998c4c 325 if(dataLength ==2)E2PROM.write(0x00034,writeData,2);
caseyquinn 25:fbf7d44e7da4 326 }else if (transmissionValue == 10){
caseyquinn 25:fbf7d44e7da4 327 if(dataLength == 16)E2PROM.write(0x00050,writeData,16);
jelord 33:03d0e7f5ef0a 328 }else if (transmissionValue == 11){
jelord 33:03d0e7f5ef0a 329 if(dataLength == 8)E2PROM.write(0x00060,writeData,8);
jelord 38:65ae9771f1e3 330 }else if (transmissionValue == 12){
jelord 38:65ae9771f1e3 331 if(dataLength == 3)E2PROM.write(0x00070,writeData,3);
jelord 38:65ae9771f1e3 332 }else if (transmissionValue == 13){
jelord 38:65ae9771f1e3 333 if(dataLength == 3)E2PROM.write(0x00076,writeData,3);
jelord 3:122bfc998c4c 334 }
caseyquinn 25:fbf7d44e7da4 335
jelord 3:122bfc998c4c 336 dataLength++;
jelord 1:9fbb5b665068 337 }
jelord 3:122bfc998c4c 338
jelord 3:122bfc998c4c 339 rx_len = 0;
jelord 3:122bfc998c4c 340 }else{
jelord 3:122bfc998c4c 341 while(microChannel.readable())
jelord 3:122bfc998c4c 342 uint8_t extract = microChannel.getc();
jelord 3:122bfc998c4c 343 }
jelord 2:88fcbfadec6a 344
caseyquinn 12:5b4f3245606a 345
jelord 2:88fcbfadec6a 346 }
caseyquinn 14:7cdb643da356 347
jelord 2:88fcbfadec6a 348 void sendData(){
jelord 2:88fcbfadec6a 349
caseyquinn 27:922f53fa649c 350 //First byte is designator for the App
caseyquinn 21:bb10efc5bf57 351 uint8_t sampleTimePassValues[13] = {0x01,0x00,0x00,0x0A,0x01,0x01,0x10,0x00,0x00,0x0A,0x01,0x01,0x10};
caseyquinn 40:cac5bdffba44 352 uint8_t subjectLabelOriginal[16] = {0x02,0x52,0x45,0x53,0x45,0x54,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x0F};
caseyquinn 21:bb10efc5bf57 353 uint8_t dataLogOriginal[2] = {0x03,0x0A,};
caseyquinn 21:bb10efc5bf57 354 uint8_t flowRateOriginal[5] = {0x04,0x00,0x00,0x80,0x3F};
caseyquinn 29:fd74725294d5 355 uint8_t serialBytes[3] = {0x07,0x00,0x00};
caseyquinn 25:fbf7d44e7da4 356 uint8_t latLongSchoolOriginal[17] = {0x0A,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F};
jelord 33:03d0e7f5ef0a 357 uint8_t latLongHome2[9] = {0x0B,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F};
jelord 38:65ae9771f1e3 358 uint8_t cartridgeIDOriginal[4] = {0x0C,0x48,0x48,0x48};
jelord 38:65ae9771f1e3 359 uint8_t dutyCycleOriginal[4] = {0x0D,0x31,0x30,0x30};
caseyquinn 25:fbf7d44e7da4 360 // Latitude School EEPROM = 0x50-0x53
caseyquinn 25:fbf7d44e7da4 361 // Longitude School EEPROM = 0x54-0x57
caseyquinn 25:fbf7d44e7da4 362 // Latitude Home EEPROM = 0x58-0x5B
caseyquinn 25:fbf7d44e7da4 363 // Longitude Home EEPROM = 0x5C-0x5F
caseyquinn 25:fbf7d44e7da4 364 uint8_t NEW_EEPROM_CHECK[1] = {0,}; //THIS IS USED TO ENSURE COOPERATION WITH MOBILE APPS
jelord 33:03d0e7f5ef0a 365 uint8_t TERMINATE_BYTE[1] = {0xff,}; //used for compatibility with android app
caseyquinn 25:fbf7d44e7da4 366
caseyquinn 25:fbf7d44e7da4 367 //NEW EEPROM Check bit = 0x75
caseyquinn 25:fbf7d44e7da4 368 E2PROM.read(0x00075,NEW_EEPROM_CHECK,1);
caseyquinn 25:fbf7d44e7da4 369
jelord 39:f1ebecfb32ca 370 if(NEW_EEPROM_CHECK[0] == 0x0C){ //increment when you add a new parameter to pass to app
caseyquinn 25:fbf7d44e7da4 371 E2PROM.read(0x00015, sampleTimePassValues+1, 12);
jelord 39:f1ebecfb32ca 372 E2PROM.read(0x00001, subjectLabelOriginal+1,15);
caseyquinn 25:fbf7d44e7da4 373 E2PROM.read(0x00014,dataLogOriginal+1,1);
caseyquinn 25:fbf7d44e7da4 374 E2PROM.read(0x00010,flowRateOriginal+1,4);
caseyquinn 29:fd74725294d5 375 E2PROM.read(0x00034,serialBytes+1,2);
caseyquinn 25:fbf7d44e7da4 376 E2PROM.read(0x00050,latLongSchoolOriginal+1,16);
jelord 33:03d0e7f5ef0a 377 E2PROM.read(0x00060,latLongHome2+1,8);
jelord 38:65ae9771f1e3 378 E2PROM.read(0x00070,cartridgeIDOriginal+1,3);
jelord 38:65ae9771f1e3 379 E2PROM.read(0x00076,dutyCycleOriginal+1,3);
jelord 38:65ae9771f1e3 380
caseyquinn 25:fbf7d44e7da4 381 }else{
jelord 39:f1ebecfb32ca 382 NEW_EEPROM_CHECK[0] = 0x0C; //increment as well
caseyquinn 25:fbf7d44e7da4 383 E2PROM.write(0x00075,NEW_EEPROM_CHECK,1);
caseyquinn 25:fbf7d44e7da4 384 E2PROM.write(0x00015, sampleTimePassValues+1, 12);
jelord 39:f1ebecfb32ca 385 E2PROM.write(0x00001, subjectLabelOriginal+1,15);
caseyquinn 25:fbf7d44e7da4 386 E2PROM.write(0x00014,dataLogOriginal+1,1);
caseyquinn 25:fbf7d44e7da4 387 E2PROM.write(0x00010,flowRateOriginal+1,4);
caseyquinn 29:fd74725294d5 388 E2PROM.write(0x00034,serialBytes+1,2);
caseyquinn 25:fbf7d44e7da4 389 E2PROM.write(0x00050,latLongSchoolOriginal+1,16);
jelord 33:03d0e7f5ef0a 390 E2PROM.write(0x00060,latLongHome2+1,8);
jelord 38:65ae9771f1e3 391 E2PROM.write(0x00070,cartridgeIDOriginal+1,3);
jelord 38:65ae9771f1e3 392 E2PROM.write(0x00076,dutyCycleOriginal+1,3);
caseyquinn 25:fbf7d44e7da4 393 }
caseyquinn 21:bb10efc5bf57 394
jelord 2:88fcbfadec6a 395
jelord 2:88fcbfadec6a 396 for(int i=0; i<13; i++){
jelord 2:88fcbfadec6a 397 microChannel.putc(sampleTimePassValues[i]);
jelord 2:88fcbfadec6a 398 }
jelord 33:03d0e7f5ef0a 399 wait(.15);
jelord 2:88fcbfadec6a 400
jelord 39:f1ebecfb32ca 401 for(int i=0; i<16; i++){
jelord 2:88fcbfadec6a 402 microChannel.putc(subjectLabelOriginal[i]);
jelord 2:88fcbfadec6a 403 }
jelord 33:03d0e7f5ef0a 404 wait(.15);
jelord 2:88fcbfadec6a 405
jelord 2:88fcbfadec6a 406 for(int i=0; i<2; i++){
jelord 2:88fcbfadec6a 407 microChannel.putc(dataLogOriginal[i]);
jelord 2:88fcbfadec6a 408 }
jelord 33:03d0e7f5ef0a 409 wait(.15);
jelord 2:88fcbfadec6a 410
jelord 2:88fcbfadec6a 411 for(int i=0; i<5; i++){
jelord 2:88fcbfadec6a 412 microChannel.putc(flowRateOriginal[i]);
caseyquinn 25:fbf7d44e7da4 413 }
jelord 33:03d0e7f5ef0a 414 wait(.15);
caseyquinn 25:fbf7d44e7da4 415
caseyquinn 25:fbf7d44e7da4 416 for(int i=0;i<17;i++){
caseyquinn 25:fbf7d44e7da4 417 microChannel.putc(latLongSchoolOriginal[i]);
jelord 2:88fcbfadec6a 418 }
jelord 33:03d0e7f5ef0a 419 wait(.15);
jelord 33:03d0e7f5ef0a 420
jelord 33:03d0e7f5ef0a 421 for(int i=0;i<9;i++){
jelord 33:03d0e7f5ef0a 422 microChannel.putc(latLongHome2[i]);
jelord 33:03d0e7f5ef0a 423 }
jelord 33:03d0e7f5ef0a 424 wait(.15);
jelord 38:65ae9771f1e3 425 for(int i=0;i<4;i++){
jelord 38:65ae9771f1e3 426 microChannel.putc(cartridgeIDOriginal[i]);
jelord 38:65ae9771f1e3 427 }
jelord 38:65ae9771f1e3 428 wait(.15);
jelord 38:65ae9771f1e3 429 for(int i=0;i<4;i++){
jelord 38:65ae9771f1e3 430 microChannel.putc(dutyCycleOriginal[i]);
jelord 38:65ae9771f1e3 431 }
jelord 38:65ae9771f1e3 432 wait(.15);
jelord 33:03d0e7f5ef0a 433 microChannel.putc(TERMINATE_BYTE[0]);
jelord 0:2cb2b2ea316f 434
jelord 2:88fcbfadec6a 435
caseyquinn 25:fbf7d44e7da4 436 }
jelord 39:f1ebecfb32ca 437 void Read_File(char filename[]){
jelord 39:f1ebecfb32ca 438 char new_str[] = "/sd/XXXX0000LOG000000000000---------------.txt";
jelord 39:f1ebecfb32ca 439
jelord 39:f1ebecfb32ca 440 sprintf(new_str, "/sd/%s", filename);
jelord 39:f1ebecfb32ca 441 FILE *fp = fopen(new_str, "r");
jelord 39:f1ebecfb32ca 442 if(fp == NULL) {
jelord 39:f1ebecfb32ca 443 pc.printf("Could not open file, check disk.\r\n");
jelord 39:f1ebecfb32ca 444 while(1) {};
jelord 39:f1ebecfb32ca 445 } else {
jelord 39:f1ebecfb32ca 446 pc.printf("file opened\r\n");
jelord 39:f1ebecfb32ca 447 }
jelord 39:f1ebecfb32ca 448 unsigned char c;
jelord 39:f1ebecfb32ca 449 uint8_t sendMe[1] = {254};
jelord 39:f1ebecfb32ca 450 RGB_LED.set_led(0,1,0);
jelord 39:f1ebecfb32ca 451 //pc.printf("%s\r\n",fp.c_str());
jelord 39:f1ebecfb32ca 452 microChannel.putc(sendMe[0]);
jelord 39:f1ebecfb32ca 453 while (c != 255){ // while not end of file or forever
jelord 39:f1ebecfb32ca 454 c=fgetc(fp); // get a character/byte from the file
jelord 39:f1ebecfb32ca 455 //printf("%c",c); // and show it in hex format
jelord 39:f1ebecfb32ca 456 microChannel.putc(c);
jelord 39:f1ebecfb32ca 457 //wait(0.005);
jelord 39:f1ebecfb32ca 458 }
jelord 39:f1ebecfb32ca 459 //RGB_LED.set_led(1,0,0);
jelord 39:f1ebecfb32ca 460 printf("\r\n");
jelord 39:f1ebecfb32ca 461 fclose(fp); // close the file
jelord 39:f1ebecfb32ca 462
jelord 39:f1ebecfb32ca 463 };
caseyquinn 14:7cdb643da356 464
caseyquinn 12:5b4f3245606a 465 //////////////////////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 466 // GPS: Calculate distance from target location
caseyquinn 12:5b4f3245606a 467 //////////////////////////////////////////////////////////////
caseyquinn 12:5b4f3245606a 468 double GPSdistanceCalc (float tlat, float tlon)
caseyquinn 12:5b4f3245606a 469 {
caseyquinn 12:5b4f3245606a 470
caseyquinn 12:5b4f3245606a 471 float tlatrad, flatrad;
caseyquinn 12:5b4f3245606a 472 float sdlong, cdlong;
caseyquinn 12:5b4f3245606a 473 float sflat, cflat;
caseyquinn 12:5b4f3245606a 474 float stlat, ctlat;
caseyquinn 12:5b4f3245606a 475 float delta, denom;
caseyquinn 12:5b4f3245606a 476
caseyquinn 12:5b4f3245606a 477 double distance;
caseyquinn 27:922f53fa649c 478 delta = (gpslongitude-tlon)*0.0174532925;
caseyquinn 12:5b4f3245606a 479 sdlong = sin(delta);
caseyquinn 12:5b4f3245606a 480 cdlong = cos(delta);
caseyquinn 27:922f53fa649c 481 flatrad = (gpslatitude)*0.0174532925;
caseyquinn 12:5b4f3245606a 482 tlatrad = (tlat)*0.0174532925;
caseyquinn 12:5b4f3245606a 483 sflat = sin(flatrad);
caseyquinn 12:5b4f3245606a 484 cflat = cos(flatrad);
caseyquinn 12:5b4f3245606a 485 stlat = sin(tlatrad);
caseyquinn 12:5b4f3245606a 486 ctlat = cos(tlatrad);
caseyquinn 12:5b4f3245606a 487 delta = (cflat * stlat) - (sflat * ctlat * cdlong);
caseyquinn 12:5b4f3245606a 488 delta = pow(delta,2);
caseyquinn 12:5b4f3245606a 489 delta += pow(ctlat * sdlong,2);
caseyquinn 12:5b4f3245606a 490 delta = sqrt(delta);
caseyquinn 12:5b4f3245606a 491 denom = (sflat * stlat) + (cflat * ctlat * cdlong);
caseyquinn 12:5b4f3245606a 492 delta = atan2(delta, denom);
caseyquinn 12:5b4f3245606a 493 distance = delta * 6372795;
caseyquinn 12:5b4f3245606a 494 return distance;
caseyquinn 12:5b4f3245606a 495 }
caseyquinn 12:5b4f3245606a 496
caseyquinn 43:05aa1fb68946 497 //////////////////////////////////////////////////////////////
caseyquinn 45:5e0942088e31 498 //Time Comparison Function
caseyquinn 43:05aa1fb68946 499 //////////////////////////////////////////////////////////////
caseyquinn 43:05aa1fb68946 500 bool timecompare(uint8_t t_sec, uint8_t t_minutes, uint8_t t_hour, uint8_t t_date, uint8_t t_month, uint8_t t_year)
caseyquinn 43:05aa1fb68946 501 {
caseyquinn 43:05aa1fb68946 502
caseyquinn 43:05aa1fb68946 503 time_t seconds = time(NULL);
caseyquinn 43:05aa1fb68946 504 //strftime(timestr, 32, "%y%m%d%H%M%S", localtime(&seconds));
caseyquinn 43:05aa1fb68946 505
caseyquinn 43:05aa1fb68946 506 strftime(yrstr, 4, "%y", localtime(&seconds));
caseyquinn 43:05aa1fb68946 507 stYr = atoi(yrstr);
caseyquinn 43:05aa1fb68946 508
caseyquinn 43:05aa1fb68946 509 strftime(mostr, 4, "%m", localtime(&seconds));
caseyquinn 43:05aa1fb68946 510 stMo = atoi(mostr);
caseyquinn 43:05aa1fb68946 511
caseyquinn 43:05aa1fb68946 512 strftime(daystr, 4, "%d", localtime(&seconds));
caseyquinn 43:05aa1fb68946 513 stDay = atoi(daystr);
caseyquinn 43:05aa1fb68946 514
caseyquinn 43:05aa1fb68946 515 strftime(hrstr, 4, "%H", localtime(&seconds));
caseyquinn 43:05aa1fb68946 516 stHr = atoi(hrstr);
caseyquinn 43:05aa1fb68946 517
caseyquinn 43:05aa1fb68946 518 strftime(minstr, 4, "%M", localtime(&seconds));
caseyquinn 43:05aa1fb68946 519 stMin = atoi(minstr);
caseyquinn 43:05aa1fb68946 520
caseyquinn 43:05aa1fb68946 521 strftime(secstr, 4, "%S", localtime(&seconds));
caseyquinn 43:05aa1fb68946 522 stSec = atoi(secstr);
caseyquinn 43:05aa1fb68946 523
caseyquinn 43:05aa1fb68946 524 if(t_year != stYr){
caseyquinn 43:05aa1fb68946 525 return t_year < stYr;
caseyquinn 43:05aa1fb68946 526 }
caseyquinn 43:05aa1fb68946 527 if(t_month != stMo){
caseyquinn 43:05aa1fb68946 528 return t_month < stMo;
caseyquinn 43:05aa1fb68946 529 }
caseyquinn 43:05aa1fb68946 530 if(t_date != stDay){
caseyquinn 43:05aa1fb68946 531 return t_date < stDay;
caseyquinn 43:05aa1fb68946 532 }
caseyquinn 43:05aa1fb68946 533 if(t_hour != stHr){
caseyquinn 43:05aa1fb68946 534 return t_hour < stHr;
caseyquinn 43:05aa1fb68946 535 }
caseyquinn 43:05aa1fb68946 536 if(t_minutes != stMin){
caseyquinn 43:05aa1fb68946 537 return t_minutes < stMin;
caseyquinn 43:05aa1fb68946 538 }
caseyquinn 43:05aa1fb68946 539 return t_sec < stSec;
caseyquinn 43:05aa1fb68946 540
caseyquinn 43:05aa1fb68946 541 }
caseyquinn 43:05aa1fb68946 542
caseyquinn 5:c3252e5d45ca 543
caseyquinn 9:8646fd501832 544 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 545 //Shutdown Function
caseyquinn 9:8646fd501832 546 //////////////////////////////////////////////////////////////
jelord 3:122bfc998c4c 547 void check_stop() // this checks if it's time to stop and shutdown
jelord 3:122bfc998c4c 548 {
caseyquinn 17:3e6dda6e6335 549
caseyquinn 43:05aa1fb68946 550 if(timecompare(startAndEndTime[6], startAndEndTime[7], startAndEndTime[8], startAndEndTime[9], startAndEndTime[10], startAndEndTime[11])) {
jelord 3:122bfc998c4c 551 pbKill = 0; // this is were we shut everything down
caseyquinn 4:5d004fd997d5 552 //pc.printf("If you're reading this something has gone very wrong.");
jelord 3:122bfc998c4c 553 }
caseyquinn 17:3e6dda6e6335 554
jelord 3:122bfc998c4c 555 }
caseyquinn 5:c3252e5d45ca 556
caseyquinn 9:8646fd501832 557 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 558 //SD Logging Function
caseyquinn 9:8646fd501832 559 //////////////////////////////////////////////////////////////
jelord 3:122bfc998c4c 560 void log_data()
jelord 3:122bfc998c4c 561 {
caseyquinn 44:075fa63d5df1 562 //Get RTC time(s)
caseyquinn 28:42932d3b105d 563 ///////////////////////////
caseyquinn 43:05aa1fb68946 564 RTC_UPAS.get_time();
caseyquinn 7:29b01d5812ee 565 time_t seconds = time(NULL);
caseyquinn 42:c8ed2dc04dfe 566 strftime(timestr, 32, "%y%m%d%H%M%S", localtime(&seconds));
caseyquinn 43:05aa1fb68946 567
caseyquinn 43:05aa1fb68946 568 strftime(yrstr, 4, "%y", localtime(&seconds));
caseyquinn 43:05aa1fb68946 569 stYr = atoi(yrstr);
caseyquinn 43:05aa1fb68946 570
caseyquinn 43:05aa1fb68946 571 strftime(mostr, 4, "%m", localtime(&seconds));
caseyquinn 43:05aa1fb68946 572 stMo = atoi(mostr);
caseyquinn 43:05aa1fb68946 573
caseyquinn 43:05aa1fb68946 574 strftime(daystr, 4, "%d", localtime(&seconds));
caseyquinn 43:05aa1fb68946 575 stDay = atoi(daystr);
caseyquinn 43:05aa1fb68946 576
caseyquinn 43:05aa1fb68946 577 strftime(hrstr, 4, "%H", localtime(&seconds));
caseyquinn 43:05aa1fb68946 578 stHr = atoi(hrstr);
caseyquinn 43:05aa1fb68946 579
caseyquinn 43:05aa1fb68946 580 strftime(minstr, 4, "%M", localtime(&seconds));
caseyquinn 43:05aa1fb68946 581 stMin = atoi(minstr);
caseyquinn 43:05aa1fb68946 582
caseyquinn 43:05aa1fb68946 583 strftime(secstr, 4, "%S", localtime(&seconds));
caseyquinn 43:05aa1fb68946 584 stSec = atoi(secstr);
caseyquinn 43:05aa1fb68946 585
caseyquinn 44:075fa63d5df1 586 //pc.printf("%s,%s,%d,%s,%d,%s,%d,%s,%d,%s,%d,%s,%d\r\n", timestr,yrstr,stYr,mostr,stMo,daystr,stDay,hrstr,stHr,minstr,stMin,secstr,stSec);
caseyquinn 36:2e344db70d35 587
caseyquinn 46:99d129bfdbbd 588 /////////////////////////////
caseyquinn 46:99d129bfdbbd 589 ///Dutycycle
caseyquinn 46:99d129bfdbbd 590 ////////////////////////////
caseyquinn 46:99d129bfdbbd 591 if(stSec >= dutycycleSecOn && pumps == 1){
caseyquinn 46:99d129bfdbbd 592 pumps = 0;
caseyquinn 46:99d129bfdbbd 593 }
caseyquinn 46:99d129bfdbbd 594 else if(stSec < dutycycleSecOn && pumps == 0) {
caseyquinn 46:99d129bfdbbd 595 pumps = 1;
caseyquinn 46:99d129bfdbbd 596 }
caseyquinn 46:99d129bfdbbd 597
caseyquinn 28:42932d3b105d 598 //Get Sensor Data except GPS
caseyquinn 28:42932d3b105d 599 ////////////////////////////
caseyquinn 7:29b01d5812ee 600 press = bmesensor.getPressure();
caseyquinn 7:29b01d5812ee 601 temp = bmesensor.getTemperature()-5.0;
caseyquinn 7:29b01d5812ee 602 rh = bmesensor.getHumidity();
caseyquinn 7:29b01d5812ee 603 uv = lightsensor.getUV();
caseyquinn 14:7cdb643da356 604 movementsensor.getACCEL();
caseyquinn 14:7cdb643da356 605 movementsensor.getCOMPASS();
caseyquinn 14:7cdb643da356 606 compass = movementsensor.getCOMPASS_HEADING();
caseyquinn 14:7cdb643da356 607 accel_x = movementsensor.AccelData.x;
caseyquinn 14:7cdb643da356 608 accel_y = movementsensor.AccelData.y;
caseyquinn 14:7cdb643da356 609 accel_z = movementsensor.AccelData.z;
caseyquinn 14:7cdb643da356 610 accel_comp = pow(accel_x,(float)2)+pow(accel_y,(float)2)+pow(accel_z,(float)2)-1.0;
caseyquinn 14:7cdb643da356 611 mag_x = movementsensor.MagData.x;
caseyquinn 14:7cdb643da356 612 mag_y = movementsensor.MagData.y;
caseyquinn 14:7cdb643da356 613 mag_z = movementsensor.MagData.z;
caseyquinn 25:fbf7d44e7da4 614 vInReadingLast = vInReading;
caseyquinn 25:fbf7d44e7da4 615 vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0
caseyquinn 25:fbf7d44e7da4 616 amps = gasG.getAmps();
caseyquinn 25:fbf7d44e7da4 617 bVolt = gasG.getVolts();
caseyquinn 25:fbf7d44e7da4 618 bFuel = gasG.getCharge();
caseyquinn 35:e0bdd6389a75 619
caseyquinn 28:42932d3b105d 620 //Check for fully charged battery
caseyquinn 28:42932d3b105d 621 if(bVolt > 1750 && amps > 8191) {
caseyquinn 46:99d129bfdbbd 622 //RGB_LED.set_led(0,0,0);
caseyquinn 46:99d129bfdbbd 623 RGB_LED.set_led(0,1,0);
caseyquinn 44:075fa63d5df1 624 //Check for battery with ~2 hours left of runtime at 2lpm to remind user to plug in sampler
caseyquinn 44:075fa63d5df1 625 }else if(amps > 8191 && bVolt < 1500) {
caseyquinn 28:42932d3b105d 626 if(ledOn) {
caseyquinn 28:42932d3b105d 627 RGB_LED.set_led(0,0,0);
caseyquinn 28:42932d3b105d 628 ledOn = 0;
caseyquinn 28:42932d3b105d 629 }else {
caseyquinn 28:42932d3b105d 630 RGB_LED.set_led(1,0,0);
caseyquinn 28:42932d3b105d 631 ledOn = 1;
caseyquinn 28:42932d3b105d 632 }
caseyquinn 28:42932d3b105d 633 //No LED on when not low battery and not fully charged
caseyquinn 28:42932d3b105d 634 }else{
caseyquinn 28:42932d3b105d 635 RGB_LED.set_led(0,0,0);
caseyquinn 28:42932d3b105d 636 }
caseyquinn 28:42932d3b105d 637
caseyquinn 35:e0bdd6389a75 638
caseyquinn 28:42932d3b105d 639 // Get GPS Data
caseyquinn 28:42932d3b105d 640 //////////////////////////////
caseyquinn 28:42932d3b105d 641 //if(gpsEN ==1){
caseyquinn 28:42932d3b105d 642
caseyquinn 28:42932d3b105d 643 gpsFix = gps.read(1);
caseyquinn 28:42932d3b105d 644 gpsspeed = gps.speed;
caseyquinn 28:42932d3b105d 645 //gpscourse = gps.course;
caseyquinn 28:42932d3b105d 646 gpssatellites = gps.satellites;
caseyquinn 28:42932d3b105d 647 gpslatitude = gps.lat;
caseyquinn 28:42932d3b105d 648 gpslongitude = gps.lon;
caseyquinn 28:42932d3b105d 649 gpsaltitude = gps.altitude;
caseyquinn 43:05aa1fb68946 650 //}
caseyquinn 28:42932d3b105d 651
caseyquinn 28:42932d3b105d 652 //Check for 3.3V rail cut out and turn off pumps in this event
caseyquinn 28:42932d3b105d 653 if(vInReading > 5950 && amps > 8191) {
caseyquinn 35:e0bdd6389a75 654 pumps = 0;
caseyquinn 28:42932d3b105d 655 wait(1);
caseyquinn 28:42932d3b105d 656 //Turn pumps back on once the sampler is plugged in and charging after pumps shutoff and 3.3V rail drops out
caseyquinn 28:42932d3b105d 657 } else if(pumps == 0 && amps < 8191) {
caseyquinn 46:99d129bfdbbd 658 //pumps = 1;
caseyquinn 28:42932d3b105d 659 }
caseyquinn 28:42932d3b105d 660
caseyquinn 28:42932d3b105d 661
caseyquinn 14:7cdb643da356 662
caseyquinn 25:fbf7d44e7da4 663 if(pumps == 1){
caseyquinn 34:da333abe3476 664 omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 34:da333abe3476 665 omronVolt = (omronReading*4.096)/(32768*1);
caseyquinn 25:fbf7d44e7da4 666
caseyquinn 25:fbf7d44e7da4 667 if(omronVolt<=calibrations.omronVMin) {
caseyquinn 25:fbf7d44e7da4 668 massflow = calibrations.omronMFMin;
caseyquinn 25:fbf7d44e7da4 669 } else if(omronVolt>=calibrations.omronVMax) {
caseyquinn 25:fbf7d44e7da4 670 massflow = calibrations.omronMFMax;
caseyquinn 25:fbf7d44e7da4 671 } else {
caseyquinn 25:fbf7d44e7da4 672 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 25:fbf7d44e7da4 673 }
caseyquinn 25:fbf7d44e7da4 674
caseyquinn 25:fbf7d44e7da4 675 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 25:fbf7d44e7da4 676 volflow = massflow/atmoRho;
caseyquinn 25:fbf7d44e7da4 677 sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
caseyquinn 25:fbf7d44e7da4 678 deltaVflow = volflow-volflowSet;
caseyquinn 25:fbf7d44e7da4 679 massflowSet = volflowSet*atmoRho;
caseyquinn 25:fbf7d44e7da4 680 deltaMflow = massflow-massflowSet;
caseyquinn 25:fbf7d44e7da4 681
caseyquinn 25:fbf7d44e7da4 682 vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0
caseyquinn 25:fbf7d44e7da4 683 omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3
caseyquinn 14:7cdb643da356 684 }
caseyquinn 14:7cdb643da356 685
caseyquinn 27:922f53fa649c 686
caseyquinn 21:bb10efc5bf57 687
caseyquinn 7:29b01d5812ee 688 FILE *fp = fopen(filename, "a");
caseyquinn 21:bb10efc5bf57 689 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 690 fprintf(fp, "%s,", timestr);
caseyquinn 7:29b01d5812ee 691 fprintf(fp, "%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,", omronVolt,massflow,temp,press,rh,atmoRho);
caseyquinn 7:29b01d5812ee 692 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 693 fprintf(fp, "%.1f,%.1f,%.1f,%.3f,%.3f,%.3f,%.1f,", angle_x,angle_y,angle_z,mag_x, mag_y, mag_z,compass);
caseyquinn 25:fbf7d44e7da4 694 fprintf(fp, "%d,%d,%d,%d,%d,%d," ,uv,omronReading, vInReading, vBlowerReading, omronDiff,amps);
caseyquinn 25:fbf7d44e7da4 695 fprintf(fp, "%d,%d,%d,%1.3f,%1.3f,", bVolt, bFuel,digital_pot_set, deltaMflow, deltaVflow);
caseyquinn 27:922f53fa649c 696 fprintf(fp, "%f,%f,%06d,%06d,", gpslatitude, gpslongitude, (long)gps.date, (long)gps.utc);
caseyquinn 28:42932d3b105d 697 //fprintf(fp, "%f,%d,%f,%f,%d,", gpsspeed, gpssatellites, gpscourse, gpsaltitude, gpsFix);
caseyquinn 28:42932d3b105d 698 fprintf(fp, "%f,%d,%f,%d,", gpsspeed, gpssatellites, gpsaltitude, gpsFix);
caseyquinn 46:99d129bfdbbd 699 fprintf(fp, "%d,%d\r\n", dutyCycleI, pumps == 1); // test and add in speed, etc that Josh added in to match the adafruit GPS
caseyquinn 7:29b01d5812ee 700 fclose(fp);
caseyquinn 7:29b01d5812ee 701 free(fp);
caseyquinn 25:fbf7d44e7da4 702
caseyquinn 25:fbf7d44e7da4 703
caseyquinn 14:7cdb643da356 704
caseyquinn 12:5b4f3245606a 705
caseyquinn 25:fbf7d44e7da4 706
caseyquinn 12:5b4f3245606a 707
jelord 3:122bfc998c4c 708
jelord 3:122bfc998c4c 709 }
caseyquinn 8:c4a8f9b67cee 710
caseyquinn 9:8646fd501832 711 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 712 //Flow Control Function
caseyquinn 9:8646fd501832 713 //////////////////////////////////////////////////////////////
caseyquinn 8:c4a8f9b67cee 714 void flowControl()
caseyquinn 8:c4a8f9b67cee 715 {
caseyquinn 48:45d29f874b23 716 if(pumps == 1){
caseyquinn 25:fbf7d44e7da4 717 //RGB_LED.set_led(0,1,0);
caseyquinn 34:da333abe3476 718 omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 34:da333abe3476 719 omronVolt = (omronReading*4.096)/(32768*1);
caseyquinn 8:c4a8f9b67cee 720
caseyquinn 8:c4a8f9b67cee 721 if(omronVolt<=calibrations.omronVMin) {
caseyquinn 8:c4a8f9b67cee 722 massflow = calibrations.omronMFMin;
caseyquinn 8:c4a8f9b67cee 723 } else if(omronVolt>=calibrations.omronVMax) {
caseyquinn 8:c4a8f9b67cee 724 massflow = calibrations.omronMFMax;
caseyquinn 8:c4a8f9b67cee 725 } else {
caseyquinn 8:c4a8f9b67cee 726 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 727 }
caseyquinn 8:c4a8f9b67cee 728
caseyquinn 8:c4a8f9b67cee 729 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 730 volflow = massflow/atmoRho;
caseyquinn 47:fe50d72c7adc 731 //sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
caseyquinn 8:c4a8f9b67cee 732 deltaVflow = volflow-volflowSet;
caseyquinn 8:c4a8f9b67cee 733 massflowSet = volflowSet*atmoRho;
caseyquinn 8:c4a8f9b67cee 734 deltaMflow = massflow-massflowSet;
caseyquinn 12:5b4f3245606a 735
caseyquinn 8:c4a8f9b67cee 736 if(abs(deltaMflow)>.025) {
caseyquinn 8:c4a8f9b67cee 737 digital_pot_change = (int)(gainFlow*deltaMflow);
caseyquinn 8:c4a8f9b67cee 738
caseyquinn 8:c4a8f9b67cee 739
caseyquinn 12:5b4f3245606a 740 if(abs(digital_pot_change)>=10) {
caseyquinn 12:5b4f3245606a 741 digital_pot_set = (int)(digital_pot_set+ (int)(1*deltaMflow));
caseyquinn 25:fbf7d44e7da4 742 //RGB_LED.set_led(1,0,0);
caseyquinn 12:5b4f3245606a 743 } else {
caseyquinn 8:c4a8f9b67cee 744 digital_pot_set = (digital_pot_set+ digital_pot_change);
caseyquinn 25:fbf7d44e7da4 745 //RGB_LED.set_led(1,1,0);
caseyquinn 8:c4a8f9b67cee 746 }
caseyquinn 8:c4a8f9b67cee 747
caseyquinn 12:5b4f3245606a 748 if(digital_pot_set>=digitalpotMax) {
caseyquinn 12:5b4f3245606a 749 digital_pot_set = digitalpotMax;
caseyquinn 25:fbf7d44e7da4 750 //RGB_LED.set_led(1,0,0);
caseyquinn 12:5b4f3245606a 751 } else if(digital_pot_set<=digitalpotMin) {
caseyquinn 12:5b4f3245606a 752 digital_pot_set = digitalpotMin;
caseyquinn 25:fbf7d44e7da4 753 //RGB_LED.set_led(1,0,0);
caseyquinn 12:5b4f3245606a 754 }
caseyquinn 8:c4a8f9b67cee 755
caseyquinn 8:c4a8f9b67cee 756 DigPot.writeRegister(digital_pot_set);
caseyquinn 12:5b4f3245606a 757
caseyquinn 8:c4a8f9b67cee 758 } else {
caseyquinn 25:fbf7d44e7da4 759 //RGB_LED.set_led(0,1,0);
caseyquinn 8:c4a8f9b67cee 760 }
caseyquinn 48:45d29f874b23 761 }
caseyquinn 25:fbf7d44e7da4 762
caseyquinn 8:c4a8f9b67cee 763 }
caseyquinn 9:8646fd501832 764 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 765 //Main Function
caseyquinn 9:8646fd501832 766 //////////////////////////////////////////////////////////////
jelord 1:9fbb5b665068 767 int main(){
caseyquinn 27:922f53fa649c 768
caseyquinn 29:fd74725294d5 769
caseyquinn 23:1ca41779b8ec 770 RGB_LED.set_led(0,0,1);
caseyquinn 36:2e344db70d35 771
caseyquinn 36:2e344db70d35 772
caseyquinn 29:fd74725294d5 773 /*
caseyquinn 27:922f53fa649c 774 while(1){
caseyquinn 27:922f53fa649c 775 if(sdCD == 0){
caseyquinn 27:922f53fa649c 776 RGB_LED.set_led(0,1,0);
caseyquinn 27:922f53fa649c 777 }else{
caseyquinn 27:922f53fa649c 778 RGB_LED.set_led(1,0,0);
caseyquinn 27:922f53fa649c 779 }
caseyquinn 27:922f53fa649c 780
caseyquinn 27:922f53fa649c 781 wait(10);
caseyquinn 27:922f53fa649c 782 }
caseyquinn 35:e0bdd6389a75 783
caseyquinn 43:05aa1fb68946 784 */
caseyquinn 30:aa6324845a84 785
caseyquinn 23:1ca41779b8ec 786
caseyquinn 23:1ca41779b8ec 787 gpsEN = 1;
caseyquinn 23:1ca41779b8ec 788 wait(1);
caseyquinn 23:1ca41779b8ec 789 BT_SW = 1;
caseyquinn 23:1ca41779b8ec 790 wait(1);
caseyquinn 23:1ca41779b8ec 791 BT_IRST = 1;
caseyquinn 23:1ca41779b8ec 792 wait(1);
caseyquinn 23:1ca41779b8ec 793
caseyquinn 12:5b4f3245606a 794
caseyquinn 10:06fbb1c9e3bd 795 pc.baud(115200); // set what you want here depending on your terminal program speed
caseyquinn 10:06fbb1c9e3bd 796 pc.printf("\f\n\r-------------Startup-------------\n\r");
jelord 1:9fbb5b665068 797 wait(0.5);
caseyquinn 5:c3252e5d45ca 798
caseyquinn 29:fd74725294d5 799
caseyquinn 29:fd74725294d5 800
caseyquinn 29:fd74725294d5 801 uint8_t serialNumberAndType[6] = {0x50,0x53,}; //ex) PS0018 // 0x50,0x53 <- ASCII 80 + 83 (PS) //0x4d,0x53 <- ASCII 77 + 83 (MS)
caseyquinn 29:fd74725294d5 802 E2PROM.read(0x00034,serialNumberAndType+2,2);
caseyquinn 29:fd74725294d5 803
caseyquinn 29:fd74725294d5 804 int tempSerialNum = ((serialNumberAndType[2]-48)*10 + serialNumberAndType[3]-48);
caseyquinn 29:fd74725294d5 805 if(tempSerialNum < 18){
caseyquinn 29:fd74725294d5 806 serialNumberAndType[0] = 0x4D;
caseyquinn 29:fd74725294d5 807 }
caseyquinn 13:455601f62aad 808
jelord 3:122bfc998c4c 809 int serialNumDigits[4];
jelord 3:122bfc998c4c 810 serialNumDigits[0] = tempSerialNum / 1000 % 10;
jelord 3:122bfc998c4c 811 serialNumDigits[1] = tempSerialNum / 100 % 10;
jelord 3:122bfc998c4c 812 serialNumDigits[2] = tempSerialNum / 10 % 10;
jelord 3:122bfc998c4c 813 serialNumDigits[3] = tempSerialNum % 10;
jelord 3:122bfc998c4c 814
caseyquinn 29:fd74725294d5 815
jelord 3:122bfc998c4c 816 serialNumberAndType[2] = serialNumDigits[0]+48;
jelord 3:122bfc998c4c 817 serialNumberAndType[3] = serialNumDigits[1]+48;
jelord 3:122bfc998c4c 818 serialNumberAndType[4] = serialNumDigits[2]+48;
jelord 3:122bfc998c4c 819 serialNumberAndType[5] = serialNumDigits[3]+48;
caseyquinn 12:5b4f3245606a 820
caseyquinn 29:fd74725294d5 821 /*
caseyquinn 29:fd74725294d5 822 serialNumberAndType[2] = serialNumDigits[0];
caseyquinn 29:fd74725294d5 823 serialNumberAndType[3] = serialNumDigits[1];
caseyquinn 29:fd74725294d5 824 serialNumberAndType[4] = serialNumDigits[2];
caseyquinn 29:fd74725294d5 825 serialNumberAndType[5] = serialNumDigits[3];
caseyquinn 29:fd74725294d5 826 */
caseyquinn 29:fd74725294d5 827
caseyquinn 29:fd74725294d5 828 RGB_LED.set_led(0,1,0);
caseyquinn 13:455601f62aad 829
caseyquinn 10:06fbb1c9e3bd 830 pc.attach(pc_recv);
jelord 1:9fbb5b665068 831 microChannel.attach(uartMicro,microChannel.RxIrq);
jelord 3:122bfc998c4c 832 microChannel.baud(115200);
jelord 1:9fbb5b665068 833 microChannel.printf("$$$");
jelord 3:122bfc998c4c 834 wait(0.5);
jelord 3:122bfc998c4c 835 microChannel.printf("SN,");
jelord 3:122bfc998c4c 836 for(int i=0;i<6;i++)microChannel.putc(serialNumberAndType[i]);
jelord 3:122bfc998c4c 837 microChannel.printf("\r");
jelord 3:122bfc998c4c 838 wait(0.5);
jelord 1:9fbb5b665068 839 microChannel.printf("A\r");
jelord 3:122bfc998c4c 840 wait(0.5);
jelord 2:88fcbfadec6a 841 microChannel.printf("---\r");
jelord 3:122bfc998c4c 842 wait(0.5);
jelord 2:88fcbfadec6a 843
caseyquinn 18:41ef98db0423 844 RGB_LED.set_led(1,1,1);
caseyquinn 36:2e344db70d35 845
jelord 3:122bfc998c4c 846 while(runReady!=1) {
jelord 3:122bfc998c4c 847 wait(1);
caseyquinn 26:6aa294d83af4 848 pc.printf("Waiting for BLE instruction\r\n");
jelord 3:122bfc998c4c 849
jelord 3:122bfc998c4c 850 }
jelord 3:122bfc998c4c 851
caseyquinn 36:2e344db70d35 852 BT_SW = 0;
caseyquinn 36:2e344db70d35 853 wait(1);
caseyquinn 36:2e344db70d35 854 BT_IRST = 0;
caseyquinn 36:2e344db70d35 855 wait(1);
caseyquinn 36:2e344db70d35 856
caseyquinn 36:2e344db70d35 857
caseyquinn 36:2e344db70d35 858
jelord 3:122bfc998c4c 859 E2PROM.read(0x00015, startAndEndTime, 12); //Grab start and end times from EEPROM
jelord 3:122bfc998c4c 860 RGB_LED.set_led(0,1,0);
caseyquinn 14:7cdb643da356 861
caseyquinn 26:6aa294d83af4 862
caseyquinn 26:6aa294d83af4 863 //Pull MicroEnviornment Lat/Lons from EEPROM
caseyquinn 26:6aa294d83af4 864 // Latitude School EEPROM = 0x50-0x53
caseyquinn 26:6aa294d83af4 865 // Longitude School EEPROM = 0x54-0x57
caseyquinn 26:6aa294d83af4 866 // Latitude Home EEPROM = 0x58-0x5B
caseyquinn 26:6aa294d83af4 867 // Longitude Home EEPROM = 0x5C-0x5F
caseyquinn 26:6aa294d83af4 868
caseyquinn 26:6aa294d83af4 869 uint8_t workLat[4] = {0,};
caseyquinn 26:6aa294d83af4 870 E2PROM.read(0x00050,workLat,4);
caseyquinn 26:6aa294d83af4 871 E2PROM.byteToFloat(workLat, &work_lat);
caseyquinn 26:6aa294d83af4 872
caseyquinn 26:6aa294d83af4 873 uint8_t workLon[4] = {0,};
caseyquinn 26:6aa294d83af4 874 E2PROM.read(0x00054,workLon,4);
caseyquinn 26:6aa294d83af4 875 E2PROM.byteToFloat(workLon, &work_lon);
caseyquinn 26:6aa294d83af4 876
caseyquinn 26:6aa294d83af4 877 uint8_t homeLat[4] = {0,};
caseyquinn 26:6aa294d83af4 878 E2PROM.read(0x00058,homeLat,4);
caseyquinn 26:6aa294d83af4 879 E2PROM.byteToFloat(homeLat, &home_lat);
caseyquinn 26:6aa294d83af4 880
caseyquinn 26:6aa294d83af4 881 uint8_t homeLon[4] = {0,};
caseyquinn 26:6aa294d83af4 882 E2PROM.read(0x0005C,homeLon,4);
caseyquinn 26:6aa294d83af4 883 E2PROM.byteToFloat(homeLon, &home_lon);
caseyquinn 26:6aa294d83af4 884
caseyquinn 36:2e344db70d35 885 uint8_t homeLat2[4] = {0,};
caseyquinn 36:2e344db70d35 886 E2PROM.read(0x00060,homeLat2,4);
caseyquinn 36:2e344db70d35 887 E2PROM.byteToFloat(homeLat2, &home_lat2);
caseyquinn 26:6aa294d83af4 888
caseyquinn 36:2e344db70d35 889 uint8_t homeLon2[4] = {0,};
caseyquinn 36:2e344db70d35 890 E2PROM.read(0x00064,homeLon2,4);
caseyquinn 36:2e344db70d35 891 E2PROM.byteToFloat(homeLon2, &home_lon2);
caseyquinn 36:2e344db70d35 892
caseyquinn 36:2e344db70d35 893 pc.printf("%f,%f\r\n %f,%f\r\n %f,%f\r\n", home_lat, home_lon, work_lat, work_lon, home_lat2, home_lon2);
caseyquinn 36:2e344db70d35 894
caseyquinn 36:2e344db70d35 895 //Get the subject line information
caseyquinn 40:cac5bdffba44 896 uint8_t subjectLabelOriginal[15] = {0,};
caseyquinn 40:cac5bdffba44 897 E2PROM.read(0x00001, subjectLabelOriginal,15);
jelord 3:122bfc998c4c 898
caseyquinn 44:075fa63d5df1 899 //Get the cartridge ID information
caseyquinn 44:075fa63d5df1 900 uint8_t cartridgeID[3] = {0,};
caseyquinn 44:075fa63d5df1 901 E2PROM.read(0x00070, cartridgeID,3);
caseyquinn 44:075fa63d5df1 902
caseyquinn 46:99d129bfdbbd 903 //Get the dutycycle information
caseyquinn 46:99d129bfdbbd 904 uint8_t dutycycleStr[3] = {0,};
caseyquinn 46:99d129bfdbbd 905 E2PROM.read(0x00076, dutycycleStr,3);
caseyquinn 46:99d129bfdbbd 906 dutyCycleI = ((dutycycleStr[0]-48)*100 + (dutycycleStr[1]-48)*10 + (dutycycleStr[2]-48));
caseyquinn 46:99d129bfdbbd 907 float dutycycleF = ((float)dutyCycleI/100);
caseyquinn 46:99d129bfdbbd 908 dutycycleSecOn = (int)(dutycycleF*60);
caseyquinn 46:99d129bfdbbd 909
caseyquinn 46:99d129bfdbbd 910 //wait(1);
caseyquinn 46:99d129bfdbbd 911 //pc.printf("%s,%d,%f,%d\r\n", dutycycleStr,dutyCycleI,dutycycleF,dutycycleSecOn);
caseyquinn 46:99d129bfdbbd 912
jelord 3:122bfc998c4c 913 //Get the proper serial number
jelord 3:122bfc998c4c 914 uint8_t serialBytes[2] = {0,};
caseyquinn 29:fd74725294d5 915 E2PROM.read(0x00034,serialBytes,2);
caseyquinn 29:fd74725294d5 916 serial_num = (uint16_t)(((serialBytes[0]-48)*10 + serialBytes[1]-48));
caseyquinn 29:fd74725294d5 917
caseyquinn 29:fd74725294d5 918
caseyquinn 29:fd74725294d5 919 ////////////////////////////////////////////////////////////////////
caseyquinn 29:fd74725294d5 920 //Temporary fix for setting serial_num
caseyquinn 29:fd74725294d5 921 ////////////////////////////////////////////////////////////////////
caseyquinn 29:fd74725294d5 922 //uint8_t serialsubjectLabelOriginal[2] = {0,};
caseyquinn 29:fd74725294d5 923 //E2PROM.read(0x00001, serialsubjectLabelOriginal,2);
caseyquinn 29:fd74725294d5 924 //uint8_t newserialBytes[2] = {0,};
caseyquinn 29:fd74725294d5 925
caseyquinn 30:aa6324845a84 926 if(subjectLabelOriginal[2] == 126){
caseyquinn 29:fd74725294d5 927 E2PROM.write(0x00034,subjectLabelOriginal,2);
caseyquinn 29:fd74725294d5 928 serial_num = (uint16_t)(((subjectLabelOriginal[0]-48)*10 + subjectLabelOriginal[1]-48));
caseyquinn 29:fd74725294d5 929 }
caseyquinn 29:fd74725294d5 930
caseyquinn 29:fd74725294d5 931 //----------------------------------------------
jelord 3:122bfc998c4c 932 calibrations.initialize(serial_num);
caseyquinn 29:fd74725294d5 933 pc.printf("%d\r\n", serial_num);
caseyquinn 29:fd74725294d5 934 pc.printf("%f\r\n",calibrations.MF4);
caseyquinn 29:fd74725294d5 935 //----------------------------------------------
caseyquinn 29:fd74725294d5 936 ////////////////////////////////////////////////////////////////////
caseyquinn 29:fd74725294d5 937
jelord 3:122bfc998c4c 938
jelord 3:122bfc998c4c 939 uint8_t logByte[1] = {0,};
jelord 3:122bfc998c4c 940 E2PROM.read(0x00014,logByte,1);
jelord 3:122bfc998c4c 941 logInerval = logByte[0];
jelord 3:122bfc998c4c 942
jelord 3:122bfc998c4c 943 //Use the flow rate value stored in eeprom
jelord 3:122bfc998c4c 944 uint8_t flowRateBytes[4] = {0,};
jelord 3:122bfc998c4c 945 E2PROM.read(0x00010,flowRateBytes,4);
jelord 3:122bfc998c4c 946 E2PROM.byteToFloat(flowRateBytes, &volflowSet);
caseyquinn 29:fd74725294d5 947
caseyquinn 29:fd74725294d5 948
caseyquinn 43:05aa1fb68946 949
caseyquinn 36:2e344db70d35 950 /*
caseyquinn 36:2e344db70d35 951 while(!gpsFix){
caseyquinn 36:2e344db70d35 952 gpsFix = gps.read(1);
caseyquinn 36:2e344db70d35 953 if(ledOn) {
caseyquinn 36:2e344db70d35 954 RGB_LED.set_led(0,0,0);
caseyquinn 36:2e344db70d35 955 ledOn = 0;
caseyquinn 36:2e344db70d35 956 }else {
caseyquinn 36:2e344db70d35 957 RGB_LED.set_led(1,0,0);
caseyquinn 36:2e344db70d35 958 ledOn = 1;
caseyquinn 36:2e344db70d35 959 }
caseyquinn 36:2e344db70d35 960 wait(1);
caseyquinn 36:2e344db70d35 961 }
caseyquinn 36:2e344db70d35 962 */
caseyquinn 36:2e344db70d35 963
caseyquinn 36:2e344db70d35 964
caseyquinn 36:2e344db70d35 965
caseyquinn 43:05aa1fb68946 966 while(!timecompare(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
caseyquinn 36:2e344db70d35 967 wait(0.5);
caseyquinn 36:2e344db70d35 968
caseyquinn 36:2e344db70d35 969 }
caseyquinn 46:99d129bfdbbd 970
caseyquinn 46:99d129bfdbbd 971
caseyquinn 43:05aa1fb68946 972
caseyquinn 43:05aa1fb68946 973 time_t seconds = time(NULL);
caseyquinn 43:05aa1fb68946 974 strftime(timestr, 32, "%y-%m-%d-%H=%M=%S", localtime(&seconds));
caseyquinn 43:05aa1fb68946 975 RTC_UPAS.get_time();
caseyquinn 43:05aa1fb68946 976 if(tempSerialNum < 18){
caseyquinn 44:075fa63d5df1 977 sprintf(filename, "/sd/MS%04dLOG_%02d-%02d-%02d_%02d=%02d=%02d_%c%c%c%c%c%c%c%c%c%c%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],subjectLabelOriginal[8],subjectLabelOriginal[9],subjectLabelOriginal[10],subjectLabelOriginal[11],subjectLabelOriginal[12],subjectLabelOriginal[13],subjectLabelOriginal[14],cartridgeID[0],cartridgeID[1],cartridgeID[2]);
caseyquinn 36:2e344db70d35 978
caseyquinn 43:05aa1fb68946 979 }
caseyquinn 43:05aa1fb68946 980 else{
caseyquinn 44:075fa63d5df1 981 sprintf(filename, "/sd/PS%04dLOG_%02d-%02d-%02d_%02d=%02d=%02d_%c%c%c%c%c%c%c%c%c%c%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],subjectLabelOriginal[8],subjectLabelOriginal[9],subjectLabelOriginal[10],subjectLabelOriginal[11],subjectLabelOriginal[12],subjectLabelOriginal[13],subjectLabelOriginal[14],cartridgeID[0],cartridgeID[1],cartridgeID[2]);
caseyquinn 43:05aa1fb68946 982 }
caseyquinn 43:05aa1fb68946 983 //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 43:05aa1fb68946 984 //sprintf(filename, "/sd/UPAS_TboardtestLog_%s.txt", timestr);
caseyquinn 43:05aa1fb68946 985 FILE *fp = fopen(filename, "w");
caseyquinn 43:05aa1fb68946 986 fclose(fp);
caseyquinn 36:2e344db70d35 987
caseyquinn 36:2e344db70d35 988 RGB_LED.set_led(1,0,1);
caseyquinn 36:2e344db70d35 989
jelord 3:122bfc998c4c 990 if(volflowSet<=1.0) {
jelord 3:122bfc998c4c 991 gainFlow = 100;
jelord 3:122bfc998c4c 992 } else if(volflowSet>=2.0) {
jelord 3:122bfc998c4c 993 gainFlow = 25;
jelord 3:122bfc998c4c 994 } else {
jelord 3:122bfc998c4c 995 gainFlow = 25;
jelord 0:2cb2b2ea316f 996 }
caseyquinn 36:2e344db70d35 997
jelord 3:122bfc998c4c 998 press = bmesensor.getPressure();
jelord 3:122bfc998c4c 999 temp = bmesensor.getTemperature();
jelord 3:122bfc998c4c 1000 rh = bmesensor.getHumidity();
jelord 3:122bfc998c4c 1001
jelord 3:122bfc998c4c 1002 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 1003 massflowSet = volflowSet*atmoRho;
jelord 3:122bfc998c4c 1004
jelord 3:122bfc998c4c 1005 DigPot.writeRegister(digital_pot_setpoint);
jelord 3:122bfc998c4c 1006 wait(1);
caseyquinn 28:42932d3b105d 1007 pumps = 1;
caseyquinn 25:fbf7d44e7da4 1008 //pumpOn = 1;
jelord 3:122bfc998c4c 1009
caseyquinn 35:e0bdd6389a75 1010
caseyquinn 29:fd74725294d5 1011 if(volflowSet<=1.0) {
caseyquinn 29:fd74725294d5 1012 gainFlow = 100;
caseyquinn 29:fd74725294d5 1013 } else if(volflowSet>=2.0) {
caseyquinn 29:fd74725294d5 1014 gainFlow = 25;
caseyquinn 29:fd74725294d5 1015 } else {
caseyquinn 29:fd74725294d5 1016 gainFlow = 25;
caseyquinn 29:fd74725294d5 1017 }
caseyquinn 29:fd74725294d5 1018
caseyquinn 29:fd74725294d5 1019 RGB_LED.set_led(1,0,0);
caseyquinn 29:fd74725294d5 1020 press = bmesensor.getPressure();
caseyquinn 29:fd74725294d5 1021 temp = bmesensor.getTemperature();
caseyquinn 29:fd74725294d5 1022 rh = bmesensor.getHumidity();
caseyquinn 29:fd74725294d5 1023
caseyquinn 29:fd74725294d5 1024 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 29:fd74725294d5 1025 massflowSet = volflowSet*atmoRho;
caseyquinn 29:fd74725294d5 1026
caseyquinn 29:fd74725294d5 1027 //Digtal pot tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
caseyquinn 29:fd74725294d5 1028 digital_pot_setpoint = (int)floor(calibrations.DP4*pow(massflowSet,4)+calibrations.DP3*pow(massflowSet,3)+calibrations.DP2*pow(massflowSet,2)+calibrations.DP1*massflowSet+calibrations.DP0); //min = 0x7F, max = 0x00
caseyquinn 29:fd74725294d5 1029
caseyquinn 29:fd74725294d5 1030 if(digital_pot_setpoint>=digitalpotMax) {
caseyquinn 29:fd74725294d5 1031 digital_pot_setpoint = digitalpotMax;
caseyquinn 29:fd74725294d5 1032 } else if(digital_pot_setpoint<=digitalpotMin) {
caseyquinn 29:fd74725294d5 1033 digital_pot_setpoint = digitalpotMin;
caseyquinn 29:fd74725294d5 1034 }
caseyquinn 29:fd74725294d5 1035
caseyquinn 29:fd74725294d5 1036 pc.printf("%d\r\n", digital_pot_setpoint);
caseyquinn 29:fd74725294d5 1037 DigPot.writeRegister(digital_pot_setpoint);
caseyquinn 29:fd74725294d5 1038 wait(1);
caseyquinn 35:e0bdd6389a75 1039 pumps = 1;
caseyquinn 35:e0bdd6389a75 1040
jelord 3:122bfc998c4c 1041
caseyquinn 25:fbf7d44e7da4 1042
caseyquinn 34:da333abe3476 1043 omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 34:da333abe3476 1044 omronVolt = (omronReading*4.096)/(32768*1);
caseyquinn 12:5b4f3245606a 1045 if(omronVolt<=calibrations.omronVMin) {
caseyquinn 12:5b4f3245606a 1046 massflow = calibrations.omronMFMin;
caseyquinn 12:5b4f3245606a 1047 } else if(omronVolt>=calibrations.omronVMax) {
caseyquinn 12:5b4f3245606a 1048 massflow = calibrations.omronMFMax;
caseyquinn 12:5b4f3245606a 1049 } else {
caseyquinn 12:5b4f3245606a 1050 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 1051 }
caseyquinn 12:5b4f3245606a 1052 deltaMflow = massflow-massflowSet;
caseyquinn 12:5b4f3245606a 1053 digital_pot_set = digital_pot_setpoint;
caseyquinn 12:5b4f3245606a 1054 wait(5);
caseyquinn 12:5b4f3245606a 1055
caseyquinn 12:5b4f3245606a 1056 //---------------------------------------------------------------------------------------------//
caseyquinn 12:5b4f3245606a 1057 //Sets the flow withen +-1.5% of the desired flow rate based on mass flow
caseyquinn 35:e0bdd6389a75 1058
caseyquinn 12:5b4f3245606a 1059 while(abs(deltaMflow)>.025) {
caseyquinn 12:5b4f3245606a 1060
caseyquinn 34:da333abe3476 1061 omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 34:da333abe3476 1062 omronVolt = (omronReading*4.096)/(32768*1);
caseyquinn 36:2e344db70d35 1063 pc.printf("%d,%f\r\n", omronReading, omronVolt);
caseyquinn 12:5b4f3245606a 1064 //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
caseyquinn 12:5b4f3245606a 1065 if(omronVolt<=calibrations.omronVMin) {
caseyquinn 12:5b4f3245606a 1066 massflow = calibrations.omronMFMin;
caseyquinn 12:5b4f3245606a 1067 } else if(omronVolt>=calibrations.omronVMax) {
caseyquinn 12:5b4f3245606a 1068 massflow = calibrations.omronMFMax;
caseyquinn 12:5b4f3245606a 1069 } else {
caseyquinn 12:5b4f3245606a 1070 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 1071 }
caseyquinn 12:5b4f3245606a 1072
caseyquinn 12:5b4f3245606a 1073 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 1074 volflow = massflow/atmoRho;
caseyquinn 36:2e344db70d35 1075 pc.printf("%f\r\n", volflow);
caseyquinn 12:5b4f3245606a 1076 massflowSet = volflowSet*atmoRho;
caseyquinn 12:5b4f3245606a 1077 deltaMflow = massflow-massflowSet;
caseyquinn 12:5b4f3245606a 1078
caseyquinn 12:5b4f3245606a 1079 digital_pot_set = (int)(digital_pot_set+(int)((gainFlow*deltaMflow)));
caseyquinn 12:5b4f3245606a 1080 if(digital_pot_set>=digitalpotMax) {
caseyquinn 12:5b4f3245606a 1081 digital_pot_set = digitalpotMax;
caseyquinn 12:5b4f3245606a 1082 } else if(digital_pot_set<=digitalpotMin) {
caseyquinn 12:5b4f3245606a 1083 digital_pot_set = digitalpotMin;
caseyquinn 12:5b4f3245606a 1084 }
caseyquinn 12:5b4f3245606a 1085
caseyquinn 12:5b4f3245606a 1086 wait(2);
caseyquinn 12:5b4f3245606a 1087 DigPot.writeRegister(digital_pot_set);
caseyquinn 12:5b4f3245606a 1088 pc.printf("%d,\r\n", digital_pot_set);
caseyquinn 12:5b4f3245606a 1089 wait(1);
caseyquinn 12:5b4f3245606a 1090
caseyquinn 12:5b4f3245606a 1091
caseyquinn 12:5b4f3245606a 1092 }
caseyquinn 36:2e344db70d35 1093 //pumps = 0;
jelord 3:122bfc998c4c 1094 sampledVol = 0.0;
jelord 3:122bfc998c4c 1095 RGB_LED.set_led(0,1,0);
caseyquinn 25:fbf7d44e7da4 1096 wait(1);
caseyquinn 25:fbf7d44e7da4 1097 RGB_LED.set_led(0,0,0);
caseyquinn 14:7cdb643da356 1098
caseyquinn 46:99d129bfdbbd 1099 while(fmod((double)stSec,10)!=0) {
caseyquinn 46:99d129bfdbbd 1100 //pc.printf("%f, %f\r\n", floor(secondsD), floor(lastsecondD));
caseyquinn 46:99d129bfdbbd 1101 time_t seconds = time(NULL);
caseyquinn 46:99d129bfdbbd 1102 strftime(secstr, 4, "%S", localtime(&seconds));
caseyquinn 46:99d129bfdbbd 1103 stSec = atoi(secstr);
caseyquinn 46:99d129bfdbbd 1104 wait_ms(100);
caseyquinn 46:99d129bfdbbd 1105 }
caseyquinn 46:99d129bfdbbd 1106
caseyquinn 46:99d129bfdbbd 1107 logg.attach(&log_data, logInerval);
caseyquinn 43:05aa1fb68946 1108 stop.attach(&check_stop, 9); // check if we should shut down every 9 number seconds, starting after the start.
caseyquinn 35:e0bdd6389a75 1109 flowCtl.attach(&flowControl, 3);
caseyquinn 30:aa6324845a84 1110
caseyquinn 35:e0bdd6389a75 1111
caseyquinn 35:e0bdd6389a75 1112
caseyquinn 30:aa6324845a84 1113
jelord 3:122bfc998c4c 1114 //** end of initalization **//
jelord 3:122bfc998c4c 1115 //---------------------------------------------------------------------------------------------//
jelord 3:122bfc998c4c 1116 //---------------------------------------------------------------------------------------------//
jelord 3:122bfc998c4c 1117 // Main Control Loop
jelord 3:122bfc998c4c 1118
caseyquinn 7:29b01d5812ee 1119 while (1) {
caseyquinn 7:29b01d5812ee 1120 // Do other things...
caseyquinn 46:99d129bfdbbd 1121
caseyquinn 46:99d129bfdbbd 1122 }
caseyquinn 7:29b01d5812ee 1123
caseyquinn 8:c4a8f9b67cee 1124
caseyquinn 4:5d004fd997d5 1125
jelord 3:122bfc998c4c 1126
jelord 0:2cb2b2ea316f 1127 }