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:
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 @@
 }
 
 
-