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 20:59:40 2016 +0000
Revision:
10:06fbb1c9e3bd
Parent:
9:8646fd501832
Child:
11:aa21628a9b15
Updated mbed files and nucleo board to "try" and make the tboard RN4677 work on D1 and D0 rather than D8 and D2 pins. Still not working exactly right...

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