all working version 2.0

Dependencies:   ADS1115 BME280 CronoDot SDFileSystem mbed

Fork of Outdoor_UPAS_v1_2_powerfunction by scott kelleher

Committer:
caseyquinn
Date:
Thu Mar 03 16:06:05 2016 +0000
Revision:
11:aa21628a9b15
Parent:
10:06fbb1c9e3bd
Child:
12:5b4f3245606a
Reverted back to official mbed library due to Tboard trace changes to leave Serial2 for the USB com and to use Serial3 RX,TX,CTS,RTS for the RN4677. This works with the nucleo module.

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