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:
Thu Jul 02 19:16:12 2015 +0000
Revision:
59:a9b21b3d9afc
Parent:
58:7239c2ab2b65
Child:
60:5913d77c8a4a
Fixed start and stop issues, code should now start and stop at the correct time. Also now has option for duty cycle. ; Only known bug is the i2c communication bugging out after a shutdown, power cycle to fix.

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