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:
jelord
Date:
Thu Dec 10 23:32:24 2015 +0000
Revision:
94:c57720890e76
Parent:
93:b53a9a7cb8f1
Child:
95:0ae0ffddc544
Works with new App and can write to the SD card

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 72:0b36575ab00d 12 #include "US_Menu.h"
joshuasmth04 77:24fbeb2bfe05 13 #include "BLEDevice.h"
joshuasmth04 77:24fbeb2bfe05 14 #include "Calibration.h"
jelord 94:c57720890e76 15 #include "UPAS_Service.h"
joshuasmth04 71:78edbceff4fc 16
caseyquinn 1:37babeb68ab9 17
caseyquinn 1:37babeb68ab9 18 #define SERIAL_BAUD_RATE 9600
joshuasmth04 41:1fb3e0ac6f87 19 #define SCL 20
caseyquinn 7:a24d7156bc02 20 #define SDA 22
caseyquinn 81:480f0310ef9a 21
caseyquinn 0:14d46ef4b6cb 22
joshuasmth04 71:78edbceff4fc 23
jelord 94:c57720890e76 24
joshuasmth04 71:78edbceff4fc 25
jelord 94:c57720890e76 26 uint8_t startAndEndTime[12] = {0,};
jelord 94:c57720890e76 27 const static char DEVICE_NAME[] = "UPAS"; //Will hold the actual name of the whichever UPAS is being connected to
jelord 94:c57720890e76 28 static const uint16_t uuid16_list[] = {UPAS_Service::UPAS_SERVICE_UUID}; //Currently a custom 16-bit representation of 128-bit UUID
joshuasmth04 71:78edbceff4fc 29 BLEDevice ble;
jelord 94:c57720890e76 30 UPAS_Service *upasServicePtr;
jelord 94:c57720890e76 31 //BLE_Menu bleMenu(ble, txPayload, rxPayload, uart_base_uuid_rev, uart_base_uuid, uartService);
joshuasmth04 71:78edbceff4fc 32
joshuasmth04 72:0b36575ab00d 33 I2C i2c(p22, p20);
joshuasmth04 72:0b36575ab00d 34 Adafruit_ADS1115 ads(&i2c);
joshuasmth04 72:0b36575ab00d 35 MCP40D17 DigPot(&i2c);
joshuasmth04 72:0b36575ab00d 36 BME280 bmesensor(p22, p20);
joshuasmth04 72:0b36575ab00d 37 STC3100 gasG(p22, p20);
joshuasmth04 72:0b36575ab00d 38 Serial pc(USBTX, USBRX);
joshuasmth04 72:0b36575ab00d 39 DigitalOut blower(p29, 0);
joshuasmth04 72:0b36575ab00d 40 DigitalOut pbKill(p18, 1);
joshuasmth04 72:0b36575ab00d 41 LSM303 movementsensor(p22, p20);
joshuasmth04 72:0b36575ab00d 42 SI1145 lightsensor(p22, p20);
joshuasmth04 72:0b36575ab00d 43 NCP5623BMUTBG RGB_LED(p22, p20);
joshuasmth04 72:0b36575ab00d 44 CronoDot RTC(p22, p20);
joshuasmth04 72:0b36575ab00d 45 EEPROM E2PROM(p22, p20);
joshuasmth04 72:0b36575ab00d 46 US_Menu Menu;
joshuasmth04 77:24fbeb2bfe05 47 DigitalOut GPS_EN(p4,0); //pin 4 is used to enable and disable the GPS, in order to recive serial communications
joshuasmth04 77:24fbeb2bfe05 48 Calibration calibrations(1); //Default serial/calibration if there are no values for the selected option
caseyquinn 57:0b554f7aa9a3 49
caseyquinn 57:0b554f7aa9a3 50 Timeout stop; //This is the stop call back object
joshuasmth04 77:24fbeb2bfe05 51 Timeout logg; //This is the logging call back object
caseyquinn 67:300418575137 52
joshuasmth04 77:24fbeb2bfe05 53 uint16_t serial_num = 1; // Default serial/calibration number
joshuasmth04 77:24fbeb2bfe05 54 int RunReady =0;
caseyquinn 70:81f04e69e08a 55
caseyquinn 70:81f04e69e08a 56
caseyquinn 20:ad9883973d86 57 float press;
caseyquinn 20:ad9883973d86 58 float temp;
caseyquinn 20:ad9883973d86 59 float rh;
caseyquinn 4:69bd7e8a994c 60
caseyquinn 20:ad9883973d86 61 int uv;
caseyquinn 20:ad9883973d86 62 int vis;
caseyquinn 20:ad9883973d86 63 int ir;
caseyquinn 8:204c21adf693 64
caseyquinn 67:300418575137 65 float compass;
caseyquinn 10:f9cb61b29340 66 float accel_x;
caseyquinn 10:f9cb61b29340 67 float accel_y;
caseyquinn 10:f9cb61b29340 68 float accel_z;
lionberg 52:80480b2fafba 69 float accel_comp;
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;
joshuasmth04 41:1fb3e0ac6f87 86 float massflowSet;
caseyquinn 42:fc2f2b9f07ae 87 float deltaVflow = 0.0;
caseyquinn 42:fc2f2b9f07ae 88 float deltaMflow = 0.0;
caseyquinn 47:3146e8c949a9 89 float gainFlow;
lionberg 52:80480b2fafba 90 float sampledVol; //L, total sampled volume
caseyquinn 20:ad9883973d86 91
caseyquinn 55:f24d70f519cd 92 int digital_pot_setpoint; //min = 0x7F, max = 0x00
caseyquinn 55:f24d70f519cd 93 int digital_pot_set;
caseyquinn 55:f24d70f519cd 94 int digital_pot_change;
caseyquinn 55:f24d70f519cd 95 int digitalpotMax = 127;
caseyquinn 55:f24d70f519cd 96 int digitalpotMin = 2;
caseyquinn 55:f24d70f519cd 97
joshuasmth04 59:a9b21b3d9afc 98 int dutyUp;
joshuasmth04 59:a9b21b3d9afc 99 int dutyDown;
joshuasmth04 59:a9b21b3d9afc 100
joshuasmth04 72:0b36575ab00d 101 // variables are only place holders for the US_Menu //
joshuasmth04 72:0b36575ab00d 102 int refreshtime;
joshuasmth04 72:0b36575ab00d 103 float home_lat, home_lon, work_lat, work_lon;
joshuasmth04 77:24fbeb2bfe05 104 //*************************************************//
joshuasmth04 72:0b36575ab00d 105
caseyquinn 67:300418575137 106 //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 107
caseyquinn 57:0b554f7aa9a3 108 char device_name[] = "---------------";
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 94:c57720890e76 137 uint8_t runData = writeData[0];
jelord 94:c57720890e76 138
jelord 94:c57720890e76 139 if(runData == 10){
jelord 94:c57720890e76 140 RunReady = 10;
jelord 94:c57720890e76 141 RGB_LED.set_led(1,2,3);
jelord 94:c57720890e76 142 }else{
jelord 94:c57720890e76 143 RunReady = 2;
jelord 94:c57720890e76 144 }
jelord 94:c57720890e76 145
jelord 94:c57720890e76 146 }else if(Handler->charHandle == upasServicePtr->runModeCharacteristic.getValueAttribute().getHandle()){
jelord 94:c57720890e76 147 /* Trigger demo mode*/
jelord 94:c57720890e76 148 RGB_LED.set_led(3,1,0);
jelord 94:c57720890e76 149 E2PROM.write(0x00036,writeData,1);
jelord 94:c57720890e76 150 }
joshuasmth04 71:78edbceff4fc 151 }
joshuasmth04 71:78edbceff4fc 152
joshuasmth04 62:edc9632bcc43 153 void check_stop() // this checks if it's time to stop and shutdown
caseyquinn 57:0b554f7aa9a3 154 {
jelord 94:c57720890e76 155
jelord 94:c57720890e76 156 if(RTC.compare(startAndEndTime[6], startAndEndTime[7], startAndEndTime[8], startAndEndTime[9], startAndEndTime[10], startAndEndTime[11])) {
caseyquinn 57:0b554f7aa9a3 157 pbKill = 0; // this is were we shut everything down
joshuasmth04 92:bb36c4bedb8e 158 pc.printf("If you're reading this something has gone very wrong.");
caseyquinn 57:0b554f7aa9a3 159 }
caseyquinn 57:0b554f7aa9a3 160 stop.detach();
joshuasmth04 77:24fbeb2bfe05 161 stop.attach(&check_stop, 9);
joshuasmth04 62:edc9632bcc43 162 }
caseyquinn 58:7239c2ab2b65 163
joshuasmth04 41:1fb3e0ac6f87 164
caseyquinn 57:0b554f7aa9a3 165 void log_data()
joshuasmth04 59:a9b21b3d9afc 166 {
caseyquinn 70:81f04e69e08a 167 logg.detach();
jelord 94:c57720890e76 168
jelord 94:c57720890e76 169 logg.attach(&log_data, logInerval); // reading and logging data must take significintly less than 0.5s. This can be increased.
jelord 94:c57720890e76 170
joshuasmth04 59:a9b21b3d9afc 171 RTC.get_time();
jelord 94:c57720890e76 172
joshuasmth04 59:a9b21b3d9afc 173 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
joshuasmth04 59:a9b21b3d9afc 174 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 59:a9b21b3d9afc 175
joshuasmth04 77:24fbeb2bfe05 176 if(omronVolt<=calibrations.omronVMin) {
joshuasmth04 77:24fbeb2bfe05 177 massflow = calibrations.omronMFMin;
joshuasmth04 77:24fbeb2bfe05 178 } else if(omronVolt>=calibrations.omronVMax) {
joshuasmth04 77:24fbeb2bfe05 179 massflow = calibrations.omronMFMax;
joshuasmth04 59:a9b21b3d9afc 180 } else {
joshuasmth04 77:24fbeb2bfe05 181 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 182 }
joshuasmth04 59:a9b21b3d9afc 183
joshuasmth04 59:a9b21b3d9afc 184 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 185 volflow = massflow/atmoRho;
joshuasmth04 59:a9b21b3d9afc 186 sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
joshuasmth04 59:a9b21b3d9afc 187 deltaVflow = volflow-volflowSet;
joshuasmth04 59:a9b21b3d9afc 188 massflowSet = volflowSet*atmoRho;
joshuasmth04 59:a9b21b3d9afc 189 deltaMflow = massflow-massflowSet;
joshuasmth04 59:a9b21b3d9afc 190 if(abs(deltaMflow)>.025) {
joshuasmth04 59:a9b21b3d9afc 191 digital_pot_change = (int)(gainFlow*deltaMflow);
joshuasmth04 59:a9b21b3d9afc 192
joshuasmth04 59:a9b21b3d9afc 193
joshuasmth04 59:a9b21b3d9afc 194 if(abs(digital_pot_change)>=50) {
joshuasmth04 59:a9b21b3d9afc 195 digital_pot_set = (int)(digital_pot_set+(int)((10.0*deltaMflow)));
joshuasmth04 59:a9b21b3d9afc 196 RGB_LED.set_led(1,0,0);
joshuasmth04 41:1fb3e0ac6f87 197
joshuasmth04 59:a9b21b3d9afc 198 } else if(digital_pot_change+digital_pot_set>=digitalpotMax&abs(digital_pot_change)<50) {
joshuasmth04 59:a9b21b3d9afc 199 digital_pot_set = digitalpotMax;
joshuasmth04 59:a9b21b3d9afc 200 RGB_LED.set_led(1,0,0);
joshuasmth04 59:a9b21b3d9afc 201 } else if(digital_pot_change+digital_pot_set<=digitalpotMin&abs(digital_pot_change)<50) {
joshuasmth04 59:a9b21b3d9afc 202 digital_pot_set = digitalpotMin;
joshuasmth04 59:a9b21b3d9afc 203 RGB_LED.set_led(1,0,0);
joshuasmth04 59:a9b21b3d9afc 204 } else {
joshuasmth04 59:a9b21b3d9afc 205 digital_pot_set = (digital_pot_set+ digital_pot_change);
joshuasmth04 59:a9b21b3d9afc 206 RGB_LED.set_led(1,1,0);
joshuasmth04 59:a9b21b3d9afc 207 }
joshuasmth04 59:a9b21b3d9afc 208
joshuasmth04 59:a9b21b3d9afc 209 DigPot.writeRegister(digital_pot_set);
joshuasmth04 59:a9b21b3d9afc 210
joshuasmth04 59:a9b21b3d9afc 211 } else {
joshuasmth04 59:a9b21b3d9afc 212 RGB_LED.set_led(0,1,0);
joshuasmth04 59:a9b21b3d9afc 213 }
joshuasmth04 59:a9b21b3d9afc 214 movementsensor.getACCEL();
joshuasmth04 59:a9b21b3d9afc 215 movementsensor.getCOMPASS();
caseyquinn 67:300418575137 216 compass = movementsensor.getCOMPASS_HEADING();
joshuasmth04 59:a9b21b3d9afc 217 accel_x = movementsensor.AccelData.x;
joshuasmth04 59:a9b21b3d9afc 218 accel_y = movementsensor.AccelData.y;
joshuasmth04 59:a9b21b3d9afc 219 accel_z = movementsensor.AccelData.z;
joshuasmth04 59:a9b21b3d9afc 220 accel_comp = pow(accel_x,(float)2)+pow(accel_y,(float)2)+pow(accel_z,(float)2)-1.0;
joshuasmth04 59:a9b21b3d9afc 221 mag_x = movementsensor.MagData.x;
joshuasmth04 59:a9b21b3d9afc 222 mag_y = movementsensor.MagData.y;
joshuasmth04 59:a9b21b3d9afc 223 mag_z = movementsensor.MagData.z;
joshuasmth04 59:a9b21b3d9afc 224 vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0
joshuasmth04 59:a9b21b3d9afc 225 vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0
joshuasmth04 59:a9b21b3d9afc 226 omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3
joshuasmth04 59:a9b21b3d9afc 227 press = bmesensor.getPressure();
joshuasmth04 59:a9b21b3d9afc 228 temp = bmesensor.getTemperature()-5.0;
joshuasmth04 59:a9b21b3d9afc 229 rh = bmesensor.getHumidity();
joshuasmth04 59:a9b21b3d9afc 230 uv = lightsensor.getUV();
joshuasmth04 59:a9b21b3d9afc 231 vis = lightsensor.getVIS();
joshuasmth04 59:a9b21b3d9afc 232 ir = lightsensor.getIR();
joshuasmth04 59:a9b21b3d9afc 233 FILE *fp = fopen(filename, "a");
caseyquinn 67:300418575137 234 fprintf(fp, "%02d,%02d,%02d,%02d,%02d,%02d,%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,%1.3f,%5.1f,%1.1f,%1.1f,%1.1f,%1.1f,%d,%d,%d,%d,%d,%d,%d,%d,%d,%1.3f,%1.3f,%f\r\n",RTC.year, RTC.month,RTC.date,RTC.hour,RTC.minutes,RTC.seconds,omronVolt,massflow,temp,press,rh,atmoRho,volflow,sampledVol,accel_x,accel_y,accel_z,accel_comp,uv,omronReading, vInReading, vBlowerReading, omronDiff,gasG.getAmps(), gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow, compass);
joshuasmth04 59:a9b21b3d9afc 235 fclose(fp);
caseyquinn 93:b53a9a7cb8f1 236 //wait_ms(5);
caseyquinn 93:b53a9a7cb8f1 237
joshuasmth04 59:a9b21b3d9afc 238 }
caseyquinn 57:0b554f7aa9a3 239
caseyquinn 57:0b554f7aa9a3 240 int main()
caseyquinn 57:0b554f7aa9a3 241 {
joshuasmth04 89:047e8558fd09 242 uint8_t temp_crr;
joshuasmth04 91:f838d9a5b596 243 RGB_LED.set_led(1,1,1);
caseyquinn 57:0b554f7aa9a3 244 // Setup and Initialization
caseyquinn 57:0b554f7aa9a3 245 //---------------------------------------------------------------------------------------------//
joshuasmth04 77:24fbeb2bfe05 246 Menu.read_menu(E2PROM, logInerval,refreshtime, volflowSet, device_name, dutyUp, dutyDown, home_lat, home_lon, work_lat, work_lon, RunReady, serial_num); //Read all data from the EEPROM here
joshuasmth04 85:a95dd5f03818 247 if(Menu.crr == 255) {
joshuasmth04 85:a95dd5f03818 248 Menu.factory_reset(E2PROM, logInerval,refreshtime, volflowSet, device_name, dutyUp, dutyDown, home_lat, home_lon, work_lat, work_lon, RunReady, serial_num);
joshuasmth04 85:a95dd5f03818 249 }
joshuasmth04 71:78edbceff4fc 250 //**************//BLE initialization//**************//
jelord 94:c57720890e76 251 RTC.get_time();
jelord 94:c57720890e76 252 uint8_t rtcPassValues[6] = {RTC.seconds, RTC.minutes,RTC.hour,RTC.date,RTC.month,RTC.year};
jelord 94:c57720890e76 253 uint8_t sampleTimePassValues[12] = {0,};
jelord 94:c57720890e76 254 uint8_t subjectLabelOriginal[15] = {0,};
jelord 94:c57720890e76 255 E2PROM.read(0x00015, sampleTimePassValues, 12);
jelord 94:c57720890e76 256 E2PROM.read(0x00001, subjectLabelOriginal,15);
jelord 94:c57720890e76 257
jelord 94:c57720890e76 258
joshuasmth04 77:24fbeb2bfe05 259 ble.init();
jelord 94:c57720890e76 260 ble.onDisconnection(disconnectionCallback);
jelord 94:c57720890e76 261 ble.onDataWritten(WrittenHandler); //add writeCharCallback (custom function) to whenever data is being written to device
jelord 94:c57720890e76 262 UPAS_Service upasService(ble, false,rtcPassValues,sampleTimePassValues,subjectLabelOriginal); //Create a GattService that is defined in UPAS_Service.h
jelord 94:c57720890e76 263 upasServicePtr = &upasService; //Create a pointer to the service (Allows advertisement without specifically adding the service
jelord 94:c57720890e76 264
jelord 94:c57720890e76 265 /* setup advertising
jelord 94:c57720890e76 266 Following lines do the follow:
jelord 94:c57720890e76 267 1:Declare the device as Bluetooth Smart(Low-Energy)
jelord 94:c57720890e76 268 2.Advertise the UPAS service that will send and receive the 57-bits of settable values in the UPAS EEPROM
jelord 94:c57720890e76 269 3.Advertise the name that will be associated with the UPAS
jelord 94:c57720890e76 270 4.Allow the UPAS to advertise unrestricted (this might change) */
jelord 94:c57720890e76 271
jelord 94:c57720890e76 272 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
jelord 94:c57720890e76 273 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
jelord 94:c57720890e76 274 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
joshuasmth04 71:78edbceff4fc 275 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
jelord 94:c57720890e76 276 ble.setAdvertisingInterval(160); /* 160ms. */
joshuasmth04 77:24fbeb2bfe05 277 ble.startAdvertising();
jelord 94:c57720890e76 278
joshuasmth04 71:78edbceff4fc 279 //**************//BLE initialization//**************//
jelord 94:c57720890e76 280 while (1) {
jelord 94:c57720890e76 281 ble.waitForEvent();
jelord 94:c57720890e76 282 if(RunReady==2 && blower ==0){ //Code used to see if one-click run should begin
jelord 94:c57720890e76 283 calibrations.initialize(serial_num);
jelord 94:c57720890e76 284 RGB_LED.set_led(3,0,2);
jelord 94:c57720890e76 285 blower=1;
jelord 94:c57720890e76 286 RunReady=0;
jelord 94:c57720890e76 287 }
jelord 94:c57720890e76 288 if(RunReady==2 && blower ==1){ //Code used to see if one-click run is done.
jelord 94:c57720890e76 289 blower=0;
jelord 94:c57720890e76 290 RunReady=0;
jelord 94:c57720890e76 291 }
jelord 94:c57720890e76 292
jelord 94:c57720890e76 293 if(RunReady==10){ //Check to see if app is done with configurations
jelord 94:c57720890e76 294 blower = 0;
jelord 94:c57720890e76 295 ble.stopAdvertising();
jelord 94:c57720890e76 296 break;
jelord 94:c57720890e76 297 }
jelord 94:c57720890e76 298 }
jelord 94:c57720890e76 299
jelord 94:c57720890e76 300 E2PROM.read(0x00015, startAndEndTime, 12); //Grab start and end times from EEPROM
jelord 94:c57720890e76 301 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 302 wait(0.5);
jelord 94:c57720890e76 303 RTC.get_time();
jelord 94:c57720890e76 304
jelord 94:c57720890e76 305 }
jelord 94:c57720890e76 306 calibrations.initialize(serial_num);
jelord 94:c57720890e76 307 blower=1;
jelord 94:c57720890e76 308
jelord 94:c57720890e76 309 // while(!RTC.compare(startAndEndTime[6], startAndEndTime[7], startAndEndTime[8], startAndEndTime[9], startAndEndTime[10], startAndEndTime[11])) { //Waits for end time
jelord 94:c57720890e76 310 // wait(0.5);
jelord 94:c57720890e76 311 // RTC.get_time();
jelord 94:c57720890e76 312 //
jelord 94:c57720890e76 313 // }
jelord 94:c57720890e76 314 //pbKill = 0; // this is were we shut everything down
joshuasmth04 77:24fbeb2bfe05 315
joshuasmth04 77:24fbeb2bfe05 316
joshuasmth04 77:24fbeb2bfe05 317
jelord 94:c57720890e76 318
jelord 94:c57720890e76 319
joshuasmth04 85:a95dd5f03818 320
jelord 94:c57720890e76 321
jelord 94:c57720890e76 322
jelord 94:c57720890e76 323
joshuasmth04 89:047e8558fd09 324
joshuasmth04 89:047e8558fd09 325 pc.printf("You're done, you can now disconect the USB cable.\r\n");
caseyquinn 84:85d11d422da3 326 RunReady = 0;
joshuasmth04 77:24fbeb2bfe05 327 Menu.save_menu(E2PROM, logInerval, refreshtime, volflowSet, device_name, dutyUp, dutyDown, home_lat, home_lon, work_lat, work_lon, RunReady, serial_num); //Save all data to the EEPROM
joshuasmth04 91:f838d9a5b596 328
caseyquinn 83:9153d6c3af81 329 RGB_LED.set_led(1,1,0);
joshuasmth04 85:a95dd5f03818 330
joshuasmth04 85:a95dd5f03818 331
joshuasmth04 78:a465de6cc47e 332 calibrations.initialize(serial_num);
joshuasmth04 85:a95dd5f03818 333
jelord 94:c57720890e76 334
jelord 94:c57720890e76 335 stop.attach(&check_stop, 60); // check if we should shut down every 9 seconds, starting 60s after the start.
joshuasmth04 85:a95dd5f03818 336
caseyquinn 81:480f0310ef9a 337 if(volflowSet<=1.0) {
joshuasmth04 59:a9b21b3d9afc 338 gainFlow = 100;
caseyquinn 81:480f0310ef9a 339 } else if(volflowSet>=2.0) {
joshuasmth04 59:a9b21b3d9afc 340 gainFlow = 25;
joshuasmth04 59:a9b21b3d9afc 341 } else {
caseyquinn 88:9142f21a4715 342 gainFlow = 25;
joshuasmth04 59:a9b21b3d9afc 343 }
joshuasmth04 59:a9b21b3d9afc 344
caseyquinn 57:0b554f7aa9a3 345 RGB_LED.set_led(1,0,0);
caseyquinn 57:0b554f7aa9a3 346 press = bmesensor.getPressure();
caseyquinn 57:0b554f7aa9a3 347 temp = bmesensor.getTemperature();
caseyquinn 57:0b554f7aa9a3 348 rh = bmesensor.getHumidity();
caseyquinn 57:0b554f7aa9a3 349
caseyquinn 57:0b554f7aa9a3 350 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 351 massflowSet = volflowSet*atmoRho;
caseyquinn 57:0b554f7aa9a3 352 //Digtal pot tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
joshuasmth04 85:a95dd5f03818 353
joshuasmth04 85:a95dd5f03818 354
joshuasmth04 77:24fbeb2bfe05 355 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 356
joshuasmth04 59:a9b21b3d9afc 357 if(digital_pot_setpoint>=digitalpotMax) {
caseyquinn 57:0b554f7aa9a3 358 digital_pot_setpoint = digitalpotMax;
joshuasmth04 59:a9b21b3d9afc 359 } else if(digital_pot_setpoint<=digitalpotMin) {
caseyquinn 57:0b554f7aa9a3 360 digital_pot_setpoint = digitalpotMin;
joshuasmth04 59:a9b21b3d9afc 361 }
joshuasmth04 59:a9b21b3d9afc 362
caseyquinn 57:0b554f7aa9a3 363 DigPot.writeRegister(digital_pot_setpoint);
caseyquinn 57:0b554f7aa9a3 364 wait(1);
caseyquinn 57:0b554f7aa9a3 365 blower = 1;
jelord 94:c57720890e76 366
jelord 94:c57720890e76 367 //Menu.save_menu(E2PROM, logInerval, refreshtime, volflowSet, device_name, dutyUp, dutyDown, home_lat, home_lon, work_lat, work_lon, RunReady, serial_num); //Save all data to the EEPROM
joshuasmth04 92:bb36c4bedb8e 368
caseyquinn 81:480f0310ef9a 369 sprintf(filename, "/sd/UPAS%04dLOG_%02d-%02d-%02d_%02d=%02d=%02d_%s.txt",serial_num,RTC.year,RTC.month,RTC.date,RTC.hour,RTC.minutes,RTC.seconds,device_name);
caseyquinn 57:0b554f7aa9a3 370 FILE *fp = fopen(filename, "w");
caseyquinn 57:0b554f7aa9a3 371 fclose(fp);
joshuasmth04 59:a9b21b3d9afc 372
joshuasmth04 59:a9b21b3d9afc 373 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 374 //Following lines are needed to enter into the initiallization flow control loop
joshuasmth04 59:a9b21b3d9afc 375
caseyquinn 57:0b554f7aa9a3 376 wait(10);
joshuasmth04 59:a9b21b3d9afc 377
caseyquinn 57:0b554f7aa9a3 378 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 57:0b554f7aa9a3 379 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 77:24fbeb2bfe05 380 if(omronVolt<=calibrations.omronVMin) {
joshuasmth04 77:24fbeb2bfe05 381 massflow = calibrations.omronMFMin;
joshuasmth04 77:24fbeb2bfe05 382 } else if(omronVolt>=calibrations.omronVMax) {
joshuasmth04 77:24fbeb2bfe05 383 massflow = calibrations.omronMFMax;
joshuasmth04 59:a9b21b3d9afc 384 } else {
joshuasmth04 77:24fbeb2bfe05 385 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 386 }
joshuasmth04 59:a9b21b3d9afc 387 deltaMflow = massflow-massflowSet;
joshuasmth04 59:a9b21b3d9afc 388 digital_pot_set = digital_pot_setpoint;
joshuasmth04 59:a9b21b3d9afc 389 wait(5);
joshuasmth04 59:a9b21b3d9afc 390
joshuasmth04 59:a9b21b3d9afc 391 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 392 //Sets the flow withen +-1.5% of the desired flow rate based on mass flow
joshuasmth04 59:a9b21b3d9afc 393
joshuasmth04 59:a9b21b3d9afc 394 while(abs(deltaMflow)>.015) {
joshuasmth04 77:24fbeb2bfe05 395
joshuasmth04 59:a9b21b3d9afc 396 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
joshuasmth04 59:a9b21b3d9afc 397 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 59:a9b21b3d9afc 398 //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
joshuasmth04 77:24fbeb2bfe05 399 if(omronVolt<=calibrations.omronVMin) {
joshuasmth04 77:24fbeb2bfe05 400 massflow = calibrations.omronMFMin;
joshuasmth04 77:24fbeb2bfe05 401 } else if(omronVolt>=calibrations.omronVMax) {
joshuasmth04 77:24fbeb2bfe05 402 massflow = calibrations.omronMFMax;
joshuasmth04 59:a9b21b3d9afc 403 } else {
joshuasmth04 77:24fbeb2bfe05 404 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 405 }
caseyquinn 57:0b554f7aa9a3 406
joshuasmth04 59:a9b21b3d9afc 407 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 408 volflow = massflow/atmoRho;
joshuasmth04 59:a9b21b3d9afc 409 massflowSet = volflowSet*atmoRho;
joshuasmth04 59:a9b21b3d9afc 410 deltaMflow = massflow-massflowSet;
jelord 94:c57720890e76 411
joshuasmth04 59:a9b21b3d9afc 412 digital_pot_set = (int)(digital_pot_set+(int)((gainFlow*deltaMflow)));
joshuasmth04 59:a9b21b3d9afc 413 if(digital_pot_set>=digitalpotMax) {
joshuasmth04 59:a9b21b3d9afc 414 digital_pot_set = digitalpotMax;
joshuasmth04 59:a9b21b3d9afc 415 } else if(digital_pot_set<=digitalpotMin) {
joshuasmth04 59:a9b21b3d9afc 416 digital_pot_set = digitalpotMin;
joshuasmth04 59:a9b21b3d9afc 417 }
joshuasmth04 59:a9b21b3d9afc 418
joshuasmth04 59:a9b21b3d9afc 419 wait(2);
joshuasmth04 59:a9b21b3d9afc 420 DigPot.writeRegister(digital_pot_set);
joshuasmth04 59:a9b21b3d9afc 421 wait(1);
joshuasmth04 59:a9b21b3d9afc 422
joshuasmth04 59:a9b21b3d9afc 423
joshuasmth04 59:a9b21b3d9afc 424 }
joshuasmth04 59:a9b21b3d9afc 425
joshuasmth04 59:a9b21b3d9afc 426 sampledVol = 0.0;
joshuasmth04 59:a9b21b3d9afc 427 RGB_LED.set_led(0,1,0);
joshuasmth04 77:24fbeb2bfe05 428
caseyquinn 67:300418575137 429
joshuasmth04 59:a9b21b3d9afc 430
joshuasmth04 59:a9b21b3d9afc 431 //** end of initalization **//
joshuasmth04 59:a9b21b3d9afc 432 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 433 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 434 // Main Control Loop
joshuasmth04 59:a9b21b3d9afc 435
caseyquinn 93:b53a9a7cb8f1 436
joshuasmth04 62:edc9632bcc43 437 logg.attach(&log_data, logInerval); // uses callbacks or block Interrupts for anything that uses i2c
joshuasmth04 59:a9b21b3d9afc 438
caseyquinn 0:14d46ef4b6cb 439 }
caseyquinn 0:14d46ef4b6cb 440