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:
joshuasmth04
Date:
Tue Oct 06 03:14:40 2015 +0000
Revision:
92:bb36c4bedb8e
Parent:
91:f838d9a5b596
Child:
93:b53a9a7cb8f1
I2C bus crashing and the device not shutting down should now be fixed. The device may not log exactly every 10s but it's very very very close.

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 71:78edbceff4fc 14 #include "BLE_Menu.h"
joshuasmth04 77:24fbeb2bfe05 15 #include "Calibration.h"
joshuasmth04 71:78edbceff4fc 16
joshuasmth04 71:78edbceff4fc 17 #define BLE_UUID_TXRX_SERVICE 0x0000 /**< The UUID of the Nordic UART Service. */
joshuasmth04 71:78edbceff4fc 18 #define BLE_UUID_TX_CHARACTERISTIC 0x0002 /**< The UUID of the TX Characteristic. */
joshuasmth04 71:78edbceff4fc 19 #define BLE_UUIDS_RX_CHARACTERISTIC 0x0003 /**< The UUID of the RX Characteristic. */
caseyquinn 1:37babeb68ab9 20
caseyquinn 1:37babeb68ab9 21 #define SERIAL_BAUD_RATE 9600
joshuasmth04 41:1fb3e0ac6f87 22 #define SCL 20
caseyquinn 7:a24d7156bc02 23 #define SDA 22
caseyquinn 81:480f0310ef9a 24
caseyquinn 0:14d46ef4b6cb 25
joshuasmth04 71:78edbceff4fc 26 uint8_t txPayload[TXRX_BUF_LEN] = {0,};
joshuasmth04 71:78edbceff4fc 27 uint8_t rxPayload[TXRX_BUF_LEN] = {0,};
joshuasmth04 71:78edbceff4fc 28
joshuasmth04 71:78edbceff4fc 29 static const uint8_t uart_base_uuid[] = {0x71, 0x3D, 0, 0, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
joshuasmth04 71:78edbceff4fc 30 static const uint8_t uart_tx_uuid[] = {0x71, 0x3D, 0, 3, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
joshuasmth04 71:78edbceff4fc 31 static const uint8_t uart_rx_uuid[] = {0x71, 0x3D, 0, 2, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
joshuasmth04 71:78edbceff4fc 32 static const uint8_t uart_base_uuid_rev[] = {0x1E, 0x94, 0x8D, 0xF1, 0x48, 0x31, 0x94, 0xBA, 0x75, 0x4C, 0x3E, 0x50, 0, 0, 0x3D, 0x71};
joshuasmth04 71:78edbceff4fc 33
joshuasmth04 71:78edbceff4fc 34 GattCharacteristic txCharacteristic (uart_tx_uuid, txPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
joshuasmth04 71:78edbceff4fc 35 GattCharacteristic rxCharacteristic (uart_rx_uuid, rxPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
joshuasmth04 71:78edbceff4fc 36 GattCharacteristic *uartChars[] = {&txCharacteristic, &rxCharacteristic};
joshuasmth04 71:78edbceff4fc 37 GattService uartService(uart_base_uuid, uartChars, sizeof(uartChars) / sizeof(GattCharacteristic *));
joshuasmth04 71:78edbceff4fc 38
joshuasmth04 71:78edbceff4fc 39 BLEDevice ble;
joshuasmth04 71:78edbceff4fc 40 BLE_Menu bleMenu(ble, txPayload, rxPayload, uart_base_uuid_rev, uart_base_uuid, uartService);
joshuasmth04 71:78edbceff4fc 41
joshuasmth04 72:0b36575ab00d 42 I2C i2c(p22, p20);
joshuasmth04 72:0b36575ab00d 43 Adafruit_ADS1115 ads(&i2c);
joshuasmth04 72:0b36575ab00d 44 MCP40D17 DigPot(&i2c);
joshuasmth04 72:0b36575ab00d 45 BME280 bmesensor(p22, p20);
joshuasmth04 72:0b36575ab00d 46 STC3100 gasG(p22, p20);
joshuasmth04 72:0b36575ab00d 47 Serial pc(USBTX, USBRX);
joshuasmth04 72:0b36575ab00d 48 DigitalOut blower(p29, 0);
joshuasmth04 72:0b36575ab00d 49 DigitalOut pbKill(p18, 1);
joshuasmth04 72:0b36575ab00d 50 LSM303 movementsensor(p22, p20);
joshuasmth04 72:0b36575ab00d 51 SI1145 lightsensor(p22, p20);
joshuasmth04 72:0b36575ab00d 52 NCP5623BMUTBG RGB_LED(p22, p20);
joshuasmth04 72:0b36575ab00d 53 CronoDot RTC(p22, p20);
joshuasmth04 72:0b36575ab00d 54 EEPROM E2PROM(p22, p20);
joshuasmth04 72:0b36575ab00d 55 US_Menu Menu;
joshuasmth04 77:24fbeb2bfe05 56 DigitalOut GPS_EN(p4,0); //pin 4 is used to enable and disable the GPS, in order to recive serial communications
joshuasmth04 77:24fbeb2bfe05 57 Calibration calibrations(1); //Default serial/calibration if there are no values for the selected option
caseyquinn 57:0b554f7aa9a3 58
caseyquinn 57:0b554f7aa9a3 59 Timeout stop; //This is the stop call back object
joshuasmth04 77:24fbeb2bfe05 60 Timeout logg; //This is the logging call back object
caseyquinn 67:300418575137 61
joshuasmth04 77:24fbeb2bfe05 62 uint16_t serial_num = 1; // Default serial/calibration number
joshuasmth04 77:24fbeb2bfe05 63 int RunReady =0;
caseyquinn 70:81f04e69e08a 64
caseyquinn 70:81f04e69e08a 65
caseyquinn 20:ad9883973d86 66 float press;
caseyquinn 20:ad9883973d86 67 float temp;
caseyquinn 20:ad9883973d86 68 float rh;
caseyquinn 4:69bd7e8a994c 69
caseyquinn 20:ad9883973d86 70 int uv;
caseyquinn 20:ad9883973d86 71 int vis;
caseyquinn 20:ad9883973d86 72 int ir;
caseyquinn 8:204c21adf693 73
caseyquinn 67:300418575137 74 float compass;
caseyquinn 10:f9cb61b29340 75 float accel_x;
caseyquinn 10:f9cb61b29340 76 float accel_y;
caseyquinn 10:f9cb61b29340 77 float accel_z;
lionberg 52:80480b2fafba 78 float accel_comp;
caseyquinn 10:f9cb61b29340 79 float mag_x;
caseyquinn 10:f9cb61b29340 80 float mag_y;
caseyquinn 10:f9cb61b29340 81 float mag_z;
caseyquinn 10:f9cb61b29340 82
caseyquinn 0:14d46ef4b6cb 83 int vInReading;
caseyquinn 0:14d46ef4b6cb 84 int vBlowerReading;
caseyquinn 0:14d46ef4b6cb 85 int omronDiff;
lionberg 52:80480b2fafba 86 float omronVolt; //V
caseyquinn 20:ad9883973d86 87 int omronReading;
lionberg 52:80480b2fafba 88 float atmoRho; //g/L
caseyquinn 49:19e828650618 89
caseyquinn 20:ad9883973d86 90 float massflow; //g/min
caseyquinn 20:ad9883973d86 91 float volflow; //L/min
caseyquinn 67:300418575137 92 float volflowSet = 1.0; //L/min
caseyquinn 81:480f0310ef9a 93 int logInerval = 10; //seconds
caseyquinn 57:0b554f7aa9a3 94 double secondsD = 0;
joshuasmth04 41:1fb3e0ac6f87 95 float massflowSet;
caseyquinn 42:fc2f2b9f07ae 96 float deltaVflow = 0.0;
caseyquinn 42:fc2f2b9f07ae 97 float deltaMflow = 0.0;
caseyquinn 47:3146e8c949a9 98 float gainFlow;
lionberg 52:80480b2fafba 99 float sampledVol; //L, total sampled volume
caseyquinn 20:ad9883973d86 100
caseyquinn 55:f24d70f519cd 101 int digital_pot_setpoint; //min = 0x7F, max = 0x00
caseyquinn 55:f24d70f519cd 102 int digital_pot_set;
caseyquinn 55:f24d70f519cd 103 int digital_pot_change;
caseyquinn 55:f24d70f519cd 104 int digitalpotMax = 127;
caseyquinn 55:f24d70f519cd 105 int digitalpotMin = 2;
caseyquinn 55:f24d70f519cd 106
joshuasmth04 59:a9b21b3d9afc 107 int dutyUp;
joshuasmth04 59:a9b21b3d9afc 108 int dutyDown;
joshuasmth04 59:a9b21b3d9afc 109
joshuasmth04 72:0b36575ab00d 110 // variables are only place holders for the US_Menu //
joshuasmth04 72:0b36575ab00d 111 int refreshtime;
joshuasmth04 72:0b36575ab00d 112 float home_lat, home_lon, work_lat, work_lon;
joshuasmth04 77:24fbeb2bfe05 113 //*************************************************//
joshuasmth04 72:0b36575ab00d 114
caseyquinn 67:300418575137 115 //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 116
caseyquinn 57:0b554f7aa9a3 117 char device_name[] = "---------------";
caseyquinn 81:480f0310ef9a 118 char filename[] = "/sd/XXXX0000LOG000000000000---------------.txt";
caseyquinn 7:a24d7156bc02 119 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 120
caseyquinn 7:a24d7156bc02 121
joshuasmth04 71:78edbceff4fc 122 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
joshuasmth04 71:78edbceff4fc 123 {
joshuasmth04 71:78edbceff4fc 124 bleMenu.disconnectionCallback();
joshuasmth04 71:78edbceff4fc 125 }
joshuasmth04 71:78edbceff4fc 126
joshuasmth04 71:78edbceff4fc 127 void WrittenHandler(const GattCharacteristicWriteCBParams *Handler) // called any time the phone sends a message
joshuasmth04 71:78edbceff4fc 128 {
joshuasmth04 71:78edbceff4fc 129 bleMenu.WrittenHandler(pc, txPayload, txCharacteristic, Handler);
joshuasmth04 71:78edbceff4fc 130 //returns things to the txPayload
joshuasmth04 71:78edbceff4fc 131 }
joshuasmth04 71:78edbceff4fc 132
joshuasmth04 62:edc9632bcc43 133 void check_stop() // this checks if it's time to stop and shutdown
caseyquinn 57:0b554f7aa9a3 134 {
joshuasmth04 86:60c9ec6e48ed 135 //RTC.get_time(); //debug
joshuasmth04 92:bb36c4bedb8e 136 //pc.printf("%02d:%02d:%02d on %d/%d/%d checking if it's time to shutdown \r\n",RTC.hour, RTC.minutes, RTC.seconds, RTC.month, RTC.date, RTC.year);//debug
joshuasmth04 85:a95dd5f03818 137 if(RTC.compare(Menu.f_sec, Menu.f_min, Menu.f_hour, Menu.f_day, Menu.f_month, Menu.f_year)) {
caseyquinn 57:0b554f7aa9a3 138 pbKill = 0; // this is were we shut everything down
joshuasmth04 92:bb36c4bedb8e 139 pc.printf("If you're reading this something has gone very wrong.");
caseyquinn 57:0b554f7aa9a3 140 }
caseyquinn 57:0b554f7aa9a3 141 stop.detach();
joshuasmth04 77:24fbeb2bfe05 142 stop.attach(&check_stop, 9);
joshuasmth04 62:edc9632bcc43 143 }
caseyquinn 58:7239c2ab2b65 144
joshuasmth04 41:1fb3e0ac6f87 145
caseyquinn 57:0b554f7aa9a3 146 void log_data()
joshuasmth04 59:a9b21b3d9afc 147 {
caseyquinn 70:81f04e69e08a 148 logg.detach();
joshuasmth04 92:bb36c4bedb8e 149 if(logInerval < 1){
joshuasmth04 92:bb36c4bedb8e 150 logg.attach(&log_data, logInerval); // reading and logging data must take significintly less than 0.5s. This can be increased.
joshuasmth04 92:bb36c4bedb8e 151 }else{
joshuasmth04 92:bb36c4bedb8e 152 logg.attach(&log_data, logInerval-0.5); // reading and logging data must take significintly less than 0.5s. This can be increased.
joshuasmth04 92:bb36c4bedb8e 153 }
joshuasmth04 59:a9b21b3d9afc 154 RTC.get_time();
joshuasmth04 92:bb36c4bedb8e 155 //*****************************************//
joshuasmth04 92:bb36c4bedb8e 156 //RTC.get_time(); //debug
joshuasmth04 92:bb36c4bedb8e 157 //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
joshuasmth04 92:bb36c4bedb8e 158 //*****************************************//
joshuasmth04 92:bb36c4bedb8e 159 //secondsD = RTC.seconds;
joshuasmth04 92:bb36c4bedb8e 160 //while(fmod(secondsD,logInerval)!=0) {
joshuasmth04 92:bb36c4bedb8e 161 // RTC.get_time();
joshuasmth04 92:bb36c4bedb8e 162 // secondsD = RTC.seconds;
joshuasmth04 92:bb36c4bedb8e 163 // wait_ms(5);
joshuasmth04 92:bb36c4bedb8e 164 //}
joshuasmth04 92:bb36c4bedb8e 165 //*****************************************//
joshuasmth04 92:bb36c4bedb8e 166 //RTC.get_time(); //debug
joshuasmth04 92:bb36c4bedb8e 167 //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
joshuasmth04 92:bb36c4bedb8e 168 //*****************************************//
joshuasmth04 59:a9b21b3d9afc 169 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
joshuasmth04 59:a9b21b3d9afc 170 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 59:a9b21b3d9afc 171
joshuasmth04 77:24fbeb2bfe05 172 if(omronVolt<=calibrations.omronVMin) {
joshuasmth04 77:24fbeb2bfe05 173 massflow = calibrations.omronMFMin;
joshuasmth04 77:24fbeb2bfe05 174 } else if(omronVolt>=calibrations.omronVMax) {
joshuasmth04 77:24fbeb2bfe05 175 massflow = calibrations.omronMFMax;
joshuasmth04 59:a9b21b3d9afc 176 } else {
joshuasmth04 77:24fbeb2bfe05 177 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 178 }
joshuasmth04 59:a9b21b3d9afc 179
joshuasmth04 59:a9b21b3d9afc 180 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 181 volflow = massflow/atmoRho;
joshuasmth04 59:a9b21b3d9afc 182 sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
joshuasmth04 59:a9b21b3d9afc 183 deltaVflow = volflow-volflowSet;
joshuasmth04 59:a9b21b3d9afc 184 massflowSet = volflowSet*atmoRho;
joshuasmth04 59:a9b21b3d9afc 185 deltaMflow = massflow-massflowSet;
joshuasmth04 59:a9b21b3d9afc 186 if(abs(deltaMflow)>.025) {
joshuasmth04 59:a9b21b3d9afc 187 digital_pot_change = (int)(gainFlow*deltaMflow);
joshuasmth04 59:a9b21b3d9afc 188
joshuasmth04 59:a9b21b3d9afc 189
joshuasmth04 59:a9b21b3d9afc 190 if(abs(digital_pot_change)>=50) {
joshuasmth04 59:a9b21b3d9afc 191 digital_pot_set = (int)(digital_pot_set+(int)((10.0*deltaMflow)));
joshuasmth04 59:a9b21b3d9afc 192 RGB_LED.set_led(1,0,0);
joshuasmth04 41:1fb3e0ac6f87 193
joshuasmth04 59:a9b21b3d9afc 194 } else if(digital_pot_change+digital_pot_set>=digitalpotMax&abs(digital_pot_change)<50) {
joshuasmth04 59:a9b21b3d9afc 195 digital_pot_set = digitalpotMax;
joshuasmth04 59:a9b21b3d9afc 196 RGB_LED.set_led(1,0,0);
joshuasmth04 59:a9b21b3d9afc 197 } else if(digital_pot_change+digital_pot_set<=digitalpotMin&abs(digital_pot_change)<50) {
joshuasmth04 59:a9b21b3d9afc 198 digital_pot_set = digitalpotMin;
joshuasmth04 59:a9b21b3d9afc 199 RGB_LED.set_led(1,0,0);
joshuasmth04 59:a9b21b3d9afc 200 } else {
joshuasmth04 59:a9b21b3d9afc 201 digital_pot_set = (digital_pot_set+ digital_pot_change);
joshuasmth04 59:a9b21b3d9afc 202 RGB_LED.set_led(1,1,0);
joshuasmth04 59:a9b21b3d9afc 203 }
joshuasmth04 59:a9b21b3d9afc 204
joshuasmth04 59:a9b21b3d9afc 205 DigPot.writeRegister(digital_pot_set);
joshuasmth04 59:a9b21b3d9afc 206
joshuasmth04 59:a9b21b3d9afc 207 } else {
joshuasmth04 59:a9b21b3d9afc 208 RGB_LED.set_led(0,1,0);
joshuasmth04 59:a9b21b3d9afc 209 }
joshuasmth04 59:a9b21b3d9afc 210 movementsensor.getACCEL();
joshuasmth04 59:a9b21b3d9afc 211 movementsensor.getCOMPASS();
caseyquinn 67:300418575137 212 compass = movementsensor.getCOMPASS_HEADING();
joshuasmth04 59:a9b21b3d9afc 213 accel_x = movementsensor.AccelData.x;
joshuasmth04 59:a9b21b3d9afc 214 accel_y = movementsensor.AccelData.y;
joshuasmth04 59:a9b21b3d9afc 215 accel_z = movementsensor.AccelData.z;
joshuasmth04 59:a9b21b3d9afc 216 accel_comp = pow(accel_x,(float)2)+pow(accel_y,(float)2)+pow(accel_z,(float)2)-1.0;
joshuasmth04 59:a9b21b3d9afc 217 mag_x = movementsensor.MagData.x;
joshuasmth04 59:a9b21b3d9afc 218 mag_y = movementsensor.MagData.y;
joshuasmth04 59:a9b21b3d9afc 219 mag_z = movementsensor.MagData.z;
joshuasmth04 59:a9b21b3d9afc 220 vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0
joshuasmth04 59:a9b21b3d9afc 221 vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0
joshuasmth04 59:a9b21b3d9afc 222 omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3
joshuasmth04 59:a9b21b3d9afc 223 press = bmesensor.getPressure();
joshuasmth04 59:a9b21b3d9afc 224 temp = bmesensor.getTemperature()-5.0;
joshuasmth04 59:a9b21b3d9afc 225 rh = bmesensor.getHumidity();
joshuasmth04 59:a9b21b3d9afc 226 uv = lightsensor.getUV();
joshuasmth04 59:a9b21b3d9afc 227 vis = lightsensor.getVIS();
joshuasmth04 59:a9b21b3d9afc 228 ir = lightsensor.getIR();
joshuasmth04 59:a9b21b3d9afc 229 FILE *fp = fopen(filename, "a");
caseyquinn 67:300418575137 230 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 231 fclose(fp);
joshuasmth04 92:bb36c4bedb8e 232 wait_ms(5);
joshuasmth04 59:a9b21b3d9afc 233 }
caseyquinn 57:0b554f7aa9a3 234
caseyquinn 57:0b554f7aa9a3 235 int main()
caseyquinn 57:0b554f7aa9a3 236 {
joshuasmth04 89:047e8558fd09 237 uint8_t temp_crr;
joshuasmth04 91:f838d9a5b596 238 RGB_LED.set_led(1,1,1);
caseyquinn 57:0b554f7aa9a3 239 // Setup and Initialization
caseyquinn 57:0b554f7aa9a3 240 //---------------------------------------------------------------------------------------------//
joshuasmth04 77:24fbeb2bfe05 241 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 242 if(Menu.crr == 255) {
joshuasmth04 85:a95dd5f03818 243 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 244 }
joshuasmth04 71:78edbceff4fc 245 //**************//BLE initialization//**************//
joshuasmth04 78:a465de6cc47e 246 bleMenu.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 71:78edbceff4fc 247 uint8_t BLE_name[] = {device_name[0], device_name[1], device_name[2], device_name[3], device_name[4], device_name[5], device_name[6], device_name[7], device_name[8]};
joshuasmth04 77:24fbeb2bfe05 248 ble.init();
joshuasmth04 77:24fbeb2bfe05 249 // setup advertising
joshuasmth04 71:78edbceff4fc 250 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
joshuasmth04 71:78edbceff4fc 251 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
joshuasmth04 71:78edbceff4fc 252 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,(const uint8_t *)BLE_name, sizeof(BLE_name) - 1); // ~8 char max!
joshuasmth04 71:78edbceff4fc 253 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,(const uint8_t *)uart_base_uuid_rev, sizeof(uart_base_uuid));
joshuasmth04 77:24fbeb2bfe05 254 // 100ms; in multiples of 0.625ms.
joshuasmth04 71:78edbceff4fc 255 ble.setAdvertisingInterval(160);
joshuasmth04 71:78edbceff4fc 256 ble.addService(uartService);
joshuasmth04 77:24fbeb2bfe05 257 ble.startAdvertising();
joshuasmth04 71:78edbceff4fc 258 ble.onDisconnection(disconnectionCallback); //what happens when disconected
joshuasmth04 71:78edbceff4fc 259 ble.onDataWritten(WrittenHandler); //what happens when the phone sends a message
joshuasmth04 71:78edbceff4fc 260 //**************//BLE initialization//**************//
joshuasmth04 77:24fbeb2bfe05 261
joshuasmth04 77:24fbeb2bfe05 262
joshuasmth04 77:24fbeb2bfe05 263
caseyquinn 57:0b554f7aa9a3 264 //Test for errors
joshuasmth04 71:78edbceff4fc 265 //RunReady = 0; //debug always open the menu
joshuasmth04 76:8130cb6776c6 266 //if(RTC.OSF()) { //Force the menu open if the RTC needs reset.
joshuasmth04 76:8130cb6776c6 267 // RunReady = 0;
joshuasmth04 76:8130cb6776c6 268 //}
joshuasmth04 86:60c9ec6e48ed 269 Reopen:
joshuasmth04 89:047e8558fd09 270 temp_crr = Menu.crr;
joshuasmth04 89:047e8558fd09 271 if((Menu.crr &0x01) != 0x01) { // crr bit 0, should the menu be optional
joshuasmth04 85:a95dd5f03818 272 RGB_LED.set_led(1,1,1);
caseyquinn 82:e01326a63ae9 273 wait(5);
joshuasmth04 85:a95dd5f03818 274 RGB_LED.set_led(1,1,0);
joshuasmth04 80:5487ba127c82 275 Menu.Start(pc, E2PROM, RTC, logInerval, refreshtime, volflowSet, device_name, dutyUp, dutyDown, home_lat, home_lon, work_lat, work_lon, Menu.menu_ops, 2, serial_num, calibrations); //Forces you to open the menu
joshuasmth04 80:5487ba127c82 276 bleMenu.open_menu(txPayload, rxCharacteristic, E2PROM, RTC, logInerval, refreshtime, volflowSet, device_name, dutyUp, dutyDown, home_lat, home_lon, work_lat, work_lon, Menu.menu_ops ,RunReady, 3, serial_num, calibrations);
joshuasmth04 91:f838d9a5b596 277 } else if(RunReady == 0 ) {
joshuasmth04 71:78edbceff4fc 278 RGB_LED.set_led(0,1,1); // error code/color
caseyquinn 87:c920521283b2 279 //pc.printf("Fix RTC\r\n");
joshuasmth04 91:f838d9a5b596 280 while(RunReady == 0 ) {
joshuasmth04 71:78edbceff4fc 281 RGB_LED.set_led(0,1,1); // error code/color
joshuasmth04 77:24fbeb2bfe05 282 RunReady = Menu.Start(pc, E2PROM, RTC, logInerval, refreshtime, volflowSet, device_name, dutyUp, dutyDown, home_lat, home_lon, work_lat, work_lon, Menu.menu_ops, 0.25, serial_num, calibrations); //Forces you to open the menu
joshuasmth04 91:f838d9a5b596 283 RGB_LED.set_led(0,3,3); // error code/color
joshuasmth04 78:a465de6cc47e 284 bleMenu.open_menu(txPayload, rxCharacteristic, E2PROM, RTC, logInerval, refreshtime, volflowSet, device_name, dutyUp, dutyDown, home_lat, home_lon, work_lat, work_lon, Menu.menu_ops ,RunReady, 0.25, serial_num, calibrations);
joshuasmth04 71:78edbceff4fc 285 }
joshuasmth04 85:a95dd5f03818 286
joshuasmth04 85:a95dd5f03818 287 if((Menu.crr & 0x08) != 0) { // crr bit 3, power down prepared to sample 24hr when powered on
joshuasmth04 85:a95dd5f03818 288 RunReady = 1;
joshuasmth04 77:24fbeb2bfe05 289 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 290
joshuasmth04 77:24fbeb2bfe05 291 pbKill = 0;
joshuasmth04 77:24fbeb2bfe05 292 }
joshuasmth04 71:78edbceff4fc 293 }
joshuasmth04 86:60c9ec6e48ed 294 /*if(((Menu.crr & 0x02) != 0) || ((Menu.crr & 0x02) != 0)) {
joshuasmth04 86:60c9ec6e48ed 295 RTC.get_time();
joshuasmth04 86:60c9ec6e48ed 296 if(RTC.OSF()) { //Don't proceed if the time needs to be reset
joshuasmth04 86:60c9ec6e48ed 297 RGB_LED.set_led(0,1,1); // error code/color
joshuasmth04 86:60c9ec6e48ed 298 pc.printf("Please fix the Time before exiting!\r\n");
joshuasmth04 86:60c9ec6e48ed 299 RunReady = 0;
joshuasmth04 86:60c9ec6e48ed 300 goto Reopen;
joshuasmth04 86:60c9ec6e48ed 301 }
joshuasmth04 86:60c9ec6e48ed 302 }*/
joshuasmth04 86:60c9ec6e48ed 303 if((Menu.crr & 0x02) != 0) {
joshuasmth04 86:60c9ec6e48ed 304 RTC.get_time();
joshuasmth04 86:60c9ec6e48ed 305 if(RTC.compare(Menu.s_sec, Menu.s_min, Menu.s_hour, Menu.s_day, Menu.s_month, Menu.s_year)) { //Don't proceed if it's already time to start
joshuasmth04 86:60c9ec6e48ed 306 RGB_LED.set_led(0,1,1); // error code/color
joshuasmth04 86:60c9ec6e48ed 307 pc.printf("Please fix the START time before exiting!\r\n");
joshuasmth04 86:60c9ec6e48ed 308 RunReady = 0;
joshuasmth04 86:60c9ec6e48ed 309 goto Reopen;
joshuasmth04 86:60c9ec6e48ed 310 }
joshuasmth04 86:60c9ec6e48ed 311 }
caseyquinn 83:9153d6c3af81 312 // Compare function for 519(UBCUO) mode to have it wait for the start time to start
joshuasmth04 91:f838d9a5b596 313 if(((Menu.crr & 0x04) != 0) && ((Menu.crr & 0x08) == 0)) {
joshuasmth04 85:a95dd5f03818 314 RTC.get_time();
joshuasmth04 85:a95dd5f03818 315 //Need to add in a compare function to check to see if the start time has already passed.
joshuasmth04 85:a95dd5f03818 316 if(RTC.compare(Menu.f_sec, Menu.f_min, Menu.f_hour, Menu.f_day, Menu.f_month, Menu.f_year)) { //Don't proceed if it's already time to stop
joshuasmth04 85:a95dd5f03818 317 RGB_LED.set_led(0,1,1); // error code/color
joshuasmth04 86:60c9ec6e48ed 318 pc.printf("Please fix the STOP time before exiting!\r\n");
joshuasmth04 86:60c9ec6e48ed 319 RunReady = 0;
joshuasmth04 86:60c9ec6e48ed 320 goto Reopen;
joshuasmth04 85:a95dd5f03818 321 }
caseyquinn 83:9153d6c3af81 322 }
joshuasmth04 86:60c9ec6e48ed 323
joshuasmth04 89:047e8558fd09 324 if(bleMenu.crr != temp_crr ) {
joshuasmth04 79:ed555e9081d0 325 Menu.crr = bleMenu.crr; // if this was changed in the UBM move it to the primary USM before saving
joshuasmth04 89:047e8558fd09 326 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 79:ed555e9081d0 327 }
joshuasmth04 90:26a08de1a0ac 328 //if(Menu.crr != temp_crr) {
joshuasmth04 90:26a08de1a0ac 329 // 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 90:26a08de1a0ac 330 // //RunReady = ?;
joshuasmth04 90:26a08de1a0ac 331 // goto Restart;
joshuasmth04 90:26a08de1a0ac 332 //}
joshuasmth04 89:047e8558fd09 333
joshuasmth04 89:047e8558fd09 334 pc.printf("You're done, you can now disconect the USB cable.\r\n");
caseyquinn 84:85d11d422da3 335 RunReady = 0;
joshuasmth04 77:24fbeb2bfe05 336 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 337
caseyquinn 83:9153d6c3af81 338 RGB_LED.set_led(1,1,0);
joshuasmth04 85:a95dd5f03818 339
joshuasmth04 85:a95dd5f03818 340 if((Menu.crr & 0x10) != 0) { //crr bit 4 uses Demo values
caseyquinn 87:c920521283b2 341 //volflowSet = 1.0; //L/min
caseyquinn 87:c920521283b2 342 //logInerval = 10;
caseyquinn 83:9153d6c3af81 343 }
joshuasmth04 85:a95dd5f03818 344
joshuasmth04 85:a95dd5f03818 345 if((Menu.crr & 0x02) != 0) {
joshuasmth04 85:a95dd5f03818 346 while(!RTC.compare(Menu.s_sec, Menu.s_min, Menu.s_hour, Menu.s_day, Menu.s_month, Menu.s_year)) { // this while waits for the start time by looping until the start time
joshuasmth04 85:a95dd5f03818 347 wait(0.5);
joshuasmth04 85:a95dd5f03818 348 RTC.get_time(); //debug
joshuasmth04 91:f838d9a5b596 349 pc.printf("%02d:%02d:%02d on %d/%d/%d) \r\n",RTC.hour, RTC.minutes, RTC.seconds, RTC.month, RTC.date, RTC.year);//debug
joshuasmth04 85:a95dd5f03818 350 //pc.printf("Waiting to start\r\n");
joshuasmth04 85:a95dd5f03818 351 // serial print a count down??
joshuasmth04 85:a95dd5f03818 352 }
caseyquinn 84:85d11d422da3 353 }
joshuasmth04 85:a95dd5f03818 354
joshuasmth04 78:a465de6cc47e 355 calibrations.initialize(serial_num);
joshuasmth04 85:a95dd5f03818 356
joshuasmth04 85:a95dd5f03818 357 if((Menu.crr & 0x04) != 0) { // don't shut off when in demo mode
joshuasmth04 92:bb36c4bedb8e 358 stop.attach(&check_stop, 60); // check if we should shut down every 9 seconds, starting 60s after the start.
joshuasmth04 79:ed555e9081d0 359 }
joshuasmth04 85:a95dd5f03818 360
caseyquinn 81:480f0310ef9a 361 if(volflowSet<=1.0) {
joshuasmth04 59:a9b21b3d9afc 362 gainFlow = 100;
caseyquinn 81:480f0310ef9a 363 } else if(volflowSet>=2.0) {
joshuasmth04 59:a9b21b3d9afc 364 gainFlow = 25;
joshuasmth04 59:a9b21b3d9afc 365 } else {
caseyquinn 88:9142f21a4715 366 gainFlow = 25;
joshuasmth04 59:a9b21b3d9afc 367 }
joshuasmth04 59:a9b21b3d9afc 368
caseyquinn 57:0b554f7aa9a3 369 RGB_LED.set_led(1,0,0);
caseyquinn 57:0b554f7aa9a3 370 press = bmesensor.getPressure();
caseyquinn 57:0b554f7aa9a3 371 temp = bmesensor.getTemperature();
caseyquinn 57:0b554f7aa9a3 372 rh = bmesensor.getHumidity();
caseyquinn 57:0b554f7aa9a3 373
caseyquinn 57:0b554f7aa9a3 374 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 375 massflowSet = volflowSet*atmoRho;
caseyquinn 57:0b554f7aa9a3 376 //Digtal pot tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
joshuasmth04 85:a95dd5f03818 377
caseyquinn 81:480f0310ef9a 378 //--------------------------------------------------------------//
caseyquinn 81:480f0310ef9a 379 // Calibration value checks //
caseyquinn 81:480f0310ef9a 380 //--------------------------------------------------------------//
joshuasmth04 85:a95dd5f03818 381 //while(1){
joshuasmth04 85:a95dd5f03818 382 //pc.printf("%f,%f,%f,%f,%f\r\n",calibrations.DP4, calibrations.DP3, calibrations.DP2, calibrations.DP1, calibrations.DP0);
joshuasmth04 85:a95dd5f03818 383 //pc.printf("%f,%f,%f,%f\r\n",calibrations.omronVMin, calibrations.omronVMax, calibrations.omronMFMin, calibrations.omronMFMax);
joshuasmth04 85:a95dd5f03818 384 //pc.printf("%f,%f,%f,%f,%f\r\n",calibrations.MF4, calibrations.MF3, calibrations.MF2, calibrations.MF1, calibrations.MF0);
joshuasmth04 85:a95dd5f03818 385 //wait(1);
joshuasmth04 85:a95dd5f03818 386 //}
caseyquinn 81:480f0310ef9a 387 //--------------------------------------------------------------//
caseyquinn 81:480f0310ef9a 388 //--------------------------------------------------------------//
joshuasmth04 85:a95dd5f03818 389
joshuasmth04 77:24fbeb2bfe05 390 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
caseyquinn 81:480f0310ef9a 391 //pc.printf("%d\r\n", digital_pot_setpoint);
joshuasmth04 85:a95dd5f03818 392
joshuasmth04 59:a9b21b3d9afc 393 if(digital_pot_setpoint>=digitalpotMax) {
caseyquinn 57:0b554f7aa9a3 394 digital_pot_setpoint = digitalpotMax;
joshuasmth04 59:a9b21b3d9afc 395 } else if(digital_pot_setpoint<=digitalpotMin) {
caseyquinn 57:0b554f7aa9a3 396 digital_pot_setpoint = digitalpotMin;
joshuasmth04 59:a9b21b3d9afc 397 }
joshuasmth04 59:a9b21b3d9afc 398
caseyquinn 57:0b554f7aa9a3 399 DigPot.writeRegister(digital_pot_setpoint);
caseyquinn 57:0b554f7aa9a3 400 wait(1);
caseyquinn 57:0b554f7aa9a3 401 blower = 1;
joshuasmth04 85:a95dd5f03818 402 if((Menu.crr &0x08) != 0) {
joshuasmth04 77:24fbeb2bfe05 403 RTC.get_time();
joshuasmth04 85:a95dd5f03818 404 Menu.f_sec = RTC.seconds;
joshuasmth04 85:a95dd5f03818 405 Menu.f_min = RTC.minutes;
joshuasmth04 85:a95dd5f03818 406 Menu.f_hour = RTC.hour;
joshuasmth04 77:24fbeb2bfe05 407 if(RTC.month == 1 | RTC.month == 3 | RTC.month == 5 | RTC.month == 7 | RTC.month == 8 | RTC.month == 10) {
joshuasmth04 77:24fbeb2bfe05 408 if(RTC.date == 31) {
joshuasmth04 85:a95dd5f03818 409 Menu.f_day = 1;
joshuasmth04 85:a95dd5f03818 410 Menu.f_month = RTC.month +1;
joshuasmth04 85:a95dd5f03818 411 Menu.f_year = RTC.year;
joshuasmth04 77:24fbeb2bfe05 412 } else {
joshuasmth04 85:a95dd5f03818 413 Menu.f_day = RTC.date+1;
joshuasmth04 85:a95dd5f03818 414 Menu.f_month = RTC.month;
joshuasmth04 85:a95dd5f03818 415 Menu.f_year = RTC.year;
joshuasmth04 77:24fbeb2bfe05 416 }
joshuasmth04 77:24fbeb2bfe05 417 } else if(RTC.month == 4 | RTC.month == 6 | RTC.month == 9 | RTC.month == 11) {
joshuasmth04 77:24fbeb2bfe05 418 if(RTC.date == 30) {
joshuasmth04 85:a95dd5f03818 419 Menu.f_day = 1;
joshuasmth04 85:a95dd5f03818 420 Menu.f_month = RTC.month +1;
joshuasmth04 85:a95dd5f03818 421 Menu.f_year = RTC.year;
joshuasmth04 77:24fbeb2bfe05 422 } else {
joshuasmth04 85:a95dd5f03818 423 Menu.f_day = RTC.date+1;
joshuasmth04 85:a95dd5f03818 424 Menu.f_month = RTC.month;
joshuasmth04 85:a95dd5f03818 425 Menu.f_year = RTC.year;
joshuasmth04 77:24fbeb2bfe05 426 }
joshuasmth04 77:24fbeb2bfe05 427 } else if(RTC.month == 2) {
joshuasmth04 77:24fbeb2bfe05 428 if(RTC.year == 16 | RTC.year == 20 | RTC.year == 24| RTC.year == 28) {
joshuasmth04 77:24fbeb2bfe05 429 if(RTC.date == 29) {
joshuasmth04 85:a95dd5f03818 430 Menu.f_day = 1;
joshuasmth04 85:a95dd5f03818 431 Menu.f_month = RTC.month +1;
joshuasmth04 85:a95dd5f03818 432 Menu.f_year = RTC.year;
joshuasmth04 77:24fbeb2bfe05 433 } else {
joshuasmth04 85:a95dd5f03818 434 Menu.f_day = RTC.date+1;
joshuasmth04 85:a95dd5f03818 435 Menu.f_month = RTC.month;
joshuasmth04 85:a95dd5f03818 436 Menu.f_year = RTC.year;
joshuasmth04 77:24fbeb2bfe05 437 }
joshuasmth04 77:24fbeb2bfe05 438 } else {
joshuasmth04 77:24fbeb2bfe05 439 if(RTC.date == 28) {
joshuasmth04 85:a95dd5f03818 440 Menu.f_day = 1;
joshuasmth04 85:a95dd5f03818 441 Menu.f_month = RTC.month +1;
joshuasmth04 85:a95dd5f03818 442 Menu.f_year = RTC.year;
joshuasmth04 77:24fbeb2bfe05 443 } else {
joshuasmth04 85:a95dd5f03818 444 Menu.f_day = RTC.date+1;
joshuasmth04 85:a95dd5f03818 445 Menu.f_month = RTC.month;
joshuasmth04 85:a95dd5f03818 446 Menu.f_year = RTC.year;
caseyquinn 67:300418575137 447 }
caseyquinn 67:300418575137 448 }
joshuasmth04 77:24fbeb2bfe05 449 } else if(RTC.month == 12) {
joshuasmth04 77:24fbeb2bfe05 450 if(RTC.date == 31) {
joshuasmth04 85:a95dd5f03818 451 Menu.f_day = 1;
joshuasmth04 85:a95dd5f03818 452 Menu.f_month = 1;
joshuasmth04 85:a95dd5f03818 453 Menu.f_year = RTC.year+1;
joshuasmth04 77:24fbeb2bfe05 454 } else {
joshuasmth04 85:a95dd5f03818 455 Menu.f_day = RTC.date+1;
joshuasmth04 85:a95dd5f03818 456 Menu.f_month = RTC.month;
joshuasmth04 85:a95dd5f03818 457 Menu.f_year = RTC.year;
joshuasmth04 77:24fbeb2bfe05 458 }
caseyquinn 67:300418575137 459 }
joshuasmth04 77:24fbeb2bfe05 460 }
joshuasmth04 92:bb36c4bedb8e 461 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 462
caseyquinn 81:480f0310ef9a 463 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 464 FILE *fp = fopen(filename, "w");
caseyquinn 57:0b554f7aa9a3 465 fclose(fp);
joshuasmth04 59:a9b21b3d9afc 466 //pc.printf("%d\r\n",digital_pot_setpoint);
joshuasmth04 59:a9b21b3d9afc 467
joshuasmth04 59:a9b21b3d9afc 468 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 469 //Following lines are needed to enter into the initiallization flow control loop
joshuasmth04 59:a9b21b3d9afc 470
caseyquinn 57:0b554f7aa9a3 471 wait(10);
joshuasmth04 59:a9b21b3d9afc 472
caseyquinn 57:0b554f7aa9a3 473 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 57:0b554f7aa9a3 474 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 77:24fbeb2bfe05 475 if(omronVolt<=calibrations.omronVMin) {
joshuasmth04 77:24fbeb2bfe05 476 massflow = calibrations.omronMFMin;
joshuasmth04 77:24fbeb2bfe05 477 } else if(omronVolt>=calibrations.omronVMax) {
joshuasmth04 77:24fbeb2bfe05 478 massflow = calibrations.omronMFMax;
joshuasmth04 59:a9b21b3d9afc 479 } else {
joshuasmth04 77:24fbeb2bfe05 480 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 481 }
joshuasmth04 59:a9b21b3d9afc 482 deltaMflow = massflow-massflowSet;
joshuasmth04 59:a9b21b3d9afc 483 digital_pot_set = digital_pot_setpoint;
joshuasmth04 59:a9b21b3d9afc 484 wait(5);
joshuasmth04 59:a9b21b3d9afc 485
joshuasmth04 59:a9b21b3d9afc 486 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 487 //Sets the flow withen +-1.5% of the desired flow rate based on mass flow
joshuasmth04 59:a9b21b3d9afc 488
joshuasmth04 59:a9b21b3d9afc 489 while(abs(deltaMflow)>.015) {
joshuasmth04 77:24fbeb2bfe05 490
joshuasmth04 59:a9b21b3d9afc 491 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
joshuasmth04 59:a9b21b3d9afc 492 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 59:a9b21b3d9afc 493 //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
joshuasmth04 77:24fbeb2bfe05 494 if(omronVolt<=calibrations.omronVMin) {
joshuasmth04 77:24fbeb2bfe05 495 massflow = calibrations.omronMFMin;
joshuasmth04 77:24fbeb2bfe05 496 } else if(omronVolt>=calibrations.omronVMax) {
joshuasmth04 77:24fbeb2bfe05 497 massflow = calibrations.omronMFMax;
joshuasmth04 59:a9b21b3d9afc 498 } else {
joshuasmth04 77:24fbeb2bfe05 499 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 500 }
caseyquinn 57:0b554f7aa9a3 501
joshuasmth04 59:a9b21b3d9afc 502 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 503 volflow = massflow/atmoRho;
joshuasmth04 59:a9b21b3d9afc 504 massflowSet = volflowSet*atmoRho;
joshuasmth04 59:a9b21b3d9afc 505 deltaMflow = massflow-massflowSet;
joshuasmth04 63:66796aef8d68 506 //pc.printf("%f,%f,%f,%f,%d,%u,%x\r\n",volflow,massflow,massflowSet,deltaMflow,digital_pot_set,digital_pot_set,digital_pot_set);
joshuasmth04 85:a95dd5f03818 507 //pc.printf("%d,%d,%d,%d,%d,%d\r\n",Menu.f_sec,Menu.f_min,Menu.f_hour,Menu.f_day,Menu.f_month,Menu.f_year,digital_pot_set);
joshuasmth04 59:a9b21b3d9afc 508 digital_pot_set = (int)(digital_pot_set+(int)((gainFlow*deltaMflow)));
joshuasmth04 59:a9b21b3d9afc 509 if(digital_pot_set>=digitalpotMax) {
joshuasmth04 59:a9b21b3d9afc 510 digital_pot_set = digitalpotMax;
joshuasmth04 59:a9b21b3d9afc 511 } else if(digital_pot_set<=digitalpotMin) {
joshuasmth04 59:a9b21b3d9afc 512 digital_pot_set = digitalpotMin;
joshuasmth04 59:a9b21b3d9afc 513 }
joshuasmth04 59:a9b21b3d9afc 514
joshuasmth04 59:a9b21b3d9afc 515 wait(2);
joshuasmth04 59:a9b21b3d9afc 516 DigPot.writeRegister(digital_pot_set);
joshuasmth04 59:a9b21b3d9afc 517 wait(1);
joshuasmth04 59:a9b21b3d9afc 518
joshuasmth04 59:a9b21b3d9afc 519
joshuasmth04 59:a9b21b3d9afc 520 }
joshuasmth04 59:a9b21b3d9afc 521
joshuasmth04 59:a9b21b3d9afc 522 sampledVol = 0.0;
joshuasmth04 59:a9b21b3d9afc 523 RGB_LED.set_led(0,1,0);
joshuasmth04 77:24fbeb2bfe05 524
caseyquinn 67:300418575137 525
joshuasmth04 59:a9b21b3d9afc 526
joshuasmth04 59:a9b21b3d9afc 527 //** end of initalization **//
joshuasmth04 59:a9b21b3d9afc 528 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 529 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 530 // Main Control Loop
joshuasmth04 59:a9b21b3d9afc 531
joshuasmth04 62:edc9632bcc43 532 logg.attach(&log_data, logInerval); // uses callbacks or block Interrupts for anything that uses i2c
joshuasmth04 59:a9b21b3d9afc 533 while(1) {
joshuasmth04 62:edc9632bcc43 534 //__disable_irq(); // Disable Interrupts
joshuasmth04 62:edc9632bcc43 535 //RTC.get_time();
joshuasmth04 62:edc9632bcc43 536 //__enable_irq(); // Enable Interrupts
joshuasmth04 62:edc9632bcc43 537 //secondsD = (double)RTC.seconds;
joshuasmth04 62:edc9632bcc43 538 //if(fmod(secondsD,logInerval)==0) {
joshuasmth04 77:24fbeb2bfe05 539 //log_data();
joshuasmth04 64:2906b0c48403 540 //}
caseyquinn 0:14d46ef4b6cb 541 }
joshuasmth04 59:a9b21b3d9afc 542
caseyquinn 0:14d46ef4b6cb 543 }
caseyquinn 0:14d46ef4b6cb 544
caseyquinn 0:14d46ef4b6cb 545