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

Revision:
50:dddf01867e85
Parent:
42:fc2f2b9f07ae
--- a/main.cpp	Thu Jun 11 23:11:27 2015 +0000
+++ b/main.cpp	Fri Jun 12 02:53:12 2015 +0000
@@ -62,10 +62,15 @@
 float deltaVflow = 0.0;
 float deltaMflow = 0.0;
 float gainFlow = 0.5;
+float digital_pot_maxflow = 2;
+float digital_pot_minflow = 127;
+float delta_tol = 0.05;
 
+float digital_pot_startpoint = 75;
 int digital_pot_setpoint; //min = 0x7F, max = 0x00
 int digital_pot_setpointCK;
 int digital_pot_delta;
+float t_controlstep = 1;
 float DP0 = 285.74;
 float DP1 = -461.55;
 float DP2 = 352.54;
@@ -96,11 +101,13 @@
     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(DP4*pow(massflowSet,4)+DP3*pow(massflowSet,3)+DP2*pow(massflowSet,2)+DP1*massflowSet+DP0); //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
+    digital_pot_setpoint = digital_pot_startpoint;
 
     DigPot.writeRegister(digital_pot_setpoint);
     wait(1);
     blower = 1;
+    wait(1);
 
     RTCtime = RTC.get_time();
     sprintf(filename, "/sd/UPAS0010LOG_%02d-%02d-%02d_%02d-%02d-%02d.txt",RTCtime[5],RTCtime[4],RTCtime[3],RTCtime[2],RTCtime[1],RTCtime[0]);
@@ -148,16 +155,11 @@
             //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 = 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;
             deltaVflow = volflow-volflowSet;
-
-            /*if(abs(deltaflow)>.05*volflowSet){
-                digital_pot_setpoint = f(Vsetpoint);
-                DigPot.writeRegister(digital_pot_setpoint);
-                }
-            */
+            massflowSet = volflowSet*atmoRho; 
+            deltaMflow = massflow-massflowSet;
             movementsensor.getACCEL();
             movementsensor.getCOMPASS();
             accel_x = movementsensor.AccelData.x;
@@ -177,7 +179,6 @@
             vis = lightsensor.getVIS();
             ir = lightsensor.getIR();
 
-
             //Mount the filesystem
             sd.mount();
             FILE *fp = fopen(filename, "a");
@@ -186,25 +187,94 @@
             //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);
+            //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;
+            //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));
+
                     
-                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;
+                if(deltaVflow>delta_tol*10){
+                    digital_pot_setpoint = digital_pot_setpoint+20;
+                    DigPot.writeRegister(digital_pot_setpoint);
+                    wait(1.5);
+                    omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
+                    omronVolt = (omronReading*4.096)/(32768*2);
+                    massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;
+                    volflow = massflow/atmoRho;
+                    deltaVflow = volflow-volflowSet;
+                    }
+                if(deltaVflow>delta_tol*5){
+                    digital_pot_setpoint = digital_pot_setpoint+8;
+                    DigPot.writeRegister(digital_pot_setpoint);
+                    wait(1);
+                    omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
+                    omronVolt = (omronReading*4.096)/(32768*2);
+                    massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;
+                    volflow = massflow/atmoRho;
+                    deltaVflow = volflow-volflowSet;
+                    }
+                if(deltaVflow>delta_tol*2){
+                    digital_pot_setpoint = digital_pot_setpoint+4;
+                    DigPot.writeRegister(digital_pot_setpoint);
+                    wait(1);
+                    omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
+                    omronVolt = (omronReading*4.096)/(32768*2);
+                    massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;
+                    volflow = massflow/atmoRho;
+                    deltaVflow = volflow-volflowSet;
+                    }
+                if(deltaVflow>delta_tol){
+                    digital_pot_setpoint = digital_pot_setpoint+1;
                     DigPot.writeRegister(digital_pot_setpoint);
-                    
-                
+                    wait(0.5);
+                    omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
+                    omronVolt = (omronReading*4.096)/(32768*2);
+                    massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;
+                    volflow = massflow/atmoRho;
+                    deltaVflow = volflow-volflowSet;
+                    }
+                if(deltaVflow<-delta_tol*10){
+                    digital_pot_setpoint = digital_pot_setpoint+20;
+                    DigPot.writeRegister(digital_pot_setpoint);
+                    wait(1.5);
+                    omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
+                    omronVolt = (omronReading*4.096)/(32768*2);
+                    massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;
+                    volflow = massflow/atmoRho;
+                    deltaVflow = volflow-volflowSet;
                     }
-
-            wait(1);
-
+                if(deltaVflow<-delta_tol*5){
+                    digital_pot_setpoint = digital_pot_setpoint+8;
+                    DigPot.writeRegister(digital_pot_setpoint);
+                    wait(1);
+                    omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
+                    omronVolt = (omronReading*4.096)/(32768*2);
+                    massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;
+                    volflow = massflow/atmoRho;
+                    deltaVflow = volflow-volflowSet;
+                    }
+                if(deltaVflow<-delta_tol*2){
+                    digital_pot_setpoint = digital_pot_setpoint+4;
+                    DigPot.writeRegister(digital_pot_setpoint);
+                    wait(1);
+                    omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
+                    omronVolt = (omronReading*4.096)/(32768*2);
+                    massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;
+                    volflow = massflow/atmoRho;
+                    deltaVflow = volflow-volflowSet;
+                    }
+                if(deltaVflow<-delta_tol){
+                    digital_pot_setpoint = digital_pot_setpoint+1;
+                    DigPot.writeRegister(digital_pot_setpoint);
+                    wait(0.5);
+                    omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
+                    omronVolt = (omronReading*4.096)/(32768*2);
+                    massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;
+                    volflow = massflow/atmoRho;
+                    deltaVflow = volflow-volflowSet;
+                    }
         }
     }
 }