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:
112:fd14d51e3493
Parent:
111:5f2ba5f1a468
Child:
113:846f67efaa80
--- a/main.cpp	Fri Feb 12 03:46:24 2016 +0000
+++ b/main.cpp	Wed Feb 17 02:06:46 2016 +0000
@@ -178,33 +178,20 @@
     
 }
 
-
+int r =0;
+int g =1;
+int b=1;
 void log_data()
 {
-    logg.detach();
-    logg.attach(&log_data, logInerval);     // reading and logging data must take significintly less than 0.5s. This can be increased.
-
+    //logg.detach();
+    //logg.attach(&log_data, logInerval);     // reading and logging data must take significintly less than 0.5s. This can be increased.
+    if(r==0) r=1;
+    else r=0;
+    RGB_LED.set_led(r,g,b);
+    wait(0.5);
     
     RTC.get_time();
     
-    //*****************************************//
-    //RTC.get_time(); //debug
-    //pc.printf("%02d:%02d:%02d on %d/%d/%d before fmod  \r\n",RTC.hour, RTC.minutes, RTC.seconds, RTC.month, RTC.date, RTC.year);//debug
-    //*****************************************//
-    secondsD = RTC.seconds;
-    /*
-    while(fmod(secondsD,logInerval)!=0 || floor(secondsD)==floor(lastsecondD)) {
-       //pc.printf("%f, %f\r\n", floor(secondsD), floor(lastsecondD)); 
-        RTC.get_time();
-        secondsD = RTC.seconds;
-        wait_ms(100);
-    }
-    lastsecondD = secondsD;
-    //
-    //RTC.get_time(); //debug
-    //pc.printf("%02d:%02d:%02d on %d/%d/%d after fmod \r\n",RTC.hour, RTC.minutes, RTC.seconds, RTC.month, RTC.date, RTC.year);//debug
-    //
-    */
     omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
     omronVolt = (omronReading*4.096)/(32768*2);
 
@@ -280,20 +267,6 @@
     fprintf(fp, "%d,%d,%d,%1.3f,%1.3f\r\n", gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow);
     fclose(fp);
     
-    /*
-    FILE *fp = fopen(filename, "a");
-    fprintf(fp, "%02d,%02d,%02d,%02d,%02d,%02d,",RTC.year, RTC.month,RTC.date,RTC.hour,RTC.minutes,RTC.seconds);
-    fprintf(fp, "%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,", omronVolt,massflow,temp,press,rh,atmoRho);
-    fprintf(fp, "%1.3f,%5.1f,%1.1f,%1.1f,%1.1f,%1.1f,", volflow, sampledVol, accel_x, accel_y, accel_z, accel_comp);
-    fprintf(fp, "%.1f,%.1f,%.1f,%.3f,%.3f,%.3f,%.1f,", angle_x,angle_y,angle_z,mag_x, mag_y, mag_z,compass);
-    fprintf(fp, "%d,%d,%d,%d,%d,%d," ,uv,omronReading, vInReading, vBlowerReading, omronDiff,gasG.getAmps());
-    fprintf(fp, "%d,%d,%d,%1.3f,%1.3f\r\n", gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow);
-    //fprintf(fp, "%d,%f,", serial_num, volflowSet);
-    //fprintf(fp, "%f,%f,%f,%f,%f\r\n", calibrations.MF4, calibrations.MF3, calibrations.MF2, calibrations.MF1, calibrations.MF0); 
-    fclose(fp);
-    //wait_ms(5);
-    */
-    
 }
 /*EEPROM ADDRESSING:
     0:Status bit-Unused
@@ -406,14 +379,6 @@
                pbKill = 0;
            }
         }
-        
-    //}else{
-//        RunReady = 12;
-//    }
-    
-    //If 24 hour mode was set by app, make sure to clear it for next app cycle...commented out for now
-   // presetRunModeCheck[0] = 0x01;
-//    E2PROM.write(0x00033,presetRunModeCheck,1);
     
     E2PROM.read(0x00015, startAndEndTime, 12); //Grab start and end times from EEPROM
     while(!RTC.compare(startAndEndTime[0], startAndEndTime[1], startAndEndTime[2], startAndEndTime[3], startAndEndTime[4], startAndEndTime[5])) {  // this while waits for the start time by looping until the start time
@@ -424,69 +389,6 @@
     }
     
     
-    //Commented out to prevent mem issues
-    //MARK: editting 24 hour mode code here
-    //if(RunReady == 12) {
-//        RTC.get_time();
-//        startAndEndTime[6] = RTC.seconds;
-//        startAndEndTime[7] = RTC.minutes;
-//        startAndEndTime[8] = RTC.hour;
-//        if(RTC.month == 1 | RTC.month == 3 | RTC.month == 5 | RTC.month == 7 | RTC.month == 8 | RTC.month == 10) {
-//            if(RTC.date == 31) {
-//                startAndEndTime[9] = 1;
-//                startAndEndTime[10] = RTC.month +1;
-//                startAndEndTime[11] = RTC.year;
-//            } else {
-//                startAndEndTime[9] = RTC.date+1;
-//                startAndEndTime[10] = RTC.month;
-//                startAndEndTime[11] = RTC.year;
-//            }
-//        } else if(RTC.month == 4 | RTC.month == 6 | RTC.month == 9 | RTC.month == 11) {
-//            if(RTC.date == 30) {
-//                startAndEndTime[9] = 1;
-//                startAndEndTime[10] = RTC.month +1;
-//                startAndEndTime[11] = RTC.year;
-//            } else {
-//                startAndEndTime[9] = RTC.date+1;
-//                startAndEndTime[10] = RTC.month;
-//                startAndEndTime[11] = RTC.year;
-//            }
-//        } else if(RTC.month == 2) {
-//            if(RTC.year == 16 | RTC.year == 20 | RTC.year == 24| RTC.year == 28) {
-//                if(RTC.date == 29) {
-//                    startAndEndTime[9] = 1;
-//                    startAndEndTime[10] = RTC.month +1;
-//                    startAndEndTime[11] = RTC.year;
-//                } else {
-//                    startAndEndTime[9] = RTC.date+1;
-//                    startAndEndTime[10] = RTC.month;
-//                    startAndEndTime[11] = RTC.year;
-//                }
-//            } else {
-//                if(RTC.date == 28) {
-//                    startAndEndTime[9] = 1;
-//                    startAndEndTime[10] = RTC.month +1;
-//                    startAndEndTime[11] = RTC.year;
-//                } else {
-//                    startAndEndTime[9] = RTC.date+1;
-//                    startAndEndTime[10] = RTC.month;
-//                    startAndEndTime[11] = RTC.year;
-//                }
-//            }
-//        } else if(RTC.month == 12) {
-//            if(RTC.date == 31) {
-//                startAndEndTime[9] = 1;
-//                startAndEndTime[10] = 1;
-//                startAndEndTime[11] = RTC.year+1;
-//            } else {
-//                startAndEndTime[9] = RTC.date+1;
-//                startAndEndTime[10] = RTC.month;
-//                startAndEndTime[11] = RTC.year;
-//            }
-//        }
-//    }
-    //MARK: end of 24 hour mode code
-    
     RGB_LED.set_led(0,1,0);
     
     //Get the proper serial number
@@ -505,7 +407,7 @@
     RunReady = 0;
 
 
-    stop.attach(&check_stop, 30);    // check if we should shut down every 9 seconds, starting 60s after the start.
+    //stop.attach(&check_stop, 30);    // check if we should shut down every 9 seconds, starting 60s after the start.
 
     //Use the flow rate value stored in eeprom
     E2PROM.read(0x00010,flowRateOriginal,4);
@@ -605,14 +507,94 @@
     RGB_LED.set_led(0,1,0);
 
 
-
-    //** end of initalization **//
-    //---------------------------------------------------------------------------------------------//
-    //---------------------------------------------------------------------------------------------//
-    // Main Control Loop
-
-
-    logg.attach(&log_data, logInerval); // uses callbacks or block Interrupts for anything that uses i2c
+    while(1){
+        if(RTC.compare(startAndEndTime[6], startAndEndTime[7], startAndEndTime[8], startAndEndTime[9], startAndEndTime[10], startAndEndTime[11])) 
+            pbKill = 0; // this is were we shut everything down
+            
+        wait(logInerval - 0.2);
+//        if(r==0) r=1;
+//        else r=0;
+//        RGB_LED.set_led(r,g,b);
+//        wait(0.5);
+        
+        RTC.get_time();
+        
+        omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
+        omronVolt = (omronReading*4.096)/(32768*2);
+    
+        if(omronVolt<=calibrations.omronVMin) {
+            massflow = calibrations.omronMFMin;
+        } else if(omronVolt>=calibrations.omronVMax) {
+            massflow = calibrations.omronMFMax;
+        } else {
+            massflow = calibrations.MF4*pow(omronVolt,(float)4)+calibrations.MF3*pow(omronVolt,(float)3)+calibrations.MF2*pow(omronVolt,(float)2)+calibrations.MF1*omronVolt+calibrations.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;
+        sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow);
+        deltaVflow = volflow-volflowSet;
+        massflowSet = volflowSet*atmoRho;
+        deltaMflow = massflow-massflowSet;
+        if(abs(deltaMflow)>.025) {
+            digital_pot_change = (int)(gainFlow*deltaMflow);
+    
+    
+            if(abs(digital_pot_change)>=50) {
+                digital_pot_set = (int)(digital_pot_set+(int)((10.0*deltaMflow)));
+                RGB_LED.set_led(1,0,0);
+            }   else {
+                digital_pot_set = (digital_pot_set+ digital_pot_change);
+                RGB_LED.set_led(1,1,0);
+            }
+            
+                    if(digital_pot_set>=digitalpotMax) {
+                        digital_pot_set = digitalpotMax;
+                        RGB_LED.set_led(1,0,0);
+                    } else if(digital_pot_set<=digitalpotMin) {
+                        digital_pot_set = digitalpotMin;
+                        RGB_LED.set_led(1,0,0);
+                    }
+    
+    
+            DigPot.writeRegister(digital_pot_set);
+    
+        } else {
+            RGB_LED.set_led(0,1,0);
+        }
+        
+        movementsensor.getACCEL();
+        movementsensor.getCOMPASS();
+        compass = movementsensor.getCOMPASS_HEADING();
+        accel_x = movementsensor.AccelData.x;
+        accel_y = movementsensor.AccelData.y;
+        accel_z = movementsensor.AccelData.z;
+        accel_comp = pow(accel_x,(float)2)+pow(accel_y,(float)2)+pow(accel_z,(float)2)-1.0;
+        mag_x = movementsensor.MagData.x;
+        mag_y = movementsensor.MagData.y;
+        mag_z = movementsensor.MagData.z;
+        
+        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
+        press = bmesensor.getPressure();
+        temp = bmesensor.getTemperature()-5.0;
+        rh = bmesensor.getHumidity();
+        uv =  lightsensor.getUV();
+        vis = lightsensor.getVIS();
+        ir = lightsensor.getIR();
+       
+        
+        FILE *fp = fopen(filename, "a");
+        fprintf(fp, "%02d,%02d,%02d,%02d,%02d,%02d,",RTC.year, RTC.month,RTC.date,RTC.hour,RTC.minutes,RTC.seconds);
+        fprintf(fp, "%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,", omronVolt,massflow,temp,press,rh,atmoRho);
+        fprintf(fp, "%1.3f,%5.1f,%1.1f,%1.1f,%1.1f,%1.1f,", volflow, sampledVol, accel_x, accel_y, accel_z, accel_comp);
+        fprintf(fp, "%.1f,%.1f,%.1f,%.3f,%.3f,%.3f,%.1f,", angle_x,angle_y,angle_z,mag_x, mag_y, mag_z,compass);
+        fprintf(fp, "%d,%d,%d,%d,%d,%d," ,uv,omronReading, vInReading, vBlowerReading, omronDiff,gasG.getAmps());
+        fprintf(fp, "%d,%d,%d,%1.3f,%1.3f\r\n", gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow);
+        fclose(fp);
+        
+    }