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