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 17 03:16:59 2016 +0000
Revision:
113:846f67efaa80
Parent:
112:fd14d51e3493
Child:
114:84e759e07948
commented out callback functions (replaced by while loop and wait statements in main()). Also added purple light to indicate waiting to start.

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
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
caseyquinn 113:846f67efaa80 169 /*
joshuasmth04 62:edc9632bcc43 170 void check_stop() // this checks if it's time to stop and shutdown
caseyquinn 57:0b554f7aa9a3 171 {
jelord 94:c57720890e76 172
jelord 94:c57720890e76 173 if(RTC.compare(startAndEndTime[6], startAndEndTime[7], startAndEndTime[8], startAndEndTime[9], startAndEndTime[10], startAndEndTime[11])) {
caseyquinn 57:0b554f7aa9a3 174 pbKill = 0; // this is were we shut everything down
joshuasmth04 92:bb36c4bedb8e 175 pc.printf("If you're reading this something has gone very wrong.");
caseyquinn 57:0b554f7aa9a3 176 }
caseyquinn 57:0b554f7aa9a3 177 stop.detach();
joshuasmth04 77:24fbeb2bfe05 178 stop.attach(&check_stop, 9);
jelord 97:c596f8ed4562 179
joshuasmth04 62:edc9632bcc43 180 }
caseyquinn 58:7239c2ab2b65 181
jelord 112:fd14d51e3493 182 int r =0;
jelord 112:fd14d51e3493 183 int g =1;
jelord 112:fd14d51e3493 184 int b=1;
caseyquinn 57:0b554f7aa9a3 185 void log_data()
joshuasmth04 59:a9b21b3d9afc 186 {
jelord 112:fd14d51e3493 187 //logg.detach();
jelord 112:fd14d51e3493 188 //logg.attach(&log_data, logInerval); // reading and logging data must take significintly less than 0.5s. This can be increased.
jelord 112:fd14d51e3493 189 if(r==0) r=1;
jelord 112:fd14d51e3493 190 else r=0;
jelord 112:fd14d51e3493 191 RGB_LED.set_led(r,g,b);
jelord 112:fd14d51e3493 192 wait(0.5);
caseyquinn 105:f3be9e0314f7 193
joshuasmth04 59:a9b21b3d9afc 194 RTC.get_time();
caseyquinn 105:f3be9e0314f7 195
joshuasmth04 59:a9b21b3d9afc 196 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
joshuasmth04 59:a9b21b3d9afc 197 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 59:a9b21b3d9afc 198
joshuasmth04 77:24fbeb2bfe05 199 if(omronVolt<=calibrations.omronVMin) {
joshuasmth04 77:24fbeb2bfe05 200 massflow = calibrations.omronMFMin;
joshuasmth04 77:24fbeb2bfe05 201 } else if(omronVolt>=calibrations.omronVMax) {
joshuasmth04 77:24fbeb2bfe05 202 massflow = calibrations.omronMFMax;
joshuasmth04 59:a9b21b3d9afc 203 } else {
joshuasmth04 77:24fbeb2bfe05 204 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 205 }
joshuasmth04 59:a9b21b3d9afc 206
joshuasmth04 59:a9b21b3d9afc 207 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 208 volflow = massflow/atmoRho;
joshuasmth04 59:a9b21b3d9afc 209 sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
joshuasmth04 59:a9b21b3d9afc 210 deltaVflow = volflow-volflowSet;
joshuasmth04 59:a9b21b3d9afc 211 massflowSet = volflowSet*atmoRho;
joshuasmth04 59:a9b21b3d9afc 212 deltaMflow = massflow-massflowSet;
joshuasmth04 59:a9b21b3d9afc 213 if(abs(deltaMflow)>.025) {
joshuasmth04 59:a9b21b3d9afc 214 digital_pot_change = (int)(gainFlow*deltaMflow);
joshuasmth04 59:a9b21b3d9afc 215
joshuasmth04 59:a9b21b3d9afc 216
joshuasmth04 59:a9b21b3d9afc 217 if(abs(digital_pot_change)>=50) {
joshuasmth04 59:a9b21b3d9afc 218 digital_pot_set = (int)(digital_pot_set+(int)((10.0*deltaMflow)));
joshuasmth04 59:a9b21b3d9afc 219 RGB_LED.set_led(1,0,0);
caseyquinn 105:f3be9e0314f7 220 } else {
joshuasmth04 59:a9b21b3d9afc 221 digital_pot_set = (digital_pot_set+ digital_pot_change);
joshuasmth04 59:a9b21b3d9afc 222 RGB_LED.set_led(1,1,0);
joshuasmth04 59:a9b21b3d9afc 223 }
caseyquinn 105:f3be9e0314f7 224
caseyquinn 105:f3be9e0314f7 225 if(digital_pot_set>=digitalpotMax) {
caseyquinn 105:f3be9e0314f7 226 digital_pot_set = digitalpotMax;
caseyquinn 105:f3be9e0314f7 227 RGB_LED.set_led(1,0,0);
caseyquinn 105:f3be9e0314f7 228 } else if(digital_pot_set<=digitalpotMin) {
caseyquinn 105:f3be9e0314f7 229 digital_pot_set = digitalpotMin;
caseyquinn 105:f3be9e0314f7 230 RGB_LED.set_led(1,0,0);
caseyquinn 105:f3be9e0314f7 231 }
caseyquinn 105:f3be9e0314f7 232
joshuasmth04 59:a9b21b3d9afc 233
joshuasmth04 59:a9b21b3d9afc 234 DigPot.writeRegister(digital_pot_set);
joshuasmth04 59:a9b21b3d9afc 235
joshuasmth04 59:a9b21b3d9afc 236 } else {
joshuasmth04 59:a9b21b3d9afc 237 RGB_LED.set_led(0,1,0);
joshuasmth04 59:a9b21b3d9afc 238 }
caseyquinn 106:3911b3c7a24e 239
joshuasmth04 59:a9b21b3d9afc 240 movementsensor.getACCEL();
joshuasmth04 59:a9b21b3d9afc 241 movementsensor.getCOMPASS();
caseyquinn 67:300418575137 242 compass = movementsensor.getCOMPASS_HEADING();
joshuasmth04 59:a9b21b3d9afc 243 accel_x = movementsensor.AccelData.x;
joshuasmth04 59:a9b21b3d9afc 244 accel_y = movementsensor.AccelData.y;
joshuasmth04 59:a9b21b3d9afc 245 accel_z = movementsensor.AccelData.z;
joshuasmth04 59:a9b21b3d9afc 246 accel_comp = pow(accel_x,(float)2)+pow(accel_y,(float)2)+pow(accel_z,(float)2)-1.0;
joshuasmth04 59:a9b21b3d9afc 247 mag_x = movementsensor.MagData.x;
joshuasmth04 59:a9b21b3d9afc 248 mag_y = movementsensor.MagData.y;
joshuasmth04 59:a9b21b3d9afc 249 mag_z = movementsensor.MagData.z;
caseyquinn 106:3911b3c7a24e 250
joshuasmth04 59:a9b21b3d9afc 251 vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0
joshuasmth04 59:a9b21b3d9afc 252 vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0
joshuasmth04 59:a9b21b3d9afc 253 omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3
joshuasmth04 59:a9b21b3d9afc 254 press = bmesensor.getPressure();
joshuasmth04 59:a9b21b3d9afc 255 temp = bmesensor.getTemperature()-5.0;
joshuasmth04 59:a9b21b3d9afc 256 rh = bmesensor.getHumidity();
joshuasmth04 59:a9b21b3d9afc 257 uv = lightsensor.getUV();
joshuasmth04 59:a9b21b3d9afc 258 vis = lightsensor.getVIS();
joshuasmth04 59:a9b21b3d9afc 259 ir = lightsensor.getIR();
caseyquinn 106:3911b3c7a24e 260
caseyquinn 108:2cf8d5159fc6 261
caseyquinn 108:2cf8d5159fc6 262 FILE *fp = fopen(filename, "a");
caseyquinn 108:2cf8d5159fc6 263 fprintf(fp, "%02d,%02d,%02d,%02d,%02d,%02d,",RTC.year, RTC.month,RTC.date,RTC.hour,RTC.minutes,RTC.seconds);
caseyquinn 108:2cf8d5159fc6 264 fprintf(fp, "%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,", omronVolt,massflow,temp,press,rh,atmoRho);
caseyquinn 108:2cf8d5159fc6 265 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 266 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 267 fprintf(fp, "%d,%d,%d,%d,%d,%d," ,uv,omronReading, vInReading, vBlowerReading, omronDiff,gasG.getAmps());
caseyquinn 108:2cf8d5159fc6 268 fprintf(fp, "%d,%d,%d,%1.3f,%1.3f\r\n", gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow);
caseyquinn 108:2cf8d5159fc6 269 fclose(fp);
caseyquinn 108:2cf8d5159fc6 270
joshuasmth04 59:a9b21b3d9afc 271 }
caseyquinn 113:846f67efaa80 272 */
caseyquinn 113:846f67efaa80 273
jelord 96:03106adb45c9 274 /*EEPROM ADDRESSING:
jelord 96:03106adb45c9 275 0:Status bit-Unused
jelord 96:03106adb45c9 276 1-15:Device Name
jelord 96:03106adb45c9 277 16-19:Flow Rate
jelord 96:03106adb45c9 278 20: Data Log Interval
jelord 96:03106adb45c9 279 21-26: Start Time: ssmmHHddMMyy
jelord 96:03106adb45c9 280 27-32: Stop Time: ssmmHHddMMyy
jelord 96:03106adb45c9 281 33: Duty Up
jelord 96:03106adb45c9 282 34: Duty Down
jelord 96:03106adb45c9 283 35-38: Home Latitude
jelord 96:03106adb45c9 284 39-42: Home Longitude
jelord 96:03106adb45c9 285 43-46: Work Latitude
jelord 96:03106adb45c9 286 47-50: Work Longitude
jelord 96:03106adb45c9 287 51: Runready: Currently useless, should be 0
jelord 96:03106adb45c9 288 52-53: Device Calibration
jelord 96:03106adb45c9 289 54: Consider RunReady
jelord 96:03106adb45c9 290 55-56: Menu Options
jelord 96:03106adb45c9 291 57+ Nothing*/
caseyquinn 57:0b554f7aa9a3 292 int main()
caseyquinn 57:0b554f7aa9a3 293 {
joshuasmth04 91:f838d9a5b596 294 RGB_LED.set_led(1,1,1);
caseyquinn 57:0b554f7aa9a3 295 // Setup and Initialization
caseyquinn 57:0b554f7aa9a3 296 //---------------------------------------------------------------------------------------------//
joshuasmth04 71:78edbceff4fc 297 //**************//BLE initialization//**************//
jelord 94:c57720890e76 298 RTC.get_time();
jelord 94:c57720890e76 299 uint8_t rtcPassValues[6] = {RTC.seconds, RTC.minutes,RTC.hour,RTC.date,RTC.month,RTC.year};
jelord 104:c57913399e79 300
jelord 104:c57913399e79 301 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 302 uint8_t subjectLabelOriginal[8] = {0x52,0x45,0x53,0x45,0x54,0x5F,0x5F,0x5f}; // RESET___
jelord 104:c57913399e79 303 uint8_t dataLogOriginal[1] = {0x0A,}; //10 seconds
jelord 104:c57913399e79 304 uint8_t flowRateOriginal[4] = {0x00,0x00,0x80,0x3F}; //1.0 LPM
jelord 104:c57913399e79 305
jelord 104:c57913399e79 306 uint8_t serialNumberAndType[6] = {0x50,0x53};
jelord 104:c57913399e79 307
jelord 104:c57913399e79 308 //Code/conditional set up to prevent bad values in the EEPROM. Does not set serial number currently
jelord 104:c57913399e79 309 uint8_t eepromFlag[1] = {0,};
jelord 104:c57913399e79 310 E2PROM.read(0x00071,eepromFlag,1);
jelord 109:33d7fc6c1b9b 311 if(eepromFlag[0]!= 0x0B){
jelord 104:c57913399e79 312 E2PROM.write(0x00015, sampleTimePassValues, 12);
jelord 104:c57913399e79 313 E2PROM.write(0x00001, subjectLabelOriginal,8);
jelord 104:c57913399e79 314 E2PROM.write(0x00014,dataLogOriginal,1);
jelord 104:c57913399e79 315 E2PROM.write(0x00010,flowRateOriginal,4);
jelord 104:c57913399e79 316
jelord 109:33d7fc6c1b9b 317 eepromFlag[0] = 0x0B;
jelord 104:c57913399e79 318 E2PROM.write(0x00071,eepromFlag,1);
jelord 104:c57913399e79 319 }
jelord 104:c57913399e79 320
jelord 104:c57913399e79 321
jelord 104:c57913399e79 322 //Retrieve current eeprom values
jelord 94:c57720890e76 323 E2PROM.read(0x00015, sampleTimePassValues, 12);
jelord 99:229435dd4cfb 324 E2PROM.read(0x00001, subjectLabelOriginal,8);
jelord 96:03106adb45c9 325 E2PROM.read(0x00014,dataLogOriginal,1);
jelord 96:03106adb45c9 326 E2PROM.read(0x00010,flowRateOriginal,4);
jelord 104:c57913399e79 327
jelord 104:c57913399e79 328
jelord 104:c57913399e79 329 //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 330 E2PROM.read(0x00034,serialNumberAndType+2,2);
jelord 104:c57913399e79 331 int tempSerialNum = serialNumberAndType[2]+serialNumberAndType[3];
jelord 104:c57913399e79 332 int serialNumDigits[4];
jelord 104:c57913399e79 333 serialNumDigits[0] = tempSerialNum / 1000 % 10;
jelord 104:c57913399e79 334 serialNumDigits[1] = tempSerialNum / 100 % 10;
jelord 104:c57913399e79 335 serialNumDigits[2] = tempSerialNum / 10 % 10;
jelord 104:c57913399e79 336 serialNumDigits[3] = tempSerialNum % 10;
jelord 104:c57913399e79 337
jelord 104:c57913399e79 338 serialNumberAndType[2] = serialNumDigits[0]+48;
jelord 104:c57913399e79 339 serialNumberAndType[3] = serialNumDigits[1]+48;
jelord 104:c57913399e79 340 serialNumberAndType[4] = serialNumDigits[2]+48;
jelord 104:c57913399e79 341 serialNumberAndType[5] = serialNumDigits[3]+48;
jelord 104:c57913399e79 342
jelord 104:c57913399e79 343
jelord 102:d25eab697fe0 344 //E2PROM.read(0x00033,presetRunModeCheck,1); //commented out mem issue
joshuasmth04 77:24fbeb2bfe05 345 ble.init();
jelord 94:c57720890e76 346 ble.onDisconnection(disconnectionCallback);
jelord 94:c57720890e76 347 ble.onDataWritten(WrittenHandler); //add writeCharCallback (custom function) to whenever data is being written to device
jelord 102:d25eab697fe0 348 UPAS_Service upasService(ble, false,rtcPassValues,sampleTimePassValues,subjectLabelOriginal,dataLogOriginal,flowRateOriginal); //Create a GattService that is defined in UPAS_Service.h
jelord 94:c57720890e76 349 upasServicePtr = &upasService; //Create a pointer to the service (Allows advertisement without specifically adding the service
jelord 94:c57720890e76 350
jelord 94:c57720890e76 351 /* setup advertising
jelord 94:c57720890e76 352 Following lines do the follow:
jelord 94:c57720890e76 353 1:Declare the device as Bluetooth Smart(Low-Energy)
jelord 100:da71436aa52a 354 2.Advertise the UPAS service that will send and receive the 113+ bits of settable values in the UPAS EEPROM
jelord 94:c57720890e76 355 3.Advertise the name that will be associated with the UPAS
jelord 94:c57720890e76 356 4.Allow the UPAS to advertise unrestricted (this might change) */
jelord 94:c57720890e76 357
jelord 94:c57720890e76 358 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
jelord 94:c57720890e76 359 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
jelord 104:c57913399e79 360 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)serialNumberAndType, sizeof(serialNumberAndType));
joshuasmth04 71:78edbceff4fc 361 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
jelord 94:c57720890e76 362 ble.setAdvertisingInterval(160); /* 160ms. */
joshuasmth04 77:24fbeb2bfe05 363 ble.startAdvertising();
jelord 94:c57720890e76 364
joshuasmth04 71:78edbceff4fc 365 //**************//BLE initialization//**************//
jelord 96:03106adb45c9 366
jelord 96:03106adb45c9 367 //Logic Loop waiting for responses from the BLE iPhone App.
jelord 96:03106adb45c9 368 //Will not break loop without response from the app
jelord 102:d25eab697fe0 369
jelord 102:d25eab697fe0 370 //outer loop commented out to prevent mem issues
jelord 102:d25eab697fe0 371 //if(presetRunModeCheck[0] != 0x0C){
caseyquinn 106:3911b3c7a24e 372
jelord 100:da71436aa52a 373 while (1) {
jelord 100:da71436aa52a 374 ble.waitForEvent();
jelord 100:da71436aa52a 375
jelord 100:da71436aa52a 376 if(RunReady==10){ //Check to see if app is done with configurations
jelord 100:da71436aa52a 377 ble.stopAdvertising();
jelord 100:da71436aa52a 378 break;
jelord 100:da71436aa52a 379 }
jelord 98:d70ff5a0b2e6 380
jelord 100:da71436aa52a 381 if(RunReady==12){ //If 24 hour mode has been set, then shut down the UPAS for automatic start later.
jelord 100:da71436aa52a 382 pbKill = 0;
jelord 100:da71436aa52a 383 }
jelord 100:da71436aa52a 384 }
jelord 100:da71436aa52a 385
jelord 94:c57720890e76 386 E2PROM.read(0x00015, startAndEndTime, 12); //Grab start and end times from EEPROM
caseyquinn 113:846f67efaa80 387 RGB_LED.set_led(1,0,1);
jelord 94:c57720890e76 388 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 389 wait(0.5);
jelord 98:d70ff5a0b2e6 390
jelord 94:c57720890e76 391 RTC.get_time();
jelord 94:c57720890e76 392
jelord 100:da71436aa52a 393 }
caseyquinn 106:3911b3c7a24e 394
caseyquinn 106:3911b3c7a24e 395
jelord 98:d70ff5a0b2e6 396 RGB_LED.set_led(0,1,0);
jelord 102:d25eab697fe0 397
jelord 102:d25eab697fe0 398 //Get the proper serial number
jelord 102:d25eab697fe0 399 E2PROM.read(0x00034, flowRateOriginal,2);
jelord 102:d25eab697fe0 400 serial_num = ((uint16_t)flowRateOriginal[1] << 8) | flowRateOriginal[0];
caseyquinn 107:5e3364e42214 401 //----------------------------------------------
jelord 109:33d7fc6c1b9b 402 calibrations.initialize(serial_num);
jelord 109:33d7fc6c1b9b 403 pc.printf("%f\n",calibrations.MF4);
caseyquinn 107:5e3364e42214 404 //----------------------------------------------
caseyquinn 106:3911b3c7a24e 405 wait(1);
jelord 94:c57720890e76 406 blower=1;
jelord 97:c596f8ed4562 407 E2PROM.read(0x00014,logIntervalReadOut,1);
jelord 97:c596f8ed4562 408 logInerval = logIntervalReadOut[0];
jelord 100:da71436aa52a 409
joshuasmth04 89:047e8558fd09 410 pc.printf("You're done, you can now disconect the USB cable.\r\n");
caseyquinn 84:85d11d422da3 411 RunReady = 0;
joshuasmth04 85:a95dd5f03818 412
jelord 94:c57720890e76 413
jelord 112:fd14d51e3493 414 //stop.attach(&check_stop, 30); // check if we should shut down every 9 seconds, starting 60s after the start.
joshuasmth04 85:a95dd5f03818 415
jelord 102:d25eab697fe0 416 //Use the flow rate value stored in eeprom
jelord 102:d25eab697fe0 417 E2PROM.read(0x00010,flowRateOriginal,4);
jelord 102:d25eab697fe0 418 E2PROM.byteToFloat(flowRateOriginal, &volflowSet);
jelord 98:d70ff5a0b2e6 419
caseyquinn 81:480f0310ef9a 420 if(volflowSet<=1.0) {
joshuasmth04 59:a9b21b3d9afc 421 gainFlow = 100;
caseyquinn 81:480f0310ef9a 422 } else if(volflowSet>=2.0) {
joshuasmth04 59:a9b21b3d9afc 423 gainFlow = 25;
joshuasmth04 59:a9b21b3d9afc 424 } else {
caseyquinn 88:9142f21a4715 425 gainFlow = 25;
joshuasmth04 59:a9b21b3d9afc 426 }
joshuasmth04 59:a9b21b3d9afc 427
caseyquinn 57:0b554f7aa9a3 428 RGB_LED.set_led(1,0,0);
caseyquinn 57:0b554f7aa9a3 429 press = bmesensor.getPressure();
caseyquinn 57:0b554f7aa9a3 430 temp = bmesensor.getTemperature();
caseyquinn 57:0b554f7aa9a3 431 rh = bmesensor.getHumidity();
caseyquinn 57:0b554f7aa9a3 432
caseyquinn 57:0b554f7aa9a3 433 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 434 massflowSet = volflowSet*atmoRho;
caseyquinn 57:0b554f7aa9a3 435 //Digtal pot tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
joshuasmth04 85:a95dd5f03818 436
joshuasmth04 85:a95dd5f03818 437
joshuasmth04 77:24fbeb2bfe05 438 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 439
joshuasmth04 59:a9b21b3d9afc 440 if(digital_pot_setpoint>=digitalpotMax) {
caseyquinn 57:0b554f7aa9a3 441 digital_pot_setpoint = digitalpotMax;
joshuasmth04 59:a9b21b3d9afc 442 } else if(digital_pot_setpoint<=digitalpotMin) {
caseyquinn 57:0b554f7aa9a3 443 digital_pot_setpoint = digitalpotMin;
joshuasmth04 59:a9b21b3d9afc 444 }
joshuasmth04 59:a9b21b3d9afc 445
caseyquinn 57:0b554f7aa9a3 446 DigPot.writeRegister(digital_pot_setpoint);
caseyquinn 57:0b554f7aa9a3 447 wait(1);
caseyquinn 57:0b554f7aa9a3 448 blower = 1;
jelord 102:d25eab697fe0 449
jelord 97:c596f8ed4562 450
jelord 102:d25eab697fe0 451 E2PROM.read(0x00001, subjectLabelOriginal,8);
jelord 102:d25eab697fe0 452 //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 453 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 454 FILE *fp = fopen(filename, "w");
caseyquinn 57:0b554f7aa9a3 455 fclose(fp);
joshuasmth04 59:a9b21b3d9afc 456
joshuasmth04 59:a9b21b3d9afc 457 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 458 //Following lines are needed to enter into the initiallization flow control loop
joshuasmth04 59:a9b21b3d9afc 459
caseyquinn 57:0b554f7aa9a3 460 wait(10);
joshuasmth04 59:a9b21b3d9afc 461
caseyquinn 57:0b554f7aa9a3 462 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 57:0b554f7aa9a3 463 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 77:24fbeb2bfe05 464 if(omronVolt<=calibrations.omronVMin) {
joshuasmth04 77:24fbeb2bfe05 465 massflow = calibrations.omronMFMin;
joshuasmth04 77:24fbeb2bfe05 466 } else if(omronVolt>=calibrations.omronVMax) {
joshuasmth04 77:24fbeb2bfe05 467 massflow = calibrations.omronMFMax;
joshuasmth04 59:a9b21b3d9afc 468 } else {
joshuasmth04 77:24fbeb2bfe05 469 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 470 }
joshuasmth04 59:a9b21b3d9afc 471 deltaMflow = massflow-massflowSet;
joshuasmth04 59:a9b21b3d9afc 472 digital_pot_set = digital_pot_setpoint;
joshuasmth04 59:a9b21b3d9afc 473 wait(5);
joshuasmth04 59:a9b21b3d9afc 474
joshuasmth04 59:a9b21b3d9afc 475 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 476 //Sets the flow withen +-1.5% of the desired flow rate based on mass flow
joshuasmth04 59:a9b21b3d9afc 477
joshuasmth04 59:a9b21b3d9afc 478 while(abs(deltaMflow)>.015) {
joshuasmth04 77:24fbeb2bfe05 479
joshuasmth04 59:a9b21b3d9afc 480 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
joshuasmth04 59:a9b21b3d9afc 481 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 59:a9b21b3d9afc 482 //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
joshuasmth04 77:24fbeb2bfe05 483 if(omronVolt<=calibrations.omronVMin) {
joshuasmth04 77:24fbeb2bfe05 484 massflow = calibrations.omronMFMin;
joshuasmth04 77:24fbeb2bfe05 485 } else if(omronVolt>=calibrations.omronVMax) {
joshuasmth04 77:24fbeb2bfe05 486 massflow = calibrations.omronMFMax;
joshuasmth04 59:a9b21b3d9afc 487 } else {
joshuasmth04 77:24fbeb2bfe05 488 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 489 }
caseyquinn 57:0b554f7aa9a3 490
joshuasmth04 59:a9b21b3d9afc 491 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 492 volflow = massflow/atmoRho;
joshuasmth04 59:a9b21b3d9afc 493 massflowSet = volflowSet*atmoRho;
joshuasmth04 59:a9b21b3d9afc 494 deltaMflow = massflow-massflowSet;
jelord 94:c57720890e76 495
joshuasmth04 59:a9b21b3d9afc 496 digital_pot_set = (int)(digital_pot_set+(int)((gainFlow*deltaMflow)));
joshuasmth04 59:a9b21b3d9afc 497 if(digital_pot_set>=digitalpotMax) {
joshuasmth04 59:a9b21b3d9afc 498 digital_pot_set = digitalpotMax;
joshuasmth04 59:a9b21b3d9afc 499 } else if(digital_pot_set<=digitalpotMin) {
joshuasmth04 59:a9b21b3d9afc 500 digital_pot_set = digitalpotMin;
joshuasmth04 59:a9b21b3d9afc 501 }
joshuasmth04 59:a9b21b3d9afc 502
joshuasmth04 59:a9b21b3d9afc 503 wait(2);
joshuasmth04 59:a9b21b3d9afc 504 DigPot.writeRegister(digital_pot_set);
joshuasmth04 59:a9b21b3d9afc 505 wait(1);
joshuasmth04 59:a9b21b3d9afc 506
joshuasmth04 59:a9b21b3d9afc 507
joshuasmth04 59:a9b21b3d9afc 508 }
joshuasmth04 59:a9b21b3d9afc 509
joshuasmth04 59:a9b21b3d9afc 510 sampledVol = 0.0;
joshuasmth04 59:a9b21b3d9afc 511 RGB_LED.set_led(0,1,0);
joshuasmth04 77:24fbeb2bfe05 512
caseyquinn 67:300418575137 513
jelord 112:fd14d51e3493 514 while(1){
jelord 112:fd14d51e3493 515 if(RTC.compare(startAndEndTime[6], startAndEndTime[7], startAndEndTime[8], startAndEndTime[9], startAndEndTime[10], startAndEndTime[11]))
jelord 112:fd14d51e3493 516 pbKill = 0; // this is were we shut everything down
jelord 112:fd14d51e3493 517
jelord 112:fd14d51e3493 518 wait(logInerval - 0.2);
jelord 112:fd14d51e3493 519 // if(r==0) r=1;
jelord 112:fd14d51e3493 520 // else r=0;
jelord 112:fd14d51e3493 521 // RGB_LED.set_led(r,g,b);
jelord 112:fd14d51e3493 522 // wait(0.5);
jelord 112:fd14d51e3493 523
jelord 112:fd14d51e3493 524 RTC.get_time();
jelord 112:fd14d51e3493 525
jelord 112:fd14d51e3493 526 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
jelord 112:fd14d51e3493 527 omronVolt = (omronReading*4.096)/(32768*2);
jelord 112:fd14d51e3493 528
jelord 112:fd14d51e3493 529 if(omronVolt<=calibrations.omronVMin) {
jelord 112:fd14d51e3493 530 massflow = calibrations.omronMFMin;
jelord 112:fd14d51e3493 531 } else if(omronVolt>=calibrations.omronVMax) {
jelord 112:fd14d51e3493 532 massflow = calibrations.omronMFMax;
jelord 112:fd14d51e3493 533 } else {
jelord 112:fd14d51e3493 534 massflow = calibrations.MF4*pow(omronVolt,(float)4)+calibrations.MF3*pow(omronVolt,(float)3)+calibrations.MF2*pow(omronVolt,(float)2)+calibrations.MF1*omronVolt+calibrations.MF0;
jelord 112:fd14d51e3493 535 }
jelord 112:fd14d51e3493 536
jelord 112:fd14d51e3493 537 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 112:fd14d51e3493 538 volflow = massflow/atmoRho;
jelord 112:fd14d51e3493 539 sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
jelord 112:fd14d51e3493 540 deltaVflow = volflow-volflowSet;
jelord 112:fd14d51e3493 541 massflowSet = volflowSet*atmoRho;
jelord 112:fd14d51e3493 542 deltaMflow = massflow-massflowSet;
jelord 112:fd14d51e3493 543 if(abs(deltaMflow)>.025) {
jelord 112:fd14d51e3493 544 digital_pot_change = (int)(gainFlow*deltaMflow);
jelord 112:fd14d51e3493 545
jelord 112:fd14d51e3493 546
jelord 112:fd14d51e3493 547 if(abs(digital_pot_change)>=50) {
jelord 112:fd14d51e3493 548 digital_pot_set = (int)(digital_pot_set+(int)((10.0*deltaMflow)));
jelord 112:fd14d51e3493 549 RGB_LED.set_led(1,0,0);
jelord 112:fd14d51e3493 550 } else {
jelord 112:fd14d51e3493 551 digital_pot_set = (digital_pot_set+ digital_pot_change);
jelord 112:fd14d51e3493 552 RGB_LED.set_led(1,1,0);
jelord 112:fd14d51e3493 553 }
jelord 112:fd14d51e3493 554
jelord 112:fd14d51e3493 555 if(digital_pot_set>=digitalpotMax) {
jelord 112:fd14d51e3493 556 digital_pot_set = digitalpotMax;
jelord 112:fd14d51e3493 557 RGB_LED.set_led(1,0,0);
jelord 112:fd14d51e3493 558 } else if(digital_pot_set<=digitalpotMin) {
jelord 112:fd14d51e3493 559 digital_pot_set = digitalpotMin;
jelord 112:fd14d51e3493 560 RGB_LED.set_led(1,0,0);
jelord 112:fd14d51e3493 561 }
jelord 112:fd14d51e3493 562
jelord 112:fd14d51e3493 563
jelord 112:fd14d51e3493 564 DigPot.writeRegister(digital_pot_set);
jelord 112:fd14d51e3493 565
jelord 112:fd14d51e3493 566 } else {
jelord 112:fd14d51e3493 567 RGB_LED.set_led(0,1,0);
jelord 112:fd14d51e3493 568 }
jelord 112:fd14d51e3493 569
jelord 112:fd14d51e3493 570 movementsensor.getACCEL();
jelord 112:fd14d51e3493 571 movementsensor.getCOMPASS();
jelord 112:fd14d51e3493 572 compass = movementsensor.getCOMPASS_HEADING();
jelord 112:fd14d51e3493 573 accel_x = movementsensor.AccelData.x;
jelord 112:fd14d51e3493 574 accel_y = movementsensor.AccelData.y;
jelord 112:fd14d51e3493 575 accel_z = movementsensor.AccelData.z;
jelord 112:fd14d51e3493 576 accel_comp = pow(accel_x,(float)2)+pow(accel_y,(float)2)+pow(accel_z,(float)2)-1.0;
jelord 112:fd14d51e3493 577 mag_x = movementsensor.MagData.x;
jelord 112:fd14d51e3493 578 mag_y = movementsensor.MagData.y;
jelord 112:fd14d51e3493 579 mag_z = movementsensor.MagData.z;
jelord 112:fd14d51e3493 580
jelord 112:fd14d51e3493 581 vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0
jelord 112:fd14d51e3493 582 vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0
jelord 112:fd14d51e3493 583 omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3
jelord 112:fd14d51e3493 584 press = bmesensor.getPressure();
jelord 112:fd14d51e3493 585 temp = bmesensor.getTemperature()-5.0;
jelord 112:fd14d51e3493 586 rh = bmesensor.getHumidity();
jelord 112:fd14d51e3493 587 uv = lightsensor.getUV();
jelord 112:fd14d51e3493 588 vis = lightsensor.getVIS();
jelord 112:fd14d51e3493 589 ir = lightsensor.getIR();
jelord 112:fd14d51e3493 590
jelord 112:fd14d51e3493 591
jelord 112:fd14d51e3493 592 FILE *fp = fopen(filename, "a");
jelord 112:fd14d51e3493 593 fprintf(fp, "%02d,%02d,%02d,%02d,%02d,%02d,",RTC.year, RTC.month,RTC.date,RTC.hour,RTC.minutes,RTC.seconds);
jelord 112:fd14d51e3493 594 fprintf(fp, "%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,", omronVolt,massflow,temp,press,rh,atmoRho);
jelord 112:fd14d51e3493 595 fprintf(fp, "%1.3f,%5.1f,%1.1f,%1.1f,%1.1f,%1.1f,", volflow, sampledVol, accel_x, accel_y, accel_z, accel_comp);
jelord 112:fd14d51e3493 596 fprintf(fp, "%.1f,%.1f,%.1f,%.3f,%.3f,%.3f,%.1f,", angle_x,angle_y,angle_z,mag_x, mag_y, mag_z,compass);
jelord 112:fd14d51e3493 597 fprintf(fp, "%d,%d,%d,%d,%d,%d," ,uv,omronReading, vInReading, vBlowerReading, omronDiff,gasG.getAmps());
jelord 112:fd14d51e3493 598 fprintf(fp, "%d,%d,%d,%1.3f,%1.3f\r\n", gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow);
jelord 112:fd14d51e3493 599 fclose(fp);
jelord 112:fd14d51e3493 600
jelord 112:fd14d51e3493 601 }
caseyquinn 111:5f2ba5f1a468 602
caseyquinn 110:67980ebdebf6 603
joshuasmth04 59:a9b21b3d9afc 604
caseyquinn 0:14d46ef4b6cb 605 }
caseyquinn 0:14d46ef4b6cb 606