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:
Thu Jul 02 03:42:39 2015 +0000
Revision:
58:7239c2ab2b65
Parent:
57:0b554f7aa9a3
Child:
59:a9b21b3d9afc
Added back in the stop time function which still doesn't work properly

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
caseyquinn 57:0b554f7aa9a3 99 uint32_t start_time = 0; // when should the test start? default is ASAP
caseyquinn 57:0b554f7aa9a3 100 uint32_t stop_time = 0; // when should the test stop? default is 24hr after start
caseyquinn 57:0b554f7aa9a3 101 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 102
caseyquinn 57:0b554f7aa9a3 103 char device_name[] = "---------------";
caseyquinn 57:0b554f7aa9a3 104 char filename[] = "/sd/UPAS0012LOG000000000000---------------.txt";
caseyquinn 7:a24d7156bc02 105 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 106
caseyquinn 57:0b554f7aa9a3 107 /*
joshuasmth04 41:1fb3e0ac6f87 108 char Seconds = 0; //Seconds
joshuasmth04 41:1fb3e0ac6f87 109 char Minutes = 0; //Minutes
joshuasmth04 41:1fb3e0ac6f87 110 char Hour = 0; //Hour
joshuasmth04 41:1fb3e0ac6f87 111 char Date = 0; //Date
joshuasmth04 41:1fb3e0ac6f87 112 char Month = 0; //Month
joshuasmth04 41:1fb3e0ac6f87 113 char Year = 0; //Year
caseyquinn 7:a24d7156bc02 114
caseyquinn 57:0b554f7aa9a3 115
joshuasmth04 41:1fb3e0ac6f87 116 char * RTCtime;
caseyquinn 56:c4d6bdd7c3fb 117 */
caseyquinn 58:7239c2ab2b65 118
caseyquinn 57:0b554f7aa9a3 119 void check_stop() // this checks if it's time to stop and shutdown
caseyquinn 57:0b554f7aa9a3 120 {
caseyquinn 55:f24d70f519cd 121 RTC.get_time();
caseyquinn 57:0b554f7aa9a3 122 if(RTC.our_time >= stop_time) {
caseyquinn 57:0b554f7aa9a3 123 pbKill = 0; // this is were we shut everything down
caseyquinn 57:0b554f7aa9a3 124 }
caseyquinn 57:0b554f7aa9a3 125 stop.detach();
caseyquinn 57:0b554f7aa9a3 126 stop.attach(&check_stop, 5); // checks stop time every 5 seconds
caseyquinn 57:0b554f7aa9a3 127 }
caseyquinn 58:7239c2ab2b65 128
joshuasmth04 41:1fb3e0ac6f87 129
caseyquinn 57:0b554f7aa9a3 130 void log_data()
caseyquinn 57:0b554f7aa9a3 131 {
caseyquinn 57:0b554f7aa9a3 132 RTC.get_time();
caseyquinn 42:fc2f2b9f07ae 133 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
joshuasmth04 41:1fb3e0ac6f87 134 omronVolt = (omronReading*4.096)/(32768*2);
joshuasmth04 41:1fb3e0ac6f87 135
caseyquinn 49:19e828650618 136 if(omronVolt<=omronVMin){
caseyquinn 49:19e828650618 137 massflow = omronMFMin;
caseyquinn 49:19e828650618 138 }else if(omronVolt>=omronVMax){
caseyquinn 49:19e828650618 139 massflow = omronMFMax;
caseyquinn 46:af5f2d7c158c 140 }else{
caseyquinn 46:af5f2d7c158c 141 massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;}
lionberg 52:80480b2fafba 142
joshuasmth04 41:1fb3e0ac6f87 143 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 41:1fb3e0ac6f87 144 volflow = massflow/atmoRho;
lionberg 52:80480b2fafba 145 sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
caseyquinn 42:fc2f2b9f07ae 146 deltaVflow = volflow-volflowSet;
caseyquinn 43:da0708632a21 147 massflowSet = volflowSet*atmoRho;
caseyquinn 43:da0708632a21 148 deltaMflow = massflow-massflowSet;
caseyquinn 46:af5f2d7c158c 149
caseyquinn 44:096dcb50ff08 150 if(abs(deltaMflow)>.025){
caseyquinn 55:f24d70f519cd 151 digital_pot_change = (int)(gainFlow*deltaMflow);
caseyquinn 55:f24d70f519cd 152
caseyquinn 46:af5f2d7c158c 153
caseyquinn 55:f24d70f519cd 154 if(abs(digital_pot_change)>=50){
caseyquinn 56:c4d6bdd7c3fb 155 digital_pot_set = (int)(digital_pot_set+(int)((10.0*deltaMflow)));
caseyquinn 46:af5f2d7c158c 156 RGB_LED.set_led(1,0,0);
caseyquinn 56:c4d6bdd7c3fb 157
caseyquinn 55:f24d70f519cd 158 }else if(digital_pot_change+digital_pot_set>=digitalpotMax&abs(digital_pot_change)<50){
caseyquinn 55:f24d70f519cd 159 digital_pot_set = digitalpotMax;
caseyquinn 55:f24d70f519cd 160 RGB_LED.set_led(1,0,0);
caseyquinn 55:f24d70f519cd 161 }else if(digital_pot_change+digital_pot_set<=digitalpotMin&abs(digital_pot_change)<50){
caseyquinn 55:f24d70f519cd 162 digital_pot_set = digitalpotMin;
caseyquinn 46:af5f2d7c158c 163 RGB_LED.set_led(1,0,0);
caseyquinn 46:af5f2d7c158c 164 }else{
caseyquinn 55:f24d70f519cd 165 digital_pot_set = (digital_pot_set+ digital_pot_change);
caseyquinn 46:af5f2d7c158c 166 RGB_LED.set_led(1,1,0);}
caseyquinn 46:af5f2d7c158c 167
caseyquinn 46:af5f2d7c158c 168 DigPot.writeRegister(digital_pot_set);
caseyquinn 46:af5f2d7c158c 169
caseyquinn 46:af5f2d7c158c 170 }else{
caseyquinn 46:af5f2d7c158c 171 RGB_LED.set_led(0,1,0);}
caseyquinn 43:da0708632a21 172
joshuasmth04 41:1fb3e0ac6f87 173 movementsensor.getACCEL();
joshuasmth04 41:1fb3e0ac6f87 174 movementsensor.getCOMPASS();
joshuasmth04 41:1fb3e0ac6f87 175 accel_x = movementsensor.AccelData.x;
joshuasmth04 41:1fb3e0ac6f87 176 accel_y = movementsensor.AccelData.y;
joshuasmth04 41:1fb3e0ac6f87 177 accel_z = movementsensor.AccelData.z;
lionberg 52:80480b2fafba 178 accel_comp = pow(accel_x,(float)2)+pow(accel_y,(float)2)+pow(accel_z,(float)2)-1.0;
joshuasmth04 41:1fb3e0ac6f87 179 mag_x = movementsensor.MagData.x;
joshuasmth04 41:1fb3e0ac6f87 180 mag_y = movementsensor.MagData.y;
joshuasmth04 41:1fb3e0ac6f87 181 mag_z = movementsensor.MagData.z;
caseyquinn 42:fc2f2b9f07ae 182
joshuasmth04 41:1fb3e0ac6f87 183 vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0
joshuasmth04 41:1fb3e0ac6f87 184 vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0
joshuasmth04 41:1fb3e0ac6f87 185 omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3
joshuasmth04 41:1fb3e0ac6f87 186 press = bmesensor.getPressure();
lionberg 52:80480b2fafba 187 temp = bmesensor.getTemperature()-5.0;
joshuasmth04 41:1fb3e0ac6f87 188 rh = bmesensor.getHumidity();
joshuasmth04 41:1fb3e0ac6f87 189 uv = lightsensor.getUV();
joshuasmth04 41:1fb3e0ac6f87 190 vis = lightsensor.getVIS();
joshuasmth04 41:1fb3e0ac6f87 191 ir = lightsensor.getIR();
lionberg 52:80480b2fafba 192
joshuasmth04 41:1fb3e0ac6f87 193 //Mount the filesystem
caseyquinn 48:b8cbef6aaed2 194 //sd.mount();
joshuasmth04 41:1fb3e0ac6f87 195 FILE *fp = fopen(filename, "a");
caseyquinn 57:0b554f7aa9a3 196 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 41:1fb3e0ac6f87 197 fclose(fp);
joshuasmth04 41:1fb3e0ac6f87 198 //Unmount the filesystem
caseyquinn 48:b8cbef6aaed2 199 //sd.unmount();
caseyquinn 42:fc2f2b9f07ae 200
joshuasmth04 41:1fb3e0ac6f87 201 wait(1);
caseyquinn 57:0b554f7aa9a3 202
caseyquinn 57:0b554f7aa9a3 203 }
caseyquinn 57:0b554f7aa9a3 204
caseyquinn 57:0b554f7aa9a3 205 int main()
caseyquinn 57:0b554f7aa9a3 206 {
caseyquinn 57:0b554f7aa9a3 207
caseyquinn 57:0b554f7aa9a3 208 // Setup and Initialization
caseyquinn 57:0b554f7aa9a3 209 //---------------------------------------------------------------------------------------------//
caseyquinn 57:0b554f7aa9a3 210
caseyquinn 57:0b554f7aa9a3 211 Timer refresh_Timer; //sets up a timer for use in loop; how often do we log data?
caseyquinn 57:0b554f7aa9a3 212 refresh_Timer.start(); //starts the clock on the timer
caseyquinn 57:0b554f7aa9a3 213
caseyquinn 57:0b554f7aa9a3 214 RGB_LED.set_led(0,1,1);
caseyquinn 57:0b554f7aa9a3 215 refresh_Timer.reset(); // resets the timer to zero
caseyquinn 57:0b554f7aa9a3 216
caseyquinn 57:0b554f7aa9a3 217
caseyquinn 57:0b554f7aa9a3 218 Menu.read_menu(E2PROM, refresh_Time, volflowSet, start_time, stop_time, device_name); //Read all data from the EEPROM here
caseyquinn 57:0b554f7aa9a3 219 //reset defaults if the bits in byte 0 say so
caseyquinn 57:0b554f7aa9a3 220 //RTC.get_time();
caseyquinn 57:0b554f7aa9a3 221 //start_time = RTC.our_time; // default start ASAP
caseyquinn 57:0b554f7aa9a3 222 //stop_time = start_time + 86400; // default 24hr run time
caseyquinn 57:0b554f7aa9a3 223 fix_error:
caseyquinn 57:0b554f7aa9a3 224 Menu.Start(pc, E2PROM, RTC, refresh_Time, volflowSet, start_time, stop_time, device_name); //Forces you to open the menu
caseyquinn 57:0b554f7aa9a3 225 Menu.save_menu(E2PROM, refresh_Time, volflowSet, start_time, stop_time, device_name); //Save all data to the EEPROM
caseyquinn 57:0b554f7aa9a3 226
caseyquinn 57:0b554f7aa9a3 227 //Test for errors
caseyquinn 57:0b554f7aa9a3 228 if(RTC.OSF()){ //Don't proceed if the RTC needs reset
caseyquinn 57:0b554f7aa9a3 229 RGB_LED.set_led(1,0,0); // error code/color
caseyquinn 57:0b554f7aa9a3 230 pc.printf("!Reset the time!\r\n");
caseyquinn 57:0b554f7aa9a3 231 goto fix_error;
caseyquinn 57:0b554f7aa9a3 232 }
caseyquinn 58:7239c2ab2b65 233 RTC.get_time();
caseyquinn 57:0b554f7aa9a3 234 if(RTC.our_time > stop_time){ //Don't proceed if it's already time to stop
caseyquinn 57:0b554f7aa9a3 235 RGB_LED.set_led(1,0,0); // error code/color
caseyquinn 57:0b554f7aa9a3 236 pc.printf("!Fix the stop time!\r\n");
caseyquinn 57:0b554f7aa9a3 237 goto fix_error;
caseyquinn 57:0b554f7aa9a3 238 }
caseyquinn 58:7239c2ab2b65 239
caseyquinn 57:0b554f7aa9a3 240
caseyquinn 57:0b554f7aa9a3 241 RGB_LED.set_led(1,1,0);
caseyquinn 57:0b554f7aa9a3 242 while(RTC.our_time < start_time) { // this while waits for the start time by looping until the start time
caseyquinn 57:0b554f7aa9a3 243 RTC.get_time();
caseyquinn 57:0b554f7aa9a3 244 // serial print a count down??
caseyquinn 57:0b554f7aa9a3 245 }
caseyquinn 58:7239c2ab2b65 246 stop.attach(&check_stop, 60); // check if we should shut down every 5 seconds, starting 60s after the start.
caseyquinn 57:0b554f7aa9a3 247
caseyquinn 57:0b554f7aa9a3 248
caseyquinn 57:0b554f7aa9a3 249 if(volflowSet==1.0){
caseyquinn 57:0b554f7aa9a3 250 gainFlow = 100;}
caseyquinn 57:0b554f7aa9a3 251 else if(volflowSet==2.0){
caseyquinn 57:0b554f7aa9a3 252 gainFlow = 25;}
caseyquinn 57:0b554f7aa9a3 253 else{
caseyquinn 57:0b554f7aa9a3 254 gainFlow = 25;}
caseyquinn 57:0b554f7aa9a3 255
caseyquinn 57:0b554f7aa9a3 256 RGB_LED.set_led(1,0,0);
caseyquinn 57:0b554f7aa9a3 257 press = bmesensor.getPressure();
caseyquinn 57:0b554f7aa9a3 258 temp = bmesensor.getTemperature();
caseyquinn 57:0b554f7aa9a3 259 rh = bmesensor.getHumidity();
caseyquinn 57:0b554f7aa9a3 260
caseyquinn 57:0b554f7aa9a3 261 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 262 massflowSet = volflowSet*atmoRho;
caseyquinn 57:0b554f7aa9a3 263 //Digtal pot tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
caseyquinn 57:0b554f7aa9a3 264 digital_pot_setpoint = (int)floor(DP4*pow(massflowSet,4)+DP3*pow(massflowSet,3)+DP2*pow(massflowSet,2)+DP1*massflowSet+DP0); //min = 0x7F, max = 0x00
caseyquinn 57:0b554f7aa9a3 265
caseyquinn 57:0b554f7aa9a3 266 if(digital_pot_setpoint>=digitalpotMax){
caseyquinn 57:0b554f7aa9a3 267 digital_pot_setpoint = digitalpotMax;
caseyquinn 57:0b554f7aa9a3 268 }
caseyquinn 57:0b554f7aa9a3 269 else if(digital_pot_setpoint<=digitalpotMin){
caseyquinn 57:0b554f7aa9a3 270 digital_pot_setpoint = digitalpotMin;
caseyquinn 57:0b554f7aa9a3 271 }
caseyquinn 57:0b554f7aa9a3 272
caseyquinn 57:0b554f7aa9a3 273 DigPot.writeRegister(digital_pot_setpoint);
caseyquinn 57:0b554f7aa9a3 274 wait(1);
caseyquinn 57:0b554f7aa9a3 275 blower = 1;
caseyquinn 57:0b554f7aa9a3 276
caseyquinn 57:0b554f7aa9a3 277 RTC.get_time();
caseyquinn 57:0b554f7aa9a3 278 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 279 FILE *fp = fopen(filename, "w");
caseyquinn 57:0b554f7aa9a3 280 fclose(fp);
caseyquinn 57:0b554f7aa9a3 281 //pc.printf("%d\r\n",digital_pot_setpoint);
caseyquinn 57:0b554f7aa9a3 282
caseyquinn 57:0b554f7aa9a3 283 //---------------------------------------------------------------------------------------------//
caseyquinn 57:0b554f7aa9a3 284 //Following lines are needed to enter into the initiallization flow control loop
caseyquinn 57:0b554f7aa9a3 285
caseyquinn 57:0b554f7aa9a3 286 wait(10);
caseyquinn 57:0b554f7aa9a3 287
caseyquinn 57:0b554f7aa9a3 288 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 57:0b554f7aa9a3 289 omronVolt = (omronReading*4.096)/(32768*2);
caseyquinn 57:0b554f7aa9a3 290 if(omronVolt<=omronVMin){
caseyquinn 57:0b554f7aa9a3 291 massflow = omronMFMin;
caseyquinn 57:0b554f7aa9a3 292 }else if(omronVolt>=omronVMax){
caseyquinn 57:0b554f7aa9a3 293 massflow = omronMFMax;
caseyquinn 57:0b554f7aa9a3 294 }else{
caseyquinn 57:0b554f7aa9a3 295 massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;}
caseyquinn 57:0b554f7aa9a3 296 deltaMflow = massflow-massflowSet;
caseyquinn 57:0b554f7aa9a3 297 digital_pot_set = digital_pot_setpoint;
caseyquinn 57:0b554f7aa9a3 298 wait(5);
caseyquinn 57:0b554f7aa9a3 299
caseyquinn 57:0b554f7aa9a3 300 //---------------------------------------------------------------------------------------------//
caseyquinn 57:0b554f7aa9a3 301 //Sets the flow withen +-1.5% of the desired flow rate based on mass flow
caseyquinn 57:0b554f7aa9a3 302
caseyquinn 57:0b554f7aa9a3 303 while(abs(deltaMflow)>.015){
caseyquinn 57:0b554f7aa9a3 304
caseyquinn 57:0b554f7aa9a3 305 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
caseyquinn 57:0b554f7aa9a3 306 omronVolt = (omronReading*4.096)/(32768*2);
caseyquinn 57:0b554f7aa9a3 307 //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
caseyquinn 57:0b554f7aa9a3 308 if(omronVolt<=omronVMin){
caseyquinn 57:0b554f7aa9a3 309 massflow = omronMFMin;
caseyquinn 57:0b554f7aa9a3 310 }else if(omronVolt>=omronVMax){
caseyquinn 57:0b554f7aa9a3 311 massflow = omronMFMax;
caseyquinn 57:0b554f7aa9a3 312 }else{
caseyquinn 57:0b554f7aa9a3 313 massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;}
caseyquinn 57:0b554f7aa9a3 314
caseyquinn 57:0b554f7aa9a3 315 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 316 volflow = massflow/atmoRho;
caseyquinn 57:0b554f7aa9a3 317 massflowSet = volflowSet*atmoRho;
caseyquinn 57:0b554f7aa9a3 318 deltaMflow = massflow-massflowSet;
caseyquinn 57:0b554f7aa9a3 319 //pc.printf("%f,%f,%f,%f,%d,%u,%x\r\n",omronVolt,massflow,massflowSet,deltaMflow,digital_pot_set,digital_pot_set,digital_pot_set);
caseyquinn 57:0b554f7aa9a3 320 digital_pot_set = (int)(digital_pot_set+(int)((gainFlow*deltaMflow)));
caseyquinn 57:0b554f7aa9a3 321 if(digital_pot_set>=digitalpotMax){
caseyquinn 57:0b554f7aa9a3 322 digital_pot_set = digitalpotMax;
caseyquinn 57:0b554f7aa9a3 323 }else if(digital_pot_set<=digitalpotMin){
caseyquinn 57:0b554f7aa9a3 324 digital_pot_set = digitalpotMin;
caseyquinn 57:0b554f7aa9a3 325 }
caseyquinn 57:0b554f7aa9a3 326
caseyquinn 57:0b554f7aa9a3 327 wait(2);
caseyquinn 57:0b554f7aa9a3 328 DigPot.writeRegister(digital_pot_set);
caseyquinn 57:0b554f7aa9a3 329 wait(1);
caseyquinn 57:0b554f7aa9a3 330
caseyquinn 57:0b554f7aa9a3 331
caseyquinn 57:0b554f7aa9a3 332 }
caseyquinn 57:0b554f7aa9a3 333
caseyquinn 57:0b554f7aa9a3 334 sampledVol = 0.0;
caseyquinn 57:0b554f7aa9a3 335 RGB_LED.set_led(0,1,0);
caseyquinn 57:0b554f7aa9a3 336 refresh_Timer.reset(); //restarts the clock on the timer
caseyquinn 57:0b554f7aa9a3 337
caseyquinn 57:0b554f7aa9a3 338 //** end of initalization **//
caseyquinn 57:0b554f7aa9a3 339
caseyquinn 57:0b554f7aa9a3 340 //---------------------------------------------------------------------------------------------//
caseyquinn 57:0b554f7aa9a3 341 //---------------------------------------------------------------------------------------------//
caseyquinn 57:0b554f7aa9a3 342 //---------------------------------------------------------------------------------------------//
caseyquinn 57:0b554f7aa9a3 343 // Main Control Loop
caseyquinn 57:0b554f7aa9a3 344
caseyquinn 57:0b554f7aa9a3 345 while(1) {
caseyquinn 57:0b554f7aa9a3 346
caseyquinn 57:0b554f7aa9a3 347 RTC.get_time();
caseyquinn 57:0b554f7aa9a3 348 secondsD = (double)RTC.seconds;
caseyquinn 57:0b554f7aa9a3 349
caseyquinn 57:0b554f7aa9a3 350 if(fmod(secondsD,logInerval)==0) {
caseyquinn 57:0b554f7aa9a3 351
caseyquinn 57:0b554f7aa9a3 352 log_data();
caseyquinn 57:0b554f7aa9a3 353 refresh_Timer.reset(); // resets the timer to zero
caseyquinn 57:0b554f7aa9a3 354
joshuasmth04 41:1fb3e0ac6f87 355
caseyquinn 34:481403146690 356 }
caseyquinn 0:14d46ef4b6cb 357 }
caseyquinn 57:0b554f7aa9a3 358
caseyquinn 0:14d46ef4b6cb 359 }
caseyquinn 0:14d46ef4b6cb 360
caseyquinn 0:14d46ef4b6cb 361