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

Committer:
caseyquinn
Date:
Sat Mar 05 21:14:28 2016 +0000
Revision:
124:15466d0f04ab
Parent:
33:bc73a2493821
"Fixed" the digital pot cutout issue by not allow large digital pot jumps while the boost is turned on. Also limited the lowest digital pot setting to 5.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lionberg 33:bc73a2493821 1 #include "mbed.h"
lionberg 33:bc73a2493821 2 #include "SDFileSystem.h"
lionberg 33:bc73a2493821 3 #include "Adafruit_ADS1015.h"
lionberg 33:bc73a2493821 4 #include "MCP40D17.h"
lionberg 33:bc73a2493821 5 #include "wire.h" //Used with the RTC in this code. Will need to try and remove this, and also create the correct library/update addresses and registers for the RTC.
lionberg 33:bc73a2493821 6 #include "STC3100.h"
lionberg 33:bc73a2493821 7 #include "LSM303.h"
lionberg 33:bc73a2493821 8 #include "BME280.h"
lionberg 33:bc73a2493821 9 #include "SI1145.h"
lionberg 33:bc73a2493821 10
lionberg 33:bc73a2493821 11 #define SERIAL_BAUD_RATE 9600
lionberg 33:bc73a2493821 12 #define SCL 20
lionberg 33:bc73a2493821 13 #define SDA 22
lionberg 33:bc73a2493821 14 #define Crono 0xD0 //D0 for the chronoDot
lionberg 33:bc73a2493821 15
lionberg 33:bc73a2493821 16 I2C i2c(p22, p20);
lionberg 33:bc73a2493821 17 Adafruit_ADS1115 ads(&i2c);
lionberg 33:bc73a2493821 18 MCP40D17 DigPot(&i2c);
lionberg 33:bc73a2493821 19 BME280 bmesensor(p22, p20);
lionberg 33:bc73a2493821 20 STC3100 gasG(p22, p20);
lionberg 33:bc73a2493821 21 Serial pc(USBTX, USBRX);
lionberg 33:bc73a2493821 22 DigitalOut blower(p29, 0);
lionberg 33:bc73a2493821 23 DigitalOut pbKill(p18, 1);
lionberg 33:bc73a2493821 24 LSM303 movementsensor(p22, p20);
lionberg 33:bc73a2493821 25 SI1145 lightsensor(p22, p20);
lionberg 33:bc73a2493821 26
lionberg 33:bc73a2493821 27 float press;
lionberg 33:bc73a2493821 28 float temp;
lionberg 33:bc73a2493821 29 float rh;
lionberg 33:bc73a2493821 30
lionberg 33:bc73a2493821 31 int uv;
lionberg 33:bc73a2493821 32 int vis;
lionberg 33:bc73a2493821 33 int ir;
lionberg 33:bc73a2493821 34
lionberg 33:bc73a2493821 35 float accel_x;
lionberg 33:bc73a2493821 36 float accel_y;
lionberg 33:bc73a2493821 37 float accel_z;
lionberg 33:bc73a2493821 38 float mag_x;
lionberg 33:bc73a2493821 39 float mag_y;
lionberg 33:bc73a2493821 40 float mag_z;
lionberg 33:bc73a2493821 41
lionberg 33:bc73a2493821 42
lionberg 33:bc73a2493821 43 int vInReading;
lionberg 33:bc73a2493821 44 int vBlowerReading;
lionberg 33:bc73a2493821 45 int omronDiff;
lionberg 33:bc73a2493821 46
lionberg 33:bc73a2493821 47 int omronReading;
lionberg 33:bc73a2493821 48 float omronVolt; //V
lionberg 33:bc73a2493821 49 float atmoRho; //g/L
lionberg 33:bc73a2493821 50 float massflow; //g/min
lionberg 33:bc73a2493821 51 float volflow; //L/min
lionberg 33:bc73a2493821 52 float volflowSet = 1.0; //L/min
lionberg 33:bc73a2493821 53 float massflowSet;
lionberg 33:bc73a2493821 54 float deltaflow;
lionberg 33:bc73a2493821 55
lionberg 33:bc73a2493821 56 int digital_pot_setpoint; //min = 0x7F, max = 0x00
lionberg 33:bc73a2493821 57 char filename[] = "/sd/UPAS0005LOG000000000000.txt";
lionberg 33:bc73a2493821 58
lionberg 33:bc73a2493821 59 TwoWire Wire = TwoWire(NRF_TWI0);
lionberg 33:bc73a2493821 60 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)
lionberg 33:bc73a2493821 61
lionberg 33:bc73a2493821 62 uint8_t Seconds = 0;//Seconds
lionberg 33:bc73a2493821 63 uint8_t Minutes = 0;//Minutes
lionberg 33:bc73a2493821 64 uint8_t Hour = 0;//Hour
lionberg 33:bc73a2493821 65 uint8_t Date = 0;//Date
lionberg 33:bc73a2493821 66 uint8_t Month = 0;//Month
lionberg 33:bc73a2493821 67 uint8_t Year = 0;//Year
lionberg 33:bc73a2493821 68 double secondsD = 0;
lionberg 33:bc73a2493821 69
lionberg 33:bc73a2493821 70 void get_time()
lionberg 33:bc73a2493821 71 {
lionberg 33:bc73a2493821 72 Wire.beginTransmission(Crono); // address DS3231
lionberg 33:bc73a2493821 73 Wire.write(0x0E); // select register
lionberg 33:bc73a2493821 74 Wire.write(0x1C); // write register bitmap, bit 7 is /EOSC
lionberg 33:bc73a2493821 75 Wire.endTransmission();
lionberg 33:bc73a2493821 76 wait(0.05);
lionberg 33:bc73a2493821 77 Wire.beginTransmission(Crono);
lionberg 33:bc73a2493821 78 Wire.write(0x00);
lionberg 33:bc73a2493821 79 Wire.endTransmission();
lionberg 33:bc73a2493821 80 Wire.requestFrom(Crono+1, 7);
lionberg 33:bc73a2493821 81
lionberg 33:bc73a2493821 82 while( Wire.available() > 0 )
lionberg 33:bc73a2493821 83 {
lionberg 33:bc73a2493821 84 Seconds = Wire.read();
lionberg 33:bc73a2493821 85 Minutes = Wire.read();
lionberg 33:bc73a2493821 86 Hour = Wire.read();
lionberg 33:bc73a2493821 87 uint8_t day =Wire.read(); // we don't uses this, it's just day of the week
lionberg 33:bc73a2493821 88 Date = Wire.read();
lionberg 33:bc73a2493821 89 Month = Wire.read();
lionberg 33:bc73a2493821 90 Year = Wire.read();
lionberg 33:bc73a2493821 91
lionberg 33:bc73a2493821 92 }
lionberg 33:bc73a2493821 93 Year = ((Year&0xF0)>>4)*10 + (Year&0x0F); //Year
lionberg 33:bc73a2493821 94 Month = ((Month&0x10)>>4)*10 + (Month&0x0F); //Month
lionberg 33:bc73a2493821 95 Date = ((Date&0x30)>>4)*10 + (Date&0x0F); //Date
lionberg 33:bc73a2493821 96 Hour = ((Hour&0x30)>>4)*10 + (Hour&0x0F); //Hour
lionberg 33:bc73a2493821 97 Minutes = ((Minutes&0x70)>>4)*10 + (Minutes&0x0F); //Minutes
lionberg 33:bc73a2493821 98 Seconds = ((Seconds&0x70)>>4)*10 + (Seconds&0x0F); //Seconds
lionberg 33:bc73a2493821 99 }
lionberg 33:bc73a2493821 100
lionberg 33:bc73a2493821 101 int main()
lionberg 33:bc73a2493821 102 {
lionberg 33:bc73a2493821 103 press = bmesensor.getPressure();
lionberg 33:bc73a2493821 104 temp = bmesensor.getTemperature();
lionberg 33:bc73a2493821 105 rh = bmesensor.getHumidity();
lionberg 33:bc73a2493821 106
lionberg 33:bc73a2493821 107 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));
lionberg 33:bc73a2493821 108 massflowSet = volflowSet*atmoRho;
lionberg 33:bc73a2493821 109 //Digtal pot tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
lionberg 33:bc73a2493821 110 digital_pot_setpoint = (int)floor(9.2456*pow(massflowSet,4)-89.538*pow(massflowSet,3)+329.03*pow(massflowSet,2)-566.12*massflowSet+412.72); //min = 0x7F, max = 0x00
lionberg 33:bc73a2493821 111
lionberg 33:bc73a2493821 112 DigPot.writeRegister(digital_pot_setpoint);
lionberg 33:bc73a2493821 113 Wire.begin(SCL, SDA, TWI_FREQUENCY_100K);//
lionberg 33:bc73a2493821 114 wait(1);
lionberg 33:bc73a2493821 115 blower = 1;
lionberg 33:bc73a2493821 116
lionberg 33:bc73a2493821 117 get_time();
lionberg 33:bc73a2493821 118 sprintf(filename, "/sd/UPAS0005LOG_%02d%02d%02d%02d%02d%02d.txt",Year,Month,Date,Hour,Minutes,Seconds);
lionberg 33:bc73a2493821 119 FILE *fp = fopen(filename, "w");
lionberg 33:bc73a2493821 120 fclose(fp);
lionberg 33:bc73a2493821 121
lionberg 33:bc73a2493821 122
lionberg 33:bc73a2493821 123 while(1){
lionberg 33:bc73a2493821 124
lionberg 33:bc73a2493821 125 get_time();
lionberg 33:bc73a2493821 126 secondsD = Seconds;
lionberg 33:bc73a2493821 127
lionberg 33:bc73a2493821 128 if(fmod(secondsD,10)==0){
lionberg 33:bc73a2493821 129
lionberg 33:bc73a2493821 130 omronVolt = (omronReading*4.096)/(32768*2);
lionberg 33:bc73a2493821 131 //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
lionberg 33:bc73a2493821 132 massflow = -2.4541*pow(omronVolt,(float)4)+15.522*pow(omronVolt,(float)3)-34.578*pow(omronVolt,(float)2)+34.05*omronVolt-11.794;
lionberg 33:bc73a2493821 133 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));
lionberg 33:bc73a2493821 134 volflow = massflow/atmoRho;
lionberg 33:bc73a2493821 135 deltaflow = volflow-volflowSet;
lionberg 33:bc73a2493821 136
lionberg 33:bc73a2493821 137 /*if(abs(deltaflow)>.05*volflowSet){
lionberg 33:bc73a2493821 138 digital_pot_setpoint = f(Vsetpoint);
lionberg 33:bc73a2493821 139 DigPot.writeRegister(digital_pot_setpoint);
lionberg 33:bc73a2493821 140 }
lionberg 33:bc73a2493821 141 */
lionberg 33:bc73a2493821 142 movementsensor.getACCEL();
lionberg 33:bc73a2493821 143 movementsensor.getCOMPASS();
lionberg 33:bc73a2493821 144 accel_x = movementsensor.AccelData.x;
lionberg 33:bc73a2493821 145 accel_y = movementsensor.AccelData.y;
lionberg 33:bc73a2493821 146 accel_z = movementsensor.AccelData.z;
lionberg 33:bc73a2493821 147 mag_x = movementsensor.MagData.x;
lionberg 33:bc73a2493821 148 mag_y = movementsensor.MagData.y;
lionberg 33:bc73a2493821 149 mag_z = movementsensor.MagData.z;
lionberg 33:bc73a2493821 150 omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
lionberg 33:bc73a2493821 151 vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0
lionberg 33:bc73a2493821 152 vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0
lionberg 33:bc73a2493821 153 omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3
lionberg 33:bc73a2493821 154 press = bmesensor.getPressure();
lionberg 33:bc73a2493821 155 temp = bmesensor.getTemperature()-3;
lionberg 33:bc73a2493821 156 rh = bmesensor.getHumidity();
lionberg 33:bc73a2493821 157 uv = lightsensor.getUV();
lionberg 33:bc73a2493821 158 vis = lightsensor.getVIS();
lionberg 33:bc73a2493821 159 ir = lightsensor.getIR();
lionberg 33:bc73a2493821 160
lionberg 33:bc73a2493821 161
lionberg 33:bc73a2493821 162 //Mount the filesystem
lionberg 33:bc73a2493821 163 sd.mount();
lionberg 33:bc73a2493821 164 FILE *fp = fopen(filename, "a");
lionberg 33:bc73a2493821 165 fprintf(fp, "%d,%d,%d,%d,%d,%d,%f,%f,%f,%f,%2.2f,%04.2f,%2.2f,%.0f,%.0f,%.0f,%.0f,%.0f,%.0f,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%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);
lionberg 33:bc73a2493821 166 fclose(fp);
lionberg 33:bc73a2493821 167 //Unmount the filesystem
lionberg 33:bc73a2493821 168 sd.unmount();
lionberg 33:bc73a2493821 169
lionberg 33:bc73a2493821 170 wait(1);
lionberg 33:bc73a2493821 171
lionberg 33:bc73a2493821 172 }
lionberg 33:bc73a2493821 173
lionberg 33:bc73a2493821 174
lionberg 33:bc73a2493821 175
lionberg 33:bc73a2493821 176
lionberg 33:bc73a2493821 177
lionberg 33:bc73a2493821 178 }
lionberg 33:bc73a2493821 179 }
lionberg 33:bc73a2493821 180
lionberg 33:bc73a2493821 181
lionberg 33:bc73a2493821 182