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:
46:af5f2d7c158c
Parent:
45:1d06ac109d04
Child:
47:3146e8c949a9
--- a/main.cpp	Fri Jun 12 22:09:00 2015 +0000
+++ b/main.cpp	Sat Jun 13 23:16:47 2015 +0000
@@ -63,10 +63,8 @@
 float deltaMflow = 0.0;
 float gainFlow = 100;
 
-int digital_pot_setpoint; //min = 0x7F, max = 0x00
-int digital_pot_setpointCK;
-int digital_pot_set;
-int digital_pot_delta;
+uint8_t digital_pot_setpoint; //min = 0x7F, max = 0x00
+uint8_t digital_pot_set;
 float DP0 = 376.73;
 float DP1 = -512.82;
 float DP2 = 303.77;
@@ -98,6 +96,14 @@
     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
+    
+    if(digital_pot_setpoint>=127){
+        digital_pot_setpoint = 127;
+        }
+    else if(digital_pot_setpoint<=1){
+        digital_pot_setpoint = 1;
+        }
+        
     DigPot.writeRegister(digital_pot_setpoint);
     wait(1);
     blower = 1;
@@ -106,50 +112,62 @@
     sprintf(filename, "/sd/UPAS0010LOG_%02d-%02d-%02d_%02d-%02d-%02d.txt",RTCtime[5],RTCtime[4],RTCtime[3],RTCtime[2],RTCtime[1],RTCtime[0]);
     FILE *fp = fopen(filename, "w");
     fclose(fp);
-    
+    pc.printf("%d\r\n",digital_pot_setpoint); 
                 
             
     wait(10);
     
-   /* omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
+    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));
-    volflow = massflow/atmoRho;
-    massflowSet = volflowSet*atmoRho; 
-    deltaMflow = massflow-massflowSet;                     
-    digital_pot_set = digital_pot_setpoint - (int)floor(0.5*(digital_pot_setpoint-digital_pot_setpointCK));
-    DigPot.writeRegister(digital_pot_set);
+    if(omronVolt<=0.6427){
+        massflow = 0.000127;
+    }else if(omronVolt>=2.3){
+        massflow = 3.548944;
+    }else{
+        massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;}
+        deltaMflow = massflow-massflowSet;    
+        digital_pot_set = digital_pot_setpoint;
+        //pc.printf("%f,%f,%f,%f,%d,%u,%x\r\n",omronVolt,massflow,massflowSet,deltaMflow,digital_pot_set,digital_pot_set,digital_pot_set);                  
+        wait(5);
     
-    wait(5);
-    */
     
     while(abs(deltaMflow)>.015){
       
             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
+            if(omronVolt<=0.7){
+                massflow = 0.2209;
+            }else if(omronVolt>=2.3){
+                massflow = 3.548944;
+            }else{
+            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;
             massflowSet = volflowSet*atmoRho; 
             deltaMflow = massflow-massflowSet;
-            digital_pot_delta = digital_pot_setpointCK-digital_pot_setpoint;
-            digital_pot_set = digital_pot_set+(gainFlow*deltaMflow);
+            //pc.printf("%f,%f,%f,%f,%d,%u,%x\r\n",omronVolt,massflow,massflowSet,deltaMflow,digital_pot_set,digital_pot_set,digital_pot_set);
+            digital_pot_set = (uint8_t)(digital_pot_set+(int8_t)((gainFlow*deltaMflow)));
+            if(digital_pot_set>=127){
+                digital_pot_set = 127;
+            }else if(digital_pot_set<=1){
+                digital_pot_set = 1;
+            }
+                
+            wait(2); 
             DigPot.writeRegister(digital_pot_set);
-
-            wait(2);
+            wait(1);
+            
             
             }
 
-    //wait(5);
+     RGB_LED.set_led(0,1,0);
     
     while(1) {
 
-        RGB_LED.set_led(0,1,0);
+       
         RTCtime = RTC.get_time();   // the way the variable RTCtime works you must save the variables in normal chars or weird things happen
         Seconds = RTCtime[0];//Seconds 
         Minutes = RTCtime[1];//Minutes
@@ -185,18 +203,37 @@
             //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 = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0;
+            if(omronVolt<=0.7){
+                massflow = 0.2209;
+            }else if(omronVolt>=2.3){
+                massflow = 3.548944;
+            }else{
+            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;
             massflowSet = volflowSet*atmoRho; 
             deltaMflow = massflow-massflowSet;
-    
+   
+            //pc.printf("%f,%f,%f,%f,%d,%u,%x\r\n",omronVolt,massflow,massflowSet,deltaMflow,digital_pot_set,digital_pot_set,digital_pot_set);
+            
             if(abs(deltaMflow)>.025){
-            digital_pot_set = digital_pot_set+(gainFlow*deltaMflow);
-            DigPot.writeRegister(digital_pot_set);
-            
-                    }
+                digital_pot_set = (uint8_t)(digital_pot_set+(int8_t)(gainFlow*deltaMflow));
+                        
+                if(digital_pot_set>=127){
+                    digital_pot_set = 127;
+                    RGB_LED.set_led(1,0,0);
+                }else if(digital_pot_set<=1){
+                    digital_pot_set = 1;
+                    RGB_LED.set_led(1,0,0);
+                }else{
+                    RGB_LED.set_led(1,1,0);}
+                    
+                DigPot.writeRegister(digital_pot_set);
+                
+             }else{
+                 RGB_LED.set_led(0,1,0);}
     
             movementsensor.getACCEL();
             movementsensor.getCOMPASS();
@@ -221,7 +258,7 @@
             //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,%f,%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);
+            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,%f,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%f,%f\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);
             fclose(fp);
             //Unmount the filesystem
             sd.unmount();