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

Dependencies:   ADS1115 BME280 BMP280 CAM_M8 NCP5623BMUTBG SDFileSystem mbed

Committer:
eawendtjr
Date:
Thu Dec 28 19:56:25 2017 +0000
Revision:
0:79a3eeb27d0d
Logging data for road emissions evaluation at 1Hz.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eawendtjr 0:79a3eeb27d0d 1 #include "mbed.h"
eawendtjr 0:79a3eeb27d0d 2 #include "NCP5623BMUTBG.h"
eawendtjr 0:79a3eeb27d0d 3 #include "CAM_M8.h"
eawendtjr 0:79a3eeb27d0d 4 #include "SDFileSystem.h"
eawendtjr 0:79a3eeb27d0d 5 #include "Adafruit_ADS1015.h"
eawendtjr 0:79a3eeb27d0d 6 #include "BME280.h"
eawendtjr 0:79a3eeb27d0d 7 #include "BMP280.h"
eawendtjr 0:79a3eeb27d0d 8
eawendtjr 0:79a3eeb27d0d 9 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 10 //Define core buses and pin states.
eawendtjr 0:79a3eeb27d0d 11 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 12 I2C i2c(PB_9, PB_8);//(D14, D15); SDA,SCL
eawendtjr 0:79a3eeb27d0d 13 Serial pc(USBTX, USBRX);
eawendtjr 0:79a3eeb27d0d 14 DigitalOut pumps(PA_9, 0);//(D8, 0);
eawendtjr 0:79a3eeb27d0d 15 DigitalOut pbKill(PC_12, 1); // Digital input pin that conncect to the LTC2950 battery charger used to shutdown the UPAS
eawendtjr 0:79a3eeb27d0d 16 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
eawendtjr 0:79a3eeb27d0d 17 NCP5623BMUTBG RGB_LED(PB_9, PB_8); //(D14, D15);
eawendtjr 0:79a3eeb27d0d 18
eawendtjr 0:79a3eeb27d0d 19 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 20 //RN4677 BT/BLE Module
eawendtjr 0:79a3eeb27d0d 21 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 22 Serial ble(PB_10, PB_11);
eawendtjr 0:79a3eeb27d0d 23 DigitalOut bleRTS(PB_14, 0);
eawendtjr 0:79a3eeb27d0d 24 DigitalOut bleCTS(PB_13, 0);
eawendtjr 0:79a3eeb27d0d 25 DigitalOut BT_IRST(PC_8, 0);
eawendtjr 0:79a3eeb27d0d 26 DigitalOut BT_SW(PA_12, 0);
eawendtjr 0:79a3eeb27d0d 27
eawendtjr 0:79a3eeb27d0d 28 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 29 //Analog to Digital Converter
eawendtjr 0:79a3eeb27d0d 30 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 31 DigitalIn ADS_ALRT(PA_10); //Connected but currently unused. (ADS1115) http://www.ti.com/lit/ds/symlink/ads1115.pdf
eawendtjr 0:79a3eeb27d0d 32 Adafruit_ADS1115 ads_sun(&i2c, ADS1015_ADDRESS_VDD); //Adress pin connected to 3.3V
eawendtjr 0:79a3eeb27d0d 33
eawendtjr 0:79a3eeb27d0d 34 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 35 //Battery, Charger, & Supply Monitoring
eawendtjr 0:79a3eeb27d0d 36 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 37 DigitalIn LTCALT(PB_2); //High for normal operation. Low when a threshold is exceeded for Voltage, gas gauge, or temp
eawendtjr 0:79a3eeb27d0d 38 DigitalIn bcs1(PC_9); //Batt charging if High. (BQ24100)[U23]
eawendtjr 0:79a3eeb27d0d 39 DigitalIn bcs2(PA_8); //Charge complete if High. (BQ24100)[U23]
eawendtjr 0:79a3eeb27d0d 40 DigitalIn bc_npg(PB_1); //Power to the charge controller. (BQ24100)[U23]
eawendtjr 0:79a3eeb27d0d 41 DigitalIn SW3flt(PC_4); //When EN = 0 pin is HIGH, When EN = 1, LOW can be current limit, thermal limit, or UVLO.
eawendtjr 0:79a3eeb27d0d 42
eawendtjr 0:79a3eeb27d0d 43 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 44 //Sensirion SDP3X(s)
eawendtjr 0:79a3eeb27d0d 45 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 46 DigitalIn SDP3Xflt(PC_0);
eawendtjr 0:79a3eeb27d0d 47 DigitalIn SDP3XAltflt(PB_7);
eawendtjr 0:79a3eeb27d0d 48
eawendtjr 0:79a3eeb27d0d 49 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 50 //Accelerometer and Magnometer
eawendtjr 0:79a3eeb27d0d 51 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 52 DigitalOut iNemoEnable(PA_1, 0);
eawendtjr 0:79a3eeb27d0d 53 DigitalIn iNemoReady(PB_0);
eawendtjr 0:79a3eeb27d0d 54 DigitalIn iNemoInt1(PC_5);
eawendtjr 0:79a3eeb27d0d 55 DigitalIn iNemoInt2(PC_6);
eawendtjr 0:79a3eeb27d0d 56 DigitalIn iNemoInt3(PC_7);
eawendtjr 0:79a3eeb27d0d 57
eawendtjr 0:79a3eeb27d0d 58 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 59 //Temperature and Pressure
eawendtjr 0:79a3eeb27d0d 60 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 61 BMP280 bmp(PB_9, PB_8, 0xEE);
eawendtjr 0:79a3eeb27d0d 62 BME280 bme(PB_9, PB_8, 0xEC); //(D14, D15);
eawendtjr 0:79a3eeb27d0d 63
eawendtjr 0:79a3eeb27d0d 64 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 65 //GPS
eawendtjr 0:79a3eeb27d0d 66 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 67 DigitalOut gpsEN(PB_15, 0);
eawendtjr 0:79a3eeb27d0d 68 CAM_M8 gps(PB_9, PB_8,(0x84));
eawendtjr 0:79a3eeb27d0d 69 uint8_t gpsBTState = 1;
eawendtjr 0:79a3eeb27d0d 70 uint8_t meState = 0;
eawendtjr 0:79a3eeb27d0d 71 DigitalIn gpsENFault(PB_12); //When EN = 0 pin is HIGH, When EN = 1, LOW can be current limit, thermal limit, or UVLO.
eawendtjr 0:79a3eeb27d0d 72
eawendtjr 0:79a3eeb27d0d 73 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 74 //SD Card
eawendtjr 0:79a3eeb27d0d 75 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 76 DigitalIn sdCD(PA_11);
eawendtjr 0:79a3eeb27d0d 77 DigitalOut sdClk(PB_3,0 );
eawendtjr 0:79a3eeb27d0d 78 DigitalIn sdMISO(PB_4);
eawendtjr 0:79a3eeb27d0d 79 DigitalOut sdMOSI(PB_5, 0);
eawendtjr 0:79a3eeb27d0d 80 DigitalOut sdCS(PB_6, 1);
eawendtjr 0:79a3eeb27d0d 81
eawendtjr 0:79a3eeb27d0d 82 DigitalIn pbIso(PA_0);
eawendtjr 0:79a3eeb27d0d 83 DigitalOut hFault1(PA_7, 0);
eawendtjr 0:79a3eeb27d0d 84 DigitalOut hFault2(PA_6, 0);
eawendtjr 0:79a3eeb27d0d 85 DigitalOut hFault3(PA_5, 0);
eawendtjr 0:79a3eeb27d0d 86 DigitalOut hFault4(PA_4, 0);
eawendtjr 0:79a3eeb27d0d 87
eawendtjr 0:79a3eeb27d0d 88 SDFileSystem sd(PB_5, PB_4, PB_3, PB_6, "sd");//(D4, D5, D3, D10, "sd"); // (MOSI, MISO, SCK, SEL)
eawendtjr 0:79a3eeb27d0d 89 char VoltFile[] = "/sd/ROAD_00.txt";
eawendtjr 0:79a3eeb27d0d 90
eawendtjr 0:79a3eeb27d0d 91 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 92 //Callbacks
eawendtjr 0:79a3eeb27d0d 93 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 94 Ticker loggVolts; //This is the AOD logging callback object
eawendtjr 0:79a3eeb27d0d 95
eawendtjr 0:79a3eeb27d0d 96 volatile bool g_loggVolts_flag = false;
eawendtjr 0:79a3eeb27d0d 97
eawendtjr 0:79a3eeb27d0d 98 static void loggVolts_ISR( void ) {
eawendtjr 0:79a3eeb27d0d 99 g_loggVolts_flag = true;
eawendtjr 0:79a3eeb27d0d 100 }
eawendtjr 0:79a3eeb27d0d 101
eawendtjr 0:79a3eeb27d0d 102 void logVolts(void);
eawendtjr 0:79a3eeb27d0d 103
eawendtjr 0:79a3eeb27d0d 104 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 105 //Globals
eawendtjr 0:79a3eeb27d0d 106 /////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 107 double gpslatitude = 0.0;
eawendtjr 0:79a3eeb27d0d 108 double gpslongitude = 0.0;
eawendtjr 0:79a3eeb27d0d 109 float gpsaltitude = 0.0;
eawendtjr 0:79a3eeb27d0d 110 uint8_t gpsquality = 0;
eawendtjr 0:79a3eeb27d0d 111 uint8_t gpssatellites = 0;
eawendtjr 0:79a3eeb27d0d 112 long gpsTime;
eawendtjr 0:79a3eeb27d0d 113 long gpsDate;
eawendtjr 0:79a3eeb27d0d 114 int gps_year;
eawendtjr 0:79a3eeb27d0d 115 int gps_month;
eawendtjr 0:79a3eeb27d0d 116 int gps_day;
eawendtjr 0:79a3eeb27d0d 117 int gps_hour;
eawendtjr 0:79a3eeb27d0d 118 int gps_minute;
eawendtjr 0:79a3eeb27d0d 119 double gps_second;
eawendtjr 0:79a3eeb27d0d 120 double v870; //Voltage read from 870nm photodiode
eawendtjr 0:79a3eeb27d0d 121 double v_raw870; //Raw analog output from 870nm photodiode
eawendtjr 0:79a3eeb27d0d 122 double v680; //Voltage read from 680nm photodiode
eawendtjr 0:79a3eeb27d0d 123 double v_raw680; //Raw analog output from 680nm photodiode
eawendtjr 0:79a3eeb27d0d 124 double v520; //Voltage read from 520nm photodiode
eawendtjr 0:79a3eeb27d0d 125 double v_raw520; //Raw analog output from 520nm photodiode
eawendtjr 0:79a3eeb27d0d 126 double v440; //Voltage read from 440nm photodiode
eawendtjr 0:79a3eeb27d0d 127 double v_raw440; //Raw analog output from 440nm photodiode
eawendtjr 0:79a3eeb27d0d 128 float bme_press;
eawendtjr 0:79a3eeb27d0d 129 float bme_temp;
eawendtjr 0:79a3eeb27d0d 130 float bmp_press;
eawendtjr 0:79a3eeb27d0d 131 //////////////////////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 132 //Main Function
eawendtjr 0:79a3eeb27d0d 133 //////////////////////////////////////////////////////////////
eawendtjr 0:79a3eeb27d0d 134 int main()
eawendtjr 0:79a3eeb27d0d 135 {
eawendtjr 0:79a3eeb27d0d 136 pc.baud(115200);
eawendtjr 0:79a3eeb27d0d 137 loggVolts.attach(&loggVolts_ISR, 1.0);
eawendtjr 0:79a3eeb27d0d 138 RGB_LED.set_led(1, 1, 1);
eawendtjr 0:79a3eeb27d0d 139 gpsEN = 1;
eawendtjr 0:79a3eeb27d0d 140
eawendtjr 0:79a3eeb27d0d 141 FILE *fp = fopen(VoltFile, "r");//try reading the log file
eawendtjr 0:79a3eeb27d0d 142
eawendtjr 0:79a3eeb27d0d 143 for(int i = 0; i < 100; i++)
eawendtjr 0:79a3eeb27d0d 144 {
eawendtjr 0:79a3eeb27d0d 145 VoltFile[9] = i/10 + '0';
eawendtjr 0:79a3eeb27d0d 146 VoltFile[10] = i%10 + '0';
eawendtjr 0:79a3eeb27d0d 147 fp = fopen(VoltFile, "r");//try reading the log file
eawendtjr 0:79a3eeb27d0d 148 if(fp == NULL)
eawendtjr 0:79a3eeb27d0d 149 {
eawendtjr 0:79a3eeb27d0d 150 fp = fopen(VoltFile, "w"); // fp is local variable
eawendtjr 0:79a3eeb27d0d 151 fclose(fp);
eawendtjr 0:79a3eeb27d0d 152 fp = fopen(VoltFile, "a");
eawendtjr 0:79a3eeb27d0d 153 fprintf(fp, "GPS Date,GPS Time,Latitude,Longitude,Altitude,Temperature (C),Pressure (mbar),v440,v520,v680,v870\r\n");
eawendtjr 0:79a3eeb27d0d 154 fclose(fp);
eawendtjr 0:79a3eeb27d0d 155 free(fp);
eawendtjr 0:79a3eeb27d0d 156 break;
eawendtjr 0:79a3eeb27d0d 157 }
eawendtjr 0:79a3eeb27d0d 158 }
eawendtjr 0:79a3eeb27d0d 159
eawendtjr 0:79a3eeb27d0d 160 while(1){
eawendtjr 0:79a3eeb27d0d 161
eawendtjr 0:79a3eeb27d0d 162 if(g_loggVolts_flag){
eawendtjr 0:79a3eeb27d0d 163 g_loggVolts_flag = false;
eawendtjr 0:79a3eeb27d0d 164 logVolts();
eawendtjr 0:79a3eeb27d0d 165 }
eawendtjr 0:79a3eeb27d0d 166
eawendtjr 0:79a3eeb27d0d 167 } //end while
eawendtjr 0:79a3eeb27d0d 168 } //end main
eawendtjr 0:79a3eeb27d0d 169
eawendtjr 0:79a3eeb27d0d 170 void logVolts(void)
eawendtjr 0:79a3eeb27d0d 171 {
eawendtjr 0:79a3eeb27d0d 172 RGB_LED.set_led(0, 1, 1);
eawendtjr 0:79a3eeb27d0d 173 //Get needed location data
eawendtjr 0:79a3eeb27d0d 174 gps.read_gps();
eawendtjr 0:79a3eeb27d0d 175 gpsquality = gps.quality;
eawendtjr 0:79a3eeb27d0d 176 if(gpsquality!=0)
eawendtjr 0:79a3eeb27d0d 177 {
eawendtjr 0:79a3eeb27d0d 178 gpslatitude = gps.lat;
eawendtjr 0:79a3eeb27d0d 179 gpslongitude = gps.lon;
eawendtjr 0:79a3eeb27d0d 180 gpsaltitude = gps.altitude;
eawendtjr 0:79a3eeb27d0d 181 }
eawendtjr 0:79a3eeb27d0d 182 gpsTime = (long)gps.utc;
eawendtjr 0:79a3eeb27d0d 183 gpsDate = (long)gps.date;
eawendtjr 0:79a3eeb27d0d 184
eawendtjr 0:79a3eeb27d0d 185 gps_minute = (int)(floor((float)(gpsTime - (uint8_t)(floor((float)gpsTime/10000))*10000)/100)); // 0-59
eawendtjr 0:79a3eeb27d0d 186 gps_second = (double)(floor(((float)gpsTime - 100*(floor((float)gpsTime/100)))));//0; //(uint8_t)(floor(((float)gpsTime - 100*(floor((float)gpsTime/100))))); // 0-59
eawendtjr 0:79a3eeb27d0d 187 gps_hour = (int)(floor((float)gpsTime/10000)); // 0-23
eawendtjr 0:79a3eeb27d0d 188 gps_day = (int)(floor((float)gpsDate/10000)); // 1-31
eawendtjr 0:79a3eeb27d0d 189 gps_month = (uint8_t)(floor((float)(gpsDate - gps_day*10000)/100)); // 0-11
eawendtjr 0:79a3eeb27d0d 190 gps_year = 1900 + (uint8_t)(100+floor(((float)gpsDate - 100*(floor((float)gpsDate/100))))); // year since 1900 (116 = 2016)//100+16
eawendtjr 0:79a3eeb27d0d 191
eawendtjr 0:79a3eeb27d0d 192 RGB_LED.set_led(0, 1, 0);
eawendtjr 0:79a3eeb27d0d 193
eawendtjr 0:79a3eeb27d0d 194 //Get temperature and pressure from the BME
eawendtjr 0:79a3eeb27d0d 195 bme_temp = bme.getTemperature();
eawendtjr 0:79a3eeb27d0d 196 bme_press = bme.getPressure(bme_temp);
eawendtjr 0:79a3eeb27d0d 197 bmp_press = bmp.getPressure(bme_temp);
eawendtjr 0:79a3eeb27d0d 198
eawendtjr 0:79a3eeb27d0d 199 // Take the average of 10 440 voltage measurements
eawendtjr 0:79a3eeb27d0d 200 double v_440_temp;
eawendtjr 0:79a3eeb27d0d 201 double v_440_sum = 0;
eawendtjr 0:79a3eeb27d0d 202 for(int i = 0; i < 10; i++)
eawendtjr 0:79a3eeb27d0d 203 {
eawendtjr 0:79a3eeb27d0d 204 v_440_temp = (double)ads_sun.readADC_SingleEnded(A0_GAIN_TWO); //Channel A0 | 2x gain | +/-2.048V | 1 bit = 1mV | 0.0625mV
eawendtjr 0:79a3eeb27d0d 205 v_440_sum += v_440_temp;
eawendtjr 0:79a3eeb27d0d 206 }
eawendtjr 0:79a3eeb27d0d 207 v_raw440 = v_440_sum/10.0;
eawendtjr 0:79a3eeb27d0d 208 v440 = (v_raw440*0.0625)/(1000); //Converts to a voltage
eawendtjr 0:79a3eeb27d0d 209
eawendtjr 0:79a3eeb27d0d 210 // Take the average of 10 520 voltage measurements
eawendtjr 0:79a3eeb27d0d 211 double v_520_temp;
eawendtjr 0:79a3eeb27d0d 212 double v_520_sum = 0;
eawendtjr 0:79a3eeb27d0d 213 for(int i = 0; i < 10; i++)
eawendtjr 0:79a3eeb27d0d 214 {
eawendtjr 0:79a3eeb27d0d 215 v_520_temp = (double)ads_sun.readADC_SingleEnded(A1_GAIN_TWO); //Channel A0 | 2x gain | +/-2.048V | 1 bit = 1mV | 0.0625mV
eawendtjr 0:79a3eeb27d0d 216 v_520_sum += v_520_temp;
eawendtjr 0:79a3eeb27d0d 217 }
eawendtjr 0:79a3eeb27d0d 218 v_raw520 = v_520_sum/10.0;
eawendtjr 0:79a3eeb27d0d 219 v520 = (v_raw520*0.0625)/(1000); //Converts to a voltage
eawendtjr 0:79a3eeb27d0d 220
eawendtjr 0:79a3eeb27d0d 221 // Take the average of 10 680 voltage measurements
eawendtjr 0:79a3eeb27d0d 222 double v_680_temp;
eawendtjr 0:79a3eeb27d0d 223 double v_680_sum = 0;
eawendtjr 0:79a3eeb27d0d 224 for(int i = 0; i < 10; i++)
eawendtjr 0:79a3eeb27d0d 225 {
eawendtjr 0:79a3eeb27d0d 226 v_680_temp = (double)ads_sun.readADC_SingleEnded(A2_GAIN_TWO); //Channel A0 | 2x gain | +/-2.048V | 1 bit = 1mV | 0.0625mV
eawendtjr 0:79a3eeb27d0d 227 v_680_sum += v_680_temp;
eawendtjr 0:79a3eeb27d0d 228 }
eawendtjr 0:79a3eeb27d0d 229 v_raw680 = v_680_sum/10.0;
eawendtjr 0:79a3eeb27d0d 230 v680 = (v_raw680*0.0625)/(1000); //Converts to a voltage
eawendtjr 0:79a3eeb27d0d 231
eawendtjr 0:79a3eeb27d0d 232 // Take the average of 10 870 voltage measurements
eawendtjr 0:79a3eeb27d0d 233 double v_870_temp;
eawendtjr 0:79a3eeb27d0d 234 double v_870_sum = 0;
eawendtjr 0:79a3eeb27d0d 235 for(int i = 0; i < 10; i++)
eawendtjr 0:79a3eeb27d0d 236 {
eawendtjr 0:79a3eeb27d0d 237 v_870_temp = (double)ads_sun.readADC_SingleEnded(A3_GAIN_TWO); //Channel A0 | 2x gain | +/-2.048V | 1 bit = 1mV | 0.0625mV
eawendtjr 0:79a3eeb27d0d 238 v_870_sum += v_870_temp;
eawendtjr 0:79a3eeb27d0d 239 }
eawendtjr 0:79a3eeb27d0d 240 v_raw870 = v_870_sum/10.0;
eawendtjr 0:79a3eeb27d0d 241 v870 = (v_raw870*0.0625)/(1000); //Converts to a voltage
eawendtjr 0:79a3eeb27d0d 242
eawendtjr 0:79a3eeb27d0d 243 // Write data to SD card
eawendtjr 0:79a3eeb27d0d 244 FILE *fpAOD = fopen(VoltFile, "a");
eawendtjr 0:79a3eeb27d0d 245 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);
eawendtjr 0:79a3eeb27d0d 246 fclose(fpAOD);
eawendtjr 0:79a3eeb27d0d 247 free(fpAOD);
eawendtjr 0:79a3eeb27d0d 248 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);
eawendtjr 0:79a3eeb27d0d 249 }
eawendtjr 0:79a3eeb27d0d 250
eawendtjr 0:79a3eeb27d0d 251