Code supports writing to the SD card as well as working with the Volckens group smartphone apps for the mbed HRM1017

Dependencies:   ADS1115 BLE_API BME280 Calibration CronoDot EEPROM LSM303 MCP40D17 NCP5623BMUTBG SDFileSystem SI1145 STC3100 mbed nRF51822

Fork of UPAS_BLE_and_USB by Volckens Group Sensors

Committer:
caseyquinn
Date:
Wed Feb 10 06:25:53 2016 +0000
Revision:
106:3911b3c7a24e
Parent:
105:f3be9e0314f7
Child:
107:5e3364e42214
Hard coded calibration value for temp fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
caseyquinn 0:14d46ef4b6cb 1 #include "mbed.h"
caseyquinn 0:14d46ef4b6cb 2 #include "SDFileSystem.h"
caseyquinn 0:14d46ef4b6cb 3 #include "Adafruit_ADS1015.h"
caseyquinn 1:37babeb68ab9 4 #include "MCP40D17.h"
caseyquinn 7:a24d7156bc02 5 #include "STC3100.h"
caseyquinn 10:f9cb61b29340 6 #include "LSM303.h"
caseyquinn 12:8c00a7f5d483 7 #include "BME280.h"
caseyquinn 14:ad550174db8b 8 #include "SI1145.h"
joshuasmth04 40:ef7e1dcb3780 9 #include "NCP5623BMUTBG.h"
joshuasmth04 41:1fb3e0ac6f87 10 #include "CronoDot.h"
caseyquinn 56:c4d6bdd7c3fb 11 #include "EEPROM.h"
joshuasmth04 77:24fbeb2bfe05 12 #include "BLEDevice.h"
joshuasmth04 77:24fbeb2bfe05 13 #include "Calibration.h"
jelord 94:c57720890e76 14 #include "UPAS_Service.h"
joshuasmth04 71:78edbceff4fc 15
caseyquinn 1:37babeb68ab9 16 #define SERIAL_BAUD_RATE 9600
joshuasmth04 41:1fb3e0ac6f87 17 #define SCL 20
caseyquinn 7:a24d7156bc02 18 #define SDA 22
caseyquinn 81:480f0310ef9a 19
caseyquinn 0:14d46ef4b6cb 20
joshuasmth04 71:78edbceff4fc 21
jelord 94:c57720890e76 22
joshuasmth04 71:78edbceff4fc 23
jelord 97:c596f8ed4562 24 uint8_t startAndEndTime[12] = {0,};
jelord 97:c596f8ed4562 25 uint8_t logIntervalReadOut[1] = {0,};
jelord 94:c57720890e76 26 static const uint16_t uuid16_list[] = {UPAS_Service::UPAS_SERVICE_UUID}; //Currently a custom 16-bit representation of 128-bit UUID
joshuasmth04 71:78edbceff4fc 27 BLEDevice ble;
jelord 94:c57720890e76 28 UPAS_Service *upasServicePtr;
jelord 94:c57720890e76 29 //BLE_Menu bleMenu(ble, txPayload, rxPayload, uart_base_uuid_rev, uart_base_uuid, uartService);
joshuasmth04 71:78edbceff4fc 30
joshuasmth04 72:0b36575ab00d 31 I2C i2c(p22, p20);
joshuasmth04 72:0b36575ab00d 32 Adafruit_ADS1115 ads(&i2c);
joshuasmth04 72:0b36575ab00d 33 MCP40D17 DigPot(&i2c);
joshuasmth04 72:0b36575ab00d 34 BME280 bmesensor(p22, p20);
joshuasmth04 72:0b36575ab00d 35 STC3100 gasG(p22, p20);
joshuasmth04 72:0b36575ab00d 36 Serial pc(USBTX, USBRX);
joshuasmth04 72:0b36575ab00d 37 DigitalOut blower(p29, 0);
joshuasmth04 72:0b36575ab00d 38 DigitalOut pbKill(p18, 1);
joshuasmth04 72:0b36575ab00d 39 LSM303 movementsensor(p22, p20);
joshuasmth04 72:0b36575ab00d 40 SI1145 lightsensor(p22, p20);
joshuasmth04 72:0b36575ab00d 41 NCP5623BMUTBG RGB_LED(p22, p20);
joshuasmth04 72:0b36575ab00d 42 CronoDot RTC(p22, p20);
joshuasmth04 72:0b36575ab00d 43 EEPROM E2PROM(p22, p20);
joshuasmth04 77:24fbeb2bfe05 44 DigitalOut GPS_EN(p4,0); //pin 4 is used to enable and disable the GPS, in order to recive serial communications
joshuasmth04 77:24fbeb2bfe05 45 Calibration calibrations(1); //Default serial/calibration if there are no values for the selected option
caseyquinn 57:0b554f7aa9a3 46
caseyquinn 57:0b554f7aa9a3 47 Timeout stop; //This is the stop call back object
joshuasmth04 77:24fbeb2bfe05 48 Timeout logg; //This is the logging call back object
caseyquinn 67:300418575137 49
joshuasmth04 77:24fbeb2bfe05 50 uint16_t serial_num = 1; // Default serial/calibration number
joshuasmth04 77:24fbeb2bfe05 51 int RunReady =0;
caseyquinn 70:81f04e69e08a 52
caseyquinn 70:81f04e69e08a 53
caseyquinn 20:ad9883973d86 54 float press;
caseyquinn 20:ad9883973d86 55 float temp;
caseyquinn 20:ad9883973d86 56 float rh;
caseyquinn 4:69bd7e8a994c 57
caseyquinn 20:ad9883973d86 58 int uv;
caseyquinn 20:ad9883973d86 59 int vis;
caseyquinn 20:ad9883973d86 60 int ir;
caseyquinn 8:204c21adf693 61
caseyquinn 67:300418575137 62 float compass;
caseyquinn 10:f9cb61b29340 63 float accel_x;
caseyquinn 10:f9cb61b29340 64 float accel_y;
caseyquinn 10:f9cb61b29340 65 float accel_z;
lionberg 52:80480b2fafba 66 float accel_comp;
caseyquinn 105:f3be9e0314f7 67 float angle_x;
caseyquinn 105:f3be9e0314f7 68 float angle_y;
caseyquinn 105:f3be9e0314f7 69 float angle_z;
caseyquinn 10:f9cb61b29340 70 float mag_x;
caseyquinn 10:f9cb61b29340 71 float mag_y;
caseyquinn 10:f9cb61b29340 72 float mag_z;
caseyquinn 10:f9cb61b29340 73
caseyquinn 0:14d46ef4b6cb 74 int vInReading;
caseyquinn 0:14d46ef4b6cb 75 int vBlowerReading;
caseyquinn 0:14d46ef4b6cb 76 int omronDiff;
lionberg 52:80480b2fafba 77 float omronVolt; //V
caseyquinn 20:ad9883973d86 78 int omronReading;
lionberg 52:80480b2fafba 79 float atmoRho; //g/L
caseyquinn 49:19e828650618 80
caseyquinn 20:ad9883973d86 81 float massflow; //g/min
caseyquinn 20:ad9883973d86 82 float volflow; //L/min
caseyquinn 67:300418575137 83 float volflowSet = 1.0; //L/min
caseyquinn 81:480f0310ef9a 84 int logInerval = 10; //seconds
caseyquinn 57:0b554f7aa9a3 85 double secondsD = 0;
caseyquinn 105:f3be9e0314f7 86 double lastsecondD = 0;
joshuasmth04 41:1fb3e0ac6f87 87 float massflowSet;
caseyquinn 42:fc2f2b9f07ae 88 float deltaVflow = 0.0;
caseyquinn 42:fc2f2b9f07ae 89 float deltaMflow = 0.0;
caseyquinn 47:3146e8c949a9 90 float gainFlow;
lionberg 52:80480b2fafba 91 float sampledVol; //L, total sampled volume
caseyquinn 20:ad9883973d86 92
caseyquinn 55:f24d70f519cd 93 int digital_pot_setpoint; //min = 0x7F, max = 0x00
caseyquinn 55:f24d70f519cd 94 int digital_pot_set;
caseyquinn 55:f24d70f519cd 95 int digital_pot_change;
caseyquinn 55:f24d70f519cd 96 int digitalpotMax = 127;
caseyquinn 55:f24d70f519cd 97 int digitalpotMin = 2;
caseyquinn 55:f24d70f519cd 98
joshuasmth04 59:a9b21b3d9afc 99 int dutyUp;
joshuasmth04 59:a9b21b3d9afc 100 int dutyDown;
joshuasmth04 59:a9b21b3d9afc 101
joshuasmth04 72:0b36575ab00d 102 // variables are only place holders for the US_Menu //
joshuasmth04 72:0b36575ab00d 103 int refreshtime;
joshuasmth04 72:0b36575ab00d 104 float home_lat, home_lon, work_lat, work_lon;
joshuasmth04 77:24fbeb2bfe05 105 //*************************************************//
joshuasmth04 72:0b36575ab00d 106
caseyquinn 67:300418575137 107 //int refresh_Time = 10; // refresh time in s, note calling read_GPS()(or similar) will still take how ever long it needs(hopefully < 1s)
caseyquinn 42:fc2f2b9f07ae 108
caseyquinn 81:480f0310ef9a 109 char filename[] = "/sd/XXXX0000LOG000000000000---------------.txt";
caseyquinn 7:a24d7156bc02 110 SDFileSystem sd(SPIS_PSELMOSI, SPIS_PSELMISO, SPIS_PSELSCK, SPIS_PSELSS, "sd"); // I believe this matches Todd's pinout, let me know if this doesn't work. (p12, p13, p15, p14)
caseyquinn 7:a24d7156bc02 111
caseyquinn 7:a24d7156bc02 112
joshuasmth04 71:78edbceff4fc 113 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
joshuasmth04 71:78edbceff4fc 114 {
jelord 94:c57720890e76 115 ble.startAdvertising();
joshuasmth04 71:78edbceff4fc 116 }
joshuasmth04 71:78edbceff4fc 117
joshuasmth04 71:78edbceff4fc 118 void WrittenHandler(const GattCharacteristicWriteCBParams *Handler) // called any time the phone sends a message
joshuasmth04 71:78edbceff4fc 119 {
jelord 94:c57720890e76 120 uint8_t *writeData = const_cast<uint8_t*>(Handler->data);
jelord 94:c57720890e76 121 // check to see what characteristic was written, by handle
jelord 94:c57720890e76 122 if(Handler->charHandle == upasServicePtr->rtcCharacteristic.getValueAttribute().getHandle()) {
jelord 94:c57720890e76 123
jelord 94:c57720890e76 124
jelord 94:c57720890e76 125
jelord 94:c57720890e76 126 E2PROM.write(0x00015, writeData+6, 12);
jelord 94:c57720890e76 127 RTC.set_time(writeData[0],writeData[1],writeData[2],writeData[3],writeData[3],writeData[4],writeData[5]);
jelord 94:c57720890e76 128
jelord 94:c57720890e76 129 }else if(Handler->charHandle == upasServicePtr->sampleTimeCharacteristic.getValueAttribute().getHandle()){
jelord 94:c57720890e76 130
jelord 94:c57720890e76 131 E2PROM.write(0x00015, writeData, 12);
jelord 94:c57720890e76 132
jelord 94:c57720890e76 133 }else if(Handler->charHandle == upasServicePtr->subjectLabelCharacteristic.getValueAttribute().getHandle()){
jelord 94:c57720890e76 134 E2PROM.write(0x00001,writeData,15);
jelord 94:c57720890e76 135
jelord 94:c57720890e76 136 }else if(Handler->charHandle == upasServicePtr->runReadyCharacteristic.getValueAttribute().getHandle()){
jelord 100:da71436aa52a 137
jelord 94:c57720890e76 138 uint8_t runData = writeData[0];
jelord 100:da71436aa52a 139 E2PROM.write(0x00033,writeData,1);
jelord 94:c57720890e76 140
jelord 100:da71436aa52a 141 if(runData == 0x0A){
jelord 100:da71436aa52a 142 RunReady = 10;
jelord 100:da71436aa52a 143 }else{
jelord 100:da71436aa52a 144 RunReady = 12;
jelord 100:da71436aa52a 145 }
jelord 94:c57720890e76 146
jelord 96:03106adb45c9 147 }else if(Handler->charHandle == upasServicePtr->logIntevalCharacteristic.getValueAttribute().getHandle()){
jelord 94:c57720890e76 148 /* Trigger demo mode*/
jelord 96:03106adb45c9 149 //RGB_LED.set_led(3,1,0);
jelord 96:03106adb45c9 150 E2PROM.write(0x00014,writeData,1);
jelord 96:03106adb45c9 151
jelord 96:03106adb45c9 152 }else if(Handler->charHandle == upasServicePtr->flowRateCharacteristic.getValueAttribute().getHandle()){
jelord 96:03106adb45c9 153 //RGB_LED.set_led(3,1,0);
jelord 98:d70ff5a0b2e6 154 E2PROM.write(0x00010,writeData,4);
jelord 98:d70ff5a0b2e6 155
jelord 98:d70ff5a0b2e6 156 //float volFlowTester = 0.0;
jelord 98:d70ff5a0b2e6 157 //uint8_t flowRateTestBytes[4] = {0,};
jelord 98:d70ff5a0b2e6 158 //E2PROM.read(0x00010,flowRateTestBytes,4);
jelord 98:d70ff5a0b2e6 159 //E2PROM.byteToFloat(flowRateTestBytes, &volFlowTester);
jelord 98:d70ff5a0b2e6 160
jelord 104:c57913399e79 161 }else if(Handler->charHandle == upasServicePtr->serialNumCharacteristic.getValueAttribute().getHandle()){
jelord 104:c57913399e79 162 E2PROM.write(0x00034,writeData,2);
jelord 94:c57720890e76 163 }
jelord 104:c57913399e79 164
joshuasmth04 71:78edbceff4fc 165 }
joshuasmth04 71:78edbceff4fc 166
joshuasmth04 62:edc9632bcc43 167 void check_stop() // this checks if it's time to stop and shutdown
caseyquinn 57:0b554f7aa9a3 168 {
jelord 94:c57720890e76 169
jelord 94:c57720890e76 170 if(RTC.compare(startAndEndTime[6], startAndEndTime[7], startAndEndTime[8], startAndEndTime[9], startAndEndTime[10], startAndEndTime[11])) {
caseyquinn 57:0b554f7aa9a3 171 pbKill = 0; // this is were we shut everything down
joshuasmth04 92:bb36c4bedb8e 172 pc.printf("If you're reading this something has gone very wrong.");
caseyquinn 57:0b554f7aa9a3 173 }
caseyquinn 57:0b554f7aa9a3 174 stop.detach();
joshuasmth04 77:24fbeb2bfe05 175 stop.attach(&check_stop, 9);
jelord 97:c596f8ed4562 176
joshuasmth04 62:edc9632bcc43 177 }
caseyquinn 58:7239c2ab2b65 178
joshuasmth04 41:1fb3e0ac6f87 179
caseyquinn 57:0b554f7aa9a3 180 void log_data()
joshuasmth04 59:a9b21b3d9afc 181 {
caseyquinn 70:81f04e69e08a 182 logg.detach();
jelord 94:c57720890e76 183 logg.attach(&log_data, logInerval); // reading and logging data must take significintly less than 0.5s. This can be increased.
caseyquinn 105:f3be9e0314f7 184
joshuasmth04 59:a9b21b3d9afc 185 RTC.get_time();
caseyquinn 105:f3be9e0314f7 186
caseyquinn 105:f3be9e0314f7 187 //*****************************************//
caseyquinn 105:f3be9e0314f7 188 //RTC.get_time(); //debug
caseyquinn 105:f3be9e0314f7 189 //pc.printf("%02d:%02d:%02d on %d/%d/%d before fmod \r\n",RTC.hour, RTC.minutes, RTC.seconds, RTC.month, RTC.date, RTC.year);//debug
caseyquinn 105:f3be9e0314f7 190 //*****************************************//
caseyquinn 105:f3be9e0314f7 191 secondsD = RTC.seconds;
caseyquinn 105:f3be9e0314f7 192
caseyquinn 105:f3be9e0314f7 193 while(fmod(secondsD,logInerval)!=0 || floor(secondsD)==floor(lastsecondD)) {
caseyquinn 105:f3be9e0314f7 194 //pc.printf("%f, %f\r\n", floor(secondsD), floor(lastsecondD));
caseyquinn 105:f3be9e0314f7 195 RTC.get_time();
caseyquinn 105:f3be9e0314f7 196 secondsD = RTC.seconds;
caseyquinn 105:f3be9e0314f7 197 wait_ms(100);
caseyquinn 105:f3be9e0314f7 198 }
caseyquinn 105:f3be9e0314f7 199 lastsecondD = secondsD;
caseyquinn 105:f3be9e0314f7 200 //*****************************************//
caseyquinn 105:f3be9e0314f7 201 //RTC.get_time(); //debug
caseyquinn 105:f3be9e0314f7 202 //pc.printf("%02d:%02d:%02d on %d/%d/%d after fmod \r\n",RTC.hour, RTC.minutes, RTC.seconds, RTC.month, RTC.date, RTC.year);//debug
caseyquinn 105:f3be9e0314f7 203 //*****************************************//
joshuasmth04 59:a9b21b3d9afc 204 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
joshuasmth04 59:a9b21b3d9afc 205 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 59:a9b21b3d9afc 206
joshuasmth04 77:24fbeb2bfe05 207 if(omronVolt<=calibrations.omronVMin) {
joshuasmth04 77:24fbeb2bfe05 208 massflow = calibrations.omronMFMin;
joshuasmth04 77:24fbeb2bfe05 209 } else if(omronVolt>=calibrations.omronVMax) {
joshuasmth04 77:24fbeb2bfe05 210 massflow = calibrations.omronMFMax;
joshuasmth04 59:a9b21b3d9afc 211 } else {
joshuasmth04 77:24fbeb2bfe05 212 massflow = calibrations.MF4*pow(omronVolt,(float)4)+calibrations.MF3*pow(omronVolt,(float)3)+calibrations.MF2*pow(omronVolt,(float)2)+calibrations.MF1*omronVolt+calibrations.MF0;
joshuasmth04 59:a9b21b3d9afc 213 }
joshuasmth04 59:a9b21b3d9afc 214
joshuasmth04 59:a9b21b3d9afc 215 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));
joshuasmth04 59:a9b21b3d9afc 216 volflow = massflow/atmoRho;
joshuasmth04 59:a9b21b3d9afc 217 sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
joshuasmth04 59:a9b21b3d9afc 218 deltaVflow = volflow-volflowSet;
joshuasmth04 59:a9b21b3d9afc 219 massflowSet = volflowSet*atmoRho;
joshuasmth04 59:a9b21b3d9afc 220 deltaMflow = massflow-massflowSet;
joshuasmth04 59:a9b21b3d9afc 221 if(abs(deltaMflow)>.025) {
joshuasmth04 59:a9b21b3d9afc 222 digital_pot_change = (int)(gainFlow*deltaMflow);
joshuasmth04 59:a9b21b3d9afc 223
joshuasmth04 59:a9b21b3d9afc 224
joshuasmth04 59:a9b21b3d9afc 225 if(abs(digital_pot_change)>=50) {
joshuasmth04 59:a9b21b3d9afc 226 digital_pot_set = (int)(digital_pot_set+(int)((10.0*deltaMflow)));
joshuasmth04 59:a9b21b3d9afc 227 RGB_LED.set_led(1,0,0);
caseyquinn 105:f3be9e0314f7 228 } else {
joshuasmth04 59:a9b21b3d9afc 229 digital_pot_set = (digital_pot_set+ digital_pot_change);
joshuasmth04 59:a9b21b3d9afc 230 RGB_LED.set_led(1,1,0);
joshuasmth04 59:a9b21b3d9afc 231 }
caseyquinn 105:f3be9e0314f7 232
caseyquinn 105:f3be9e0314f7 233 if(digital_pot_set>=digitalpotMax) {
caseyquinn 105:f3be9e0314f7 234 digital_pot_set = digitalpotMax;
caseyquinn 105:f3be9e0314f7 235 RGB_LED.set_led(1,0,0);
caseyquinn 105:f3be9e0314f7 236 } else if(digital_pot_set<=digitalpotMin) {
caseyquinn 105:f3be9e0314f7 237 digital_pot_set = digitalpotMin;
caseyquinn 105:f3be9e0314f7 238 RGB_LED.set_led(1,0,0);
caseyquinn 105:f3be9e0314f7 239 }
caseyquinn 105:f3be9e0314f7 240
joshuasmth04 59:a9b21b3d9afc 241
joshuasmth04 59:a9b21b3d9afc 242 DigPot.writeRegister(digital_pot_set);
joshuasmth04 59:a9b21b3d9afc 243
joshuasmth04 59:a9b21b3d9afc 244 } else {
joshuasmth04 59:a9b21b3d9afc 245 RGB_LED.set_led(0,1,0);
joshuasmth04 59:a9b21b3d9afc 246 }
caseyquinn 106:3911b3c7a24e 247
joshuasmth04 59:a9b21b3d9afc 248 movementsensor.getACCEL();
joshuasmth04 59:a9b21b3d9afc 249 movementsensor.getCOMPASS();
caseyquinn 67:300418575137 250 compass = movementsensor.getCOMPASS_HEADING();
joshuasmth04 59:a9b21b3d9afc 251 accel_x = movementsensor.AccelData.x;
joshuasmth04 59:a9b21b3d9afc 252 accel_y = movementsensor.AccelData.y;
joshuasmth04 59:a9b21b3d9afc 253 accel_z = movementsensor.AccelData.z;
joshuasmth04 59:a9b21b3d9afc 254 accel_comp = pow(accel_x,(float)2)+pow(accel_y,(float)2)+pow(accel_z,(float)2)-1.0;
joshuasmth04 59:a9b21b3d9afc 255 mag_x = movementsensor.MagData.x;
joshuasmth04 59:a9b21b3d9afc 256 mag_y = movementsensor.MagData.y;
joshuasmth04 59:a9b21b3d9afc 257 mag_z = movementsensor.MagData.z;
caseyquinn 106:3911b3c7a24e 258
joshuasmth04 59:a9b21b3d9afc 259 vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0
joshuasmth04 59:a9b21b3d9afc 260 vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0
joshuasmth04 59:a9b21b3d9afc 261 omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3
joshuasmth04 59:a9b21b3d9afc 262 press = bmesensor.getPressure();
joshuasmth04 59:a9b21b3d9afc 263 temp = bmesensor.getTemperature()-5.0;
joshuasmth04 59:a9b21b3d9afc 264 rh = bmesensor.getHumidity();
joshuasmth04 59:a9b21b3d9afc 265 uv = lightsensor.getUV();
joshuasmth04 59:a9b21b3d9afc 266 vis = lightsensor.getVIS();
joshuasmth04 59:a9b21b3d9afc 267 ir = lightsensor.getIR();
caseyquinn 106:3911b3c7a24e 268
joshuasmth04 59:a9b21b3d9afc 269 FILE *fp = fopen(filename, "a");
caseyquinn 105:f3be9e0314f7 270 fprintf(fp, "%02d,%02d,%02d,%02d,%02d,%02d,",RTC.year, RTC.month,RTC.date,RTC.hour,RTC.minutes,RTC.seconds);
caseyquinn 105:f3be9e0314f7 271 fprintf(fp, "%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,", omronVolt,massflow,temp,press,rh,atmoRho);
caseyquinn 105:f3be9e0314f7 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 105:f3be9e0314f7 273 fprintf(fp, "%.1f,%.1f,%.1f,%.3f,%.3f,%.3f,%.1f,", angle_x,angle_y,angle_z,mag_x, mag_y, mag_z,compass);
caseyquinn 105:f3be9e0314f7 274 fprintf(fp, "%d,%d,%d,%d,%d,%d," ,uv,omronReading, vInReading, vBlowerReading, omronDiff,gasG.getAmps());
caseyquinn 105:f3be9e0314f7 275 fprintf(fp, "%d,%d,%d,%1.3f,%1.3f\r\n", gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow);
caseyquinn 106:3911b3c7a24e 276 //fprintf(fp, "%d,%f,", serial_num, volflowSet);
caseyquinn 106:3911b3c7a24e 277 //fprintf(fp, "%f,%f,%f,%f,%f\r\n", calibrations.MF4, calibrations.MF3, calibrations.MF2, calibrations.MF1, calibrations.MF0);
joshuasmth04 59:a9b21b3d9afc 278 fclose(fp);
caseyquinn 105:f3be9e0314f7 279 //wait_ms(5);
caseyquinn 93:b53a9a7cb8f1 280
joshuasmth04 59:a9b21b3d9afc 281 }
jelord 96:03106adb45c9 282 /*EEPROM ADDRESSING:
jelord 96:03106adb45c9 283 0:Status bit-Unused
jelord 96:03106adb45c9 284 1-15:Device Name
jelord 96:03106adb45c9 285 16-19:Flow Rate
jelord 96:03106adb45c9 286 20: Data Log Interval
jelord 96:03106adb45c9 287 21-26: Start Time: ssmmHHddMMyy
jelord 96:03106adb45c9 288 27-32: Stop Time: ssmmHHddMMyy
jelord 96:03106adb45c9 289 33: Duty Up
jelord 96:03106adb45c9 290 34: Duty Down
jelord 96:03106adb45c9 291 35-38: Home Latitude
jelord 96:03106adb45c9 292 39-42: Home Longitude
jelord 96:03106adb45c9 293 43-46: Work Latitude
jelord 96:03106adb45c9 294 47-50: Work Longitude
jelord 96:03106adb45c9 295 51: Runready: Currently useless, should be 0
jelord 96:03106adb45c9 296 52-53: Device Calibration
jelord 96:03106adb45c9 297 54: Consider RunReady
jelord 96:03106adb45c9 298 55-56: Menu Options
jelord 96:03106adb45c9 299 57+ Nothing*/
caseyquinn 57:0b554f7aa9a3 300 int main()
caseyquinn 57:0b554f7aa9a3 301 {
joshuasmth04 91:f838d9a5b596 302 RGB_LED.set_led(1,1,1);
caseyquinn 57:0b554f7aa9a3 303 // Setup and Initialization
caseyquinn 57:0b554f7aa9a3 304 //---------------------------------------------------------------------------------------------//
joshuasmth04 71:78edbceff4fc 305 //**************//BLE initialization//**************//
jelord 94:c57720890e76 306 RTC.get_time();
jelord 94:c57720890e76 307 uint8_t rtcPassValues[6] = {RTC.seconds, RTC.minutes,RTC.hour,RTC.date,RTC.month,RTC.year};
jelord 104:c57913399e79 308
jelord 104:c57913399e79 309 uint8_t sampleTimePassValues[12] = {0x00,0x00,0x0A,0x01,0x01,0x10,0x00,0x00,0x0A,0x01,0x01,0x10}; //Start 1/1/16 12:00:00 End 1/1/16 12:00:00
jelord 104:c57913399e79 310 uint8_t subjectLabelOriginal[8] = {0x52,0x45,0x53,0x45,0x54,0x5F,0x5F,0x5f}; // RESET___
jelord 104:c57913399e79 311 uint8_t dataLogOriginal[1] = {0x0A,}; //10 seconds
jelord 104:c57913399e79 312 uint8_t flowRateOriginal[4] = {0x00,0x00,0x80,0x3F}; //1.0 LPM
jelord 104:c57913399e79 313
jelord 104:c57913399e79 314 uint8_t serialNumberAndType[6] = {0x50,0x53};
jelord 104:c57913399e79 315
jelord 104:c57913399e79 316 //Code/conditional set up to prevent bad values in the EEPROM. Does not set serial number currently
jelord 104:c57913399e79 317 uint8_t eepromFlag[1] = {0,};
jelord 104:c57913399e79 318 E2PROM.read(0x00071,eepromFlag,1);
jelord 104:c57913399e79 319 if(eepromFlag[0]!= 0x0A){
jelord 104:c57913399e79 320 E2PROM.write(0x00015, sampleTimePassValues, 12);
jelord 104:c57913399e79 321 E2PROM.write(0x00001, subjectLabelOriginal,8);
jelord 104:c57913399e79 322 E2PROM.write(0x00014,dataLogOriginal,1);
jelord 104:c57913399e79 323 E2PROM.write(0x00010,flowRateOriginal,4);
jelord 104:c57913399e79 324
jelord 104:c57913399e79 325 eepromFlag[0] = 0x0A;
jelord 104:c57913399e79 326 E2PROM.write(0x00071,eepromFlag,1);
jelord 104:c57913399e79 327 }
jelord 104:c57913399e79 328
jelord 104:c57913399e79 329
jelord 104:c57913399e79 330 //Retrieve current eeprom values
jelord 94:c57720890e76 331 E2PROM.read(0x00015, sampleTimePassValues, 12);
jelord 99:229435dd4cfb 332 E2PROM.read(0x00001, subjectLabelOriginal,8);
jelord 96:03106adb45c9 333 E2PROM.read(0x00014,dataLogOriginal,1);
jelord 96:03106adb45c9 334 E2PROM.read(0x00010,flowRateOriginal,4);
jelord 104:c57913399e79 335
jelord 104:c57913399e79 336
jelord 104:c57913399e79 337 //Following 12 lines of code parses the serial number from a byte id to a readable set of characters for the app user to see
jelord 104:c57913399e79 338 E2PROM.read(0x00034,serialNumberAndType+2,2);
jelord 104:c57913399e79 339 int tempSerialNum = serialNumberAndType[2]+serialNumberAndType[3];
jelord 104:c57913399e79 340 int serialNumDigits[4];
jelord 104:c57913399e79 341 serialNumDigits[0] = tempSerialNum / 1000 % 10;
jelord 104:c57913399e79 342 serialNumDigits[1] = tempSerialNum / 100 % 10;
jelord 104:c57913399e79 343 serialNumDigits[2] = tempSerialNum / 10 % 10;
jelord 104:c57913399e79 344 serialNumDigits[3] = tempSerialNum % 10;
jelord 104:c57913399e79 345
jelord 104:c57913399e79 346 serialNumberAndType[2] = serialNumDigits[0]+48;
jelord 104:c57913399e79 347 serialNumberAndType[3] = serialNumDigits[1]+48;
jelord 104:c57913399e79 348 serialNumberAndType[4] = serialNumDigits[2]+48;
jelord 104:c57913399e79 349 serialNumberAndType[5] = serialNumDigits[3]+48;
jelord 104:c57913399e79 350
jelord 104:c57913399e79 351
jelord 102:d25eab697fe0 352 //E2PROM.read(0x00033,presetRunModeCheck,1); //commented out mem issue
joshuasmth04 77:24fbeb2bfe05 353 ble.init();
jelord 94:c57720890e76 354 ble.onDisconnection(disconnectionCallback);
jelord 94:c57720890e76 355 ble.onDataWritten(WrittenHandler); //add writeCharCallback (custom function) to whenever data is being written to device
jelord 102:d25eab697fe0 356 UPAS_Service upasService(ble, false,rtcPassValues,sampleTimePassValues,subjectLabelOriginal,dataLogOriginal,flowRateOriginal); //Create a GattService that is defined in UPAS_Service.h
jelord 94:c57720890e76 357 upasServicePtr = &upasService; //Create a pointer to the service (Allows advertisement without specifically adding the service
jelord 94:c57720890e76 358
jelord 94:c57720890e76 359 /* setup advertising
jelord 94:c57720890e76 360 Following lines do the follow:
jelord 94:c57720890e76 361 1:Declare the device as Bluetooth Smart(Low-Energy)
jelord 100:da71436aa52a 362 2.Advertise the UPAS service that will send and receive the 113+ bits of settable values in the UPAS EEPROM
jelord 94:c57720890e76 363 3.Advertise the name that will be associated with the UPAS
jelord 94:c57720890e76 364 4.Allow the UPAS to advertise unrestricted (this might change) */
jelord 94:c57720890e76 365
jelord 94:c57720890e76 366 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
jelord 94:c57720890e76 367 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
jelord 104:c57913399e79 368 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)serialNumberAndType, sizeof(serialNumberAndType));
joshuasmth04 71:78edbceff4fc 369 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
jelord 94:c57720890e76 370 ble.setAdvertisingInterval(160); /* 160ms. */
joshuasmth04 77:24fbeb2bfe05 371 ble.startAdvertising();
jelord 94:c57720890e76 372
joshuasmth04 71:78edbceff4fc 373 //**************//BLE initialization//**************//
jelord 96:03106adb45c9 374
jelord 96:03106adb45c9 375 //Logic Loop waiting for responses from the BLE iPhone App.
jelord 96:03106adb45c9 376 //Will not break loop without response from the app
jelord 102:d25eab697fe0 377
jelord 102:d25eab697fe0 378 //outer loop commented out to prevent mem issues
jelord 102:d25eab697fe0 379 //if(presetRunModeCheck[0] != 0x0C){
caseyquinn 106:3911b3c7a24e 380
jelord 100:da71436aa52a 381 while (1) {
jelord 100:da71436aa52a 382 ble.waitForEvent();
jelord 100:da71436aa52a 383
jelord 100:da71436aa52a 384 if(RunReady==10){ //Check to see if app is done with configurations
jelord 100:da71436aa52a 385 ble.stopAdvertising();
jelord 100:da71436aa52a 386 break;
jelord 100:da71436aa52a 387 }
jelord 98:d70ff5a0b2e6 388
jelord 100:da71436aa52a 389 if(RunReady==12){ //If 24 hour mode has been set, then shut down the UPAS for automatic start later.
jelord 100:da71436aa52a 390 pbKill = 0;
jelord 100:da71436aa52a 391 }
jelord 100:da71436aa52a 392 }
caseyquinn 106:3911b3c7a24e 393
jelord 102:d25eab697fe0 394 //}else{
jelord 102:d25eab697fe0 395 // RunReady = 12;
jelord 102:d25eab697fe0 396 // }
jelord 98:d70ff5a0b2e6 397
jelord 102:d25eab697fe0 398 //If 24 hour mode was set by app, make sure to clear it for next app cycle...commented out for now
jelord 102:d25eab697fe0 399 // presetRunModeCheck[0] = 0x01;
jelord 102:d25eab697fe0 400 // E2PROM.write(0x00033,presetRunModeCheck,1);
jelord 100:da71436aa52a 401
jelord 94:c57720890e76 402 E2PROM.read(0x00015, startAndEndTime, 12); //Grab start and end times from EEPROM
jelord 94:c57720890e76 403 while(!RTC.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 94:c57720890e76 404 wait(0.5);
jelord 98:d70ff5a0b2e6 405
jelord 94:c57720890e76 406 RTC.get_time();
jelord 94:c57720890e76 407
jelord 100:da71436aa52a 408 }
caseyquinn 106:3911b3c7a24e 409
caseyquinn 106:3911b3c7a24e 410
jelord 102:d25eab697fe0 411 //Commented out to prevent mem issues
jelord 100:da71436aa52a 412 //MARK: editting 24 hour mode code here
jelord 102:d25eab697fe0 413 //if(RunReady == 12) {
jelord 102:d25eab697fe0 414 // RTC.get_time();
jelord 102:d25eab697fe0 415 // startAndEndTime[6] = RTC.seconds;
jelord 102:d25eab697fe0 416 // startAndEndTime[7] = RTC.minutes;
jelord 102:d25eab697fe0 417 // startAndEndTime[8] = RTC.hour;
jelord 102:d25eab697fe0 418 // if(RTC.month == 1 | RTC.month == 3 | RTC.month == 5 | RTC.month == 7 | RTC.month == 8 | RTC.month == 10) {
jelord 102:d25eab697fe0 419 // if(RTC.date == 31) {
jelord 102:d25eab697fe0 420 // startAndEndTime[9] = 1;
jelord 102:d25eab697fe0 421 // startAndEndTime[10] = RTC.month +1;
jelord 102:d25eab697fe0 422 // startAndEndTime[11] = RTC.year;
jelord 102:d25eab697fe0 423 // } else {
jelord 102:d25eab697fe0 424 // startAndEndTime[9] = RTC.date+1;
jelord 102:d25eab697fe0 425 // startAndEndTime[10] = RTC.month;
jelord 102:d25eab697fe0 426 // startAndEndTime[11] = RTC.year;
jelord 102:d25eab697fe0 427 // }
jelord 102:d25eab697fe0 428 // } else if(RTC.month == 4 | RTC.month == 6 | RTC.month == 9 | RTC.month == 11) {
jelord 102:d25eab697fe0 429 // if(RTC.date == 30) {
jelord 102:d25eab697fe0 430 // startAndEndTime[9] = 1;
jelord 102:d25eab697fe0 431 // startAndEndTime[10] = RTC.month +1;
jelord 102:d25eab697fe0 432 // startAndEndTime[11] = RTC.year;
jelord 102:d25eab697fe0 433 // } else {
jelord 102:d25eab697fe0 434 // startAndEndTime[9] = RTC.date+1;
jelord 102:d25eab697fe0 435 // startAndEndTime[10] = RTC.month;
jelord 102:d25eab697fe0 436 // startAndEndTime[11] = RTC.year;
jelord 102:d25eab697fe0 437 // }
jelord 102:d25eab697fe0 438 // } else if(RTC.month == 2) {
jelord 102:d25eab697fe0 439 // if(RTC.year == 16 | RTC.year == 20 | RTC.year == 24| RTC.year == 28) {
jelord 102:d25eab697fe0 440 // if(RTC.date == 29) {
jelord 102:d25eab697fe0 441 // startAndEndTime[9] = 1;
jelord 102:d25eab697fe0 442 // startAndEndTime[10] = RTC.month +1;
jelord 102:d25eab697fe0 443 // startAndEndTime[11] = RTC.year;
jelord 102:d25eab697fe0 444 // } else {
jelord 102:d25eab697fe0 445 // startAndEndTime[9] = RTC.date+1;
jelord 102:d25eab697fe0 446 // startAndEndTime[10] = RTC.month;
jelord 102:d25eab697fe0 447 // startAndEndTime[11] = RTC.year;
jelord 102:d25eab697fe0 448 // }
jelord 102:d25eab697fe0 449 // } else {
jelord 102:d25eab697fe0 450 // if(RTC.date == 28) {
jelord 102:d25eab697fe0 451 // startAndEndTime[9] = 1;
jelord 102:d25eab697fe0 452 // startAndEndTime[10] = RTC.month +1;
jelord 102:d25eab697fe0 453 // startAndEndTime[11] = RTC.year;
jelord 102:d25eab697fe0 454 // } else {
jelord 102:d25eab697fe0 455 // startAndEndTime[9] = RTC.date+1;
jelord 102:d25eab697fe0 456 // startAndEndTime[10] = RTC.month;
jelord 102:d25eab697fe0 457 // startAndEndTime[11] = RTC.year;
jelord 102:d25eab697fe0 458 // }
jelord 102:d25eab697fe0 459 // }
jelord 102:d25eab697fe0 460 // } else if(RTC.month == 12) {
jelord 102:d25eab697fe0 461 // if(RTC.date == 31) {
jelord 102:d25eab697fe0 462 // startAndEndTime[9] = 1;
jelord 102:d25eab697fe0 463 // startAndEndTime[10] = 1;
jelord 102:d25eab697fe0 464 // startAndEndTime[11] = RTC.year+1;
jelord 102:d25eab697fe0 465 // } else {
jelord 102:d25eab697fe0 466 // startAndEndTime[9] = RTC.date+1;
jelord 102:d25eab697fe0 467 // startAndEndTime[10] = RTC.month;
jelord 102:d25eab697fe0 468 // startAndEndTime[11] = RTC.year;
jelord 102:d25eab697fe0 469 // }
jelord 102:d25eab697fe0 470 // }
jelord 102:d25eab697fe0 471 // }
jelord 100:da71436aa52a 472 //MARK: end of 24 hour mode code
jelord 100:da71436aa52a 473
jelord 98:d70ff5a0b2e6 474 RGB_LED.set_led(0,1,0);
jelord 102:d25eab697fe0 475
jelord 102:d25eab697fe0 476 //Get the proper serial number
jelord 102:d25eab697fe0 477 E2PROM.read(0x00034, flowRateOriginal,2);
jelord 102:d25eab697fe0 478 serial_num = ((uint16_t)flowRateOriginal[1] << 8) | flowRateOriginal[0];
caseyquinn 106:3911b3c7a24e 479 calibrations.initialize(17);
caseyquinn 106:3911b3c7a24e 480 wait(1);
jelord 94:c57720890e76 481 blower=1;
jelord 97:c596f8ed4562 482 E2PROM.read(0x00014,logIntervalReadOut,1);
jelord 97:c596f8ed4562 483 logInerval = logIntervalReadOut[0];
jelord 100:da71436aa52a 484
joshuasmth04 89:047e8558fd09 485 pc.printf("You're done, you can now disconect the USB cable.\r\n");
caseyquinn 84:85d11d422da3 486 RunReady = 0;
joshuasmth04 85:a95dd5f03818 487
jelord 94:c57720890e76 488
jelord 96:03106adb45c9 489 stop.attach(&check_stop, 30); // check if we should shut down every 9 seconds, starting 60s after the start.
joshuasmth04 85:a95dd5f03818 490
jelord 102:d25eab697fe0 491 //Use the flow rate value stored in eeprom
jelord 102:d25eab697fe0 492 E2PROM.read(0x00010,flowRateOriginal,4);
jelord 102:d25eab697fe0 493 E2PROM.byteToFloat(flowRateOriginal, &volflowSet);
jelord 98:d70ff5a0b2e6 494
caseyquinn 81:480f0310ef9a 495 if(volflowSet<=1.0) {
joshuasmth04 59:a9b21b3d9afc 496 gainFlow = 100;
caseyquinn 81:480f0310ef9a 497 } else if(volflowSet>=2.0) {
joshuasmth04 59:a9b21b3d9afc 498 gainFlow = 25;
joshuasmth04 59:a9b21b3d9afc 499 } else {
caseyquinn 88:9142f21a4715 500 gainFlow = 25;
joshuasmth04 59:a9b21b3d9afc 501 }
joshuasmth04 59:a9b21b3d9afc 502
caseyquinn 57:0b554f7aa9a3 503 RGB_LED.set_led(1,0,0);
caseyquinn 57:0b554f7aa9a3 504 press = bmesensor.getPressure();
caseyquinn 57:0b554f7aa9a3 505 temp = bmesensor.getTemperature();
caseyquinn 57:0b554f7aa9a3 506 rh = bmesensor.getHumidity();
caseyquinn 57:0b554f7aa9a3 507
caseyquinn 57:0b554f7aa9a3 508 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 57:0b554f7aa9a3 509 massflowSet = volflowSet*atmoRho;
caseyquinn 57:0b554f7aa9a3 510 //Digtal pot tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
joshuasmth04 85:a95dd5f03818 511
joshuasmth04 85:a95dd5f03818 512
joshuasmth04 77:24fbeb2bfe05 513 digital_pot_setpoint = (int)floor(calibrations.DP4*pow(massflowSet,4)+calibrations.DP3*pow(massflowSet,3)+calibrations.DP2*pow(massflowSet,2)+calibrations.DP1*massflowSet+calibrations.DP0); //min = 0x7F, max = 0x00
joshuasmth04 85:a95dd5f03818 514
joshuasmth04 59:a9b21b3d9afc 515 if(digital_pot_setpoint>=digitalpotMax) {
caseyquinn 57:0b554f7aa9a3 516 digital_pot_setpoint = digitalpotMax;
joshuasmth04 59:a9b21b3d9afc 517 } else if(digital_pot_setpoint<=digitalpotMin) {
caseyquinn 57:0b554f7aa9a3 518 digital_pot_setpoint = digitalpotMin;
joshuasmth04 59:a9b21b3d9afc 519 }
joshuasmth04 59:a9b21b3d9afc 520
caseyquinn 57:0b554f7aa9a3 521 DigPot.writeRegister(digital_pot_setpoint);
caseyquinn 57:0b554f7aa9a3 522 wait(1);
caseyquinn 57:0b554f7aa9a3 523 blower = 1;
jelord 102:d25eab697fe0 524
jelord 97:c596f8ed4562 525
jelord 102:d25eab697fe0 526 E2PROM.read(0x00001, subjectLabelOriginal,8);
jelord 102:d25eab697fe0 527 //sprintf(filename, "/sd/%c%c%c%c%c%c%c%cLOG_%02d-%02d-%02d_%02d=%02d=%02d.txt",subjectLabelOriginal[0],subjectLabelOriginal[1],subjectLabelOriginal[2],subjectLabelOriginal[3],subjectLabelOriginal[4],subjectLabelOriginal[5],subjectLabelOriginal[6],subjectLabelOriginal[7],RTC.year,RTC.month,RTC.date,RTC.hour,RTC.minutes,RTC.seconds);
jelord 102:d25eab697fe0 528 sprintf(filename, "/sd/UPAS%04dLOG_%02d-%02d-%02d_%02d=%02d=%02d_%c%c%c%c%c%c%c%c.txt",serial_num,RTC.year,RTC.month,RTC.date,RTC.hour,RTC.minutes,RTC.seconds,subjectLabelOriginal[0],subjectLabelOriginal[1],subjectLabelOriginal[2],subjectLabelOriginal[3],subjectLabelOriginal[4],subjectLabelOriginal[5],subjectLabelOriginal[6],subjectLabelOriginal[7]);
caseyquinn 57:0b554f7aa9a3 529 FILE *fp = fopen(filename, "w");
caseyquinn 57:0b554f7aa9a3 530 fclose(fp);
joshuasmth04 59:a9b21b3d9afc 531
joshuasmth04 59:a9b21b3d9afc 532 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 533 //Following lines are needed to enter into the initiallization flow control loop
joshuasmth04 59:a9b21b3d9afc 534
caseyquinn 57:0b554f7aa9a3 535 wait(10);
joshuasmth04 59:a9b21b3d9afc 536
caseyquinn 57:0b554f7aa9a3 537 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 57:0b554f7aa9a3 538 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 77:24fbeb2bfe05 539 if(omronVolt<=calibrations.omronVMin) {
joshuasmth04 77:24fbeb2bfe05 540 massflow = calibrations.omronMFMin;
joshuasmth04 77:24fbeb2bfe05 541 } else if(omronVolt>=calibrations.omronVMax) {
joshuasmth04 77:24fbeb2bfe05 542 massflow = calibrations.omronMFMax;
joshuasmth04 59:a9b21b3d9afc 543 } else {
joshuasmth04 77:24fbeb2bfe05 544 massflow = calibrations.MF4*pow(omronVolt,(float)4)+calibrations.MF3*pow(omronVolt,(float)3)+calibrations.MF2*pow(omronVolt,(float)2)+calibrations.MF1*omronVolt+calibrations.MF0;
joshuasmth04 59:a9b21b3d9afc 545 }
joshuasmth04 59:a9b21b3d9afc 546 deltaMflow = massflow-massflowSet;
joshuasmth04 59:a9b21b3d9afc 547 digital_pot_set = digital_pot_setpoint;
joshuasmth04 59:a9b21b3d9afc 548 wait(5);
joshuasmth04 59:a9b21b3d9afc 549
joshuasmth04 59:a9b21b3d9afc 550 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 551 //Sets the flow withen +-1.5% of the desired flow rate based on mass flow
joshuasmth04 59:a9b21b3d9afc 552
joshuasmth04 59:a9b21b3d9afc 553 while(abs(deltaMflow)>.015) {
joshuasmth04 77:24fbeb2bfe05 554
joshuasmth04 59:a9b21b3d9afc 555 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
joshuasmth04 59:a9b21b3d9afc 556 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 59:a9b21b3d9afc 557 //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
joshuasmth04 77:24fbeb2bfe05 558 if(omronVolt<=calibrations.omronVMin) {
joshuasmth04 77:24fbeb2bfe05 559 massflow = calibrations.omronMFMin;
joshuasmth04 77:24fbeb2bfe05 560 } else if(omronVolt>=calibrations.omronVMax) {
joshuasmth04 77:24fbeb2bfe05 561 massflow = calibrations.omronMFMax;
joshuasmth04 59:a9b21b3d9afc 562 } else {
joshuasmth04 77:24fbeb2bfe05 563 massflow = calibrations.MF4*pow(omronVolt,(float)4)+calibrations.MF3*pow(omronVolt,(float)3)+calibrations.MF2*pow(omronVolt,(float)2)+calibrations.MF1*omronVolt+calibrations.MF0;
joshuasmth04 59:a9b21b3d9afc 564 }
caseyquinn 57:0b554f7aa9a3 565
joshuasmth04 59:a9b21b3d9afc 566 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));
joshuasmth04 59:a9b21b3d9afc 567 volflow = massflow/atmoRho;
joshuasmth04 59:a9b21b3d9afc 568 massflowSet = volflowSet*atmoRho;
joshuasmth04 59:a9b21b3d9afc 569 deltaMflow = massflow-massflowSet;
jelord 94:c57720890e76 570
joshuasmth04 59:a9b21b3d9afc 571 digital_pot_set = (int)(digital_pot_set+(int)((gainFlow*deltaMflow)));
joshuasmth04 59:a9b21b3d9afc 572 if(digital_pot_set>=digitalpotMax) {
joshuasmth04 59:a9b21b3d9afc 573 digital_pot_set = digitalpotMax;
joshuasmth04 59:a9b21b3d9afc 574 } else if(digital_pot_set<=digitalpotMin) {
joshuasmth04 59:a9b21b3d9afc 575 digital_pot_set = digitalpotMin;
joshuasmth04 59:a9b21b3d9afc 576 }
joshuasmth04 59:a9b21b3d9afc 577
joshuasmth04 59:a9b21b3d9afc 578 wait(2);
joshuasmth04 59:a9b21b3d9afc 579 DigPot.writeRegister(digital_pot_set);
joshuasmth04 59:a9b21b3d9afc 580 wait(1);
joshuasmth04 59:a9b21b3d9afc 581
joshuasmth04 59:a9b21b3d9afc 582
joshuasmth04 59:a9b21b3d9afc 583 }
joshuasmth04 59:a9b21b3d9afc 584
joshuasmth04 59:a9b21b3d9afc 585 sampledVol = 0.0;
joshuasmth04 59:a9b21b3d9afc 586 RGB_LED.set_led(0,1,0);
joshuasmth04 77:24fbeb2bfe05 587
caseyquinn 67:300418575137 588
joshuasmth04 59:a9b21b3d9afc 589
joshuasmth04 59:a9b21b3d9afc 590 //** end of initalization **//
joshuasmth04 59:a9b21b3d9afc 591 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 592 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 593 // Main Control Loop
joshuasmth04 59:a9b21b3d9afc 594
caseyquinn 93:b53a9a7cb8f1 595
joshuasmth04 62:edc9632bcc43 596 logg.attach(&log_data, logInerval); // uses callbacks or block Interrupts for anything that uses i2c
joshuasmth04 59:a9b21b3d9afc 597
caseyquinn 0:14d46ef4b6cb 598 }
caseyquinn 0:14d46ef4b6cb 599