This is a basic program that provides the necessary BLE service to allow communications with the UPAS

Dependencies:   BLE_API mbed nRF51822 CronoDot EEPROM NCP5623BMUTBG ADS1115 BME280 Calibration_one MCP40D17 SDFileSystem LSM303 SI1145 STC3100

Fork of BLE_Button by Bluetooth Low Energy

Revision:
19:9886f667a62a
Parent:
18:c911a8928d0b
--- a/main.cpp	Tue Dec 08 05:03:24 2015 +0000
+++ b/main.cpp	Tue Dec 08 05:41:19 2015 +0000
@@ -34,7 +34,8 @@
 I2C                 i2c(p22, p20);
 Adafruit_ADS1115    ads(&i2c);
 Calibration         calibrations(7);     //Default serial/calibration if there are no values for the selected option
-
+MCP40D17            DigPot(&i2c);
+BME280              bmesensor(p22, p20);
 
 BLE         ble;
 /*EEPROM ADDRESSING:
@@ -63,6 +64,47 @@
 int RunReady =0;
 
 
+float press;
+float temp;
+float rh;
+
+int uv;
+
+float compass;
+float accel_x;
+float accel_y;
+float accel_z;
+float accel_comp;
+
+int vInReading;
+int vBlowerReading;
+int omronDiff;
+float omronVolt; //V
+int omronReading;
+float atmoRho; //g/L
+
+float massflow; //g/min
+float volflow; //L/min
+float volflowSet = 1.0; //L/min
+int   logInerval = 10; //seconds
+
+float massflowSet;
+float deltaVflow = 0.0;
+float deltaMflow = 0.0;
+float gainFlow;
+float sampledVol; //L, total sampled volume
+
+int digital_pot_setpoint; //min = 0x7F, max = 0x00
+int digital_pot_set;
+int digital_pot_change;
+int digitalpotMax = 127;
+int digitalpotMin = 2;
+
+//char filename[] = "/sd/XXXX0000LOG000000000000---------------.txt";
+char filename[] = "/sd/UPASLOG00.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)
+
+
 const static char     DEVICE_NAME[] = "UPAS"; //Will hold the actual name of the whichever UPAS is being connected to
 static const uint16_t uuid16_list[] = {UPAS_Service::UPAS_SERVICE_UUID}; //Currently a custom 16-bit representation of 128-bit UUID
 
@@ -128,6 +170,61 @@
     }
 }
 
+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.
+    RGB_LED.set_led(0,0,0);
+     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
+    //*****************************************//
+    
+    
+   
+   /* 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
+    //*****************************************//
+    DigPot.writeRegister(digital_pot_setpoint);
+    omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
+    omronVolt = (omronReading*4.096)/(32768*2);
+      
+    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();
+    uint16_t fuel = gasG.getCounter();
+    
+
+    
+    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,", compass);
+        fprintf(fp, "%d," ,uv);
+        fprintf(fp, "%d,%d,%d,%d,%d," ,omronReading, vInReading, vBlowerReading, omronDiff,gasG.getAmps());
+        fprintf(fp, "%d,%d,%d,%1.3f,%1.3f,", gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow);
+    fclose(fp);
+    wait(5);
+    RGB_LED.set_led(0,1,0);
+
+    
+}
+
+
 int main(void)
 {
     Ticker ticker;
@@ -168,6 +265,7 @@
             RGB_LED.set_led(3,0,2);
             blower=1;
             RunReady=0;
+            break;
          }
          if(RunReady==2 && blower ==1){ //Code used to see if one-click run is done.
             blower=0;
@@ -177,7 +275,7 @@
         if(RunReady==10){ //Check to see if app is done with configurations
            blower = 0;
            ble.gap().stopAdvertising();
-           break;
+           //break;
        }
     }
     uint8_t startAndEndTime[12] = {0,}; 
@@ -195,6 +293,32 @@
         RTC.get_time(); 
 
     }
-    pbKill = 0; // this is were we shut everything down
+    //pbKill = 0; // this is were we shut everything down
+    
+    RGB_LED.set_led(1,0,0);
+    //The filename creation isn't working...
+    /*
+      for (uint8_t i = 0; i < 100; i++) {
+      filename[11] = i/10 + '0';
+      filename[12] = i%10 + '0';
+      FILE *fp = fopen(filename, "r");
+      if (fp == NULL) {
+      // only open a new file if it doesn't exist
+      FILE *fp = fopen(filename, "w");
+      fclose(fp);
+      break;  // leave the loop!
+                    } 
+    }
+    */
+    wait(10);
+       RGB_LED.set_led(0,0,1);
+       
+       wait(10);
+    
+    while(1) {
+    
+       
+        log_data();
+        }
 
 }