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 17:16:43 2016 +0000
Revision:
9:8646fd501832
Parent:
8:c4a8f9b67cee
Child:
10:06fbb1c9e3bd
General code cleaning and also added in the chronodot RTC into the log file for now.

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 9:8646fd501832 37
caseyquinn 9:8646fd501832 38 Ticker stop; //This is the stop callback object
caseyquinn 8:c4a8f9b67cee 39 Ticker logg; //This is the logging callback object
caseyquinn 9:8646fd501832 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
caseyquinn 9:8646fd501832 48 float press;
caseyquinn 9:8646fd501832 49 float temp;
caseyquinn 9:8646fd501832 50 float rh;
jelord 3:122bfc998c4c 51
caseyquinn 9:8646fd501832 52 int uv;
caseyquinn 9:8646fd501832 53 int vis;
caseyquinn 9:8646fd501832 54 int ir;
jelord 3:122bfc998c4c 55
caseyquinn 9:8646fd501832 56 float compass;
caseyquinn 9:8646fd501832 57 float accel_x;
caseyquinn 9:8646fd501832 58 float accel_y;
caseyquinn 9:8646fd501832 59 float accel_z;
caseyquinn 9:8646fd501832 60 float accel_comp;
caseyquinn 9:8646fd501832 61 float angle_x;
caseyquinn 9:8646fd501832 62 float angle_y;
caseyquinn 9:8646fd501832 63 float angle_z;
caseyquinn 9:8646fd501832 64 float mag_x;
caseyquinn 9:8646fd501832 65 float mag_y;
caseyquinn 9:8646fd501832 66 float mag_z;
jelord 3:122bfc998c4c 67
caseyquinn 9:8646fd501832 68 int vInReading;
caseyquinn 9:8646fd501832 69 int vBlowerReading;
caseyquinn 9:8646fd501832 70 int omronDiff;
caseyquinn 9:8646fd501832 71 float omronVolt; //V
caseyquinn 9:8646fd501832 72 int omronReading;
caseyquinn 9:8646fd501832 73 float atmoRho; //g/L
jelord 3:122bfc998c4c 74
caseyquinn 9:8646fd501832 75 float massflow; //g/min
caseyquinn 9:8646fd501832 76 float volflow; //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;
caseyquinn 9:8646fd501832 81 float massflowSet;
jelord 3:122bfc998c4c 82 float deltaVflow = 0.0;
jelord 3:122bfc998c4c 83 float deltaMflow = 0.0;
caseyquinn 9:8646fd501832 84 float gainFlow;
caseyquinn 9:8646fd501832 85 float sampledVol; //L, total sampled volume
jelord 3:122bfc998c4c 86
caseyquinn 9:8646fd501832 87 int digital_pot_setpoint; //min = 0x7F, max = 0x00
caseyquinn 9:8646fd501832 88 int digital_pot_set;
caseyquinn 9:8646fd501832 89 int digital_pot_change;
jelord 3:122bfc998c4c 90 int digitalpotMax = 127;
caseyquinn 9:8646fd501832 91 int digitalpotMin = 10;
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 //
caseyquinn 9:8646fd501832 97 int refreshtime;
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
jelord 3:122bfc998c4c 102 char filename[] = "/sd/XXXX0000LOG000000000000---------------.txt";
caseyquinn 4:5d004fd997d5 103 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 104
jelord 2:88fcbfadec6a 105 void sendData();
jelord 0:2cb2b2ea316f 106 static uint8_t rx_buf[20];
jelord 0:2cb2b2ea316f 107 static uint8_t rx_len=0;
jelord 1:9fbb5b665068 108 static int haltBLE = 1;
jelord 1:9fbb5b665068 109 static int transmissionValue = 0;
jelord 2:88fcbfadec6a 110 uint8_t writeData[20] = {0,};
jelord 2:88fcbfadec6a 111 static uint8_t dataLength = 0;
jelord 3:122bfc998c4c 112 static int runReady = 0;
jelord 3:122bfc998c4c 113 static uint8_t startAndEndTime[12] = {0,};
caseyquinn 5:c3252e5d45ca 114
caseyquinn 9:8646fd501832 115 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 116 //BLE Functions
caseyquinn 9:8646fd501832 117 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 118
caseyquinn 9:8646fd501832 119 void uartMicro(){
jelord 3:122bfc998c4c 120 if(runReady!=1){
jelord 3:122bfc998c4c 121 haltBLE = 2;
jelord 3:122bfc998c4c 122 while(microChannel.readable()){
jelord 3:122bfc998c4c 123 rx_buf[rx_len++] = microChannel.getc();
jelord 2:88fcbfadec6a 124
jelord 3:122bfc998c4c 125 //Code block to verify what is being transmitted. To function correctly, all data must terminate with \0 or \n
jelord 3:122bfc998c4c 126 if(transmissionValue==0){
jelord 3:122bfc998c4c 127
caseyquinn 4:5d004fd997d5 128 if (rx_buf[0] == 0x01)transmissionValue = 1; //rtc
jelord 3:122bfc998c4c 129 else if(rx_buf[0] == 0x02)transmissionValue = 2; //sample start and end times
jelord 3:122bfc998c4c 130 else if(rx_buf[0] == 0x03)transmissionValue = 3; //sample name
jelord 3:122bfc998c4c 131 else if(rx_buf[0] == 0x04)transmissionValue = 4; //Send Data Check
jelord 3:122bfc998c4c 132
jelord 3:122bfc998c4c 133 else if(rx_buf[0] == 0x05)transmissionValue = 5; //log interval
jelord 3:122bfc998c4c 134 else if(rx_buf[0] == 0x06)transmissionValue = 6; //Flow Rate
jelord 3:122bfc998c4c 135 else if(rx_buf[0] == 0x07)transmissionValue = 7; //Serial Number
jelord 3:122bfc998c4c 136 else if(rx_buf[0] == 0x08)transmissionValue = 8; //Run Enable
jelord 3:122bfc998c4c 137 else transmissionValue = 100; //Not useful data
jelord 3:122bfc998c4c 138 }
jelord 3:122bfc998c4c 139
jelord 3:122bfc998c4c 140 if(rx_buf[rx_len-1]=='\0' || rx_buf[rx_len-1]=='\n' || rx_buf[rx_len-1] == 0xff){
jelord 3:122bfc998c4c 141 if((transmissionValue == 1 || transmissionValue == 2 || transmissionValue == 3 || transmissionValue == 4 || transmissionValue == 5 ||
jelord 3:122bfc998c4c 142 transmissionValue == 6 || transmissionValue == 7) && rx_buf[rx_len-1] != 0xff)
jelord 3:122bfc998c4c 143 {}else{
jelord 3:122bfc998c4c 144 if(transmissionValue == 4 ) sendData();
jelord 3:122bfc998c4c 145 if(transmissionValue == 8){
jelord 3:122bfc998c4c 146 runReady = 1;
jelord 3:122bfc998c4c 147 microChannel.attach(NULL,microChannel.RxIrq);
jelord 3:122bfc998c4c 148 }
jelord 3:122bfc998c4c 149 haltBLE = 1;
jelord 3:122bfc998c4c 150 transmissionValue = 0;
jelord 3:122bfc998c4c 151 dataLength = 0;
jelord 2:88fcbfadec6a 152
jelord 3:122bfc998c4c 153 }
jelord 2:88fcbfadec6a 154 }
jelord 1:9fbb5b665068 155 }
jelord 3:122bfc998c4c 156 if(haltBLE!=1){
jelord 2:88fcbfadec6a 157
jelord 3:122bfc998c4c 158 if((transmissionValue!=100) && (dataLength!= 0)) writeData[dataLength-1] = rx_buf[0];
jelord 3:122bfc998c4c 159
jelord 3:122bfc998c4c 160 if(transmissionValue ==100){
jelord 3:122bfc998c4c 161 //pc.putc(rx_buf[0]);
jelord 2:88fcbfadec6a 162
jelord 3:122bfc998c4c 163 }else if(transmissionValue ==1){ //process and store RTC values
jelord 3:122bfc998c4c 164
caseyquinn 7:29b01d5812ee 165 //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 166 if(dataLength==6){
caseyquinn 7:29b01d5812ee 167 RTC_UPAS.set_time(writeData[0],writeData[1],writeData[2],writeData[3],writeData[3],writeData[4],writeData[5]);//sets chronodot RTC
caseyquinn 7:29b01d5812ee 168 //sets ST RTC
caseyquinn 7:29b01d5812ee 169 STtime.tm_sec = writeData[0]; // 0-59
caseyquinn 7:29b01d5812ee 170 STtime.tm_min = writeData[1]; // 0-59
caseyquinn 7:29b01d5812ee 171 STtime.tm_hour = writeData[2]; // 0-23
caseyquinn 7:29b01d5812ee 172 STtime.tm_mday = writeData[3]; // 1-31
caseyquinn 7:29b01d5812ee 173 STtime.tm_mon = writeData[4]-1; // 0-11
caseyquinn 7:29b01d5812ee 174 STtime.tm_year = 100+writeData[5]; // year since 1900 (116 = 2016)
caseyquinn 7:29b01d5812ee 175 time_t STseconds = mktime(&STtime);
caseyquinn 7:29b01d5812ee 176 set_time(STseconds); // Set RTC time to 16 December 2013 10:05:23 UTC
caseyquinn 7:29b01d5812ee 177 }
jelord 3:122bfc998c4c 178
jelord 3:122bfc998c4c 179 }else if(transmissionValue ==2){ //process and store sample start/end
jelord 3:122bfc998c4c 180 if(dataLength ==12)E2PROM.write(0x00015, writeData, 12);
jelord 3:122bfc998c4c 181
jelord 3:122bfc998c4c 182 }else if(transmissionValue ==3){ //process and store sample name
jelord 3:122bfc998c4c 183 if(dataLength ==8)E2PROM.write(0x00001,writeData,8);
jelord 3:122bfc998c4c 184
jelord 3:122bfc998c4c 185 }else if(transmissionValue ==5){ //process and store Log Interval
jelord 3:122bfc998c4c 186 if(dataLength ==1)E2PROM.write(0x00014,writeData,1);
jelord 2:88fcbfadec6a 187
jelord 3:122bfc998c4c 188 }else if(transmissionValue ==6){ //process and store Flow Rate
jelord 3:122bfc998c4c 189 if(dataLength ==4)E2PROM.write(0x00010,writeData,4);
jelord 3:122bfc998c4c 190
jelord 3:122bfc998c4c 191 }else if(transmissionValue ==7){ //process and store Serial Number
jelord 3:122bfc998c4c 192 if(dataLength ==2)E2PROM.write(0x00034,writeData,2);
jelord 3:122bfc998c4c 193 }
jelord 3:122bfc998c4c 194 dataLength++;
jelord 1:9fbb5b665068 195 }
jelord 3:122bfc998c4c 196
jelord 3:122bfc998c4c 197 rx_len = 0;
jelord 3:122bfc998c4c 198 }else{
jelord 3:122bfc998c4c 199 while(microChannel.readable())
jelord 3:122bfc998c4c 200 uint8_t extract = microChannel.getc();
jelord 3:122bfc998c4c 201 }
jelord 2:88fcbfadec6a 202
jelord 2:88fcbfadec6a 203 }
jelord 2:88fcbfadec6a 204 void sendData(){
jelord 2:88fcbfadec6a 205
jelord 2:88fcbfadec6a 206 uint8_t sampleTimePassValues[13] = {0x01,};
jelord 2:88fcbfadec6a 207 uint8_t subjectLabelOriginal[9] = {0x02,};
jelord 2:88fcbfadec6a 208 uint8_t dataLogOriginal[2] = {0x03,};
jelord 2:88fcbfadec6a 209 uint8_t flowRateOriginal[5] = {0x04,};
jelord 2:88fcbfadec6a 210 //uint8_t presetRunModeCheck[1] = {0,}; Commented and currently unused to prevent mem issues
jelord 2:88fcbfadec6a 211 E2PROM.read(0x00015, sampleTimePassValues+1, 12);
jelord 2:88fcbfadec6a 212 E2PROM.read(0x00001, subjectLabelOriginal+1,8);
jelord 2:88fcbfadec6a 213 E2PROM.read(0x00014,dataLogOriginal+1,1);
jelord 2:88fcbfadec6a 214 E2PROM.read(0x00010,flowRateOriginal+1,4);
jelord 2:88fcbfadec6a 215
jelord 2:88fcbfadec6a 216 for(int i=0; i<13; i++){
jelord 2:88fcbfadec6a 217 microChannel.putc(sampleTimePassValues[i]);
jelord 2:88fcbfadec6a 218 }
jelord 2:88fcbfadec6a 219 wait(.25);
jelord 2:88fcbfadec6a 220
jelord 2:88fcbfadec6a 221 for(int i=0; i<9; i++){
jelord 2:88fcbfadec6a 222 microChannel.putc(subjectLabelOriginal[i]);
jelord 2:88fcbfadec6a 223 }
jelord 2:88fcbfadec6a 224 wait(.25);
jelord 2:88fcbfadec6a 225
jelord 2:88fcbfadec6a 226 for(int i=0; i<2; i++){
jelord 2:88fcbfadec6a 227 microChannel.putc(dataLogOriginal[i]);
jelord 2:88fcbfadec6a 228 }
jelord 2:88fcbfadec6a 229 wait(.25);
jelord 2:88fcbfadec6a 230
jelord 2:88fcbfadec6a 231 for(int i=0; i<5; i++){
jelord 2:88fcbfadec6a 232 microChannel.putc(flowRateOriginal[i]);
jelord 2:88fcbfadec6a 233 }
jelord 0:2cb2b2ea316f 234
jelord 2:88fcbfadec6a 235
jelord 2:88fcbfadec6a 236 }
caseyquinn 5:c3252e5d45ca 237
caseyquinn 9:8646fd501832 238 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 239 //Shutdown Function
caseyquinn 9:8646fd501832 240 //////////////////////////////////////////////////////////////
jelord 3:122bfc998c4c 241 void check_stop() // this checks if it's time to stop and shutdown
jelord 3:122bfc998c4c 242 {
caseyquinn 9:8646fd501832 243 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
caseyquinn 9:8646fd501832 244 //UPDATE THIS TO WORK WITH ST RTC INSTEAD
caseyquinn 9:8646fd501832 245 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
jelord 3:122bfc998c4c 246 if(RTC_UPAS.compare(startAndEndTime[6], startAndEndTime[7], startAndEndTime[8], startAndEndTime[9], startAndEndTime[10], startAndEndTime[11])) {
jelord 3:122bfc998c4c 247 pbKill = 0; // this is were we shut everything down
caseyquinn 4:5d004fd997d5 248 //pc.printf("If you're reading this something has gone very wrong.");
jelord 3:122bfc998c4c 249 }
jelord 3:122bfc998c4c 250
jelord 3:122bfc998c4c 251 }
caseyquinn 5:c3252e5d45ca 252
caseyquinn 9:8646fd501832 253 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 254 //SD Logging Function
caseyquinn 9:8646fd501832 255 //////////////////////////////////////////////////////////////
jelord 3:122bfc998c4c 256 void log_data()
jelord 3:122bfc998c4c 257 {
jelord 3:122bfc998c4c 258
caseyquinn 9:8646fd501832 259 RGB_LED.set_led(1,1,0);
caseyquinn 7:29b01d5812ee 260
caseyquinn 7:29b01d5812ee 261 time_t seconds = time(NULL);
caseyquinn 7:29b01d5812ee 262 strftime(timestr, 32, "%y%m%d%H%M%S", localtime(&seconds));
caseyquinn 9:8646fd501832 263 RTC_UPAS.get_time();
caseyquinn 7:29b01d5812ee 264 press = bmesensor.getPressure();
caseyquinn 7:29b01d5812ee 265 temp = bmesensor.getTemperature()-5.0;
caseyquinn 7:29b01d5812ee 266 rh = bmesensor.getHumidity();
caseyquinn 7:29b01d5812ee 267 uv = lightsensor.getUV();
caseyquinn 7:29b01d5812ee 268
caseyquinn 7:29b01d5812ee 269
caseyquinn 7:29b01d5812ee 270 FILE *fp = fopen(filename, "a");
caseyquinn 9:8646fd501832 271 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 272 fprintf(fp, "%s,", timestr);
caseyquinn 7:29b01d5812ee 273 fprintf(fp, "%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,", omronVolt,massflow,temp,press,rh,atmoRho);
caseyquinn 7:29b01d5812ee 274 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 275 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 276 fprintf(fp, "%d,%d,%d,%d,%d,%d," ,uv,omronReading, vInReading, vBlowerReading, omronDiff,gasG.getAmps());
caseyquinn 7:29b01d5812ee 277 fprintf(fp, "%d,%d,%d,%1.3f,%1.3f\r\n", gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow);
caseyquinn 7:29b01d5812ee 278 fclose(fp);
caseyquinn 7:29b01d5812ee 279 free(fp);
caseyquinn 7:29b01d5812ee 280 RGB_LED.set_led(1,0,0);
jelord 3:122bfc998c4c 281
jelord 3:122bfc998c4c 282 }
caseyquinn 8:c4a8f9b67cee 283
caseyquinn 9:8646fd501832 284 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 285 //Flow Control Function
caseyquinn 9:8646fd501832 286 //////////////////////////////////////////////////////////////
caseyquinn 8:c4a8f9b67cee 287 void flowControl()
caseyquinn 8:c4a8f9b67cee 288 {
caseyquinn 8:c4a8f9b67cee 289 RGB_LED.set_led(0,1,0);
caseyquinn 8:c4a8f9b67cee 290 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 8:c4a8f9b67cee 291 omronVolt = (omronReading*4.096)/(32768*2);
caseyquinn 8:c4a8f9b67cee 292
caseyquinn 8:c4a8f9b67cee 293 if(omronVolt<=calibrations.omronVMin) {
caseyquinn 8:c4a8f9b67cee 294 massflow = calibrations.omronMFMin;
caseyquinn 8:c4a8f9b67cee 295 } else if(omronVolt>=calibrations.omronVMax) {
caseyquinn 8:c4a8f9b67cee 296 massflow = calibrations.omronMFMax;
caseyquinn 8:c4a8f9b67cee 297 } else {
caseyquinn 8:c4a8f9b67cee 298 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 299 }
caseyquinn 8:c4a8f9b67cee 300
caseyquinn 8:c4a8f9b67cee 301 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 302 volflow = massflow/atmoRho;
caseyquinn 8:c4a8f9b67cee 303 sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
caseyquinn 8:c4a8f9b67cee 304 deltaVflow = volflow-volflowSet;
caseyquinn 8:c4a8f9b67cee 305 massflowSet = volflowSet*atmoRho;
caseyquinn 8:c4a8f9b67cee 306 deltaMflow = massflow-massflowSet;
caseyquinn 8:c4a8f9b67cee 307 if(abs(deltaMflow)>.025) {
caseyquinn 8:c4a8f9b67cee 308 digital_pot_change = (int)(gainFlow*deltaMflow);
caseyquinn 8:c4a8f9b67cee 309
caseyquinn 8:c4a8f9b67cee 310
caseyquinn 8:c4a8f9b67cee 311 if(abs(digital_pot_change)>=50) {
caseyquinn 8:c4a8f9b67cee 312 digital_pot_set = (int)(digital_pot_set+(int)((10.0*deltaMflow)));
caseyquinn 8:c4a8f9b67cee 313 //RGB_LED.set_led(1,0,0);
caseyquinn 8:c4a8f9b67cee 314 } else {
caseyquinn 8:c4a8f9b67cee 315 digital_pot_set = (digital_pot_set+ digital_pot_change);
caseyquinn 8:c4a8f9b67cee 316 // RGB_LED.set_led(1,1,0);
caseyquinn 8:c4a8f9b67cee 317 }
caseyquinn 8:c4a8f9b67cee 318
caseyquinn 8:c4a8f9b67cee 319 if(digital_pot_set>=digitalpotMax) {
caseyquinn 8:c4a8f9b67cee 320 digital_pot_set = digitalpotMax;
caseyquinn 8:c4a8f9b67cee 321 //RGB_LED.set_led(1,0,0);
caseyquinn 8:c4a8f9b67cee 322 } else if(digital_pot_set<=digitalpotMin) {
caseyquinn 8:c4a8f9b67cee 323 digital_pot_set = digitalpotMin;
caseyquinn 8:c4a8f9b67cee 324 //RGB_LED.set_led(1,0,0);
caseyquinn 8:c4a8f9b67cee 325 }
caseyquinn 8:c4a8f9b67cee 326
caseyquinn 8:c4a8f9b67cee 327
caseyquinn 8:c4a8f9b67cee 328 DigPot.writeRegister(digital_pot_set);
caseyquinn 8:c4a8f9b67cee 329
caseyquinn 8:c4a8f9b67cee 330 } else {
caseyquinn 8:c4a8f9b67cee 331 //RGB_LED.set_led(0,1,0);
caseyquinn 8:c4a8f9b67cee 332 }
caseyquinn 8:c4a8f9b67cee 333 }
caseyquinn 9:8646fd501832 334
caseyquinn 9:8646fd501832 335 //////////////////////////////////////////////////////////////
caseyquinn 9:8646fd501832 336 //Main Function
caseyquinn 9:8646fd501832 337 //////////////////////////////////////////////////////////////
jelord 1:9fbb5b665068 338 int main(){
caseyquinn 7:29b01d5812ee 339
caseyquinn 4:5d004fd997d5 340 //wait(10);
caseyquinn 6:a738dcd53bf8 341 //RGB_LED.set_led(0,0,1);
caseyquinn 4:5d004fd997d5 342 //pc.baud(115200); // set what you want here depending on your terminal program speed
caseyquinn 4:5d004fd997d5 343 //pc.printf("\f\n\r-------------Startup-------------\n\r");
jelord 1:9fbb5b665068 344 wait(0.5);
caseyquinn 5:c3252e5d45ca 345
jelord 3:122bfc998c4c 346 uint8_t serialNumberAndType[6] = {0x50,0x53};
jelord 3:122bfc998c4c 347 E2PROM.read(0x00034,serialNumberAndType+2,2);
caseyquinn 4:5d004fd997d5 348
jelord 3:122bfc998c4c 349 int tempSerialNum = serialNumberAndType[2]+serialNumberAndType[3];
jelord 3:122bfc998c4c 350 int serialNumDigits[4];
jelord 3:122bfc998c4c 351 serialNumDigits[0] = tempSerialNum / 1000 % 10;
jelord 3:122bfc998c4c 352 serialNumDigits[1] = tempSerialNum / 100 % 10;
jelord 3:122bfc998c4c 353 serialNumDigits[2] = tempSerialNum / 10 % 10;
jelord 3:122bfc998c4c 354 serialNumDigits[3] = tempSerialNum % 10;
jelord 3:122bfc998c4c 355
jelord 3:122bfc998c4c 356 serialNumberAndType[2] = serialNumDigits[0]+48;
jelord 3:122bfc998c4c 357 serialNumberAndType[3] = serialNumDigits[1]+48;
jelord 3:122bfc998c4c 358 serialNumberAndType[4] = serialNumDigits[2]+48;
jelord 3:122bfc998c4c 359 serialNumberAndType[5] = serialNumDigits[3]+48;
caseyquinn 5:c3252e5d45ca 360 RGB_LED.set_led(0,1,0);
jelord 3:122bfc998c4c 361 //pc.attach(pc_recv);
jelord 1:9fbb5b665068 362 microChannel.attach(uartMicro,microChannel.RxIrq);
jelord 3:122bfc998c4c 363 microChannel.baud(115200);
jelord 1:9fbb5b665068 364 microChannel.printf("$$$");
jelord 3:122bfc998c4c 365 wait(0.5);
jelord 3:122bfc998c4c 366 microChannel.printf("SN,");
jelord 3:122bfc998c4c 367 for(int i=0;i<6;i++)microChannel.putc(serialNumberAndType[i]);
jelord 3:122bfc998c4c 368 microChannel.printf("\r");
jelord 3:122bfc998c4c 369 wait(0.5);
jelord 1:9fbb5b665068 370 microChannel.printf("A\r");
jelord 3:122bfc998c4c 371 wait(0.5);
jelord 2:88fcbfadec6a 372 microChannel.printf("---\r");
jelord 3:122bfc998c4c 373 wait(0.5);
jelord 2:88fcbfadec6a 374
jelord 2:88fcbfadec6a 375
caseyquinn 4:5d004fd997d5 376
jelord 2:88fcbfadec6a 377
jelord 2:88fcbfadec6a 378 RGB_LED.set_led(1,1,1);
jelord 3:122bfc998c4c 379 while(runReady!=1) {
jelord 3:122bfc998c4c 380 wait(1);
jelord 3:122bfc998c4c 381 //pc.printf("Waiting for BLE instruction");
jelord 3:122bfc998c4c 382
jelord 3:122bfc998c4c 383 }
jelord 3:122bfc998c4c 384
caseyquinn 7:29b01d5812ee 385
jelord 3:122bfc998c4c 386
jelord 3:122bfc998c4c 387 E2PROM.read(0x00015, startAndEndTime, 12); //Grab start and end times from EEPROM
jelord 3:122bfc998c4c 388 RGB_LED.set_led(0,1,0);
caseyquinn 7:29b01d5812ee 389
caseyquinn 7:29b01d5812ee 390 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
caseyquinn 7:29b01d5812ee 391 //UPDATE THIS TO WORK WITH ST RTC INSTEAD
caseyquinn 7:29b01d5812ee 392 //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
caseyquinn 7:29b01d5812ee 393
jelord 3:122bfc998c4c 394 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 395 wait(0.5);
jelord 3:122bfc998c4c 396
jelord 3:122bfc998c4c 397 RTC_UPAS.get_time();
jelord 3:122bfc998c4c 398
jelord 3:122bfc998c4c 399 }
jelord 3:122bfc998c4c 400
jelord 3:122bfc998c4c 401
jelord 3:122bfc998c4c 402 //Get the proper serial number
jelord 3:122bfc998c4c 403 uint8_t serialBytes[2] = {0,};
jelord 3:122bfc998c4c 404 E2PROM.read(0x00034, serialBytes,2);
jelord 3:122bfc998c4c 405 serial_num = ((uint16_t)serialBytes[1] << 8) | serialBytes[0];
jelord 3:122bfc998c4c 406 calibrations.initialize(serial_num);
jelord 3:122bfc998c4c 407
jelord 3:122bfc998c4c 408 uint8_t logByte[1] = {0,};
jelord 3:122bfc998c4c 409 E2PROM.read(0x00014,logByte,1);
jelord 3:122bfc998c4c 410 logInerval = logByte[0];
jelord 3:122bfc998c4c 411
caseyquinn 7:29b01d5812ee 412
jelord 3:122bfc998c4c 413 //Use the flow rate value stored in eeprom
jelord 3:122bfc998c4c 414 uint8_t flowRateBytes[4] = {0,};
jelord 3:122bfc998c4c 415 E2PROM.read(0x00010,flowRateBytes,4);
jelord 3:122bfc998c4c 416 E2PROM.byteToFloat(flowRateBytes, &volflowSet);
jelord 3:122bfc998c4c 417
jelord 3:122bfc998c4c 418 if(volflowSet<=1.0) {
jelord 3:122bfc998c4c 419 gainFlow = 100;
jelord 3:122bfc998c4c 420 } else if(volflowSet>=2.0) {
jelord 3:122bfc998c4c 421 gainFlow = 25;
jelord 3:122bfc998c4c 422 } else {
jelord 3:122bfc998c4c 423 gainFlow = 25;
jelord 0:2cb2b2ea316f 424 }
jelord 3:122bfc998c4c 425
jelord 3:122bfc998c4c 426 RGB_LED.set_led(1,0,0);
jelord 3:122bfc998c4c 427 press = bmesensor.getPressure();
jelord 3:122bfc998c4c 428 temp = bmesensor.getTemperature();
jelord 3:122bfc998c4c 429 rh = bmesensor.getHumidity();
jelord 3:122bfc998c4c 430
jelord 3:122bfc998c4c 431 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 432 massflowSet = volflowSet*atmoRho;
jelord 3:122bfc998c4c 433
jelord 3:122bfc998c4c 434
jelord 3:122bfc998c4c 435 DigPot.writeRegister(digital_pot_setpoint);
jelord 3:122bfc998c4c 436 wait(1);
caseyquinn 5:c3252e5d45ca 437 //blower = 1;
jelord 3:122bfc998c4c 438
jelord 3:122bfc998c4c 439 uint8_t subjectLabelOriginal[8] = {0,};
caseyquinn 4:5d004fd997d5 440 E2PROM.read(0x00001, subjectLabelOriginal,8);
caseyquinn 5:c3252e5d45ca 441
caseyquinn 4:5d004fd997d5 442 time_t seconds = time(NULL);
caseyquinn 4:5d004fd997d5 443 strftime(timestr, 32, "%y-%m-%d-%H=%M=%S", localtime(&seconds));
caseyquinn 9:8646fd501832 444 //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 4:5d004fd997d5 445 sprintf(filename, "/sd/UPASboardtest_%s.txt", timestr);
jelord 3:122bfc998c4c 446 FILE *fp = fopen(filename, "w");
jelord 3:122bfc998c4c 447 fclose(fp);
jelord 3:122bfc998c4c 448
jelord 3:122bfc998c4c 449
jelord 3:122bfc998c4c 450 sampledVol = 0.0;
jelord 3:122bfc998c4c 451 RGB_LED.set_led(0,1,0);
caseyquinn 9:8646fd501832 452
caseyquinn 9:8646fd501832 453 stop.attach(&check_stop, 9); // check if we should shut down every 9 number seconds, starting after the start.
caseyquinn 7:29b01d5812ee 454 logg.attach(&log_data, logInerval);
caseyquinn 8:c4a8f9b67cee 455 flowCtl.attach(&flowControl, 1);
caseyquinn 7:29b01d5812ee 456
jelord 3:122bfc998c4c 457
jelord 3:122bfc998c4c 458 //** end of initalization **//
jelord 3:122bfc998c4c 459 //---------------------------------------------------------------------------------------------//
jelord 3:122bfc998c4c 460 //---------------------------------------------------------------------------------------------//
jelord 3:122bfc998c4c 461 // Main Control Loop
jelord 3:122bfc998c4c 462
caseyquinn 7:29b01d5812ee 463 while (1) {
caseyquinn 7:29b01d5812ee 464 // Do other things...
caseyquinn 7:29b01d5812ee 465 }
caseyquinn 7:29b01d5812ee 466
caseyquinn 8:c4a8f9b67cee 467
caseyquinn 4:5d004fd997d5 468
jelord 3:122bfc998c4c 469
jelord 0:2cb2b2ea316f 470 }