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:
Sun Aug 16 17:10:37 2015 +0000
Revision:
70:81f04e69e08a
Parent:
69:7a99d97c334e
Child:
71:78edbceff4fc
Fixed issues with logging time stamp variation. Logs at 10s intervals at 0,10,20,30,40,50 seconds.

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"
caseyquinn 67:300418575137 12 #include "Honduras_SerialMenu.h"
caseyquinn 1:37babeb68ab9 13
caseyquinn 1:37babeb68ab9 14 #define SERIAL_BAUD_RATE 9600
joshuasmth04 41:1fb3e0ac6f87 15 #define SCL 20
caseyquinn 7:a24d7156bc02 16 #define SDA 22
caseyquinn 57:0b554f7aa9a3 17 //#define Crono 0xD0 //D0 for the chronoDot
caseyquinn 0:14d46ef4b6cb 18
caseyquinn 0:14d46ef4b6cb 19 I2C i2c(p22, p20);
caseyquinn 0:14d46ef4b6cb 20 Adafruit_ADS1115 ads(&i2c);
caseyquinn 1:37babeb68ab9 21 MCP40D17 DigPot(&i2c);
caseyquinn 12:8c00a7f5d483 22 BME280 bmesensor(p22, p20);
caseyquinn 7:a24d7156bc02 23 STC3100 gasG(p22, p20);
caseyquinn 2:e596e685eb39 24 Serial pc(USBTX, USBRX);
caseyquinn 8:204c21adf693 25 DigitalOut blower(p29, 0);
caseyquinn 17:1baf7cab694e 26 DigitalOut pbKill(p18, 1);
caseyquinn 10:f9cb61b29340 27 LSM303 movementsensor(p22, p20);
caseyquinn 14:ad550174db8b 28 SI1145 lightsensor(p22, p20);
joshuasmth04 40:ef7e1dcb3780 29 NCP5623BMUTBG RGB_LED(p22, p20);
joshuasmth04 41:1fb3e0ac6f87 30 CronoDot RTC(p22, p20);
caseyquinn 56:c4d6bdd7c3fb 31 EEPROM E2PROM(p22, p20);
caseyquinn 67:300418575137 32 Honduras_SerialMenu Menu;
caseyquinn 68:ca444d0760a0 33 //DigitalOut GPS_EN(p4,0); //pin 4 is used to enable and disable the GPS, in order to recive serial communications
caseyquinn 57:0b554f7aa9a3 34
caseyquinn 57:0b554f7aa9a3 35 Timeout stop; //This is the stop call back object
joshuasmth04 62:edc9632bcc43 36 Timeout logg; //This is the logging call back object
caseyquinn 67:300418575137 37 int RunReady =0;
caseyquinn 67:300418575137 38
caseyquinn 0:14d46ef4b6cb 39
caseyquinn 68:ca444d0760a0 40 //UPAS0011 CALIBRATION TRANSFER FUNCTION COEFFICIENTS FROM 'UPAS v2 OSU-calibration primary flow data.xlsx'
lionberg 52:80480b2fafba 41 //mass flow sensor output signal (x) vs. mass flow (y)
caseyquinn 68:ca444d0760a0 42 float MF4 = -2.5778;
caseyquinn 68:ca444d0760a0 43 float MF3 = 15.031;
caseyquinn 68:ca444d0760a0 44 float MF2 = -30.738;
caseyquinn 68:ca444d0760a0 45 float MF1 = 27.914;
caseyquinn 68:ca444d0760a0 46 float MF0 = -8.794;
caseyquinn 68:ca444d0760a0 47 //mass flow sensor polynomial deviation limits
caseyquinn 68:ca444d0760a0 48 float omronVMin = 0.645; //V
caseyquinn 68:ca444d0760a0 49 float omronVMax = 2.275; //V
caseyquinn 68:ca444d0760a0 50 float omronMFMin = 0.010; //g/L
caseyquinn 68:ca444d0760a0 51 float omronMFMax = 3.553; //g/L
caseyquinn 68:ca444d0760a0 52 //UPAS0011 values dig_pot=9.2763x4 - 85.942x3 + 303.77x2 - 512.82x + 376.73
caseyquinn 68:ca444d0760a0 53 float DP4 = 9.2763;
caseyquinn 68:ca444d0760a0 54 float DP3 = -85.942;
caseyquinn 68:ca444d0760a0 55 float DP2 = 303.77;
caseyquinn 68:ca444d0760a0 56 float DP1 = -512.82;
caseyquinn 68:ca444d0760a0 57 float DP0 = 376.73;
caseyquinn 68:ca444d0760a0 58
caseyquinn 68:ca444d0760a0 59
lionberg 52:80480b2fafba 60
caseyquinn 70:81f04e69e08a 61
caseyquinn 70:81f04e69e08a 62
caseyquinn 20:ad9883973d86 63 float press;
caseyquinn 20:ad9883973d86 64 float temp;
caseyquinn 20:ad9883973d86 65 float rh;
caseyquinn 4:69bd7e8a994c 66
caseyquinn 20:ad9883973d86 67 int uv;
caseyquinn 20:ad9883973d86 68 int vis;
caseyquinn 20:ad9883973d86 69 int ir;
caseyquinn 8:204c21adf693 70
caseyquinn 67:300418575137 71 float compass;
caseyquinn 10:f9cb61b29340 72 float accel_x;
caseyquinn 10:f9cb61b29340 73 float accel_y;
caseyquinn 10:f9cb61b29340 74 float accel_z;
lionberg 52:80480b2fafba 75 float accel_comp;
caseyquinn 10:f9cb61b29340 76 float mag_x;
caseyquinn 10:f9cb61b29340 77 float mag_y;
caseyquinn 10:f9cb61b29340 78 float mag_z;
caseyquinn 10:f9cb61b29340 79
caseyquinn 0:14d46ef4b6cb 80 int vInReading;
caseyquinn 0:14d46ef4b6cb 81 int vBlowerReading;
caseyquinn 0:14d46ef4b6cb 82 int omronDiff;
lionberg 52:80480b2fafba 83 float omronVolt; //V
caseyquinn 20:ad9883973d86 84 int omronReading;
lionberg 52:80480b2fafba 85 float atmoRho; //g/L
caseyquinn 49:19e828650618 86
caseyquinn 20:ad9883973d86 87 float massflow; //g/min
caseyquinn 20:ad9883973d86 88 float volflow; //L/min
caseyquinn 67:300418575137 89 float volflowSet = 1.0; //L/min
caseyquinn 57:0b554f7aa9a3 90 int logInerval = 10;
caseyquinn 57:0b554f7aa9a3 91 double secondsD = 0;
joshuasmth04 41:1fb3e0ac6f87 92 float massflowSet;
caseyquinn 42:fc2f2b9f07ae 93 float deltaVflow = 0.0;
caseyquinn 42:fc2f2b9f07ae 94 float deltaMflow = 0.0;
caseyquinn 47:3146e8c949a9 95 float gainFlow;
lionberg 52:80480b2fafba 96 float sampledVol; //L, total sampled volume
caseyquinn 20:ad9883973d86 97
caseyquinn 55:f24d70f519cd 98 int digital_pot_setpoint; //min = 0x7F, max = 0x00
caseyquinn 55:f24d70f519cd 99 int digital_pot_set;
caseyquinn 55:f24d70f519cd 100 int digital_pot_change;
caseyquinn 55:f24d70f519cd 101 int digitalpotMax = 127;
caseyquinn 55:f24d70f519cd 102 int digitalpotMin = 2;
caseyquinn 55:f24d70f519cd 103
joshuasmth04 59:a9b21b3d9afc 104 int dutyUp;
joshuasmth04 59:a9b21b3d9afc 105 int dutyDown;
caseyquinn 67:300418575137 106 uint8_t f_sec, f_min, f_hour, f_date, f_month, f_year;
joshuasmth04 59:a9b21b3d9afc 107
caseyquinn 67:300418575137 108 //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 109
caseyquinn 57:0b554f7aa9a3 110 char device_name[] = "---------------";
caseyquinn 68:ca444d0760a0 111 char filename[] = "/sd/UPAS0011LOG000000000000---------------.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 62:edc9632bcc43 115 void check_stop() // this checks if it's time to stop and shutdown
caseyquinn 57:0b554f7aa9a3 116 {
joshuasmth04 63:66796aef8d68 117 //RTC.get_time(); //debug
joshuasmth04 63:66796aef8d68 118 //pc.printf("%02d:%02d:%02d on %d/%d/%d) \r\n",RTC.hour, RTC.minutes, RTC.seconds, RTC.month, RTC.date, RTC.year);//debig
caseyquinn 67:300418575137 119 if(RTC.compare(f_sec, f_min, f_hour, f_date, f_month, f_year)) {
caseyquinn 57:0b554f7aa9a3 120 pbKill = 0; // this is were we shut everything down
caseyquinn 57:0b554f7aa9a3 121 }
caseyquinn 57:0b554f7aa9a3 122 stop.detach();
caseyquinn 70:81f04e69e08a 123 stop.attach(&check_stop, 9);
joshuasmth04 62:edc9632bcc43 124 }
caseyquinn 58:7239c2ab2b65 125
joshuasmth04 41:1fb3e0ac6f87 126
caseyquinn 57:0b554f7aa9a3 127 void log_data()
joshuasmth04 59:a9b21b3d9afc 128 {
caseyquinn 70:81f04e69e08a 129 logg.detach();
caseyquinn 70:81f04e69e08a 130 logg.attach(&log_data, logInerval);
joshuasmth04 59:a9b21b3d9afc 131 RTC.get_time();
caseyquinn 70:81f04e69e08a 132 secondsD = RTC.seconds;
caseyquinn 70:81f04e69e08a 133 while(fmod(secondsD,logInerval)!=0){
caseyquinn 70:81f04e69e08a 134 RTC.get_time();
caseyquinn 70:81f04e69e08a 135 secondsD = RTC.seconds;
caseyquinn 70:81f04e69e08a 136 }
caseyquinn 70:81f04e69e08a 137
caseyquinn 70:81f04e69e08a 138
joshuasmth04 59:a9b21b3d9afc 139 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
joshuasmth04 59:a9b21b3d9afc 140 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 59:a9b21b3d9afc 141
joshuasmth04 59:a9b21b3d9afc 142 if(omronVolt<=omronVMin) {
joshuasmth04 59:a9b21b3d9afc 143 massflow = omronMFMin;
joshuasmth04 59:a9b21b3d9afc 144 } else if(omronVolt>=omronVMax) {
joshuasmth04 59:a9b21b3d9afc 145 massflow = omronMFMax;
joshuasmth04 59:a9b21b3d9afc 146 } else {
joshuasmth04 59:a9b21b3d9afc 147 massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;
joshuasmth04 59:a9b21b3d9afc 148 }
joshuasmth04 59:a9b21b3d9afc 149
joshuasmth04 59:a9b21b3d9afc 150 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 151 volflow = massflow/atmoRho;
joshuasmth04 59:a9b21b3d9afc 152 sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
joshuasmth04 59:a9b21b3d9afc 153 deltaVflow = volflow-volflowSet;
joshuasmth04 59:a9b21b3d9afc 154 massflowSet = volflowSet*atmoRho;
joshuasmth04 59:a9b21b3d9afc 155 deltaMflow = massflow-massflowSet;
joshuasmth04 59:a9b21b3d9afc 156
joshuasmth04 59:a9b21b3d9afc 157 if(abs(deltaMflow)>.025) {
joshuasmth04 59:a9b21b3d9afc 158 digital_pot_change = (int)(gainFlow*deltaMflow);
joshuasmth04 59:a9b21b3d9afc 159
joshuasmth04 59:a9b21b3d9afc 160
joshuasmth04 59:a9b21b3d9afc 161 if(abs(digital_pot_change)>=50) {
joshuasmth04 59:a9b21b3d9afc 162 digital_pot_set = (int)(digital_pot_set+(int)((10.0*deltaMflow)));
joshuasmth04 59:a9b21b3d9afc 163 RGB_LED.set_led(1,0,0);
joshuasmth04 41:1fb3e0ac6f87 164
joshuasmth04 59:a9b21b3d9afc 165 } else if(digital_pot_change+digital_pot_set>=digitalpotMax&abs(digital_pot_change)<50) {
joshuasmth04 59:a9b21b3d9afc 166 digital_pot_set = digitalpotMax;
joshuasmth04 59:a9b21b3d9afc 167 RGB_LED.set_led(1,0,0);
joshuasmth04 59:a9b21b3d9afc 168 } else if(digital_pot_change+digital_pot_set<=digitalpotMin&abs(digital_pot_change)<50) {
joshuasmth04 59:a9b21b3d9afc 169 digital_pot_set = digitalpotMin;
joshuasmth04 59:a9b21b3d9afc 170 RGB_LED.set_led(1,0,0);
joshuasmth04 59:a9b21b3d9afc 171 } else {
joshuasmth04 59:a9b21b3d9afc 172 digital_pot_set = (digital_pot_set+ digital_pot_change);
joshuasmth04 59:a9b21b3d9afc 173 RGB_LED.set_led(1,1,0);
joshuasmth04 59:a9b21b3d9afc 174 }
joshuasmth04 59:a9b21b3d9afc 175
joshuasmth04 59:a9b21b3d9afc 176 DigPot.writeRegister(digital_pot_set);
joshuasmth04 59:a9b21b3d9afc 177
joshuasmth04 59:a9b21b3d9afc 178 } else {
joshuasmth04 59:a9b21b3d9afc 179 RGB_LED.set_led(0,1,0);
joshuasmth04 59:a9b21b3d9afc 180 }
joshuasmth04 59:a9b21b3d9afc 181
joshuasmth04 59:a9b21b3d9afc 182 movementsensor.getACCEL();
joshuasmth04 59:a9b21b3d9afc 183 movementsensor.getCOMPASS();
caseyquinn 67:300418575137 184 compass = movementsensor.getCOMPASS_HEADING();
joshuasmth04 59:a9b21b3d9afc 185 accel_x = movementsensor.AccelData.x;
joshuasmth04 59:a9b21b3d9afc 186 accel_y = movementsensor.AccelData.y;
joshuasmth04 59:a9b21b3d9afc 187 accel_z = movementsensor.AccelData.z;
joshuasmth04 59:a9b21b3d9afc 188 accel_comp = pow(accel_x,(float)2)+pow(accel_y,(float)2)+pow(accel_z,(float)2)-1.0;
joshuasmth04 59:a9b21b3d9afc 189 mag_x = movementsensor.MagData.x;
joshuasmth04 59:a9b21b3d9afc 190 mag_y = movementsensor.MagData.y;
joshuasmth04 59:a9b21b3d9afc 191 mag_z = movementsensor.MagData.z;
joshuasmth04 59:a9b21b3d9afc 192
joshuasmth04 59:a9b21b3d9afc 193 vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0
joshuasmth04 59:a9b21b3d9afc 194 vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0
joshuasmth04 59:a9b21b3d9afc 195 omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3
joshuasmth04 59:a9b21b3d9afc 196 press = bmesensor.getPressure();
joshuasmth04 59:a9b21b3d9afc 197 temp = bmesensor.getTemperature()-5.0;
joshuasmth04 59:a9b21b3d9afc 198 rh = bmesensor.getHumidity();
joshuasmth04 59:a9b21b3d9afc 199 uv = lightsensor.getUV();
joshuasmth04 59:a9b21b3d9afc 200 vis = lightsensor.getVIS();
joshuasmth04 59:a9b21b3d9afc 201 ir = lightsensor.getIR();
joshuasmth04 59:a9b21b3d9afc 202
joshuasmth04 59:a9b21b3d9afc 203 //Mount the filesystem
joshuasmth04 59:a9b21b3d9afc 204 //sd.mount();
joshuasmth04 59:a9b21b3d9afc 205 FILE *fp = fopen(filename, "a");
caseyquinn 67:300418575137 206 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 207 fclose(fp);
joshuasmth04 59:a9b21b3d9afc 208 //Unmount the filesystem
joshuasmth04 59:a9b21b3d9afc 209 //sd.unmount();
joshuasmth04 59:a9b21b3d9afc 210
caseyquinn 70:81f04e69e08a 211 //wait(1.2);
caseyquinn 70:81f04e69e08a 212
joshuasmth04 59:a9b21b3d9afc 213 }
caseyquinn 57:0b554f7aa9a3 214
caseyquinn 57:0b554f7aa9a3 215 int main()
caseyquinn 57:0b554f7aa9a3 216 {
caseyquinn 57:0b554f7aa9a3 217
caseyquinn 57:0b554f7aa9a3 218 // Setup and Initialization
caseyquinn 57:0b554f7aa9a3 219 //---------------------------------------------------------------------------------------------//
caseyquinn 57:0b554f7aa9a3 220
caseyquinn 67:300418575137 221
caseyquinn 57:0b554f7aa9a3 222
caseyquinn 67:300418575137 223 Menu.read_menu(E2PROM, RunReady, volflowSet, device_name, dutyUp, dutyDown); //Read all data from the EEPROM here
caseyquinn 67:300418575137 224
caseyquinn 57:0b554f7aa9a3 225 //Test for errors
joshuasmth04 59:a9b21b3d9afc 226 if(RTC.OSF()) { //Don't proceed if the RTC needs reset
caseyquinn 67:300418575137 227 RGB_LED.set_led(0,1,1); // error code/color
lionberg 60:5913d77c8a4a 228 pc.printf("DATE/TIMESTAMP NEEDS TO BE RECALIBRATED!!\r\n");
caseyquinn 67:300418575137 229 Menu.Start(pc, E2PROM, RTC, RunReady, volflowSet, device_name, dutyUp, dutyDown); //Forces you to open the menu
caseyquinn 67:300418575137 230 Menu.save_menu(E2PROM, RunReady, volflowSet, device_name, dutyUp, dutyDown); //Save all data to the EEPROM
caseyquinn 57:0b554f7aa9a3 231 }
caseyquinn 67:300418575137 232
caseyquinn 67:300418575137 233 if(RunReady == 0){
caseyquinn 67:300418575137 234 RGB_LED.set_led(0,1,1); // error code/color
caseyquinn 67:300418575137 235 pc.printf("Change Name\r\n");
caseyquinn 67:300418575137 236 Menu.Start(pc, E2PROM, RTC, RunReady, volflowSet, device_name, dutyUp, dutyDown); //Forces you to open the menu
caseyquinn 67:300418575137 237 RunReady = 1;
caseyquinn 67:300418575137 238 Menu.save_menu(E2PROM, RunReady, volflowSet, device_name, dutyUp, dutyDown); //Save all data to the EEPROM
caseyquinn 67:300418575137 239 pbKill = 0;
caseyquinn 67:300418575137 240 }
caseyquinn 67:300418575137 241
caseyquinn 67:300418575137 242 RunReady = 0;
caseyquinn 67:300418575137 243 Menu.save_menu(E2PROM, RunReady, volflowSet, device_name, dutyUp, dutyDown); //Save all data to the EEPROM
joshuasmth04 59:a9b21b3d9afc 244
joshuasmth04 62:edc9632bcc43 245 stop.attach(&check_stop, 60); // check if we should shut down every 5 seconds, starting 60s after the start.
caseyquinn 57:0b554f7aa9a3 246
joshuasmth04 59:a9b21b3d9afc 247 if(volflowSet==1.0) {
joshuasmth04 59:a9b21b3d9afc 248 gainFlow = 100;
joshuasmth04 59:a9b21b3d9afc 249 } else if(volflowSet==2.0) {
joshuasmth04 59:a9b21b3d9afc 250 gainFlow = 25;
joshuasmth04 59:a9b21b3d9afc 251 } else {
joshuasmth04 59:a9b21b3d9afc 252 gainFlow = 25;
joshuasmth04 59:a9b21b3d9afc 253 }
joshuasmth04 59:a9b21b3d9afc 254
caseyquinn 57:0b554f7aa9a3 255 RGB_LED.set_led(1,0,0);
caseyquinn 57:0b554f7aa9a3 256 press = bmesensor.getPressure();
caseyquinn 57:0b554f7aa9a3 257 temp = bmesensor.getTemperature();
caseyquinn 57:0b554f7aa9a3 258 rh = bmesensor.getHumidity();
caseyquinn 57:0b554f7aa9a3 259
caseyquinn 57:0b554f7aa9a3 260 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 261 massflowSet = volflowSet*atmoRho;
caseyquinn 57:0b554f7aa9a3 262 //Digtal pot tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
caseyquinn 57:0b554f7aa9a3 263 digital_pot_setpoint = (int)floor(DP4*pow(massflowSet,4)+DP3*pow(massflowSet,3)+DP2*pow(massflowSet,2)+DP1*massflowSet+DP0); //min = 0x7F, max = 0x00
joshuasmth04 59:a9b21b3d9afc 264
joshuasmth04 59:a9b21b3d9afc 265 if(digital_pot_setpoint>=digitalpotMax) {
caseyquinn 57:0b554f7aa9a3 266 digital_pot_setpoint = digitalpotMax;
joshuasmth04 59:a9b21b3d9afc 267 } else if(digital_pot_setpoint<=digitalpotMin) {
caseyquinn 57:0b554f7aa9a3 268 digital_pot_setpoint = digitalpotMin;
joshuasmth04 59:a9b21b3d9afc 269 }
joshuasmth04 59:a9b21b3d9afc 270
caseyquinn 57:0b554f7aa9a3 271 DigPot.writeRegister(digital_pot_setpoint);
caseyquinn 57:0b554f7aa9a3 272 wait(1);
caseyquinn 57:0b554f7aa9a3 273 blower = 1;
caseyquinn 57:0b554f7aa9a3 274
caseyquinn 57:0b554f7aa9a3 275 RTC.get_time();
caseyquinn 67:300418575137 276 f_sec = RTC.seconds;
caseyquinn 67:300418575137 277 f_min = RTC.minutes;
caseyquinn 67:300418575137 278 f_hour = RTC.hour;
caseyquinn 67:300418575137 279 if(RTC.month == 1 | RTC.month == 3 | RTC.month == 5 | RTC.month == 7 | RTC.month == 8 | RTC.month == 10){
caseyquinn 67:300418575137 280 if(RTC.date == 31){
caseyquinn 67:300418575137 281 f_date = 1;
caseyquinn 67:300418575137 282 f_month = RTC.month +1;
caseyquinn 67:300418575137 283 f_year = RTC.year;
caseyquinn 67:300418575137 284 }
caseyquinn 67:300418575137 285 else{
caseyquinn 67:300418575137 286 f_date = RTC.date+1;
caseyquinn 67:300418575137 287 f_month = RTC.month;
caseyquinn 67:300418575137 288 f_year = RTC.year;
caseyquinn 67:300418575137 289 }
caseyquinn 67:300418575137 290 }
caseyquinn 67:300418575137 291 else if(RTC.month == 4 | RTC.month == 6 | RTC.month == 9 | RTC.month == 11){
caseyquinn 67:300418575137 292 if(RTC.date == 30){
caseyquinn 67:300418575137 293 f_date = 1;
caseyquinn 67:300418575137 294 f_month = RTC.month +1;
caseyquinn 67:300418575137 295 f_year = RTC.year;
caseyquinn 67:300418575137 296 }
caseyquinn 67:300418575137 297 else{
caseyquinn 67:300418575137 298 f_date = RTC.date+1;
caseyquinn 67:300418575137 299 f_month = RTC.month;
caseyquinn 67:300418575137 300 f_year = RTC.year;
caseyquinn 67:300418575137 301 }
caseyquinn 67:300418575137 302 }
caseyquinn 67:300418575137 303 else if(RTC.month == 2){
caseyquinn 67:300418575137 304 if(RTC.year == 16 | RTC.year == 20 | RTC.year == 24| RTC.year == 28){
caseyquinn 67:300418575137 305 if(RTC.date == 29){
caseyquinn 67:300418575137 306 f_date = 1;
caseyquinn 67:300418575137 307 f_month = RTC.month +1;
caseyquinn 67:300418575137 308 f_year = RTC.year;
caseyquinn 67:300418575137 309 }
caseyquinn 67:300418575137 310 else{
caseyquinn 67:300418575137 311 f_date = RTC.date+1;
caseyquinn 67:300418575137 312 f_month = RTC.month;
caseyquinn 67:300418575137 313 f_year = RTC.year;
caseyquinn 67:300418575137 314 }
caseyquinn 67:300418575137 315 }
caseyquinn 67:300418575137 316 else{
caseyquinn 67:300418575137 317 if(RTC.date == 28){
caseyquinn 67:300418575137 318 f_date = 1;
caseyquinn 67:300418575137 319 f_month = RTC.month +1;
caseyquinn 67:300418575137 320 f_year = RTC.year;
caseyquinn 67:300418575137 321 }
caseyquinn 67:300418575137 322 else{
caseyquinn 67:300418575137 323 f_date = RTC.date+1;
caseyquinn 67:300418575137 324 f_month = RTC.month;
caseyquinn 67:300418575137 325 f_year = RTC.year;
caseyquinn 67:300418575137 326 }
caseyquinn 69:7a99d97c334e 327 }
caseyquinn 67:300418575137 328 }
caseyquinn 69:7a99d97c334e 329 else if(RTC.month == 12){
caseyquinn 69:7a99d97c334e 330 if(RTC.date == 31){
caseyquinn 69:7a99d97c334e 331 f_date = 1;
caseyquinn 69:7a99d97c334e 332 f_month = 1;
caseyquinn 69:7a99d97c334e 333 f_year = RTC.year+1;
caseyquinn 69:7a99d97c334e 334 }
caseyquinn 69:7a99d97c334e 335 else{
caseyquinn 69:7a99d97c334e 336 f_date = RTC.date+1;
caseyquinn 69:7a99d97c334e 337 f_month = RTC.month;
caseyquinn 69:7a99d97c334e 338 f_year = RTC.year;
caseyquinn 69:7a99d97c334e 339 }
caseyquinn 69:7a99d97c334e 340 }
caseyquinn 67:300418575137 341
caseyquinn 67:300418575137 342
caseyquinn 68:ca444d0760a0 343 sprintf(filename, "/sd/UPAS0011LOG %02d-%02d-%02d %02d=%02d=%02d %s.txt",RTC.year,RTC.month,RTC.date,RTC.hour,RTC.minutes,RTC.seconds,device_name);
caseyquinn 57:0b554f7aa9a3 344 FILE *fp = fopen(filename, "w");
caseyquinn 57:0b554f7aa9a3 345 fclose(fp);
joshuasmth04 59:a9b21b3d9afc 346 //pc.printf("%d\r\n",digital_pot_setpoint);
joshuasmth04 59:a9b21b3d9afc 347
joshuasmth04 59:a9b21b3d9afc 348 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 349 //Following lines are needed to enter into the initiallization flow control loop
joshuasmth04 59:a9b21b3d9afc 350
caseyquinn 57:0b554f7aa9a3 351 wait(10);
joshuasmth04 59:a9b21b3d9afc 352
caseyquinn 57:0b554f7aa9a3 353 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 57:0b554f7aa9a3 354 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 59:a9b21b3d9afc 355 if(omronVolt<=omronVMin) {
caseyquinn 57:0b554f7aa9a3 356 massflow = omronMFMin;
joshuasmth04 59:a9b21b3d9afc 357 } else if(omronVolt>=omronVMax) {
caseyquinn 57:0b554f7aa9a3 358 massflow = omronMFMax;
joshuasmth04 59:a9b21b3d9afc 359 } else {
joshuasmth04 59:a9b21b3d9afc 360 massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;
joshuasmth04 59:a9b21b3d9afc 361 }
joshuasmth04 59:a9b21b3d9afc 362 deltaMflow = massflow-massflowSet;
joshuasmth04 59:a9b21b3d9afc 363 digital_pot_set = digital_pot_setpoint;
joshuasmth04 59:a9b21b3d9afc 364 wait(5);
joshuasmth04 59:a9b21b3d9afc 365
joshuasmth04 59:a9b21b3d9afc 366 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 367 //Sets the flow withen +-1.5% of the desired flow rate based on mass flow
joshuasmth04 59:a9b21b3d9afc 368
joshuasmth04 59:a9b21b3d9afc 369 while(abs(deltaMflow)>.015) {
caseyquinn 67:300418575137 370
joshuasmth04 59:a9b21b3d9afc 371 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
joshuasmth04 59:a9b21b3d9afc 372 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 59:a9b21b3d9afc 373 //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
joshuasmth04 59:a9b21b3d9afc 374 if(omronVolt<=omronVMin) {
joshuasmth04 59:a9b21b3d9afc 375 massflow = omronMFMin;
joshuasmth04 59:a9b21b3d9afc 376 } else if(omronVolt>=omronVMax) {
joshuasmth04 59:a9b21b3d9afc 377 massflow = omronMFMax;
joshuasmth04 59:a9b21b3d9afc 378 } else {
joshuasmth04 59:a9b21b3d9afc 379 massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;
joshuasmth04 59:a9b21b3d9afc 380 }
caseyquinn 57:0b554f7aa9a3 381
joshuasmth04 59:a9b21b3d9afc 382 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 383 volflow = massflow/atmoRho;
joshuasmth04 59:a9b21b3d9afc 384 massflowSet = volflowSet*atmoRho;
joshuasmth04 59:a9b21b3d9afc 385 deltaMflow = massflow-massflowSet;
joshuasmth04 63:66796aef8d68 386 //pc.printf("%f,%f,%f,%f,%d,%u,%x\r\n",volflow,massflow,massflowSet,deltaMflow,digital_pot_set,digital_pot_set,digital_pot_set);
caseyquinn 67:300418575137 387 pc.printf("%d,%d,%d,%d,%d,%d\r\n",f_sec,f_min,f_hour,f_date,f_month,f_year,digital_pot_set);
joshuasmth04 59:a9b21b3d9afc 388 digital_pot_set = (int)(digital_pot_set+(int)((gainFlow*deltaMflow)));
joshuasmth04 59:a9b21b3d9afc 389 if(digital_pot_set>=digitalpotMax) {
joshuasmth04 59:a9b21b3d9afc 390 digital_pot_set = digitalpotMax;
joshuasmth04 59:a9b21b3d9afc 391 } else if(digital_pot_set<=digitalpotMin) {
joshuasmth04 59:a9b21b3d9afc 392 digital_pot_set = digitalpotMin;
joshuasmth04 59:a9b21b3d9afc 393 }
joshuasmth04 59:a9b21b3d9afc 394
joshuasmth04 59:a9b21b3d9afc 395 wait(2);
joshuasmth04 59:a9b21b3d9afc 396 DigPot.writeRegister(digital_pot_set);
joshuasmth04 59:a9b21b3d9afc 397 wait(1);
joshuasmth04 59:a9b21b3d9afc 398
joshuasmth04 59:a9b21b3d9afc 399
joshuasmth04 59:a9b21b3d9afc 400 }
joshuasmth04 59:a9b21b3d9afc 401
joshuasmth04 59:a9b21b3d9afc 402 sampledVol = 0.0;
joshuasmth04 59:a9b21b3d9afc 403 RGB_LED.set_led(0,1,0);
caseyquinn 67:300418575137 404
caseyquinn 67:300418575137 405
joshuasmth04 59:a9b21b3d9afc 406
joshuasmth04 59:a9b21b3d9afc 407 //** end of initalization **//
joshuasmth04 59:a9b21b3d9afc 408
joshuasmth04 59:a9b21b3d9afc 409 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 410 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 411 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 412 // Main Control Loop
joshuasmth04 59:a9b21b3d9afc 413
joshuasmth04 62:edc9632bcc43 414 logg.attach(&log_data, logInerval); // uses callbacks or block Interrupts for anything that uses i2c
joshuasmth04 59:a9b21b3d9afc 415 while(1) {
joshuasmth04 62:edc9632bcc43 416 //__disable_irq(); // Disable Interrupts
joshuasmth04 62:edc9632bcc43 417 //RTC.get_time();
joshuasmth04 62:edc9632bcc43 418 //__enable_irq(); // Enable Interrupts
joshuasmth04 62:edc9632bcc43 419 //secondsD = (double)RTC.seconds;
joshuasmth04 62:edc9632bcc43 420 //if(fmod(secondsD,logInerval)==0) {
joshuasmth04 62:edc9632bcc43 421 //log_data();
joshuasmth04 64:2906b0c48403 422 //}
caseyquinn 0:14d46ef4b6cb 423 }
joshuasmth04 59:a9b21b3d9afc 424
caseyquinn 0:14d46ef4b6cb 425 }
caseyquinn 0:14d46ef4b6cb 426
caseyquinn 0:14d46ef4b6cb 427