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:
lionberg
Date:
Mon Jul 06 21:36:50 2015 +0000
Revision:
60:5913d77c8a4a
Parent:
59:a9b21b3d9afc
Child:
62:edc9632bcc43
UPAS code v2.0 - Changed menu interaction semantics and filename convention - otherwise nothing major - should be good to run with this.

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 57:0b554f7aa9a3 12 #include "UPAS_Serial.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 57:0b554f7aa9a3 32 UPAS_Serial Menu;
caseyquinn 57:0b554f7aa9a3 33
caseyquinn 57:0b554f7aa9a3 34 Timeout stop; //This is the stop call back object
caseyquinn 0:14d46ef4b6cb 35
lionberg 52:80480b2fafba 36 //UPAS0012 CALIBRATION TRANSFER FUNCTION COEFFICIENTS FROM 'UPAS v2 OSU-calibration primary flow data.xlsx'
lionberg 52:80480b2fafba 37 //mass flow sensor output signal (x) vs. mass flow (y)
lionberg 60:5913d77c8a4a 38 //y = -0.6154x4 + 3.7873x3 - 7.2564x2 + 7.0202x - 1.9413
caseyquinn 55:f24d70f519cd 39 float MF4 = -0.6154;
caseyquinn 55:f24d70f519cd 40 float MF3 = 3.7873;
caseyquinn 55:f24d70f519cd 41 float MF2 = -7.2564;
caseyquinn 55:f24d70f519cd 42 float MF1 = 7.0202;
caseyquinn 55:f24d70f519cd 43 float MF0 = -1.9413;
lionberg 52:80480b2fafba 44 //Mass flow sensor polynomial deviation limits
lionberg 60:5913d77c8a4a 45 float omronVMin = 0.425; //V
lionberg 60:5913d77c8a4a 46 float omronVMax = 2.005; //V
lionberg 60:5913d77c8a4a 47 float omronMFMin = 0.002; //g/L
lionberg 60:5913d77c8a4a 48 float omronMFMax = 3.544; //g/L
lionberg 52:80480b2fafba 49 //DIGITAL POTENTIOSTAT dig-pot vs m_dot POLYNOMIAL TRANSFER FUNCTION COEFFICIENTS FROM 'UPAS v2 OSU-calibration primary flow data.xlsx'
lionberg 60:5913d77c8a4a 50 //y = 5.3839x4 - 51.627x3 + 191.09x2 - 345.9x + 277.63
caseyquinn 55:f24d70f519cd 51 float DP4 = 5.3839;
caseyquinn 55:f24d70f519cd 52 float DP3 = -51.627;
caseyquinn 55:f24d70f519cd 53 float DP2 = 191.09;
caseyquinn 55:f24d70f519cd 54 float DP1 = -345.9;
caseyquinn 55:f24d70f519cd 55 float DP0 = 277.63;
lionberg 52:80480b2fafba 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 10:f9cb61b29340 65 float accel_x;
caseyquinn 10:f9cb61b29340 66 float accel_y;
caseyquinn 10:f9cb61b29340 67 float accel_z;
lionberg 52:80480b2fafba 68 float accel_comp;
caseyquinn 10:f9cb61b29340 69 float mag_x;
caseyquinn 10:f9cb61b29340 70 float mag_y;
caseyquinn 10:f9cb61b29340 71 float mag_z;
caseyquinn 10:f9cb61b29340 72
caseyquinn 0:14d46ef4b6cb 73 int vInReading;
caseyquinn 0:14d46ef4b6cb 74 int vBlowerReading;
caseyquinn 0:14d46ef4b6cb 75 int omronDiff;
lionberg 52:80480b2fafba 76 float omronVolt; //V
caseyquinn 20:ad9883973d86 77 int omronReading;
lionberg 52:80480b2fafba 78 float atmoRho; //g/L
caseyquinn 49:19e828650618 79
caseyquinn 20:ad9883973d86 80 float massflow; //g/min
caseyquinn 20:ad9883973d86 81 float volflow; //L/min
caseyquinn 55:f24d70f519cd 82 float volflowSet = 1.0; //L/min
caseyquinn 57:0b554f7aa9a3 83 int logInerval = 10;
caseyquinn 57:0b554f7aa9a3 84 double secondsD = 0;
joshuasmth04 41:1fb3e0ac6f87 85 float massflowSet;
caseyquinn 42:fc2f2b9f07ae 86 float deltaVflow = 0.0;
caseyquinn 42:fc2f2b9f07ae 87 float deltaMflow = 0.0;
caseyquinn 47:3146e8c949a9 88 float gainFlow;
lionberg 52:80480b2fafba 89 float sampledVol; //L, total sampled volume
caseyquinn 20:ad9883973d86 90
caseyquinn 55:f24d70f519cd 91 int digital_pot_setpoint; //min = 0x7F, max = 0x00
caseyquinn 55:f24d70f519cd 92 int digital_pot_set;
caseyquinn 55:f24d70f519cd 93 int digital_pot_change;
caseyquinn 55:f24d70f519cd 94 int digitalpotMax = 127;
caseyquinn 55:f24d70f519cd 95 int digitalpotMin = 2;
caseyquinn 55:f24d70f519cd 96
joshuasmth04 59:a9b21b3d9afc 97 int dutyUp;
joshuasmth04 59:a9b21b3d9afc 98 int dutyDown;
joshuasmth04 59:a9b21b3d9afc 99
caseyquinn 57:0b554f7aa9a3 100 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 101
caseyquinn 57:0b554f7aa9a3 102 char device_name[] = "---------------";
caseyquinn 57:0b554f7aa9a3 103 char filename[] = "/sd/UPAS0012LOG000000000000---------------.txt";
caseyquinn 7:a24d7156bc02 104 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 105
caseyquinn 7:a24d7156bc02 106
joshuasmth04 59:a9b21b3d9afc 107 /*void check_stop() // this checks if it's time to stop and shutdown
caseyquinn 57:0b554f7aa9a3 108 {
joshuasmth04 59:a9b21b3d9afc 109 //RTC.get_time(); //debug
joshuasmth04 59:a9b21b3d9afc 110 //pc.printf("%02d:%02d:%02d on %d/%d/%d) \r\n",RTC.hour, RTC.minutes, RTC.seconds, RTC.month, RTC.date, RTC.year);//debig
joshuasmth04 59:a9b21b3d9afc 111 if(RTC.compare(Menu.f_sec, Menu.f_min, Menu.f_hour, Menu.f_day, Menu.f_month, Menu.f_year)) {
caseyquinn 57:0b554f7aa9a3 112 pbKill = 0; // this is were we shut everything down
caseyquinn 57:0b554f7aa9a3 113 }
joshuasmth04 59:a9b21b3d9afc 114 wait(0.1);
caseyquinn 57:0b554f7aa9a3 115 stop.detach();
caseyquinn 57:0b554f7aa9a3 116 stop.attach(&check_stop, 5); // checks stop time every 5 seconds
joshuasmth04 59:a9b21b3d9afc 117 }*/
caseyquinn 58:7239c2ab2b65 118
joshuasmth04 41:1fb3e0ac6f87 119
caseyquinn 57:0b554f7aa9a3 120 void log_data()
joshuasmth04 59:a9b21b3d9afc 121 {
joshuasmth04 59:a9b21b3d9afc 122 RTC.get_time();
joshuasmth04 59:a9b21b3d9afc 123 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
joshuasmth04 59:a9b21b3d9afc 124 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 59:a9b21b3d9afc 125
joshuasmth04 59:a9b21b3d9afc 126 if(omronVolt<=omronVMin) {
joshuasmth04 59:a9b21b3d9afc 127 massflow = omronMFMin;
joshuasmth04 59:a9b21b3d9afc 128 } else if(omronVolt>=omronVMax) {
joshuasmth04 59:a9b21b3d9afc 129 massflow = omronMFMax;
joshuasmth04 59:a9b21b3d9afc 130 } else {
joshuasmth04 59:a9b21b3d9afc 131 massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;
joshuasmth04 59:a9b21b3d9afc 132 }
joshuasmth04 59:a9b21b3d9afc 133
joshuasmth04 59:a9b21b3d9afc 134 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 135 volflow = massflow/atmoRho;
joshuasmth04 59:a9b21b3d9afc 136 sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
joshuasmth04 59:a9b21b3d9afc 137 deltaVflow = volflow-volflowSet;
joshuasmth04 59:a9b21b3d9afc 138 massflowSet = volflowSet*atmoRho;
joshuasmth04 59:a9b21b3d9afc 139 deltaMflow = massflow-massflowSet;
joshuasmth04 59:a9b21b3d9afc 140
joshuasmth04 59:a9b21b3d9afc 141 if(abs(deltaMflow)>.025) {
joshuasmth04 59:a9b21b3d9afc 142 digital_pot_change = (int)(gainFlow*deltaMflow);
joshuasmth04 59:a9b21b3d9afc 143
joshuasmth04 59:a9b21b3d9afc 144
joshuasmth04 59:a9b21b3d9afc 145 if(abs(digital_pot_change)>=50) {
joshuasmth04 59:a9b21b3d9afc 146 digital_pot_set = (int)(digital_pot_set+(int)((10.0*deltaMflow)));
joshuasmth04 59:a9b21b3d9afc 147 RGB_LED.set_led(1,0,0);
joshuasmth04 41:1fb3e0ac6f87 148
joshuasmth04 59:a9b21b3d9afc 149 } else if(digital_pot_change+digital_pot_set>=digitalpotMax&abs(digital_pot_change)<50) {
joshuasmth04 59:a9b21b3d9afc 150 digital_pot_set = digitalpotMax;
joshuasmth04 59:a9b21b3d9afc 151 RGB_LED.set_led(1,0,0);
joshuasmth04 59:a9b21b3d9afc 152 } else if(digital_pot_change+digital_pot_set<=digitalpotMin&abs(digital_pot_change)<50) {
joshuasmth04 59:a9b21b3d9afc 153 digital_pot_set = digitalpotMin;
joshuasmth04 59:a9b21b3d9afc 154 RGB_LED.set_led(1,0,0);
joshuasmth04 59:a9b21b3d9afc 155 } else {
joshuasmth04 59:a9b21b3d9afc 156 digital_pot_set = (digital_pot_set+ digital_pot_change);
joshuasmth04 59:a9b21b3d9afc 157 RGB_LED.set_led(1,1,0);
joshuasmth04 59:a9b21b3d9afc 158 }
joshuasmth04 59:a9b21b3d9afc 159
joshuasmth04 59:a9b21b3d9afc 160 DigPot.writeRegister(digital_pot_set);
joshuasmth04 59:a9b21b3d9afc 161
joshuasmth04 59:a9b21b3d9afc 162 } else {
joshuasmth04 59:a9b21b3d9afc 163 RGB_LED.set_led(0,1,0);
joshuasmth04 59:a9b21b3d9afc 164 }
joshuasmth04 59:a9b21b3d9afc 165
joshuasmth04 59:a9b21b3d9afc 166 movementsensor.getACCEL();
joshuasmth04 59:a9b21b3d9afc 167 movementsensor.getCOMPASS();
joshuasmth04 59:a9b21b3d9afc 168 accel_x = movementsensor.AccelData.x;
joshuasmth04 59:a9b21b3d9afc 169 accel_y = movementsensor.AccelData.y;
joshuasmth04 59:a9b21b3d9afc 170 accel_z = movementsensor.AccelData.z;
joshuasmth04 59:a9b21b3d9afc 171 accel_comp = pow(accel_x,(float)2)+pow(accel_y,(float)2)+pow(accel_z,(float)2)-1.0;
joshuasmth04 59:a9b21b3d9afc 172 mag_x = movementsensor.MagData.x;
joshuasmth04 59:a9b21b3d9afc 173 mag_y = movementsensor.MagData.y;
joshuasmth04 59:a9b21b3d9afc 174 mag_z = movementsensor.MagData.z;
joshuasmth04 59:a9b21b3d9afc 175
joshuasmth04 59:a9b21b3d9afc 176 vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0
joshuasmth04 59:a9b21b3d9afc 177 vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0
joshuasmth04 59:a9b21b3d9afc 178 omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3
joshuasmth04 59:a9b21b3d9afc 179 press = bmesensor.getPressure();
joshuasmth04 59:a9b21b3d9afc 180 temp = bmesensor.getTemperature()-5.0;
joshuasmth04 59:a9b21b3d9afc 181 rh = bmesensor.getHumidity();
joshuasmth04 59:a9b21b3d9afc 182 uv = lightsensor.getUV();
joshuasmth04 59:a9b21b3d9afc 183 vis = lightsensor.getVIS();
joshuasmth04 59:a9b21b3d9afc 184 ir = lightsensor.getIR();
joshuasmth04 59:a9b21b3d9afc 185
joshuasmth04 59:a9b21b3d9afc 186 //Mount the filesystem
joshuasmth04 59:a9b21b3d9afc 187 //sd.mount();
joshuasmth04 59:a9b21b3d9afc 188 FILE *fp = fopen(filename, "a");
joshuasmth04 59:a9b21b3d9afc 189 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\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);
joshuasmth04 59:a9b21b3d9afc 190 fclose(fp);
joshuasmth04 59:a9b21b3d9afc 191 //Unmount the filesystem
joshuasmth04 59:a9b21b3d9afc 192 //sd.unmount();
joshuasmth04 59:a9b21b3d9afc 193
joshuasmth04 59:a9b21b3d9afc 194 wait(1);
joshuasmth04 59:a9b21b3d9afc 195 }
caseyquinn 57:0b554f7aa9a3 196
caseyquinn 57:0b554f7aa9a3 197 int main()
caseyquinn 57:0b554f7aa9a3 198 {
caseyquinn 57:0b554f7aa9a3 199
caseyquinn 57:0b554f7aa9a3 200 // Setup and Initialization
caseyquinn 57:0b554f7aa9a3 201 //---------------------------------------------------------------------------------------------//
caseyquinn 57:0b554f7aa9a3 202
caseyquinn 57:0b554f7aa9a3 203 Timer refresh_Timer; //sets up a timer for use in loop; how often do we log data?
caseyquinn 57:0b554f7aa9a3 204 refresh_Timer.start(); //starts the clock on the timer
caseyquinn 57:0b554f7aa9a3 205 RGB_LED.set_led(0,1,1);
caseyquinn 57:0b554f7aa9a3 206 refresh_Timer.reset(); // resets the timer to zero
caseyquinn 57:0b554f7aa9a3 207
joshuasmth04 59:a9b21b3d9afc 208 Menu.read_menu(E2PROM, refresh_Time, volflowSet, device_name, dutyUp, dutyDown); //Read all data from the EEPROM here
caseyquinn 57:0b554f7aa9a3 209 fix_error:
joshuasmth04 59:a9b21b3d9afc 210 Menu.Start(pc, E2PROM, RTC, refresh_Time, volflowSet, device_name, dutyUp, dutyDown); //Forces you to open the menu
joshuasmth04 59:a9b21b3d9afc 211 Menu.save_menu(E2PROM, refresh_Time, volflowSet, device_name, dutyUp, dutyDown); //Save all data to the EEPROM
joshuasmth04 59:a9b21b3d9afc 212
caseyquinn 57:0b554f7aa9a3 213 //Test for errors
joshuasmth04 59:a9b21b3d9afc 214 if(RTC.OSF()) { //Don't proceed if the RTC needs reset
caseyquinn 57:0b554f7aa9a3 215 RGB_LED.set_led(1,0,0); // error code/color
lionberg 60:5913d77c8a4a 216 pc.printf("DATE/TIMESTAMP NEEDS TO BE RECALIBRATED!!\r\n");
caseyquinn 57:0b554f7aa9a3 217 goto fix_error;
caseyquinn 57:0b554f7aa9a3 218 }
caseyquinn 58:7239c2ab2b65 219 RTC.get_time();
joshuasmth04 59:a9b21b3d9afc 220 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
caseyquinn 57:0b554f7aa9a3 221 RGB_LED.set_led(1,0,0); // error code/color
lionberg 60:5913d77c8a4a 222 pc.printf("Please fix the START or STOP times before exiting!\r\n");
caseyquinn 57:0b554f7aa9a3 223 goto fix_error;
caseyquinn 57:0b554f7aa9a3 224 }
joshuasmth04 59:a9b21b3d9afc 225 pc.printf("You're done, you can now disconect the USB cable.");
joshuasmth04 59:a9b21b3d9afc 226
caseyquinn 57:0b554f7aa9a3 227 RGB_LED.set_led(1,1,0);
joshuasmth04 59:a9b21b3d9afc 228 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
caseyquinn 57:0b554f7aa9a3 229 // serial print a count down??
caseyquinn 57:0b554f7aa9a3 230 }
joshuasmth04 59:a9b21b3d9afc 231 //stop.attach(&check_stop, 30); // check if we should shut down every 5 seconds, starting 60s after the start.
caseyquinn 57:0b554f7aa9a3 232
caseyquinn 57:0b554f7aa9a3 233
joshuasmth04 59:a9b21b3d9afc 234 if(volflowSet==1.0) {
joshuasmth04 59:a9b21b3d9afc 235 gainFlow = 100;
joshuasmth04 59:a9b21b3d9afc 236 } else if(volflowSet==2.0) {
joshuasmth04 59:a9b21b3d9afc 237 gainFlow = 25;
joshuasmth04 59:a9b21b3d9afc 238 } else {
joshuasmth04 59:a9b21b3d9afc 239 gainFlow = 25;
joshuasmth04 59:a9b21b3d9afc 240 }
joshuasmth04 59:a9b21b3d9afc 241
caseyquinn 57:0b554f7aa9a3 242 RGB_LED.set_led(1,0,0);
caseyquinn 57:0b554f7aa9a3 243 press = bmesensor.getPressure();
caseyquinn 57:0b554f7aa9a3 244 temp = bmesensor.getTemperature();
caseyquinn 57:0b554f7aa9a3 245 rh = bmesensor.getHumidity();
caseyquinn 57:0b554f7aa9a3 246
caseyquinn 57:0b554f7aa9a3 247 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 248 massflowSet = volflowSet*atmoRho;
caseyquinn 57:0b554f7aa9a3 249 //Digtal pot tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
caseyquinn 57:0b554f7aa9a3 250 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 251
joshuasmth04 59:a9b21b3d9afc 252 if(digital_pot_setpoint>=digitalpotMax) {
caseyquinn 57:0b554f7aa9a3 253 digital_pot_setpoint = digitalpotMax;
joshuasmth04 59:a9b21b3d9afc 254 } else if(digital_pot_setpoint<=digitalpotMin) {
caseyquinn 57:0b554f7aa9a3 255 digital_pot_setpoint = digitalpotMin;
joshuasmth04 59:a9b21b3d9afc 256 }
joshuasmth04 59:a9b21b3d9afc 257
caseyquinn 57:0b554f7aa9a3 258 DigPot.writeRegister(digital_pot_setpoint);
caseyquinn 57:0b554f7aa9a3 259 wait(1);
caseyquinn 57:0b554f7aa9a3 260 blower = 1;
caseyquinn 57:0b554f7aa9a3 261
caseyquinn 57:0b554f7aa9a3 262 RTC.get_time();
lionberg 60:5913d77c8a4a 263 sprintf(filename, "/sd/UPAS0012LOG %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 264 FILE *fp = fopen(filename, "w");
caseyquinn 57:0b554f7aa9a3 265 fclose(fp);
joshuasmth04 59:a9b21b3d9afc 266 //pc.printf("%d\r\n",digital_pot_setpoint);
joshuasmth04 59:a9b21b3d9afc 267
joshuasmth04 59:a9b21b3d9afc 268 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 269 //Following lines are needed to enter into the initiallization flow control loop
joshuasmth04 59:a9b21b3d9afc 270
caseyquinn 57:0b554f7aa9a3 271 wait(10);
joshuasmth04 59:a9b21b3d9afc 272
caseyquinn 57:0b554f7aa9a3 273 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 57:0b554f7aa9a3 274 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 59:a9b21b3d9afc 275 if(omronVolt<=omronVMin) {
caseyquinn 57:0b554f7aa9a3 276 massflow = omronMFMin;
joshuasmth04 59:a9b21b3d9afc 277 } else if(omronVolt>=omronVMax) {
caseyquinn 57:0b554f7aa9a3 278 massflow = omronMFMax;
joshuasmth04 59:a9b21b3d9afc 279 } else {
joshuasmth04 59:a9b21b3d9afc 280 massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;
joshuasmth04 59:a9b21b3d9afc 281 }
joshuasmth04 59:a9b21b3d9afc 282 deltaMflow = massflow-massflowSet;
joshuasmth04 59:a9b21b3d9afc 283 digital_pot_set = digital_pot_setpoint;
joshuasmth04 59:a9b21b3d9afc 284 wait(5);
joshuasmth04 59:a9b21b3d9afc 285
joshuasmth04 59:a9b21b3d9afc 286 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 287 //Sets the flow withen +-1.5% of the desired flow rate based on mass flow
joshuasmth04 59:a9b21b3d9afc 288
joshuasmth04 59:a9b21b3d9afc 289 while(abs(deltaMflow)>.015) {
joshuasmth04 59:a9b21b3d9afc 290
joshuasmth04 59:a9b21b3d9afc 291 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
joshuasmth04 59:a9b21b3d9afc 292 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 59:a9b21b3d9afc 293 //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
joshuasmth04 59:a9b21b3d9afc 294 if(omronVolt<=omronVMin) {
joshuasmth04 59:a9b21b3d9afc 295 massflow = omronMFMin;
joshuasmth04 59:a9b21b3d9afc 296 } else if(omronVolt>=omronVMax) {
joshuasmth04 59:a9b21b3d9afc 297 massflow = omronMFMax;
joshuasmth04 59:a9b21b3d9afc 298 } else {
joshuasmth04 59:a9b21b3d9afc 299 massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;
joshuasmth04 59:a9b21b3d9afc 300 }
caseyquinn 57:0b554f7aa9a3 301
joshuasmth04 59:a9b21b3d9afc 302 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 303 volflow = massflow/atmoRho;
joshuasmth04 59:a9b21b3d9afc 304 massflowSet = volflowSet*atmoRho;
joshuasmth04 59:a9b21b3d9afc 305 deltaMflow = massflow-massflowSet;
joshuasmth04 59:a9b21b3d9afc 306 //pc.printf("%f,%f,%f,%f,%d,%u,%x\r\n",omronVolt,massflow,massflowSet,deltaMflow,digital_pot_set,digital_pot_set,digital_pot_set);
joshuasmth04 59:a9b21b3d9afc 307 digital_pot_set = (int)(digital_pot_set+(int)((gainFlow*deltaMflow)));
joshuasmth04 59:a9b21b3d9afc 308 if(digital_pot_set>=digitalpotMax) {
joshuasmth04 59:a9b21b3d9afc 309 digital_pot_set = digitalpotMax;
joshuasmth04 59:a9b21b3d9afc 310 } else if(digital_pot_set<=digitalpotMin) {
joshuasmth04 59:a9b21b3d9afc 311 digital_pot_set = digitalpotMin;
joshuasmth04 59:a9b21b3d9afc 312 }
joshuasmth04 59:a9b21b3d9afc 313
joshuasmth04 59:a9b21b3d9afc 314 wait(2);
joshuasmth04 59:a9b21b3d9afc 315 DigPot.writeRegister(digital_pot_set);
joshuasmth04 59:a9b21b3d9afc 316 wait(1);
joshuasmth04 59:a9b21b3d9afc 317
joshuasmth04 59:a9b21b3d9afc 318
joshuasmth04 59:a9b21b3d9afc 319 }
joshuasmth04 59:a9b21b3d9afc 320
joshuasmth04 59:a9b21b3d9afc 321 sampledVol = 0.0;
joshuasmth04 59:a9b21b3d9afc 322 RGB_LED.set_led(0,1,0);
joshuasmth04 59:a9b21b3d9afc 323 refresh_Timer.reset(); //restarts the clock on the timer
joshuasmth04 59:a9b21b3d9afc 324
joshuasmth04 59:a9b21b3d9afc 325 //** end of initalization **//
joshuasmth04 59:a9b21b3d9afc 326
joshuasmth04 59:a9b21b3d9afc 327 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 328 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 329 //---------------------------------------------------------------------------------------------//
joshuasmth04 59:a9b21b3d9afc 330 // Main Control Loop
joshuasmth04 59:a9b21b3d9afc 331
joshuasmth04 59:a9b21b3d9afc 332 while(1) {
joshuasmth04 59:a9b21b3d9afc 333
caseyquinn 57:0b554f7aa9a3 334 RTC.get_time();
caseyquinn 57:0b554f7aa9a3 335 secondsD = (double)RTC.seconds;
joshuasmth04 59:a9b21b3d9afc 336
caseyquinn 57:0b554f7aa9a3 337 if(fmod(secondsD,logInerval)==0) {
joshuasmth04 59:a9b21b3d9afc 338
joshuasmth04 59:a9b21b3d9afc 339 log_data();
joshuasmth04 59:a9b21b3d9afc 340 refresh_Timer.reset(); // resets the timer to zero
joshuasmth04 59:a9b21b3d9afc 341
joshuasmth04 59:a9b21b3d9afc 342 if(RTC.compare(Menu.f_sec, Menu.f_min, Menu.f_hour, Menu.f_day, Menu.f_month, Menu.f_year)) {
joshuasmth04 59:a9b21b3d9afc 343 pbKill = 0; // this is were we shut everything down
joshuasmth04 59:a9b21b3d9afc 344 }
joshuasmth04 41:1fb3e0ac6f87 345
caseyquinn 34:481403146690 346 }
caseyquinn 0:14d46ef4b6cb 347 }
joshuasmth04 59:a9b21b3d9afc 348
caseyquinn 0:14d46ef4b6cb 349 }
caseyquinn 0:14d46ef4b6cb 350
caseyquinn 0:14d46ef4b6cb 351