Program to log data related to AOD UPAS road emissions work.

Dependencies:   ADS1115 BME280 BMP280 CAM_M8 NCP5623BMUTBG SDFileSystem mbed

Files at this revision

API Documentation at this revision

Comitter:
eawendtjr
Date:
Thu Dec 28 19:56:25 2017 +0000
Commit message:
Logging data for road emissions evaluation at 1Hz.

Changed in this revision

ADS1115.lib Show annotated file Show diff for this revision Revisions of this file
BME280.lib Show annotated file Show diff for this revision Revisions of this file
BMP280.lib Show annotated file Show diff for this revision Revisions of this file
CAM_M8.lib Show annotated file Show diff for this revision Revisions of this file
NCP5623BMUTBG.lib Show annotated file Show diff for this revision Revisions of this file
SDFileSystem.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ADS1115.lib	Thu Dec 28 19:56:25 2017 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/Vockens-Group-Sensors/code/ADS1115/#89317f1dbfc3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BME280.lib	Thu Dec 28 19:56:25 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/Vockens-Group-Sensors/code/BME280/#1627c7bed865
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/BMP280.lib	Thu Dec 28 19:56:25 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/Vockens-Group-Sensors/code/BMP280/#38e0a7c4fc2a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CAM_M8.lib	Thu Dec 28 19:56:25 2017 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/Vockens-Group-Sensors/code/CAM_M8/#b6d9095be7fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/NCP5623BMUTBG.lib	Thu Dec 28 19:56:25 2017 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/Vockens-Group-Sensors/code/NCP5623BMUTBG/#c77e17c3a863
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SDFileSystem.lib	Thu Dec 28 19:56:25 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/neilt6/code/SDFileSystem/#3fa5eaf48e81
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Dec 28 19:56:25 2017 +0000
@@ -0,0 +1,251 @@
+#include "mbed.h"
+#include "NCP5623BMUTBG.h"
+#include "CAM_M8.h"
+#include "SDFileSystem.h"
+#include "Adafruit_ADS1015.h"
+#include "BME280.h"
+#include "BMP280.h"
+
+/////////////////////////////////////////////
+//Define core buses and pin states.
+/////////////////////////////////////////////
+I2C                 i2c(PB_9, PB_8);//(D14, D15); SDA,SCL
+Serial              pc(USBTX, USBRX);
+DigitalOut          pumps(PA_9, 0);//(D8, 0);
+DigitalOut          pbKill(PC_12, 1); // Digital input pin that conncect to the LTC2950 battery charger used to shutdown the UPAS 
+DigitalIn           nINT(PA_15); //Connected but currently unused is a digital ouput pin from LTC2950 battery charger. http://cds.linear.com/docs/en/datasheet/295012fd.pdf
+NCP5623BMUTBG       RGB_LED(PB_9, PB_8);    //(D14, D15);
+
+/////////////////////////////////////////////
+//RN4677 BT/BLE Module
+/////////////////////////////////////////////
+Serial              ble(PB_10, PB_11);
+DigitalOut          bleRTS(PB_14, 0);
+DigitalOut          bleCTS(PB_13, 0);
+DigitalOut          BT_IRST(PC_8, 0);
+DigitalOut          BT_SW(PA_12, 0);
+
+/////////////////////////////////////////////
+//Analog to Digital Converter
+/////////////////////////////////////////////
+DigitalIn           ADS_ALRT(PA_10); //Connected but currently unused. (ADS1115) http://www.ti.com/lit/ds/symlink/ads1115.pdf
+Adafruit_ADS1115    ads_sun(&i2c, ADS1015_ADDRESS_VDD); //Adress pin connected to 3.3V
+
+/////////////////////////////////////////////
+//Battery, Charger, & Supply Monitoring
+/////////////////////////////////////////////
+DigitalIn           LTCALT(PB_2); //High for normal operation. Low when a threshold is exceeded for Voltage, gas gauge, or temp
+DigitalIn           bcs1(PC_9); //Batt charging if High. (BQ24100)[U23]
+DigitalIn           bcs2(PA_8); //Charge complete if High. (BQ24100)[U23]  
+DigitalIn           bc_npg(PB_1); //Power to the charge controller. (BQ24100)[U23] 
+DigitalIn           SW3flt(PC_4); //When EN = 0 pin is HIGH, When EN = 1, LOW can be current limit, thermal limit, or UVLO.
+
+/////////////////////////////////////////////
+//Sensirion SDP3X(s)
+/////////////////////////////////////////////
+DigitalIn           SDP3Xflt(PC_0);
+DigitalIn           SDP3XAltflt(PB_7);
+
+/////////////////////////////////////////////
+//Accelerometer and Magnometer
+/////////////////////////////////////////////
+DigitalOut          iNemoEnable(PA_1, 0);
+DigitalIn           iNemoReady(PB_0);
+DigitalIn           iNemoInt1(PC_5);
+DigitalIn           iNemoInt2(PC_6);
+DigitalIn           iNemoInt3(PC_7);
+
+/////////////////////////////////////////////
+//Temperature and Pressure
+/////////////////////////////////////////////
+BMP280              bmp(PB_9, PB_8, 0xEE);
+BME280              bme(PB_9, PB_8, 0xEC);  //(D14, D15);
+
+/////////////////////////////////////////////
+//GPS
+/////////////////////////////////////////////
+DigitalOut          gpsEN(PB_15, 0);
+CAM_M8              gps(PB_9, PB_8,(0x84));   
+uint8_t gpsBTState = 1;
+uint8_t meState = 0;
+DigitalIn           gpsENFault(PB_12); //When EN = 0 pin is HIGH, When EN = 1, LOW can be current limit, thermal limit, or UVLO.
+
+/////////////////////////////////////////////
+//SD Card
+/////////////////////////////////////////////
+DigitalIn           sdCD(PA_11);
+DigitalOut          sdClk(PB_3,0 );
+DigitalIn           sdMISO(PB_4);
+DigitalOut          sdMOSI(PB_5, 0);
+DigitalOut          sdCS(PB_6, 1);
+
+DigitalIn           pbIso(PA_0);
+DigitalOut          hFault1(PA_7, 0);
+DigitalOut          hFault2(PA_6, 0);
+DigitalOut          hFault3(PA_5, 0);
+DigitalOut          hFault4(PA_4, 0);
+
+SDFileSystem        sd(PB_5, PB_4, PB_3, PB_6, "sd");//(D4, D5, D3, D10, "sd"); // (MOSI, MISO, SCK, SEL)
+char VoltFile[] = "/sd/ROAD_00.txt";
+
+/////////////////////////////////////////////
+//Callbacks
+/////////////////////////////////////////////
+Ticker          loggVolts;  //This is the AOD logging callback object
+
+volatile bool g_loggVolts_flag = false;
+
+static void loggVolts_ISR( void ) {
+    g_loggVolts_flag = true;
+}
+
+void logVolts(void);
+
+/////////////////////////////////////////////
+//Globals
+/////////////////////////////////////////////
+double  gpslatitude = 0.0;
+double  gpslongitude = 0.0;
+float   gpsaltitude = 0.0;
+uint8_t gpsquality = 0;
+uint8_t gpssatellites = 0;
+long    gpsTime;
+long    gpsDate;
+int     gps_year;
+int     gps_month;
+int     gps_day;
+int     gps_hour;
+int     gps_minute;
+double  gps_second;
+double  v870;     //Voltage read from 870nm photodiode
+double  v_raw870; //Raw analog output from 870nm photodiode
+double  v680;     //Voltage read from 680nm photodiode
+double  v_raw680; //Raw analog output from 680nm photodiode
+double  v520;     //Voltage read from 520nm photodiode
+double  v_raw520; //Raw analog output from 520nm photodiode
+double  v440;     //Voltage read from 440nm photodiode
+double  v_raw440; //Raw analog output from 440nm photodiode
+float   bme_press;
+float   bme_temp;
+float   bmp_press;
+//////////////////////////////////////////////////////////////
+//Main Function
+//////////////////////////////////////////////////////////////
+int main()
+{
+    pc.baud(115200);
+    loggVolts.attach(&loggVolts_ISR, 1.0);
+    RGB_LED.set_led(1, 1, 1);
+    gpsEN = 1;
+    
+    FILE *fp = fopen(VoltFile, "r");//try reading the log file
+    
+    for(int i = 0; i < 100; i++)
+    {
+        VoltFile[9] = i/10 + '0';
+        VoltFile[10] = i%10 + '0';
+        fp = fopen(VoltFile, "r");//try reading the log file
+        if(fp == NULL)
+        {
+            fp = fopen(VoltFile, "w"); // fp is local variable
+            fclose(fp);
+            fp = fopen(VoltFile, "a");
+            fprintf(fp, "GPS Date,GPS Time,Latitude,Longitude,Altitude,Temperature (C),Pressure (mbar),v440,v520,v680,v870\r\n");
+            fclose(fp);
+            free(fp);
+            break;
+        }
+    }
+    
+    while(1){
+        
+        if(g_loggVolts_flag){
+            g_loggVolts_flag = false;
+            logVolts();
+        }
+        
+    } //end while
+} //end main
+
+void logVolts(void)
+{
+    RGB_LED.set_led(0, 1, 1);
+    //Get needed location data
+    gps.read_gps();
+    gpsquality =  gps.quality;
+    if(gpsquality!=0)
+    {
+        gpslatitude = gps.lat;
+        gpslongitude = gps.lon;
+        gpsaltitude = gps.altitude;
+    }
+    gpsTime = (long)gps.utc;
+    gpsDate = (long)gps.date;
+                        
+    gps_minute = (int)(floor((float)(gpsTime - (uint8_t)(floor((float)gpsTime/10000))*10000)/100));    // 0-59
+    gps_second = (double)(floor(((float)gpsTime - 100*(floor((float)gpsTime/100)))));//0; //(uint8_t)(floor(((float)gpsTime - 100*(floor((float)gpsTime/100)))));    // 0-59
+    gps_hour =  (int)(floor((float)gpsTime/10000));  // 0-23
+    gps_day = (int)(floor((float)gpsDate/10000));   // 1-31
+    gps_month = (uint8_t)(floor((float)(gpsDate - gps_day*10000)/100));     // 0-11
+    gps_year = 1900 + (uint8_t)(100+floor(((float)gpsDate - 100*(floor((float)gpsDate/100))))); // year since 1900 (116 = 2016)//100+16
+    
+    RGB_LED.set_led(0, 1, 0);
+    
+    //Get temperature and pressure from the BME
+    bme_temp = bme.getTemperature();
+    bme_press = bme.getPressure(bme_temp);
+    bmp_press = bmp.getPressure(bme_temp);
+    
+    // Take the average of 10 440 voltage measurements
+    double v_440_temp;
+    double v_440_sum = 0;
+    for(int i = 0; i < 10; i++)
+    {
+        v_440_temp = (double)ads_sun.readADC_SingleEnded(A0_GAIN_TWO); //Channel A0 | 2x gain | +/-2.048V | 1 bit = 1mV | 0.0625mV
+        v_440_sum += v_440_temp;
+    }    
+    v_raw440 = v_440_sum/10.0; 
+    v440 = (v_raw440*0.0625)/(1000); //Converts to a voltage
+    
+    // Take the average of 10 520 voltage measurements                    
+    double v_520_temp;
+    double v_520_sum = 0;
+    for(int i = 0; i < 10; i++)
+    {
+        v_520_temp = (double)ads_sun.readADC_SingleEnded(A1_GAIN_TWO); //Channel A0 | 2x gain | +/-2.048V | 1 bit = 1mV | 0.0625mV
+        v_520_sum += v_520_temp;
+    }    
+    v_raw520 = v_520_sum/10.0; 
+    v520 = (v_raw520*0.0625)/(1000); //Converts to a voltage
+    
+    // Take the average of 10 680 voltage measurements                    
+    double v_680_temp;
+    double v_680_sum = 0;
+    for(int i = 0; i < 10; i++)
+    {
+        v_680_temp = (double)ads_sun.readADC_SingleEnded(A2_GAIN_TWO); //Channel A0 | 2x gain | +/-2.048V | 1 bit = 1mV | 0.0625mV
+        v_680_sum += v_680_temp;
+    }    
+    v_raw680 = v_680_sum/10.0; 
+    v680 = (v_raw680*0.0625)/(1000); //Converts to a voltage
+    
+    // Take the average of 10 870 voltage measurements                      
+    double v_870_temp;
+    double v_870_sum = 0;
+    for(int i = 0; i < 10; i++)
+    {
+        v_870_temp = (double)ads_sun.readADC_SingleEnded(A3_GAIN_TWO); //Channel A0 | 2x gain | +/-2.048V | 1 bit = 1mV | 0.0625mV
+        v_870_sum += v_870_temp;
+    }    
+    v_raw870 = v_870_sum/10.0; 
+    v870 = (v_raw870*0.0625)/(1000); //Converts to a voltage
+       
+    // Write data to SD card
+    FILE *fpAOD = fopen(VoltFile, "a");
+    fprintf(fpAOD,"%06d,%06d,%f,%f,%f,%f,%f,%f,%f,%f,%f\r\n",gpsDate,gpsTime,gpslatitude,gpslongitude,gpsaltitude,bme_temp,bme_press,v440,v520,v680,v870);
+    fclose(fpAOD);
+    free(fpAOD);
+    pc.printf("%06d,%06d,%f,%f,%f,%f,%f,%f,%f,%f,%f\r\n",gpsDate,gpsTime,gpslatitude,gpslongitude,gpsaltitude,bme_temp,bme_press,v440,v520,v680,v870);   
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu Dec 28 19:56:25 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/c0f6e94411f5
\ No newline at end of file