all working version 2.0
Dependencies: ADS1115 BME280 CronoDot SDFileSystem mbed
Fork of Outdoor_UPAS_v1_2_powerfunction by
main.cpp@9:8646fd501832, 2016-03-02 (annotated)
- Committer:
- caseyquinn
- Date:
- Wed Mar 02 17:16:43 2016 +0000
- Revision:
- 9:8646fd501832
- Parent:
- 8:c4a8f9b67cee
- Child:
- 10:06fbb1c9e3bd
General code cleaning and also added in the chronodot RTC into the log file for now.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jelord | 0:2cb2b2ea316f | 1 | #include "mbed.h" |
jelord | 2:88fcbfadec6a | 2 | #include "SDFileSystem.h" |
jelord | 2:88fcbfadec6a | 3 | #include "Adafruit_ADS1015.h" |
jelord | 2:88fcbfadec6a | 4 | #include "MCP40D17.h" |
jelord | 2:88fcbfadec6a | 5 | #include "STC3100.h" |
jelord | 2:88fcbfadec6a | 6 | #include "LSM303.h" |
jelord | 2:88fcbfadec6a | 7 | #include "BME280.h" |
jelord | 2:88fcbfadec6a | 8 | #include "SI1145.h" |
jelord | 2:88fcbfadec6a | 9 | #include "NCP5623BMUTBG.h" |
jelord | 2:88fcbfadec6a | 10 | #include "CronoDot.h" |
jelord | 2:88fcbfadec6a | 11 | #include "EEPROM.h" |
jelord | 2:88fcbfadec6a | 12 | #include "Calibration.h" |
caseyquinn | 7:29b01d5812ee | 13 | //Serial pc(USBTX, USBRX); |
caseyquinn | 8:c4a8f9b67cee | 14 | //Serial microChannel(USBTX, USBRX); // tx, rx Appears there is a conflict in the mbed code (possibly already assigned to SERIAL_TX, SERIAL_RX, USBTX, USBRX need to reassign these values) |
caseyquinn | 5:c3252e5d45ca | 15 | // However still an issue with the BLE not reading the EEPROM with the old pin assignments Jake had. |
caseyquinn | 5:c3252e5d45ca | 16 | Serial microChannel(D8, D2); // tx, rx |
caseyquinn | 7:29b01d5812ee | 17 | //Timer t; |
jelord | 1:9fbb5b665068 | 18 | struct tm tt; |
jelord | 0:2cb2b2ea316f | 19 | |
jelord | 2:88fcbfadec6a | 20 | I2C i2c(D14, D15); |
jelord | 2:88fcbfadec6a | 21 | Adafruit_ADS1115 ads(&i2c); |
jelord | 2:88fcbfadec6a | 22 | MCP40D17 DigPot(&i2c); |
jelord | 2:88fcbfadec6a | 23 | BME280 bmesensor(D14, D15); |
jelord | 2:88fcbfadec6a | 24 | STC3100 gasG(D14, D15); |
caseyquinn | 5:c3252e5d45ca | 25 | //DigitalOut blower(D8, 0); |
caseyquinn | 4:5d004fd997d5 | 26 | DigitalOut pbKill(PC_12, 1); |
caseyquinn | 4:5d004fd997d5 | 27 | DigitalOut bleRTS(PB_14, 0); |
caseyquinn | 4:5d004fd997d5 | 28 | DigitalOut bleCTS(PB_13, 0); |
jelord | 2:88fcbfadec6a | 29 | LSM303 movementsensor(D14, D15); |
jelord | 2:88fcbfadec6a | 30 | SI1145 lightsensor(D14, D15); |
jelord | 2:88fcbfadec6a | 31 | NCP5623BMUTBG RGB_LED(D14, D15); |
jelord | 3:122bfc998c4c | 32 | CronoDot RTC_UPAS(D14, D15); |
jelord | 2:88fcbfadec6a | 33 | EEPROM E2PROM(D14, D15); |
jelord | 2:88fcbfadec6a | 34 | //DigitalOut GPS_EN(p4,0); //pin 4 is used to enable and disable the GPS, in order to recive serial communications |
jelord | 2:88fcbfadec6a | 35 | Calibration calibrations(1); //Default serial/calibration if there are no values for the selected option |
jelord | 0:2cb2b2ea316f | 36 | |
caseyquinn | 9:8646fd501832 | 37 | |
caseyquinn | 9:8646fd501832 | 38 | Ticker stop; //This is the stop callback object |
caseyquinn | 8:c4a8f9b67cee | 39 | Ticker logg; //This is the logging callback object |
caseyquinn | 9:8646fd501832 | 40 | Ticker flowCtl; //This is the control loop callback object |
jelord | 3:122bfc998c4c | 41 | |
jelord | 3:122bfc998c4c | 42 | uint16_t serial_num = 1; // Default serial/calibration number |
jelord | 3:122bfc998c4c | 43 | int RunReady =0; |
jelord | 3:122bfc998c4c | 44 | |
caseyquinn | 4:5d004fd997d5 | 45 | struct tm STtime; |
caseyquinn | 7:29b01d5812ee | 46 | char timestr[32]; |
jelord | 3:122bfc998c4c | 47 | |
caseyquinn | 9:8646fd501832 | 48 | float press; |
caseyquinn | 9:8646fd501832 | 49 | float temp; |
caseyquinn | 9:8646fd501832 | 50 | float rh; |
jelord | 3:122bfc998c4c | 51 | |
caseyquinn | 9:8646fd501832 | 52 | int uv; |
caseyquinn | 9:8646fd501832 | 53 | int vis; |
caseyquinn | 9:8646fd501832 | 54 | int ir; |
jelord | 3:122bfc998c4c | 55 | |
caseyquinn | 9:8646fd501832 | 56 | float compass; |
caseyquinn | 9:8646fd501832 | 57 | float accel_x; |
caseyquinn | 9:8646fd501832 | 58 | float accel_y; |
caseyquinn | 9:8646fd501832 | 59 | float accel_z; |
caseyquinn | 9:8646fd501832 | 60 | float accel_comp; |
caseyquinn | 9:8646fd501832 | 61 | float angle_x; |
caseyquinn | 9:8646fd501832 | 62 | float angle_y; |
caseyquinn | 9:8646fd501832 | 63 | float angle_z; |
caseyquinn | 9:8646fd501832 | 64 | float mag_x; |
caseyquinn | 9:8646fd501832 | 65 | float mag_y; |
caseyquinn | 9:8646fd501832 | 66 | float mag_z; |
jelord | 3:122bfc998c4c | 67 | |
caseyquinn | 9:8646fd501832 | 68 | int vInReading; |
caseyquinn | 9:8646fd501832 | 69 | int vBlowerReading; |
caseyquinn | 9:8646fd501832 | 70 | int omronDiff; |
caseyquinn | 9:8646fd501832 | 71 | float omronVolt; //V |
caseyquinn | 9:8646fd501832 | 72 | int omronReading; |
caseyquinn | 9:8646fd501832 | 73 | float atmoRho; //g/L |
jelord | 3:122bfc998c4c | 74 | |
caseyquinn | 9:8646fd501832 | 75 | float massflow; //g/min |
caseyquinn | 9:8646fd501832 | 76 | float volflow; //L/min |
jelord | 3:122bfc998c4c | 77 | float volflowSet = 1.0; //L/min |
jelord | 3:122bfc998c4c | 78 | int logInerval = 10; //seconds |
jelord | 3:122bfc998c4c | 79 | double secondsD = 0; |
jelord | 3:122bfc998c4c | 80 | double lastsecondD = 0; |
caseyquinn | 9:8646fd501832 | 81 | float massflowSet; |
jelord | 3:122bfc998c4c | 82 | float deltaVflow = 0.0; |
jelord | 3:122bfc998c4c | 83 | float deltaMflow = 0.0; |
caseyquinn | 9:8646fd501832 | 84 | float gainFlow; |
caseyquinn | 9:8646fd501832 | 85 | float sampledVol; //L, total sampled volume |
jelord | 3:122bfc998c4c | 86 | |
caseyquinn | 9:8646fd501832 | 87 | int digital_pot_setpoint; //min = 0x7F, max = 0x00 |
caseyquinn | 9:8646fd501832 | 88 | int digital_pot_set; |
caseyquinn | 9:8646fd501832 | 89 | int digital_pot_change; |
jelord | 3:122bfc998c4c | 90 | int digitalpotMax = 127; |
caseyquinn | 9:8646fd501832 | 91 | int digitalpotMin = 10; |
jelord | 3:122bfc998c4c | 92 | |
jelord | 3:122bfc998c4c | 93 | int dutyUp = 4; |
jelord | 3:122bfc998c4c | 94 | int dutyDown = 3; |
jelord | 3:122bfc998c4c | 95 | |
jelord | 3:122bfc998c4c | 96 | // variables are only place holders for the US_Menu // |
caseyquinn | 9:8646fd501832 | 97 | int refreshtime; |
caseyquinn | 7:29b01d5812ee | 98 | //int refresh_Time = 10; // refresh time in s, note calling read_GPS()(or similar) will still take how ever long it needs(hopefully < 1s) |
jelord | 3:122bfc998c4c | 99 | float home_lat, home_lon, work_lat, work_lon; |
jelord | 3:122bfc998c4c | 100 | //*************************************************// |
jelord | 3:122bfc998c4c | 101 | |
jelord | 3:122bfc998c4c | 102 | char filename[] = "/sd/XXXX0000LOG000000000000---------------.txt"; |
caseyquinn | 4:5d004fd997d5 | 103 | SDFileSystem sd(D4, D5, D3, D10, "sd"); // I believe this matches Todd's pinout, let me know if this doesn't work. (MOSI, MISO, SCK, SEL) |
jelord | 3:122bfc998c4c | 104 | |
jelord | 2:88fcbfadec6a | 105 | void sendData(); |
jelord | 0:2cb2b2ea316f | 106 | static uint8_t rx_buf[20]; |
jelord | 0:2cb2b2ea316f | 107 | static uint8_t rx_len=0; |
jelord | 1:9fbb5b665068 | 108 | static int haltBLE = 1; |
jelord | 1:9fbb5b665068 | 109 | static int transmissionValue = 0; |
jelord | 2:88fcbfadec6a | 110 | uint8_t writeData[20] = {0,}; |
jelord | 2:88fcbfadec6a | 111 | static uint8_t dataLength = 0; |
jelord | 3:122bfc998c4c | 112 | static int runReady = 0; |
jelord | 3:122bfc998c4c | 113 | static uint8_t startAndEndTime[12] = {0,}; |
caseyquinn | 5:c3252e5d45ca | 114 | |
caseyquinn | 9:8646fd501832 | 115 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 116 | //BLE Functions |
caseyquinn | 9:8646fd501832 | 117 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 118 | |
caseyquinn | 9:8646fd501832 | 119 | void uartMicro(){ |
jelord | 3:122bfc998c4c | 120 | if(runReady!=1){ |
jelord | 3:122bfc998c4c | 121 | haltBLE = 2; |
jelord | 3:122bfc998c4c | 122 | while(microChannel.readable()){ |
jelord | 3:122bfc998c4c | 123 | rx_buf[rx_len++] = microChannel.getc(); |
jelord | 2:88fcbfadec6a | 124 | |
jelord | 3:122bfc998c4c | 125 | //Code block to verify what is being transmitted. To function correctly, all data must terminate with \0 or \n |
jelord | 3:122bfc998c4c | 126 | if(transmissionValue==0){ |
jelord | 3:122bfc998c4c | 127 | |
caseyquinn | 4:5d004fd997d5 | 128 | if (rx_buf[0] == 0x01)transmissionValue = 1; //rtc |
jelord | 3:122bfc998c4c | 129 | else if(rx_buf[0] == 0x02)transmissionValue = 2; //sample start and end times |
jelord | 3:122bfc998c4c | 130 | else if(rx_buf[0] == 0x03)transmissionValue = 3; //sample name |
jelord | 3:122bfc998c4c | 131 | else if(rx_buf[0] == 0x04)transmissionValue = 4; //Send Data Check |
jelord | 3:122bfc998c4c | 132 | |
jelord | 3:122bfc998c4c | 133 | else if(rx_buf[0] == 0x05)transmissionValue = 5; //log interval |
jelord | 3:122bfc998c4c | 134 | else if(rx_buf[0] == 0x06)transmissionValue = 6; //Flow Rate |
jelord | 3:122bfc998c4c | 135 | else if(rx_buf[0] == 0x07)transmissionValue = 7; //Serial Number |
jelord | 3:122bfc998c4c | 136 | else if(rx_buf[0] == 0x08)transmissionValue = 8; //Run Enable |
jelord | 3:122bfc998c4c | 137 | else transmissionValue = 100; //Not useful data |
jelord | 3:122bfc998c4c | 138 | } |
jelord | 3:122bfc998c4c | 139 | |
jelord | 3:122bfc998c4c | 140 | if(rx_buf[rx_len-1]=='\0' || rx_buf[rx_len-1]=='\n' || rx_buf[rx_len-1] == 0xff){ |
jelord | 3:122bfc998c4c | 141 | if((transmissionValue == 1 || transmissionValue == 2 || transmissionValue == 3 || transmissionValue == 4 || transmissionValue == 5 || |
jelord | 3:122bfc998c4c | 142 | transmissionValue == 6 || transmissionValue == 7) && rx_buf[rx_len-1] != 0xff) |
jelord | 3:122bfc998c4c | 143 | {}else{ |
jelord | 3:122bfc998c4c | 144 | if(transmissionValue == 4 ) sendData(); |
jelord | 3:122bfc998c4c | 145 | if(transmissionValue == 8){ |
jelord | 3:122bfc998c4c | 146 | runReady = 1; |
jelord | 3:122bfc998c4c | 147 | microChannel.attach(NULL,microChannel.RxIrq); |
jelord | 3:122bfc998c4c | 148 | } |
jelord | 3:122bfc998c4c | 149 | haltBLE = 1; |
jelord | 3:122bfc998c4c | 150 | transmissionValue = 0; |
jelord | 3:122bfc998c4c | 151 | dataLength = 0; |
jelord | 2:88fcbfadec6a | 152 | |
jelord | 3:122bfc998c4c | 153 | } |
jelord | 2:88fcbfadec6a | 154 | } |
jelord | 1:9fbb5b665068 | 155 | } |
jelord | 3:122bfc998c4c | 156 | if(haltBLE!=1){ |
jelord | 2:88fcbfadec6a | 157 | |
jelord | 3:122bfc998c4c | 158 | if((transmissionValue!=100) && (dataLength!= 0)) writeData[dataLength-1] = rx_buf[0]; |
jelord | 3:122bfc998c4c | 159 | |
jelord | 3:122bfc998c4c | 160 | if(transmissionValue ==100){ |
jelord | 3:122bfc998c4c | 161 | //pc.putc(rx_buf[0]); |
jelord | 2:88fcbfadec6a | 162 | |
jelord | 3:122bfc998c4c | 163 | }else if(transmissionValue ==1){ //process and store RTC values |
jelord | 3:122bfc998c4c | 164 | |
caseyquinn | 7:29b01d5812ee | 165 | //if(dataLength==6)RTC_UPAS.set_time(writeData[0],writeData[1],writeData[2],writeData[3],writeData[3],writeData[4],writeData[5]);//sets chronodot RTC |
caseyquinn | 7:29b01d5812ee | 166 | if(dataLength==6){ |
caseyquinn | 7:29b01d5812ee | 167 | RTC_UPAS.set_time(writeData[0],writeData[1],writeData[2],writeData[3],writeData[3],writeData[4],writeData[5]);//sets chronodot RTC |
caseyquinn | 7:29b01d5812ee | 168 | //sets ST RTC |
caseyquinn | 7:29b01d5812ee | 169 | STtime.tm_sec = writeData[0]; // 0-59 |
caseyquinn | 7:29b01d5812ee | 170 | STtime.tm_min = writeData[1]; // 0-59 |
caseyquinn | 7:29b01d5812ee | 171 | STtime.tm_hour = writeData[2]; // 0-23 |
caseyquinn | 7:29b01d5812ee | 172 | STtime.tm_mday = writeData[3]; // 1-31 |
caseyquinn | 7:29b01d5812ee | 173 | STtime.tm_mon = writeData[4]-1; // 0-11 |
caseyquinn | 7:29b01d5812ee | 174 | STtime.tm_year = 100+writeData[5]; // year since 1900 (116 = 2016) |
caseyquinn | 7:29b01d5812ee | 175 | time_t STseconds = mktime(&STtime); |
caseyquinn | 7:29b01d5812ee | 176 | set_time(STseconds); // Set RTC time to 16 December 2013 10:05:23 UTC |
caseyquinn | 7:29b01d5812ee | 177 | } |
jelord | 3:122bfc998c4c | 178 | |
jelord | 3:122bfc998c4c | 179 | }else if(transmissionValue ==2){ //process and store sample start/end |
jelord | 3:122bfc998c4c | 180 | if(dataLength ==12)E2PROM.write(0x00015, writeData, 12); |
jelord | 3:122bfc998c4c | 181 | |
jelord | 3:122bfc998c4c | 182 | }else if(transmissionValue ==3){ //process and store sample name |
jelord | 3:122bfc998c4c | 183 | if(dataLength ==8)E2PROM.write(0x00001,writeData,8); |
jelord | 3:122bfc998c4c | 184 | |
jelord | 3:122bfc998c4c | 185 | }else if(transmissionValue ==5){ //process and store Log Interval |
jelord | 3:122bfc998c4c | 186 | if(dataLength ==1)E2PROM.write(0x00014,writeData,1); |
jelord | 2:88fcbfadec6a | 187 | |
jelord | 3:122bfc998c4c | 188 | }else if(transmissionValue ==6){ //process and store Flow Rate |
jelord | 3:122bfc998c4c | 189 | if(dataLength ==4)E2PROM.write(0x00010,writeData,4); |
jelord | 3:122bfc998c4c | 190 | |
jelord | 3:122bfc998c4c | 191 | }else if(transmissionValue ==7){ //process and store Serial Number |
jelord | 3:122bfc998c4c | 192 | if(dataLength ==2)E2PROM.write(0x00034,writeData,2); |
jelord | 3:122bfc998c4c | 193 | } |
jelord | 3:122bfc998c4c | 194 | dataLength++; |
jelord | 1:9fbb5b665068 | 195 | } |
jelord | 3:122bfc998c4c | 196 | |
jelord | 3:122bfc998c4c | 197 | rx_len = 0; |
jelord | 3:122bfc998c4c | 198 | }else{ |
jelord | 3:122bfc998c4c | 199 | while(microChannel.readable()) |
jelord | 3:122bfc998c4c | 200 | uint8_t extract = microChannel.getc(); |
jelord | 3:122bfc998c4c | 201 | } |
jelord | 2:88fcbfadec6a | 202 | |
jelord | 2:88fcbfadec6a | 203 | } |
jelord | 2:88fcbfadec6a | 204 | void sendData(){ |
jelord | 2:88fcbfadec6a | 205 | |
jelord | 2:88fcbfadec6a | 206 | uint8_t sampleTimePassValues[13] = {0x01,}; |
jelord | 2:88fcbfadec6a | 207 | uint8_t subjectLabelOriginal[9] = {0x02,}; |
jelord | 2:88fcbfadec6a | 208 | uint8_t dataLogOriginal[2] = {0x03,}; |
jelord | 2:88fcbfadec6a | 209 | uint8_t flowRateOriginal[5] = {0x04,}; |
jelord | 2:88fcbfadec6a | 210 | //uint8_t presetRunModeCheck[1] = {0,}; Commented and currently unused to prevent mem issues |
jelord | 2:88fcbfadec6a | 211 | E2PROM.read(0x00015, sampleTimePassValues+1, 12); |
jelord | 2:88fcbfadec6a | 212 | E2PROM.read(0x00001, subjectLabelOriginal+1,8); |
jelord | 2:88fcbfadec6a | 213 | E2PROM.read(0x00014,dataLogOriginal+1,1); |
jelord | 2:88fcbfadec6a | 214 | E2PROM.read(0x00010,flowRateOriginal+1,4); |
jelord | 2:88fcbfadec6a | 215 | |
jelord | 2:88fcbfadec6a | 216 | for(int i=0; i<13; i++){ |
jelord | 2:88fcbfadec6a | 217 | microChannel.putc(sampleTimePassValues[i]); |
jelord | 2:88fcbfadec6a | 218 | } |
jelord | 2:88fcbfadec6a | 219 | wait(.25); |
jelord | 2:88fcbfadec6a | 220 | |
jelord | 2:88fcbfadec6a | 221 | for(int i=0; i<9; i++){ |
jelord | 2:88fcbfadec6a | 222 | microChannel.putc(subjectLabelOriginal[i]); |
jelord | 2:88fcbfadec6a | 223 | } |
jelord | 2:88fcbfadec6a | 224 | wait(.25); |
jelord | 2:88fcbfadec6a | 225 | |
jelord | 2:88fcbfadec6a | 226 | for(int i=0; i<2; i++){ |
jelord | 2:88fcbfadec6a | 227 | microChannel.putc(dataLogOriginal[i]); |
jelord | 2:88fcbfadec6a | 228 | } |
jelord | 2:88fcbfadec6a | 229 | wait(.25); |
jelord | 2:88fcbfadec6a | 230 | |
jelord | 2:88fcbfadec6a | 231 | for(int i=0; i<5; i++){ |
jelord | 2:88fcbfadec6a | 232 | microChannel.putc(flowRateOriginal[i]); |
jelord | 2:88fcbfadec6a | 233 | } |
jelord | 0:2cb2b2ea316f | 234 | |
jelord | 2:88fcbfadec6a | 235 | |
jelord | 2:88fcbfadec6a | 236 | } |
caseyquinn | 5:c3252e5d45ca | 237 | |
caseyquinn | 9:8646fd501832 | 238 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 239 | //Shutdown Function |
caseyquinn | 9:8646fd501832 | 240 | ////////////////////////////////////////////////////////////// |
jelord | 3:122bfc998c4c | 241 | void check_stop() // this checks if it's time to stop and shutdown |
jelord | 3:122bfc998c4c | 242 | { |
caseyquinn | 9:8646fd501832 | 243 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
caseyquinn | 9:8646fd501832 | 244 | //UPDATE THIS TO WORK WITH ST RTC INSTEAD |
caseyquinn | 9:8646fd501832 | 245 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
jelord | 3:122bfc998c4c | 246 | if(RTC_UPAS.compare(startAndEndTime[6], startAndEndTime[7], startAndEndTime[8], startAndEndTime[9], startAndEndTime[10], startAndEndTime[11])) { |
jelord | 3:122bfc998c4c | 247 | pbKill = 0; // this is were we shut everything down |
caseyquinn | 4:5d004fd997d5 | 248 | //pc.printf("If you're reading this something has gone very wrong."); |
jelord | 3:122bfc998c4c | 249 | } |
jelord | 3:122bfc998c4c | 250 | |
jelord | 3:122bfc998c4c | 251 | } |
caseyquinn | 5:c3252e5d45ca | 252 | |
caseyquinn | 9:8646fd501832 | 253 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 254 | //SD Logging Function |
caseyquinn | 9:8646fd501832 | 255 | ////////////////////////////////////////////////////////////// |
jelord | 3:122bfc998c4c | 256 | void log_data() |
jelord | 3:122bfc998c4c | 257 | { |
jelord | 3:122bfc998c4c | 258 | |
caseyquinn | 9:8646fd501832 | 259 | RGB_LED.set_led(1,1,0); |
caseyquinn | 7:29b01d5812ee | 260 | |
caseyquinn | 7:29b01d5812ee | 261 | time_t seconds = time(NULL); |
caseyquinn | 7:29b01d5812ee | 262 | strftime(timestr, 32, "%y%m%d%H%M%S", localtime(&seconds)); |
caseyquinn | 9:8646fd501832 | 263 | RTC_UPAS.get_time(); |
caseyquinn | 7:29b01d5812ee | 264 | press = bmesensor.getPressure(); |
caseyquinn | 7:29b01d5812ee | 265 | temp = bmesensor.getTemperature()-5.0; |
caseyquinn | 7:29b01d5812ee | 266 | rh = bmesensor.getHumidity(); |
caseyquinn | 7:29b01d5812ee | 267 | uv = lightsensor.getUV(); |
caseyquinn | 7:29b01d5812ee | 268 | |
caseyquinn | 7:29b01d5812ee | 269 | |
caseyquinn | 7:29b01d5812ee | 270 | FILE *fp = fopen(filename, "a"); |
caseyquinn | 9:8646fd501832 | 271 | fprintf(fp, "%02d,%02d,%02d,%02d,%02d,%02d,",RTC_UPAS.year, RTC_UPAS.month,RTC_UPAS.date,RTC_UPAS.hour,RTC_UPAS.minutes,RTC_UPAS.seconds); |
caseyquinn | 7:29b01d5812ee | 272 | fprintf(fp, "%s,", timestr); |
caseyquinn | 7:29b01d5812ee | 273 | fprintf(fp, "%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,", omronVolt,massflow,temp,press,rh,atmoRho); |
caseyquinn | 7:29b01d5812ee | 274 | fprintf(fp, "%1.3f,%5.1f,%1.1f,%1.1f,%1.1f,%1.1f,", volflow, sampledVol, accel_x, accel_y, accel_z, accel_comp); |
caseyquinn | 7:29b01d5812ee | 275 | fprintf(fp, "%.1f,%.1f,%.1f,%.3f,%.3f,%.3f,%.1f,", angle_x,angle_y,angle_z,mag_x, mag_y, mag_z,compass); |
caseyquinn | 7:29b01d5812ee | 276 | fprintf(fp, "%d,%d,%d,%d,%d,%d," ,uv,omronReading, vInReading, vBlowerReading, omronDiff,gasG.getAmps()); |
caseyquinn | 7:29b01d5812ee | 277 | fprintf(fp, "%d,%d,%d,%1.3f,%1.3f\r\n", gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow); |
caseyquinn | 7:29b01d5812ee | 278 | fclose(fp); |
caseyquinn | 7:29b01d5812ee | 279 | free(fp); |
caseyquinn | 7:29b01d5812ee | 280 | RGB_LED.set_led(1,0,0); |
jelord | 3:122bfc998c4c | 281 | |
jelord | 3:122bfc998c4c | 282 | } |
caseyquinn | 8:c4a8f9b67cee | 283 | |
caseyquinn | 9:8646fd501832 | 284 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 285 | //Flow Control Function |
caseyquinn | 9:8646fd501832 | 286 | ////////////////////////////////////////////////////////////// |
caseyquinn | 8:c4a8f9b67cee | 287 | void flowControl() |
caseyquinn | 8:c4a8f9b67cee | 288 | { |
caseyquinn | 8:c4a8f9b67cee | 289 | RGB_LED.set_led(0,1,0); |
caseyquinn | 8:c4a8f9b67cee | 290 | omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V |
caseyquinn | 8:c4a8f9b67cee | 291 | omronVolt = (omronReading*4.096)/(32768*2); |
caseyquinn | 8:c4a8f9b67cee | 292 | |
caseyquinn | 8:c4a8f9b67cee | 293 | if(omronVolt<=calibrations.omronVMin) { |
caseyquinn | 8:c4a8f9b67cee | 294 | massflow = calibrations.omronMFMin; |
caseyquinn | 8:c4a8f9b67cee | 295 | } else if(omronVolt>=calibrations.omronVMax) { |
caseyquinn | 8:c4a8f9b67cee | 296 | massflow = calibrations.omronMFMax; |
caseyquinn | 8:c4a8f9b67cee | 297 | } else { |
caseyquinn | 8:c4a8f9b67cee | 298 | massflow = calibrations.MF4*pow(omronVolt,(float)4)+calibrations.MF3*pow(omronVolt,(float)3)+calibrations.MF2*pow(omronVolt,(float)2)+calibrations.MF1*omronVolt+calibrations.MF0; |
caseyquinn | 8:c4a8f9b67cee | 299 | } |
caseyquinn | 8:c4a8f9b67cee | 300 | |
caseyquinn | 8:c4a8f9b67cee | 301 | 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)); |
caseyquinn | 8:c4a8f9b67cee | 302 | volflow = massflow/atmoRho; |
caseyquinn | 8:c4a8f9b67cee | 303 | sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow); |
caseyquinn | 8:c4a8f9b67cee | 304 | deltaVflow = volflow-volflowSet; |
caseyquinn | 8:c4a8f9b67cee | 305 | massflowSet = volflowSet*atmoRho; |
caseyquinn | 8:c4a8f9b67cee | 306 | deltaMflow = massflow-massflowSet; |
caseyquinn | 8:c4a8f9b67cee | 307 | if(abs(deltaMflow)>.025) { |
caseyquinn | 8:c4a8f9b67cee | 308 | digital_pot_change = (int)(gainFlow*deltaMflow); |
caseyquinn | 8:c4a8f9b67cee | 309 | |
caseyquinn | 8:c4a8f9b67cee | 310 | |
caseyquinn | 8:c4a8f9b67cee | 311 | if(abs(digital_pot_change)>=50) { |
caseyquinn | 8:c4a8f9b67cee | 312 | digital_pot_set = (int)(digital_pot_set+(int)((10.0*deltaMflow))); |
caseyquinn | 8:c4a8f9b67cee | 313 | //RGB_LED.set_led(1,0,0); |
caseyquinn | 8:c4a8f9b67cee | 314 | } else { |
caseyquinn | 8:c4a8f9b67cee | 315 | digital_pot_set = (digital_pot_set+ digital_pot_change); |
caseyquinn | 8:c4a8f9b67cee | 316 | // RGB_LED.set_led(1,1,0); |
caseyquinn | 8:c4a8f9b67cee | 317 | } |
caseyquinn | 8:c4a8f9b67cee | 318 | |
caseyquinn | 8:c4a8f9b67cee | 319 | if(digital_pot_set>=digitalpotMax) { |
caseyquinn | 8:c4a8f9b67cee | 320 | digital_pot_set = digitalpotMax; |
caseyquinn | 8:c4a8f9b67cee | 321 | //RGB_LED.set_led(1,0,0); |
caseyquinn | 8:c4a8f9b67cee | 322 | } else if(digital_pot_set<=digitalpotMin) { |
caseyquinn | 8:c4a8f9b67cee | 323 | digital_pot_set = digitalpotMin; |
caseyquinn | 8:c4a8f9b67cee | 324 | //RGB_LED.set_led(1,0,0); |
caseyquinn | 8:c4a8f9b67cee | 325 | } |
caseyquinn | 8:c4a8f9b67cee | 326 | |
caseyquinn | 8:c4a8f9b67cee | 327 | |
caseyquinn | 8:c4a8f9b67cee | 328 | DigPot.writeRegister(digital_pot_set); |
caseyquinn | 8:c4a8f9b67cee | 329 | |
caseyquinn | 8:c4a8f9b67cee | 330 | } else { |
caseyquinn | 8:c4a8f9b67cee | 331 | //RGB_LED.set_led(0,1,0); |
caseyquinn | 8:c4a8f9b67cee | 332 | } |
caseyquinn | 8:c4a8f9b67cee | 333 | } |
caseyquinn | 9:8646fd501832 | 334 | |
caseyquinn | 9:8646fd501832 | 335 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 336 | //Main Function |
caseyquinn | 9:8646fd501832 | 337 | ////////////////////////////////////////////////////////////// |
jelord | 1:9fbb5b665068 | 338 | int main(){ |
caseyquinn | 7:29b01d5812ee | 339 | |
caseyquinn | 4:5d004fd997d5 | 340 | //wait(10); |
caseyquinn | 6:a738dcd53bf8 | 341 | //RGB_LED.set_led(0,0,1); |
caseyquinn | 4:5d004fd997d5 | 342 | //pc.baud(115200); // set what you want here depending on your terminal program speed |
caseyquinn | 4:5d004fd997d5 | 343 | //pc.printf("\f\n\r-------------Startup-------------\n\r"); |
jelord | 1:9fbb5b665068 | 344 | wait(0.5); |
caseyquinn | 5:c3252e5d45ca | 345 | |
jelord | 3:122bfc998c4c | 346 | uint8_t serialNumberAndType[6] = {0x50,0x53}; |
jelord | 3:122bfc998c4c | 347 | E2PROM.read(0x00034,serialNumberAndType+2,2); |
caseyquinn | 4:5d004fd997d5 | 348 | |
jelord | 3:122bfc998c4c | 349 | int tempSerialNum = serialNumberAndType[2]+serialNumberAndType[3]; |
jelord | 3:122bfc998c4c | 350 | int serialNumDigits[4]; |
jelord | 3:122bfc998c4c | 351 | serialNumDigits[0] = tempSerialNum / 1000 % 10; |
jelord | 3:122bfc998c4c | 352 | serialNumDigits[1] = tempSerialNum / 100 % 10; |
jelord | 3:122bfc998c4c | 353 | serialNumDigits[2] = tempSerialNum / 10 % 10; |
jelord | 3:122bfc998c4c | 354 | serialNumDigits[3] = tempSerialNum % 10; |
jelord | 3:122bfc998c4c | 355 | |
jelord | 3:122bfc998c4c | 356 | serialNumberAndType[2] = serialNumDigits[0]+48; |
jelord | 3:122bfc998c4c | 357 | serialNumberAndType[3] = serialNumDigits[1]+48; |
jelord | 3:122bfc998c4c | 358 | serialNumberAndType[4] = serialNumDigits[2]+48; |
jelord | 3:122bfc998c4c | 359 | serialNumberAndType[5] = serialNumDigits[3]+48; |
caseyquinn | 5:c3252e5d45ca | 360 | RGB_LED.set_led(0,1,0); |
jelord | 3:122bfc998c4c | 361 | //pc.attach(pc_recv); |
jelord | 1:9fbb5b665068 | 362 | microChannel.attach(uartMicro,microChannel.RxIrq); |
jelord | 3:122bfc998c4c | 363 | microChannel.baud(115200); |
jelord | 1:9fbb5b665068 | 364 | microChannel.printf("$$$"); |
jelord | 3:122bfc998c4c | 365 | wait(0.5); |
jelord | 3:122bfc998c4c | 366 | microChannel.printf("SN,"); |
jelord | 3:122bfc998c4c | 367 | for(int i=0;i<6;i++)microChannel.putc(serialNumberAndType[i]); |
jelord | 3:122bfc998c4c | 368 | microChannel.printf("\r"); |
jelord | 3:122bfc998c4c | 369 | wait(0.5); |
jelord | 1:9fbb5b665068 | 370 | microChannel.printf("A\r"); |
jelord | 3:122bfc998c4c | 371 | wait(0.5); |
jelord | 2:88fcbfadec6a | 372 | microChannel.printf("---\r"); |
jelord | 3:122bfc998c4c | 373 | wait(0.5); |
jelord | 2:88fcbfadec6a | 374 | |
jelord | 2:88fcbfadec6a | 375 | |
caseyquinn | 4:5d004fd997d5 | 376 | |
jelord | 2:88fcbfadec6a | 377 | |
jelord | 2:88fcbfadec6a | 378 | RGB_LED.set_led(1,1,1); |
jelord | 3:122bfc998c4c | 379 | while(runReady!=1) { |
jelord | 3:122bfc998c4c | 380 | wait(1); |
jelord | 3:122bfc998c4c | 381 | //pc.printf("Waiting for BLE instruction"); |
jelord | 3:122bfc998c4c | 382 | |
jelord | 3:122bfc998c4c | 383 | } |
jelord | 3:122bfc998c4c | 384 | |
caseyquinn | 7:29b01d5812ee | 385 | |
jelord | 3:122bfc998c4c | 386 | |
jelord | 3:122bfc998c4c | 387 | E2PROM.read(0x00015, startAndEndTime, 12); //Grab start and end times from EEPROM |
jelord | 3:122bfc998c4c | 388 | RGB_LED.set_led(0,1,0); |
caseyquinn | 7:29b01d5812ee | 389 | |
caseyquinn | 7:29b01d5812ee | 390 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
caseyquinn | 7:29b01d5812ee | 391 | //UPDATE THIS TO WORK WITH ST RTC INSTEAD |
caseyquinn | 7:29b01d5812ee | 392 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
caseyquinn | 7:29b01d5812ee | 393 | |
jelord | 3:122bfc998c4c | 394 | while(!RTC_UPAS.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 |
jelord | 3:122bfc998c4c | 395 | wait(0.5); |
jelord | 3:122bfc998c4c | 396 | |
jelord | 3:122bfc998c4c | 397 | RTC_UPAS.get_time(); |
jelord | 3:122bfc998c4c | 398 | |
jelord | 3:122bfc998c4c | 399 | } |
jelord | 3:122bfc998c4c | 400 | |
jelord | 3:122bfc998c4c | 401 | |
jelord | 3:122bfc998c4c | 402 | //Get the proper serial number |
jelord | 3:122bfc998c4c | 403 | uint8_t serialBytes[2] = {0,}; |
jelord | 3:122bfc998c4c | 404 | E2PROM.read(0x00034, serialBytes,2); |
jelord | 3:122bfc998c4c | 405 | serial_num = ((uint16_t)serialBytes[1] << 8) | serialBytes[0]; |
jelord | 3:122bfc998c4c | 406 | calibrations.initialize(serial_num); |
jelord | 3:122bfc998c4c | 407 | |
jelord | 3:122bfc998c4c | 408 | uint8_t logByte[1] = {0,}; |
jelord | 3:122bfc998c4c | 409 | E2PROM.read(0x00014,logByte,1); |
jelord | 3:122bfc998c4c | 410 | logInerval = logByte[0]; |
jelord | 3:122bfc998c4c | 411 | |
caseyquinn | 7:29b01d5812ee | 412 | |
jelord | 3:122bfc998c4c | 413 | //Use the flow rate value stored in eeprom |
jelord | 3:122bfc998c4c | 414 | uint8_t flowRateBytes[4] = {0,}; |
jelord | 3:122bfc998c4c | 415 | E2PROM.read(0x00010,flowRateBytes,4); |
jelord | 3:122bfc998c4c | 416 | E2PROM.byteToFloat(flowRateBytes, &volflowSet); |
jelord | 3:122bfc998c4c | 417 | |
jelord | 3:122bfc998c4c | 418 | if(volflowSet<=1.0) { |
jelord | 3:122bfc998c4c | 419 | gainFlow = 100; |
jelord | 3:122bfc998c4c | 420 | } else if(volflowSet>=2.0) { |
jelord | 3:122bfc998c4c | 421 | gainFlow = 25; |
jelord | 3:122bfc998c4c | 422 | } else { |
jelord | 3:122bfc998c4c | 423 | gainFlow = 25; |
jelord | 0:2cb2b2ea316f | 424 | } |
jelord | 3:122bfc998c4c | 425 | |
jelord | 3:122bfc998c4c | 426 | RGB_LED.set_led(1,0,0); |
jelord | 3:122bfc998c4c | 427 | press = bmesensor.getPressure(); |
jelord | 3:122bfc998c4c | 428 | temp = bmesensor.getTemperature(); |
jelord | 3:122bfc998c4c | 429 | rh = bmesensor.getHumidity(); |
jelord | 3:122bfc998c4c | 430 | |
jelord | 3:122bfc998c4c | 431 | 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)); |
jelord | 3:122bfc998c4c | 432 | massflowSet = volflowSet*atmoRho; |
jelord | 3:122bfc998c4c | 433 | |
jelord | 3:122bfc998c4c | 434 | |
jelord | 3:122bfc998c4c | 435 | DigPot.writeRegister(digital_pot_setpoint); |
jelord | 3:122bfc998c4c | 436 | wait(1); |
caseyquinn | 5:c3252e5d45ca | 437 | //blower = 1; |
jelord | 3:122bfc998c4c | 438 | |
jelord | 3:122bfc998c4c | 439 | uint8_t subjectLabelOriginal[8] = {0,}; |
caseyquinn | 4:5d004fd997d5 | 440 | E2PROM.read(0x00001, subjectLabelOriginal,8); |
caseyquinn | 5:c3252e5d45ca | 441 | |
caseyquinn | 4:5d004fd997d5 | 442 | time_t seconds = time(NULL); |
caseyquinn | 4:5d004fd997d5 | 443 | strftime(timestr, 32, "%y-%m-%d-%H=%M=%S", localtime(&seconds)); |
caseyquinn | 9:8646fd501832 | 444 | //sprintf(filename, "/sd/UPAS%04dLOG_%02d-%02d-%02d_%02d=%02d=%02d_%c%c%c%c%c%c%c%c.txt",serial_num,RTC_UPAS.year,RTC_UPAS.month,RTC_UPAS.date,RTC_UPAS.hour,RTC_UPAS.minutes,RTC_UPAS.seconds,subjectLabelOriginal[0],subjectLabelOriginal[1],subjectLabelOriginal[2],subjectLabelOriginal[3],subjectLabelOriginal[4],subjectLabelOriginal[5],subjectLabelOriginal[6],subjectLabelOriginal[7]); |
caseyquinn | 4:5d004fd997d5 | 445 | sprintf(filename, "/sd/UPASboardtest_%s.txt", timestr); |
jelord | 3:122bfc998c4c | 446 | FILE *fp = fopen(filename, "w"); |
jelord | 3:122bfc998c4c | 447 | fclose(fp); |
jelord | 3:122bfc998c4c | 448 | |
jelord | 3:122bfc998c4c | 449 | |
jelord | 3:122bfc998c4c | 450 | sampledVol = 0.0; |
jelord | 3:122bfc998c4c | 451 | RGB_LED.set_led(0,1,0); |
caseyquinn | 9:8646fd501832 | 452 | |
caseyquinn | 9:8646fd501832 | 453 | stop.attach(&check_stop, 9); // check if we should shut down every 9 number seconds, starting after the start. |
caseyquinn | 7:29b01d5812ee | 454 | logg.attach(&log_data, logInerval); |
caseyquinn | 8:c4a8f9b67cee | 455 | flowCtl.attach(&flowControl, 1); |
caseyquinn | 7:29b01d5812ee | 456 | |
jelord | 3:122bfc998c4c | 457 | |
jelord | 3:122bfc998c4c | 458 | //** end of initalization **// |
jelord | 3:122bfc998c4c | 459 | //---------------------------------------------------------------------------------------------// |
jelord | 3:122bfc998c4c | 460 | //---------------------------------------------------------------------------------------------// |
jelord | 3:122bfc998c4c | 461 | // Main Control Loop |
jelord | 3:122bfc998c4c | 462 | |
caseyquinn | 7:29b01d5812ee | 463 | while (1) { |
caseyquinn | 7:29b01d5812ee | 464 | // Do other things... |
caseyquinn | 7:29b01d5812ee | 465 | } |
caseyquinn | 7:29b01d5812ee | 466 | |
caseyquinn | 8:c4a8f9b67cee | 467 | |
caseyquinn | 4:5d004fd997d5 | 468 | |
jelord | 3:122bfc998c4c | 469 | |
jelord | 0:2cb2b2ea316f | 470 | } |