all working version 2.0

Dependencies:   ADS1115 BME280 CronoDot SDFileSystem mbed

Fork of Outdoor_UPAS_v1_2_powerfunction by scott kelleher

Committer:
caseyquinn
Date:
Wed Mar 02 16:49:59 2016 +0000
Revision:
8:c4a8f9b67cee
Parent:
7:29b01d5812ee
Child:
9:8646fd501832
Separated the flow control code from the log code such that the flow control can now be checked at the same interval all the time regardless of the logging interval.

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"
jelord 2:88fcbfadec6a 12 #include "Calibration.h"
caseyquinn 7:29b01d5812ee 13 //Serial pc(USBTX, USBRX);
caseyquinn 8:c4a8f9b67cee 14 //Serial microChannel(USBTX, USBRX); // tx, rx Appears there is a conflict in the mbed code (possibly already assigned to SERIAL_TX, SERIAL_RX, USBTX, USBRX need to reassign these values)
caseyquinn 5:c3252e5d45ca 15 // However still an issue with the BLE not reading the EEPROM with the old pin assignments Jake had.
caseyquinn 5:c3252e5d45ca 16 Serial microChannel(D8, D2); // tx, rx
caseyquinn 7:29b01d5812ee 17 //Timer t;
jelord 1:9fbb5b665068 18 struct tm tt;
jelord 0:2cb2b2ea316f 19
jelord 2:88fcbfadec6a 20 I2C i2c(D14, D15);
jelord 2:88fcbfadec6a 21 Adafruit_ADS1115 ads(&i2c);
jelord 2:88fcbfadec6a 22 MCP40D17 DigPot(&i2c);
jelord 2:88fcbfadec6a 23 BME280 bmesensor(D14, D15);
jelord 2:88fcbfadec6a 24 STC3100 gasG(D14, D15);
caseyquinn 5:c3252e5d45ca 25 //DigitalOut blower(D8, 0);
caseyquinn 4:5d004fd997d5 26 DigitalOut pbKill(PC_12, 1);
caseyquinn 4:5d004fd997d5 27 DigitalOut bleRTS(PB_14, 0);
caseyquinn 4:5d004fd997d5 28 DigitalOut bleCTS(PB_13, 0);
jelord 2:88fcbfadec6a 29 LSM303 movementsensor(D14, D15);
jelord 2:88fcbfadec6a 30 SI1145 lightsensor(D14, D15);
jelord 2:88fcbfadec6a 31 NCP5623BMUTBG RGB_LED(D14, D15);
jelord 3:122bfc998c4c 32 CronoDot RTC_UPAS(D14, D15);
jelord 2:88fcbfadec6a 33 EEPROM E2PROM(D14, D15);
jelord 2:88fcbfadec6a 34 //DigitalOut GPS_EN(p4,0); //pin 4 is used to enable and disable the GPS, in order to recive serial communications
jelord 2:88fcbfadec6a 35 Calibration calibrations(1); //Default serial/calibration if there are no values for the selected option
jelord 0:2cb2b2ea316f 36
caseyquinn 8:c4a8f9b67cee 37 Timeout stop; //This is the stop callback object
caseyquinn 7:29b01d5812ee 38 //Timeout logg;
caseyquinn 8:c4a8f9b67cee 39 Ticker logg; //This is the logging callback object
caseyquinn 8:c4a8f9b67cee 40 Ticker flowCtl; //This is the control loop callback object
jelord 3:122bfc998c4c 41
jelord 3:122bfc998c4c 42 uint16_t serial_num = 1; // Default serial/calibration number
jelord 3:122bfc998c4c 43 int RunReady =0;
jelord 3:122bfc998c4c 44
caseyquinn 4:5d004fd997d5 45 struct tm STtime;
caseyquinn 7:29b01d5812ee 46 char timestr[32];
jelord 3:122bfc998c4c 47
jelord 3:122bfc998c4c 48 float press = 1.1;
jelord 3:122bfc998c4c 49 float temp = 75.5;
jelord 3:122bfc998c4c 50 float rh = 12.1;
jelord 3:122bfc998c4c 51
jelord 3:122bfc998c4c 52 int uv = 8;
jelord 3:122bfc998c4c 53 int vis = 7;
jelord 3:122bfc998c4c 54 int ir = 6;
jelord 3:122bfc998c4c 55
jelord 3:122bfc998c4c 56 float compass = 0.1;
jelord 3:122bfc998c4c 57 float accel_x = 0.2;
jelord 3:122bfc998c4c 58 float accel_y = 0.3;
jelord 3:122bfc998c4c 59 float accel_z = 0.4;
jelord 3:122bfc998c4c 60 float accel_comp = 0.5;
jelord 3:122bfc998c4c 61 float angle_x = 0.6;
jelord 3:122bfc998c4c 62 float angle_y = 0.7;
jelord 3:122bfc998c4c 63 float angle_z = 0.8;
jelord 3:122bfc998c4c 64 float mag_x = 0.9;
jelord 3:122bfc998c4c 65 float mag_y = 1.0;
jelord 3:122bfc998c4c 66 float mag_z = 1.2;
jelord 3:122bfc998c4c 67
jelord 3:122bfc998c4c 68 int vInReading = 18;
jelord 3:122bfc998c4c 69 int vBlowerReading = 19;
jelord 3:122bfc998c4c 70 int omronDiff = 20;
jelord 3:122bfc998c4c 71 float omronVolt = 1.2; //V
jelord 3:122bfc998c4c 72 int omronReading = 100;
jelord 3:122bfc998c4c 73 float atmoRho = 1.5; //g/L
jelord 3:122bfc998c4c 74
jelord 3:122bfc998c4c 75 float massflow = 87.6; //g/min
jelord 3:122bfc998c4c 76 float volflow = 88.8; //L/min
jelord 3:122bfc998c4c 77 float volflowSet = 1.0; //L/min
jelord 3:122bfc998c4c 78 int logInerval = 10; //seconds
jelord 3:122bfc998c4c 79 double secondsD = 0;
jelord 3:122bfc998c4c 80 double lastsecondD = 0;
jelord 3:122bfc998c4c 81 float massflowSet = 19.2;
jelord 3:122bfc998c4c 82 float deltaVflow = 0.0;
jelord 3:122bfc998c4c 83 float deltaMflow = 0.0;
jelord 3:122bfc998c4c 84 float gainFlow = 98.1;
jelord 3:122bfc998c4c 85 float sampledVol = 2.0; //L, total sampled volume
jelord 3:122bfc998c4c 86
jelord 3:122bfc998c4c 87 int digital_pot_setpoint = 5 ; //min = 0x7F, max = 0x00
jelord 3:122bfc998c4c 88 int digital_pot_set = 6;
jelord 3:122bfc998c4c 89 int digital_pot_change = 7;
jelord 3:122bfc998c4c 90 int digitalpotMax = 127;
jelord 3:122bfc998c4c 91 int digitalpotMin = 2;
jelord 3:122bfc998c4c 92
jelord 3:122bfc998c4c 93 int dutyUp = 4;
jelord 3:122bfc998c4c 94 int dutyDown = 3;
jelord 3:122bfc998c4c 95
jelord 3:122bfc998c4c 96 // variables are only place holders for the US_Menu //
jelord 3:122bfc998c4c 97 int refreshtime = 6;
caseyquinn 7:29b01d5812ee 98 //int refresh_Time = 10; // refresh time in s, note calling read_GPS()(or similar) will still take how ever long it needs(hopefully < 1s)
jelord 3:122bfc998c4c 99 float home_lat, home_lon, work_lat, work_lon;
jelord 3:122bfc998c4c 100 //*************************************************//
jelord 3:122bfc998c4c 101
caseyquinn 7:29b01d5812ee 102
jelord 3:122bfc998c4c 103
jelord 3:122bfc998c4c 104 char filename[] = "/sd/XXXX0000LOG000000000000---------------.txt";
jelord 3:122bfc998c4c 105
caseyquinn 4:5d004fd997d5 106 SDFileSystem sd(D4, D5, D3, D10, "sd"); // I believe this matches Todd's pinout, let me know if this doesn't work. (MOSI, MISO, SCK, SEL)
jelord 3:122bfc998c4c 107
jelord 2:88fcbfadec6a 108 void sendData();
jelord 2:88fcbfadec6a 109
jelord 0:2cb2b2ea316f 110
jelord 0:2cb2b2ea316f 111 static uint8_t rx_buf[20];
jelord 0:2cb2b2ea316f 112 static uint8_t rx_len=0;
jelord 1:9fbb5b665068 113 static int haltBLE = 1;
jelord 1:9fbb5b665068 114 static int transmissionValue = 0;
jelord 2:88fcbfadec6a 115 uint8_t writeData[20] = {0,};
jelord 2:88fcbfadec6a 116 static uint8_t dataLength = 0;
jelord 3:122bfc998c4c 117 static int runReady = 0;
jelord 3:122bfc998c4c 118 static uint8_t startAndEndTime[12] = {0,};
caseyquinn 5:c3252e5d45ca 119
jelord 0:2cb2b2ea316f 120 void uartMicro(void){
jelord 3:122bfc998c4c 121 if(runReady!=1){
jelord 3:122bfc998c4c 122 haltBLE = 2;
jelord 3:122bfc998c4c 123 while(microChannel.readable()){
jelord 3:122bfc998c4c 124 rx_buf[rx_len++] = microChannel.getc();
jelord 2:88fcbfadec6a 125
jelord 3:122bfc998c4c 126 //Code block to verify what is being transmitted. To function correctly, all data must terminate with \0 or \n
jelord 3:122bfc998c4c 127 if(transmissionValue==0){
jelord 3:122bfc998c4c 128
caseyquinn 4:5d004fd997d5 129 if (rx_buf[0] == 0x01)transmissionValue = 1; //rtc
jelord 3:122bfc998c4c 130 else if(rx_buf[0] == 0x02)transmissionValue = 2; //sample start and end times
jelord 3:122bfc998c4c 131 else if(rx_buf[0] == 0x03)transmissionValue = 3; //sample name
jelord 3:122bfc998c4c 132 else if(rx_buf[0] == 0x04)transmissionValue = 4; //Send Data Check
jelord 3:122bfc998c4c 133
jelord 3:122bfc998c4c 134 else if(rx_buf[0] == 0x05)transmissionValue = 5; //log interval
jelord 3:122bfc998c4c 135 else if(rx_buf[0] == 0x06)transmissionValue = 6; //Flow Rate
jelord 3:122bfc998c4c 136 else if(rx_buf[0] == 0x07)transmissionValue = 7; //Serial Number
jelord 3:122bfc998c4c 137 else if(rx_buf[0] == 0x08)transmissionValue = 8; //Run Enable
jelord 3:122bfc998c4c 138 else transmissionValue = 100; //Not useful data
jelord 3:122bfc998c4c 139 }
jelord 3:122bfc998c4c 140
jelord 3:122bfc998c4c 141 if(rx_buf[rx_len-1]=='\0' || rx_buf[rx_len-1]=='\n' || rx_buf[rx_len-1] == 0xff){
jelord 3:122bfc998c4c 142 if((transmissionValue == 1 || transmissionValue == 2 || transmissionValue == 3 || transmissionValue == 4 || transmissionValue == 5 ||
jelord 3:122bfc998c4c 143 transmissionValue == 6 || transmissionValue == 7) && rx_buf[rx_len-1] != 0xff)
jelord 3:122bfc998c4c 144 {}else{
jelord 3:122bfc998c4c 145 if(transmissionValue == 4 ) sendData();
jelord 3:122bfc998c4c 146 if(transmissionValue == 8){
jelord 3:122bfc998c4c 147 runReady = 1;
jelord 3:122bfc998c4c 148 microChannel.attach(NULL,microChannel.RxIrq);
jelord 3:122bfc998c4c 149 }
jelord 3:122bfc998c4c 150 haltBLE = 1;
jelord 3:122bfc998c4c 151 transmissionValue = 0;
jelord 3:122bfc998c4c 152 dataLength = 0;
jelord 2:88fcbfadec6a 153
jelord 3:122bfc998c4c 154 }
jelord 2:88fcbfadec6a 155 }
jelord 1:9fbb5b665068 156 }
jelord 3:122bfc998c4c 157 if(haltBLE!=1){
jelord 2:88fcbfadec6a 158
jelord 3:122bfc998c4c 159 if((transmissionValue!=100) && (dataLength!= 0)) writeData[dataLength-1] = rx_buf[0];
jelord 3:122bfc998c4c 160
jelord 3:122bfc998c4c 161 if(transmissionValue ==100){
jelord 3:122bfc998c4c 162 //pc.putc(rx_buf[0]);
jelord 2:88fcbfadec6a 163
jelord 3:122bfc998c4c 164 }else if(transmissionValue ==1){ //process and store RTC values
jelord 3:122bfc998c4c 165
caseyquinn 7:29b01d5812ee 166 //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 167 if(dataLength==6){
caseyquinn 7:29b01d5812ee 168 RTC_UPAS.set_time(writeData[0],writeData[1],writeData[2],writeData[3],writeData[3],writeData[4],writeData[5]);//sets chronodot RTC
caseyquinn 7:29b01d5812ee 169 //sets ST RTC
caseyquinn 7:29b01d5812ee 170 STtime.tm_sec = writeData[0]; // 0-59
caseyquinn 7:29b01d5812ee 171 STtime.tm_min = writeData[1]; // 0-59
caseyquinn 7:29b01d5812ee 172 STtime.tm_hour = writeData[2]; // 0-23
caseyquinn 7:29b01d5812ee 173 STtime.tm_mday = writeData[3]; // 1-31
caseyquinn 7:29b01d5812ee 174 STtime.tm_mon = writeData[4]-1; // 0-11
caseyquinn 7:29b01d5812ee 175 STtime.tm_year = 100+writeData[5]; // year since 1900 (116 = 2016)
caseyquinn 7:29b01d5812ee 176 time_t STseconds = mktime(&STtime);
caseyquinn 7:29b01d5812ee 177 set_time(STseconds); // Set RTC time to 16 December 2013 10:05:23 UTC
caseyquinn 7:29b01d5812ee 178 }
jelord 3:122bfc998c4c 179
jelord 3:122bfc998c4c 180 }else if(transmissionValue ==2){ //process and store sample start/end
jelord 3:122bfc998c4c 181 if(dataLength ==12)E2PROM.write(0x00015, writeData, 12);
jelord 3:122bfc998c4c 182
jelord 3:122bfc998c4c 183 }else if(transmissionValue ==3){ //process and store sample name
jelord 3:122bfc998c4c 184 if(dataLength ==8)E2PROM.write(0x00001,writeData,8);
jelord 3:122bfc998c4c 185
jelord 3:122bfc998c4c 186 }else if(transmissionValue ==5){ //process and store Log Interval
jelord 3:122bfc998c4c 187 if(dataLength ==1)E2PROM.write(0x00014,writeData,1);
jelord 2:88fcbfadec6a 188
jelord 3:122bfc998c4c 189 }else if(transmissionValue ==6){ //process and store Flow Rate
jelord 3:122bfc998c4c 190 if(dataLength ==4)E2PROM.write(0x00010,writeData,4);
jelord 3:122bfc998c4c 191
jelord 3:122bfc998c4c 192 }else if(transmissionValue ==7){ //process and store Serial Number
jelord 3:122bfc998c4c 193 if(dataLength ==2)E2PROM.write(0x00034,writeData,2);
jelord 3:122bfc998c4c 194 }
jelord 3:122bfc998c4c 195 dataLength++;
jelord 1:9fbb5b665068 196 }
jelord 3:122bfc998c4c 197
jelord 3:122bfc998c4c 198 rx_len = 0;
jelord 3:122bfc998c4c 199 }else{
jelord 3:122bfc998c4c 200 while(microChannel.readable())
jelord 3:122bfc998c4c 201 uint8_t extract = microChannel.getc();
jelord 3:122bfc998c4c 202 }
jelord 2:88fcbfadec6a 203
jelord 2:88fcbfadec6a 204 }
jelord 2:88fcbfadec6a 205 void sendData(){
jelord 2:88fcbfadec6a 206
jelord 2:88fcbfadec6a 207 uint8_t sampleTimePassValues[13] = {0x01,};
jelord 2:88fcbfadec6a 208 uint8_t subjectLabelOriginal[9] = {0x02,};
jelord 2:88fcbfadec6a 209 uint8_t dataLogOriginal[2] = {0x03,};
jelord 2:88fcbfadec6a 210 uint8_t flowRateOriginal[5] = {0x04,};
jelord 2:88fcbfadec6a 211 //uint8_t presetRunModeCheck[1] = {0,}; Commented and currently unused to prevent mem issues
jelord 2:88fcbfadec6a 212 E2PROM.read(0x00015, sampleTimePassValues+1, 12);
jelord 2:88fcbfadec6a 213 E2PROM.read(0x00001, subjectLabelOriginal+1,8);
jelord 2:88fcbfadec6a 214 E2PROM.read(0x00014,dataLogOriginal+1,1);
jelord 2:88fcbfadec6a 215 E2PROM.read(0x00010,flowRateOriginal+1,4);
jelord 2:88fcbfadec6a 216
jelord 2:88fcbfadec6a 217 for(int i=0; i<13; i++){
jelord 2:88fcbfadec6a 218 microChannel.putc(sampleTimePassValues[i]);
jelord 2:88fcbfadec6a 219 }
jelord 2:88fcbfadec6a 220 wait(.25);
jelord 2:88fcbfadec6a 221
jelord 2:88fcbfadec6a 222 for(int i=0; i<9; i++){
jelord 2:88fcbfadec6a 223 microChannel.putc(subjectLabelOriginal[i]);
jelord 2:88fcbfadec6a 224 }
jelord 2:88fcbfadec6a 225 wait(.25);
jelord 2:88fcbfadec6a 226
jelord 2:88fcbfadec6a 227 for(int i=0; i<2; i++){
jelord 2:88fcbfadec6a 228 microChannel.putc(dataLogOriginal[i]);
jelord 2:88fcbfadec6a 229 }
jelord 2:88fcbfadec6a 230 wait(.25);
jelord 2:88fcbfadec6a 231
jelord 2:88fcbfadec6a 232 for(int i=0; i<5; i++){
jelord 2:88fcbfadec6a 233 microChannel.putc(flowRateOriginal[i]);
jelord 2:88fcbfadec6a 234 }
jelord 0:2cb2b2ea316f 235
jelord 2:88fcbfadec6a 236
jelord 2:88fcbfadec6a 237 }
caseyquinn 5:c3252e5d45ca 238
caseyquinn 7:29b01d5812ee 239
jelord 3:122bfc998c4c 240 void check_stop() // this checks if it's time to stop and shutdown
jelord 3:122bfc998c4c 241 {
jelord 3:122bfc998c4c 242
jelord 3:122bfc998c4c 243 if(RTC_UPAS.compare(startAndEndTime[6], startAndEndTime[7], startAndEndTime[8], startAndEndTime[9], startAndEndTime[10], startAndEndTime[11])) {
jelord 3:122bfc998c4c 244 pbKill = 0; // this is were we shut everything down
caseyquinn 4:5d004fd997d5 245 //pc.printf("If you're reading this something has gone very wrong.");
jelord 3:122bfc998c4c 246 }
jelord 3:122bfc998c4c 247 stop.detach();
jelord 3:122bfc998c4c 248 stop.attach(&check_stop, 9);
jelord 3:122bfc998c4c 249
jelord 3:122bfc998c4c 250 }
caseyquinn 5:c3252e5d45ca 251
jelord 3:122bfc998c4c 252
jelord 3:122bfc998c4c 253 void log_data()
jelord 3:122bfc998c4c 254 {
jelord 3:122bfc998c4c 255
caseyquinn 7:29b01d5812ee 256 RGB_LED.set_led(1,1,0);
caseyquinn 7:29b01d5812ee 257
caseyquinn 7:29b01d5812ee 258 time_t seconds = time(NULL);
caseyquinn 7:29b01d5812ee 259 strftime(timestr, 32, "%y%m%d%H%M%S", localtime(&seconds));
caseyquinn 7:29b01d5812ee 260 press = bmesensor.getPressure();
caseyquinn 7:29b01d5812ee 261 temp = bmesensor.getTemperature()-5.0;
caseyquinn 7:29b01d5812ee 262 rh = bmesensor.getHumidity();
caseyquinn 7:29b01d5812ee 263 uv = lightsensor.getUV();
caseyquinn 7:29b01d5812ee 264
caseyquinn 7:29b01d5812ee 265
caseyquinn 7:29b01d5812ee 266 FILE *fp = fopen(filename, "a");
caseyquinn 7:29b01d5812ee 267 //fprintf(fp, "Time as a basic string = %s\r\n", ctime(&seconds));
caseyquinn 7:29b01d5812ee 268 //fprintf(fp, "Time as a basic string = %s\r\n", timestr);
caseyquinn 7:29b01d5812ee 269 //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 270 fprintf(fp, "%s,", timestr);
caseyquinn 7:29b01d5812ee 271 fprintf(fp, "%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,", omronVolt,massflow,temp,press,rh,atmoRho);
caseyquinn 7:29b01d5812ee 272 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 273 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 274 fprintf(fp, "%d,%d,%d,%d,%d,%d," ,uv,omronReading, vInReading, vBlowerReading, omronDiff,gasG.getAmps());
caseyquinn 7:29b01d5812ee 275 fprintf(fp, "%d,%d,%d,%1.3f,%1.3f\r\n", gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow);
caseyquinn 7:29b01d5812ee 276 fclose(fp);
caseyquinn 7:29b01d5812ee 277 free(fp);
caseyquinn 7:29b01d5812ee 278 RGB_LED.set_led(1,0,0);
jelord 3:122bfc998c4c 279
jelord 3:122bfc998c4c 280 }
caseyquinn 8:c4a8f9b67cee 281
caseyquinn 8:c4a8f9b67cee 282 void flowControl()
caseyquinn 8:c4a8f9b67cee 283 {
caseyquinn 8:c4a8f9b67cee 284 RGB_LED.set_led(0,1,0);
caseyquinn 8:c4a8f9b67cee 285 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 8:c4a8f9b67cee 286 omronVolt = (omronReading*4.096)/(32768*2);
caseyquinn 8:c4a8f9b67cee 287
caseyquinn 8:c4a8f9b67cee 288 if(omronVolt<=calibrations.omronVMin) {
caseyquinn 8:c4a8f9b67cee 289 massflow = calibrations.omronMFMin;
caseyquinn 8:c4a8f9b67cee 290 } else if(omronVolt>=calibrations.omronVMax) {
caseyquinn 8:c4a8f9b67cee 291 massflow = calibrations.omronMFMax;
caseyquinn 8:c4a8f9b67cee 292 } else {
caseyquinn 8:c4a8f9b67cee 293 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 294 }
caseyquinn 8:c4a8f9b67cee 295
caseyquinn 8:c4a8f9b67cee 296 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 297 volflow = massflow/atmoRho;
caseyquinn 8:c4a8f9b67cee 298 sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
caseyquinn 8:c4a8f9b67cee 299 deltaVflow = volflow-volflowSet;
caseyquinn 8:c4a8f9b67cee 300 massflowSet = volflowSet*atmoRho;
caseyquinn 8:c4a8f9b67cee 301 deltaMflow = massflow-massflowSet;
caseyquinn 8:c4a8f9b67cee 302 if(abs(deltaMflow)>.025) {
caseyquinn 8:c4a8f9b67cee 303 digital_pot_change = (int)(gainFlow*deltaMflow);
caseyquinn 8:c4a8f9b67cee 304
caseyquinn 8:c4a8f9b67cee 305
caseyquinn 8:c4a8f9b67cee 306 if(abs(digital_pot_change)>=50) {
caseyquinn 8:c4a8f9b67cee 307 digital_pot_set = (int)(digital_pot_set+(int)((10.0*deltaMflow)));
caseyquinn 8:c4a8f9b67cee 308 //RGB_LED.set_led(1,0,0);
caseyquinn 8:c4a8f9b67cee 309 } else {
caseyquinn 8:c4a8f9b67cee 310 digital_pot_set = (digital_pot_set+ digital_pot_change);
caseyquinn 8:c4a8f9b67cee 311 // RGB_LED.set_led(1,1,0);
caseyquinn 8:c4a8f9b67cee 312 }
caseyquinn 8:c4a8f9b67cee 313
caseyquinn 8:c4a8f9b67cee 314 if(digital_pot_set>=digitalpotMax) {
caseyquinn 8:c4a8f9b67cee 315 digital_pot_set = digitalpotMax;
caseyquinn 8:c4a8f9b67cee 316 //RGB_LED.set_led(1,0,0);
caseyquinn 8:c4a8f9b67cee 317 } else if(digital_pot_set<=digitalpotMin) {
caseyquinn 8:c4a8f9b67cee 318 digital_pot_set = digitalpotMin;
caseyquinn 8:c4a8f9b67cee 319 //RGB_LED.set_led(1,0,0);
caseyquinn 8:c4a8f9b67cee 320 }
caseyquinn 8:c4a8f9b67cee 321
caseyquinn 8:c4a8f9b67cee 322
caseyquinn 8:c4a8f9b67cee 323 DigPot.writeRegister(digital_pot_set);
caseyquinn 8:c4a8f9b67cee 324
caseyquinn 8:c4a8f9b67cee 325 } else {
caseyquinn 8:c4a8f9b67cee 326 //RGB_LED.set_led(0,1,0);
caseyquinn 8:c4a8f9b67cee 327 }
caseyquinn 8:c4a8f9b67cee 328 }
jelord 1:9fbb5b665068 329 int main(){
caseyquinn 7:29b01d5812ee 330
caseyquinn 4:5d004fd997d5 331 //wait(10);
caseyquinn 6:a738dcd53bf8 332 //RGB_LED.set_led(0,0,1);
caseyquinn 4:5d004fd997d5 333 //pc.baud(115200); // set what you want here depending on your terminal program speed
caseyquinn 4:5d004fd997d5 334 //pc.printf("\f\n\r-------------Startup-------------\n\r");
jelord 1:9fbb5b665068 335 wait(0.5);
caseyquinn 5:c3252e5d45ca 336
jelord 3:122bfc998c4c 337 uint8_t serialNumberAndType[6] = {0x50,0x53};
jelord 3:122bfc998c4c 338 E2PROM.read(0x00034,serialNumberAndType+2,2);
caseyquinn 4:5d004fd997d5 339
jelord 3:122bfc998c4c 340 int tempSerialNum = serialNumberAndType[2]+serialNumberAndType[3];
jelord 3:122bfc998c4c 341 int serialNumDigits[4];
jelord 3:122bfc998c4c 342 serialNumDigits[0] = tempSerialNum / 1000 % 10;
jelord 3:122bfc998c4c 343 serialNumDigits[1] = tempSerialNum / 100 % 10;
jelord 3:122bfc998c4c 344 serialNumDigits[2] = tempSerialNum / 10 % 10;
jelord 3:122bfc998c4c 345 serialNumDigits[3] = tempSerialNum % 10;
jelord 3:122bfc998c4c 346
jelord 3:122bfc998c4c 347 serialNumberAndType[2] = serialNumDigits[0]+48;
jelord 3:122bfc998c4c 348 serialNumberAndType[3] = serialNumDigits[1]+48;
jelord 3:122bfc998c4c 349 serialNumberAndType[4] = serialNumDigits[2]+48;
jelord 3:122bfc998c4c 350 serialNumberAndType[5] = serialNumDigits[3]+48;
caseyquinn 5:c3252e5d45ca 351 RGB_LED.set_led(0,1,0);
jelord 3:122bfc998c4c 352 //pc.attach(pc_recv);
jelord 1:9fbb5b665068 353 microChannel.attach(uartMicro,microChannel.RxIrq);
jelord 3:122bfc998c4c 354 microChannel.baud(115200);
caseyquinn 6:a738dcd53bf8 355 //RGB_LED.set_led(1,0,0);
jelord 1:9fbb5b665068 356 microChannel.printf("$$$");
jelord 3:122bfc998c4c 357 wait(0.5);
jelord 3:122bfc998c4c 358 microChannel.printf("SN,");
jelord 3:122bfc998c4c 359 for(int i=0;i<6;i++)microChannel.putc(serialNumberAndType[i]);
jelord 3:122bfc998c4c 360 microChannel.printf("\r");
jelord 3:122bfc998c4c 361 wait(0.5);
jelord 1:9fbb5b665068 362 microChannel.printf("A\r");
jelord 3:122bfc998c4c 363 wait(0.5);
jelord 2:88fcbfadec6a 364 microChannel.printf("---\r");
jelord 3:122bfc998c4c 365 wait(0.5);
jelord 2:88fcbfadec6a 366
jelord 2:88fcbfadec6a 367
caseyquinn 4:5d004fd997d5 368
jelord 2:88fcbfadec6a 369
jelord 2:88fcbfadec6a 370 RGB_LED.set_led(1,1,1);
jelord 3:122bfc998c4c 371 while(runReady!=1) {
jelord 3:122bfc998c4c 372 wait(1);
jelord 3:122bfc998c4c 373 //pc.printf("Waiting for BLE instruction");
jelord 3:122bfc998c4c 374
jelord 3:122bfc998c4c 375 }
jelord 3:122bfc998c4c 376
caseyquinn 7:29b01d5812ee 377
jelord 3:122bfc998c4c 378 //wait(1);
jelord 3:122bfc998c4c 379
jelord 3:122bfc998c4c 380 E2PROM.read(0x00015, startAndEndTime, 12); //Grab start and end times from EEPROM
jelord 3:122bfc998c4c 381 RGB_LED.set_led(0,1,0);
caseyquinn 7:29b01d5812ee 382
caseyquinn 7:29b01d5812ee 383 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
caseyquinn 7:29b01d5812ee 384 //UPDATE THIS TO WORK WITH ST RTC INSTEAD
caseyquinn 7:29b01d5812ee 385 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
caseyquinn 7:29b01d5812ee 386
jelord 3:122bfc998c4c 387 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 388 wait(0.5);
jelord 3:122bfc998c4c 389
jelord 3:122bfc998c4c 390 RTC_UPAS.get_time();
jelord 3:122bfc998c4c 391
jelord 3:122bfc998c4c 392 }
jelord 3:122bfc998c4c 393
jelord 3:122bfc998c4c 394
jelord 3:122bfc998c4c 395 //Get the proper serial number
jelord 3:122bfc998c4c 396 uint8_t serialBytes[2] = {0,};
jelord 3:122bfc998c4c 397 E2PROM.read(0x00034, serialBytes,2);
jelord 3:122bfc998c4c 398 serial_num = ((uint16_t)serialBytes[1] << 8) | serialBytes[0];
jelord 3:122bfc998c4c 399 calibrations.initialize(serial_num);
jelord 3:122bfc998c4c 400
jelord 3:122bfc998c4c 401 uint8_t logByte[1] = {0,};
jelord 3:122bfc998c4c 402 E2PROM.read(0x00014,logByte,1);
jelord 3:122bfc998c4c 403 logInerval = logByte[0];
jelord 3:122bfc998c4c 404
caseyquinn 7:29b01d5812ee 405
jelord 3:122bfc998c4c 406 //Use the flow rate value stored in eeprom
jelord 3:122bfc998c4c 407 uint8_t flowRateBytes[4] = {0,};
jelord 3:122bfc998c4c 408 E2PROM.read(0x00010,flowRateBytes,4);
jelord 3:122bfc998c4c 409 E2PROM.byteToFloat(flowRateBytes, &volflowSet);
jelord 3:122bfc998c4c 410
jelord 3:122bfc998c4c 411 if(volflowSet<=1.0) {
jelord 3:122bfc998c4c 412 gainFlow = 100;
jelord 3:122bfc998c4c 413 } else if(volflowSet>=2.0) {
jelord 3:122bfc998c4c 414 gainFlow = 25;
jelord 3:122bfc998c4c 415 } else {
jelord 3:122bfc998c4c 416 gainFlow = 25;
jelord 0:2cb2b2ea316f 417 }
jelord 3:122bfc998c4c 418
jelord 3:122bfc998c4c 419 RGB_LED.set_led(1,0,0);
jelord 3:122bfc998c4c 420 press = bmesensor.getPressure();
jelord 3:122bfc998c4c 421 temp = bmesensor.getTemperature();
jelord 3:122bfc998c4c 422 rh = bmesensor.getHumidity();
jelord 3:122bfc998c4c 423
jelord 3:122bfc998c4c 424 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 425 massflowSet = volflowSet*atmoRho;
jelord 3:122bfc998c4c 426 //Digtal pot tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
jelord 3:122bfc998c4c 427
jelord 3:122bfc998c4c 428
jelord 3:122bfc998c4c 429
jelord 3:122bfc998c4c 430
jelord 3:122bfc998c4c 431 DigPot.writeRegister(digital_pot_setpoint);
jelord 3:122bfc998c4c 432 wait(1);
caseyquinn 5:c3252e5d45ca 433 //blower = 1;
jelord 3:122bfc998c4c 434
jelord 3:122bfc998c4c 435 uint8_t subjectLabelOriginal[8] = {0,};
caseyquinn 4:5d004fd997d5 436 E2PROM.read(0x00001, subjectLabelOriginal,8);
caseyquinn 5:c3252e5d45ca 437 //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 5:c3252e5d45ca 438
caseyquinn 4:5d004fd997d5 439 time_t seconds = time(NULL);
caseyquinn 4:5d004fd997d5 440 strftime(timestr, 32, "%y-%m-%d-%H=%M=%S", localtime(&seconds));
caseyquinn 4:5d004fd997d5 441 sprintf(filename, "/sd/UPASboardtest_%s.txt", timestr);
jelord 3:122bfc998c4c 442 FILE *fp = fopen(filename, "w");
jelord 3:122bfc998c4c 443 fclose(fp);
jelord 3:122bfc998c4c 444
jelord 3:122bfc998c4c 445 //---------------------------------------------------------------------------------------------//
jelord 3:122bfc998c4c 446 //Following lines are needed to enter into the initiallization flow control loop
jelord 3:122bfc998c4c 447
jelord 3:122bfc998c4c 448
jelord 3:122bfc998c4c 449 sampledVol = 0.0;
jelord 3:122bfc998c4c 450 RGB_LED.set_led(0,1,0);
caseyquinn 7:29b01d5812ee 451 //log_data();
caseyquinn 7:29b01d5812ee 452 stop.attach(&check_stop, 31); // check if we should shut down every 9 seconds, starting 60s after the start.
caseyquinn 7:29b01d5812ee 453 logg.attach(&log_data, logInerval);
caseyquinn 8:c4a8f9b67cee 454 flowCtl.attach(&flowControl, 1);
caseyquinn 7:29b01d5812ee 455
jelord 3:122bfc998c4c 456
jelord 3:122bfc998c4c 457 //** end of initalization **//
jelord 3:122bfc998c4c 458 //---------------------------------------------------------------------------------------------//
jelord 3:122bfc998c4c 459 //---------------------------------------------------------------------------------------------//
jelord 3:122bfc998c4c 460 // Main Control Loop
jelord 3:122bfc998c4c 461
caseyquinn 7:29b01d5812ee 462 while (1) {
caseyquinn 7:29b01d5812ee 463 // Do other things...
caseyquinn 7:29b01d5812ee 464 }
caseyquinn 7:29b01d5812ee 465
caseyquinn 8:c4a8f9b67cee 466
caseyquinn 4:5d004fd997d5 467
jelord 3:122bfc998c4c 468
jelord 0:2cb2b2ea316f 469 }