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
Diff: main.cpp
- Revision:
- 42:fc2f2b9f07ae
- Parent:
- 41:1fb3e0ac6f87
- Child:
- 43:da0708632a21
- Child:
- 50:dddf01867e85
--- a/main.cpp Tue Jun 09 20:54:03 2015 +0000 +++ b/main.cpp Thu Jun 11 23:11:27 2015 +0000 @@ -50,15 +50,29 @@ int omronReading; float omronVolt; //V float atmoRho; //g/L +float MF0 = 7.8618; +float MF1 = -33.538; +float MF2 = 53.545; +float MF3 = -34.801; +float MF4 = 8.3314; float massflow; //g/min float volflow; //L/min float volflowSet = 1.0; //L/min float massflowSet; -float deltaflow; +float deltaVflow = 0.0; +float deltaMflow = 0.0; +float gainFlow = 0.5; int digital_pot_setpoint; //min = 0x7F, max = 0x00 +int digital_pot_setpointCK; +int digital_pot_delta; +float DP0 = 285.74; +float DP1 = -461.55; +float DP2 = 352.54; +float DP3 = -133.93; +float DP4 = 19.476; + char filename[] = "/sd/UPAS0010LOG000000000000.txt"; - 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) char Seconds = 0; //Seconds @@ -82,7 +96,7 @@ 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)); massflowSet = volflowSet*atmoRho; //Digtal pot tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx - digital_pot_setpoint = (int)floor(9.2456*pow(massflowSet,4)-89.538*pow(massflowSet,3)+329.03*pow(massflowSet,2)-566.12*massflowSet+412.72); //min = 0x7F, max = 0x00 + digital_pot_setpoint = (int)floor(DP4*pow(massflowSet,4)+DP3*pow(massflowSet,3)+DP2*pow(massflowSet,2)+DP1*massflowSet+DP0); //min = 0x7F, max = 0x00 DigPot.writeRegister(digital_pot_setpoint); wait(1); @@ -93,7 +107,8 @@ FILE *fp = fopen(filename, "w"); fclose(fp); - + wait(5); + while(1) { RGB_LED.set_led(0,1,0); @@ -106,8 +121,10 @@ Year = RTCtime[5];//Year secondsD = (double)RTCtime[0]; - + if(fmod(secondsD,10)==0) { + + omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V omronVolt = (omronReading*4.096)/(32768*2); //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet @@ -130,11 +147,11 @@ //UPAS0009=-2.662*L14^4+16.421*L14^3-35.797*L14^2+34.579*L14-11.77 //massflow = -2.662*pow(omronVolt,(float)4)+16.421*pow(omronVolt,(float)3)-35.797*pow(omronVolt,(float)2)+34.579*omronVolt-11.77; //UPAS0010=-3.6933*L14^4+21.633*L14^3-44.694*L14^2+40.387*L14-12.82 - massflow = -3.6933*pow(omronVolt,(float)4)+21.633*pow(omronVolt,(float)3)-44.694*pow(omronVolt,(float)2)+40.387*omronVolt-12.82; + massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0; 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)); volflow = massflow/atmoRho; - deltaflow = volflow-volflowSet; + deltaVflow = volflow-volflowSet; /*if(abs(deltaflow)>.05*volflowSet){ digital_pot_setpoint = f(Vsetpoint); @@ -149,7 +166,7 @@ mag_x = movementsensor.MagData.x; mag_y = movementsensor.MagData.y; mag_z = movementsensor.MagData.z; - omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V + vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0 vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0 omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3 @@ -164,10 +181,27 @@ //Mount the filesystem sd.mount(); FILE *fp = fopen(filename, "a"); - fprintf(fp, "%02d,%02d,%02d,%02d,%02d,%02d,%f,%f,%f,%f,%2.2f,%04.2f,%2.2f,%1.4f,%1.4f,%1.4f,%.0f,%.0f,%.0f,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\r\n", Year,Month,Date,Hour,Minutes,Seconds,omronVolt,atmoRho,volflow,massflow,temp,press,rh,accel_x, accel_y, accel_z, mag_x, mag_y, mag_z, uv, vis, ir, omronReading,vInReading, vBlowerReading, omronDiff, gasG.getAmps(), gasG.getVolts(), gasG.getCharge(), digital_pot_setpoint); + fprintf(fp, "%02d,%02d,%02d,%02d,%02d,%02d,%f,%f,%f,%f,%2.2f,%04.2f,%2.2f,%1.4f,%1.4f,%1.4f,%.0f,%.0f,%.0f,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%f,%f,%d\r\n", Year,Month,Date,Hour,Minutes,Seconds,omronVolt,atmoRho,volflow,massflow,temp,press,rh,accel_x, accel_y, accel_z, mag_x, mag_y, mag_z, uv, vis, ir, omronReading,vInReading, vBlowerReading, omronDiff, gasG.getAmps(), gasG.getVolts(), gasG.getCharge(), digital_pot_setpoint,deltaMflow,deltaVflow,digital_pot_delta); fclose(fp); //Unmount the filesystem sd.unmount(); + + omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V + omronVolt = (omronReading*4.096)/(32768*2); + //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx + massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0; + digital_pot_setpointCK = (int)floor(DP4*pow(massflow,4)+DP3*pow(massflow,3)+DP2*pow(massflow,2)+DP1*massflow+DP0); //min = 0x7F, max = 0x00 + 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)); + massflowSet = volflowSet*atmoRho; + deltaMflow = massflow-massflowSet; + + if(abs(deltaMflow)>.05){ + digital_pot_delta = (int)floor(gainFlow*(digital_pot_setpointCK-digital_pot_setpoint)); + digital_pot_setpoint = digital_pot_setpoint+digital_pot_delta; + DigPot.writeRegister(digital_pot_setpoint); + + + } wait(1); @@ -176,4 +210,3 @@ } -