6 sharps, 2 ads hooked up
Dependencies: ADS1115 BME280 CronoDot SDFileSystem mbed
Fork of Outdoor_UPAS_v1_2_Tboard by
main.cpp@10:06fbb1c9e3bd, 2016-03-02 (annotated)
- Committer:
- caseyquinn
- Date:
- Wed Mar 02 20:59:40 2016 +0000
- Revision:
- 10:06fbb1c9e3bd
- Parent:
- 9:8646fd501832
- Child:
- 11:aa21628a9b15
Updated mbed files and nucleo board to "try" and make the tboard RN4677 work on D1 and D0 rather than D8 and D2 pins. Still not working exactly right...
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 | 10:06fbb1c9e3bd | 13 | Serial pc(USBTX, USBRX); |
caseyquinn | 10:06fbb1c9e3bd | 14 | Serial microChannel(D1, D0); // 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 | 10:06fbb1c9e3bd | 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 | 10:06fbb1c9e3bd | 115 | |
caseyquinn | 10:06fbb1c9e3bd | 116 | void pc_recv(){ |
caseyquinn | 10:06fbb1c9e3bd | 117 | while(pc.readable()){ |
caseyquinn | 10:06fbb1c9e3bd | 118 | pc.getc(); |
caseyquinn | 10:06fbb1c9e3bd | 119 | } |
caseyquinn | 10:06fbb1c9e3bd | 120 | } |
caseyquinn | 10:06fbb1c9e3bd | 121 | |
caseyquinn | 9:8646fd501832 | 122 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 123 | //BLE Functions |
caseyquinn | 9:8646fd501832 | 124 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 125 | |
caseyquinn | 9:8646fd501832 | 126 | void uartMicro(){ |
jelord | 3:122bfc998c4c | 127 | if(runReady!=1){ |
jelord | 3:122bfc998c4c | 128 | haltBLE = 2; |
jelord | 3:122bfc998c4c | 129 | while(microChannel.readable()){ |
jelord | 3:122bfc998c4c | 130 | rx_buf[rx_len++] = microChannel.getc(); |
jelord | 2:88fcbfadec6a | 131 | |
jelord | 3:122bfc998c4c | 132 | //Code block to verify what is being transmitted. To function correctly, all data must terminate with \0 or \n |
jelord | 3:122bfc998c4c | 133 | if(transmissionValue==0){ |
jelord | 3:122bfc998c4c | 134 | |
caseyquinn | 4:5d004fd997d5 | 135 | if (rx_buf[0] == 0x01)transmissionValue = 1; //rtc |
jelord | 3:122bfc998c4c | 136 | else if(rx_buf[0] == 0x02)transmissionValue = 2; //sample start and end times |
jelord | 3:122bfc998c4c | 137 | else if(rx_buf[0] == 0x03)transmissionValue = 3; //sample name |
jelord | 3:122bfc998c4c | 138 | else if(rx_buf[0] == 0x04)transmissionValue = 4; //Send Data Check |
jelord | 3:122bfc998c4c | 139 | |
jelord | 3:122bfc998c4c | 140 | else if(rx_buf[0] == 0x05)transmissionValue = 5; //log interval |
jelord | 3:122bfc998c4c | 141 | else if(rx_buf[0] == 0x06)transmissionValue = 6; //Flow Rate |
jelord | 3:122bfc998c4c | 142 | else if(rx_buf[0] == 0x07)transmissionValue = 7; //Serial Number |
jelord | 3:122bfc998c4c | 143 | else if(rx_buf[0] == 0x08)transmissionValue = 8; //Run Enable |
jelord | 3:122bfc998c4c | 144 | else transmissionValue = 100; //Not useful data |
jelord | 3:122bfc998c4c | 145 | } |
jelord | 3:122bfc998c4c | 146 | |
jelord | 3:122bfc998c4c | 147 | if(rx_buf[rx_len-1]=='\0' || rx_buf[rx_len-1]=='\n' || rx_buf[rx_len-1] == 0xff){ |
jelord | 3:122bfc998c4c | 148 | if((transmissionValue == 1 || transmissionValue == 2 || transmissionValue == 3 || transmissionValue == 4 || transmissionValue == 5 || |
jelord | 3:122bfc998c4c | 149 | transmissionValue == 6 || transmissionValue == 7) && rx_buf[rx_len-1] != 0xff) |
jelord | 3:122bfc998c4c | 150 | {}else{ |
jelord | 3:122bfc998c4c | 151 | if(transmissionValue == 4 ) sendData(); |
jelord | 3:122bfc998c4c | 152 | if(transmissionValue == 8){ |
jelord | 3:122bfc998c4c | 153 | runReady = 1; |
jelord | 3:122bfc998c4c | 154 | microChannel.attach(NULL,microChannel.RxIrq); |
jelord | 3:122bfc998c4c | 155 | } |
jelord | 3:122bfc998c4c | 156 | haltBLE = 1; |
jelord | 3:122bfc998c4c | 157 | transmissionValue = 0; |
jelord | 3:122bfc998c4c | 158 | dataLength = 0; |
jelord | 2:88fcbfadec6a | 159 | |
jelord | 3:122bfc998c4c | 160 | } |
jelord | 2:88fcbfadec6a | 161 | } |
jelord | 1:9fbb5b665068 | 162 | } |
jelord | 3:122bfc998c4c | 163 | if(haltBLE!=1){ |
jelord | 2:88fcbfadec6a | 164 | |
jelord | 3:122bfc998c4c | 165 | if((transmissionValue!=100) && (dataLength!= 0)) writeData[dataLength-1] = rx_buf[0]; |
jelord | 3:122bfc998c4c | 166 | |
jelord | 3:122bfc998c4c | 167 | if(transmissionValue ==100){ |
caseyquinn | 10:06fbb1c9e3bd | 168 | pc.putc(rx_buf[0]); |
jelord | 2:88fcbfadec6a | 169 | |
jelord | 3:122bfc998c4c | 170 | }else if(transmissionValue ==1){ //process and store RTC values |
jelord | 3:122bfc998c4c | 171 | |
caseyquinn | 7:29b01d5812ee | 172 | //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 | 173 | if(dataLength==6){ |
caseyquinn | 7:29b01d5812ee | 174 | RTC_UPAS.set_time(writeData[0],writeData[1],writeData[2],writeData[3],writeData[3],writeData[4],writeData[5]);//sets chronodot RTC |
caseyquinn | 7:29b01d5812ee | 175 | //sets ST RTC |
caseyquinn | 7:29b01d5812ee | 176 | STtime.tm_sec = writeData[0]; // 0-59 |
caseyquinn | 7:29b01d5812ee | 177 | STtime.tm_min = writeData[1]; // 0-59 |
caseyquinn | 7:29b01d5812ee | 178 | STtime.tm_hour = writeData[2]; // 0-23 |
caseyquinn | 7:29b01d5812ee | 179 | STtime.tm_mday = writeData[3]; // 1-31 |
caseyquinn | 7:29b01d5812ee | 180 | STtime.tm_mon = writeData[4]-1; // 0-11 |
caseyquinn | 7:29b01d5812ee | 181 | STtime.tm_year = 100+writeData[5]; // year since 1900 (116 = 2016) |
caseyquinn | 7:29b01d5812ee | 182 | time_t STseconds = mktime(&STtime); |
caseyquinn | 7:29b01d5812ee | 183 | set_time(STseconds); // Set RTC time to 16 December 2013 10:05:23 UTC |
caseyquinn | 7:29b01d5812ee | 184 | } |
jelord | 3:122bfc998c4c | 185 | |
jelord | 3:122bfc998c4c | 186 | }else if(transmissionValue ==2){ //process and store sample start/end |
jelord | 3:122bfc998c4c | 187 | if(dataLength ==12)E2PROM.write(0x00015, writeData, 12); |
jelord | 3:122bfc998c4c | 188 | |
jelord | 3:122bfc998c4c | 189 | }else if(transmissionValue ==3){ //process and store sample name |
jelord | 3:122bfc998c4c | 190 | if(dataLength ==8)E2PROM.write(0x00001,writeData,8); |
jelord | 3:122bfc998c4c | 191 | |
jelord | 3:122bfc998c4c | 192 | }else if(transmissionValue ==5){ //process and store Log Interval |
jelord | 3:122bfc998c4c | 193 | if(dataLength ==1)E2PROM.write(0x00014,writeData,1); |
jelord | 2:88fcbfadec6a | 194 | |
jelord | 3:122bfc998c4c | 195 | }else if(transmissionValue ==6){ //process and store Flow Rate |
jelord | 3:122bfc998c4c | 196 | if(dataLength ==4)E2PROM.write(0x00010,writeData,4); |
jelord | 3:122bfc998c4c | 197 | |
jelord | 3:122bfc998c4c | 198 | }else if(transmissionValue ==7){ //process and store Serial Number |
jelord | 3:122bfc998c4c | 199 | if(dataLength ==2)E2PROM.write(0x00034,writeData,2); |
jelord | 3:122bfc998c4c | 200 | } |
jelord | 3:122bfc998c4c | 201 | dataLength++; |
jelord | 1:9fbb5b665068 | 202 | } |
jelord | 3:122bfc998c4c | 203 | |
jelord | 3:122bfc998c4c | 204 | rx_len = 0; |
jelord | 3:122bfc998c4c | 205 | }else{ |
jelord | 3:122bfc998c4c | 206 | while(microChannel.readable()) |
jelord | 3:122bfc998c4c | 207 | uint8_t extract = microChannel.getc(); |
jelord | 3:122bfc998c4c | 208 | } |
jelord | 2:88fcbfadec6a | 209 | |
jelord | 2:88fcbfadec6a | 210 | } |
jelord | 2:88fcbfadec6a | 211 | void sendData(){ |
jelord | 2:88fcbfadec6a | 212 | |
jelord | 2:88fcbfadec6a | 213 | uint8_t sampleTimePassValues[13] = {0x01,}; |
jelord | 2:88fcbfadec6a | 214 | uint8_t subjectLabelOriginal[9] = {0x02,}; |
jelord | 2:88fcbfadec6a | 215 | uint8_t dataLogOriginal[2] = {0x03,}; |
jelord | 2:88fcbfadec6a | 216 | uint8_t flowRateOriginal[5] = {0x04,}; |
jelord | 2:88fcbfadec6a | 217 | //uint8_t presetRunModeCheck[1] = {0,}; Commented and currently unused to prevent mem issues |
jelord | 2:88fcbfadec6a | 218 | E2PROM.read(0x00015, sampleTimePassValues+1, 12); |
jelord | 2:88fcbfadec6a | 219 | E2PROM.read(0x00001, subjectLabelOriginal+1,8); |
jelord | 2:88fcbfadec6a | 220 | E2PROM.read(0x00014,dataLogOriginal+1,1); |
jelord | 2:88fcbfadec6a | 221 | E2PROM.read(0x00010,flowRateOriginal+1,4); |
jelord | 2:88fcbfadec6a | 222 | |
jelord | 2:88fcbfadec6a | 223 | for(int i=0; i<13; i++){ |
jelord | 2:88fcbfadec6a | 224 | microChannel.putc(sampleTimePassValues[i]); |
jelord | 2:88fcbfadec6a | 225 | } |
jelord | 2:88fcbfadec6a | 226 | wait(.25); |
jelord | 2:88fcbfadec6a | 227 | |
jelord | 2:88fcbfadec6a | 228 | for(int i=0; i<9; i++){ |
jelord | 2:88fcbfadec6a | 229 | microChannel.putc(subjectLabelOriginal[i]); |
jelord | 2:88fcbfadec6a | 230 | } |
jelord | 2:88fcbfadec6a | 231 | wait(.25); |
jelord | 2:88fcbfadec6a | 232 | |
jelord | 2:88fcbfadec6a | 233 | for(int i=0; i<2; i++){ |
jelord | 2:88fcbfadec6a | 234 | microChannel.putc(dataLogOriginal[i]); |
jelord | 2:88fcbfadec6a | 235 | } |
jelord | 2:88fcbfadec6a | 236 | wait(.25); |
jelord | 2:88fcbfadec6a | 237 | |
jelord | 2:88fcbfadec6a | 238 | for(int i=0; i<5; i++){ |
jelord | 2:88fcbfadec6a | 239 | microChannel.putc(flowRateOriginal[i]); |
jelord | 2:88fcbfadec6a | 240 | } |
jelord | 0:2cb2b2ea316f | 241 | |
jelord | 2:88fcbfadec6a | 242 | |
jelord | 2:88fcbfadec6a | 243 | } |
caseyquinn | 5:c3252e5d45ca | 244 | |
caseyquinn | 9:8646fd501832 | 245 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 246 | //Shutdown Function |
caseyquinn | 9:8646fd501832 | 247 | ////////////////////////////////////////////////////////////// |
jelord | 3:122bfc998c4c | 248 | void check_stop() // this checks if it's time to stop and shutdown |
jelord | 3:122bfc998c4c | 249 | { |
caseyquinn | 9:8646fd501832 | 250 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
caseyquinn | 9:8646fd501832 | 251 | //UPDATE THIS TO WORK WITH ST RTC INSTEAD |
caseyquinn | 9:8646fd501832 | 252 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
jelord | 3:122bfc998c4c | 253 | if(RTC_UPAS.compare(startAndEndTime[6], startAndEndTime[7], startAndEndTime[8], startAndEndTime[9], startAndEndTime[10], startAndEndTime[11])) { |
jelord | 3:122bfc998c4c | 254 | pbKill = 0; // this is were we shut everything down |
caseyquinn | 4:5d004fd997d5 | 255 | //pc.printf("If you're reading this something has gone very wrong."); |
jelord | 3:122bfc998c4c | 256 | } |
jelord | 3:122bfc998c4c | 257 | |
jelord | 3:122bfc998c4c | 258 | } |
caseyquinn | 5:c3252e5d45ca | 259 | |
caseyquinn | 9:8646fd501832 | 260 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 261 | //SD Logging Function |
caseyquinn | 9:8646fd501832 | 262 | ////////////////////////////////////////////////////////////// |
jelord | 3:122bfc998c4c | 263 | void log_data() |
jelord | 3:122bfc998c4c | 264 | { |
jelord | 3:122bfc998c4c | 265 | |
caseyquinn | 9:8646fd501832 | 266 | RGB_LED.set_led(1,1,0); |
caseyquinn | 7:29b01d5812ee | 267 | |
caseyquinn | 7:29b01d5812ee | 268 | time_t seconds = time(NULL); |
caseyquinn | 7:29b01d5812ee | 269 | strftime(timestr, 32, "%y%m%d%H%M%S", localtime(&seconds)); |
caseyquinn | 9:8646fd501832 | 270 | RTC_UPAS.get_time(); |
caseyquinn | 7:29b01d5812ee | 271 | press = bmesensor.getPressure(); |
caseyquinn | 7:29b01d5812ee | 272 | temp = bmesensor.getTemperature()-5.0; |
caseyquinn | 7:29b01d5812ee | 273 | rh = bmesensor.getHumidity(); |
caseyquinn | 7:29b01d5812ee | 274 | uv = lightsensor.getUV(); |
caseyquinn | 7:29b01d5812ee | 275 | |
caseyquinn | 7:29b01d5812ee | 276 | |
caseyquinn | 7:29b01d5812ee | 277 | FILE *fp = fopen(filename, "a"); |
caseyquinn | 9:8646fd501832 | 278 | 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 | 279 | fprintf(fp, "%s,", timestr); |
caseyquinn | 7:29b01d5812ee | 280 | fprintf(fp, "%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,", omronVolt,massflow,temp,press,rh,atmoRho); |
caseyquinn | 7:29b01d5812ee | 281 | 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 | 282 | 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 | 283 | fprintf(fp, "%d,%d,%d,%d,%d,%d," ,uv,omronReading, vInReading, vBlowerReading, omronDiff,gasG.getAmps()); |
caseyquinn | 7:29b01d5812ee | 284 | fprintf(fp, "%d,%d,%d,%1.3f,%1.3f\r\n", gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow); |
caseyquinn | 7:29b01d5812ee | 285 | fclose(fp); |
caseyquinn | 7:29b01d5812ee | 286 | free(fp); |
caseyquinn | 7:29b01d5812ee | 287 | RGB_LED.set_led(1,0,0); |
jelord | 3:122bfc998c4c | 288 | |
jelord | 3:122bfc998c4c | 289 | } |
caseyquinn | 8:c4a8f9b67cee | 290 | |
caseyquinn | 9:8646fd501832 | 291 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 292 | //Flow Control Function |
caseyquinn | 9:8646fd501832 | 293 | ////////////////////////////////////////////////////////////// |
caseyquinn | 8:c4a8f9b67cee | 294 | void flowControl() |
caseyquinn | 8:c4a8f9b67cee | 295 | { |
caseyquinn | 8:c4a8f9b67cee | 296 | RGB_LED.set_led(0,1,0); |
caseyquinn | 8:c4a8f9b67cee | 297 | omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V |
caseyquinn | 8:c4a8f9b67cee | 298 | omronVolt = (omronReading*4.096)/(32768*2); |
caseyquinn | 8:c4a8f9b67cee | 299 | |
caseyquinn | 8:c4a8f9b67cee | 300 | if(omronVolt<=calibrations.omronVMin) { |
caseyquinn | 8:c4a8f9b67cee | 301 | massflow = calibrations.omronMFMin; |
caseyquinn | 8:c4a8f9b67cee | 302 | } else if(omronVolt>=calibrations.omronVMax) { |
caseyquinn | 8:c4a8f9b67cee | 303 | massflow = calibrations.omronMFMax; |
caseyquinn | 8:c4a8f9b67cee | 304 | } else { |
caseyquinn | 8:c4a8f9b67cee | 305 | 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 | 306 | } |
caseyquinn | 8:c4a8f9b67cee | 307 | |
caseyquinn | 8:c4a8f9b67cee | 308 | 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 | 309 | volflow = massflow/atmoRho; |
caseyquinn | 8:c4a8f9b67cee | 310 | sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow); |
caseyquinn | 8:c4a8f9b67cee | 311 | deltaVflow = volflow-volflowSet; |
caseyquinn | 8:c4a8f9b67cee | 312 | massflowSet = volflowSet*atmoRho; |
caseyquinn | 8:c4a8f9b67cee | 313 | deltaMflow = massflow-massflowSet; |
caseyquinn | 8:c4a8f9b67cee | 314 | if(abs(deltaMflow)>.025) { |
caseyquinn | 8:c4a8f9b67cee | 315 | digital_pot_change = (int)(gainFlow*deltaMflow); |
caseyquinn | 8:c4a8f9b67cee | 316 | |
caseyquinn | 8:c4a8f9b67cee | 317 | |
caseyquinn | 8:c4a8f9b67cee | 318 | if(abs(digital_pot_change)>=50) { |
caseyquinn | 8:c4a8f9b67cee | 319 | digital_pot_set = (int)(digital_pot_set+(int)((10.0*deltaMflow))); |
caseyquinn | 8:c4a8f9b67cee | 320 | //RGB_LED.set_led(1,0,0); |
caseyquinn | 8:c4a8f9b67cee | 321 | } else { |
caseyquinn | 8:c4a8f9b67cee | 322 | digital_pot_set = (digital_pot_set+ digital_pot_change); |
caseyquinn | 8:c4a8f9b67cee | 323 | // RGB_LED.set_led(1,1,0); |
caseyquinn | 8:c4a8f9b67cee | 324 | } |
caseyquinn | 8:c4a8f9b67cee | 325 | |
caseyquinn | 8:c4a8f9b67cee | 326 | if(digital_pot_set>=digitalpotMax) { |
caseyquinn | 8:c4a8f9b67cee | 327 | digital_pot_set = digitalpotMax; |
caseyquinn | 8:c4a8f9b67cee | 328 | //RGB_LED.set_led(1,0,0); |
caseyquinn | 8:c4a8f9b67cee | 329 | } else if(digital_pot_set<=digitalpotMin) { |
caseyquinn | 8:c4a8f9b67cee | 330 | digital_pot_set = digitalpotMin; |
caseyquinn | 8:c4a8f9b67cee | 331 | //RGB_LED.set_led(1,0,0); |
caseyquinn | 8:c4a8f9b67cee | 332 | } |
caseyquinn | 8:c4a8f9b67cee | 333 | |
caseyquinn | 8:c4a8f9b67cee | 334 | |
caseyquinn | 8:c4a8f9b67cee | 335 | DigPot.writeRegister(digital_pot_set); |
caseyquinn | 8:c4a8f9b67cee | 336 | |
caseyquinn | 8:c4a8f9b67cee | 337 | } else { |
caseyquinn | 8:c4a8f9b67cee | 338 | //RGB_LED.set_led(0,1,0); |
caseyquinn | 8:c4a8f9b67cee | 339 | } |
caseyquinn | 8:c4a8f9b67cee | 340 | } |
caseyquinn | 9:8646fd501832 | 341 | |
caseyquinn | 9:8646fd501832 | 342 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 343 | //Main Function |
caseyquinn | 9:8646fd501832 | 344 | ////////////////////////////////////////////////////////////// |
jelord | 1:9fbb5b665068 | 345 | int main(){ |
caseyquinn | 7:29b01d5812ee | 346 | |
caseyquinn | 4:5d004fd997d5 | 347 | //wait(10); |
caseyquinn | 6:a738dcd53bf8 | 348 | //RGB_LED.set_led(0,0,1); |
caseyquinn | 10:06fbb1c9e3bd | 349 | pc.baud(115200); // set what you want here depending on your terminal program speed |
caseyquinn | 10:06fbb1c9e3bd | 350 | pc.printf("\f\n\r-------------Startup-------------\n\r"); |
jelord | 1:9fbb5b665068 | 351 | wait(0.5); |
caseyquinn | 5:c3252e5d45ca | 352 | |
jelord | 3:122bfc998c4c | 353 | uint8_t serialNumberAndType[6] = {0x50,0x53}; |
jelord | 3:122bfc998c4c | 354 | E2PROM.read(0x00034,serialNumberAndType+2,2); |
caseyquinn | 4:5d004fd997d5 | 355 | |
jelord | 3:122bfc998c4c | 356 | int tempSerialNum = serialNumberAndType[2]+serialNumberAndType[3]; |
jelord | 3:122bfc998c4c | 357 | int serialNumDigits[4]; |
jelord | 3:122bfc998c4c | 358 | serialNumDigits[0] = tempSerialNum / 1000 % 10; |
jelord | 3:122bfc998c4c | 359 | serialNumDigits[1] = tempSerialNum / 100 % 10; |
jelord | 3:122bfc998c4c | 360 | serialNumDigits[2] = tempSerialNum / 10 % 10; |
jelord | 3:122bfc998c4c | 361 | serialNumDigits[3] = tempSerialNum % 10; |
jelord | 3:122bfc998c4c | 362 | |
jelord | 3:122bfc998c4c | 363 | serialNumberAndType[2] = serialNumDigits[0]+48; |
jelord | 3:122bfc998c4c | 364 | serialNumberAndType[3] = serialNumDigits[1]+48; |
jelord | 3:122bfc998c4c | 365 | serialNumberAndType[4] = serialNumDigits[2]+48; |
jelord | 3:122bfc998c4c | 366 | serialNumberAndType[5] = serialNumDigits[3]+48; |
caseyquinn | 5:c3252e5d45ca | 367 | RGB_LED.set_led(0,1,0); |
caseyquinn | 10:06fbb1c9e3bd | 368 | pc.attach(pc_recv); |
jelord | 1:9fbb5b665068 | 369 | microChannel.attach(uartMicro,microChannel.RxIrq); |
jelord | 3:122bfc998c4c | 370 | microChannel.baud(115200); |
jelord | 1:9fbb5b665068 | 371 | microChannel.printf("$$$"); |
jelord | 3:122bfc998c4c | 372 | wait(0.5); |
jelord | 3:122bfc998c4c | 373 | microChannel.printf("SN,"); |
jelord | 3:122bfc998c4c | 374 | for(int i=0;i<6;i++)microChannel.putc(serialNumberAndType[i]); |
jelord | 3:122bfc998c4c | 375 | microChannel.printf("\r"); |
jelord | 3:122bfc998c4c | 376 | wait(0.5); |
jelord | 1:9fbb5b665068 | 377 | microChannel.printf("A\r"); |
jelord | 3:122bfc998c4c | 378 | wait(0.5); |
jelord | 2:88fcbfadec6a | 379 | microChannel.printf("---\r"); |
jelord | 3:122bfc998c4c | 380 | wait(0.5); |
jelord | 2:88fcbfadec6a | 381 | |
jelord | 2:88fcbfadec6a | 382 | |
caseyquinn | 4:5d004fd997d5 | 383 | |
jelord | 2:88fcbfadec6a | 384 | |
jelord | 2:88fcbfadec6a | 385 | RGB_LED.set_led(1,1,1); |
jelord | 3:122bfc998c4c | 386 | while(runReady!=1) { |
jelord | 3:122bfc998c4c | 387 | wait(1); |
jelord | 3:122bfc998c4c | 388 | //pc.printf("Waiting for BLE instruction"); |
jelord | 3:122bfc998c4c | 389 | |
jelord | 3:122bfc998c4c | 390 | } |
jelord | 3:122bfc998c4c | 391 | |
caseyquinn | 7:29b01d5812ee | 392 | |
jelord | 3:122bfc998c4c | 393 | |
jelord | 3:122bfc998c4c | 394 | E2PROM.read(0x00015, startAndEndTime, 12); //Grab start and end times from EEPROM |
jelord | 3:122bfc998c4c | 395 | RGB_LED.set_led(0,1,0); |
caseyquinn | 7:29b01d5812ee | 396 | |
caseyquinn | 7:29b01d5812ee | 397 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
caseyquinn | 7:29b01d5812ee | 398 | //UPDATE THIS TO WORK WITH ST RTC INSTEAD |
caseyquinn | 7:29b01d5812ee | 399 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
caseyquinn | 7:29b01d5812ee | 400 | |
jelord | 3:122bfc998c4c | 401 | 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 | 402 | wait(0.5); |
jelord | 3:122bfc998c4c | 403 | |
jelord | 3:122bfc998c4c | 404 | RTC_UPAS.get_time(); |
jelord | 3:122bfc998c4c | 405 | |
jelord | 3:122bfc998c4c | 406 | } |
jelord | 3:122bfc998c4c | 407 | |
jelord | 3:122bfc998c4c | 408 | |
jelord | 3:122bfc998c4c | 409 | //Get the proper serial number |
jelord | 3:122bfc998c4c | 410 | uint8_t serialBytes[2] = {0,}; |
jelord | 3:122bfc998c4c | 411 | E2PROM.read(0x00034, serialBytes,2); |
jelord | 3:122bfc998c4c | 412 | serial_num = ((uint16_t)serialBytes[1] << 8) | serialBytes[0]; |
jelord | 3:122bfc998c4c | 413 | calibrations.initialize(serial_num); |
jelord | 3:122bfc998c4c | 414 | |
jelord | 3:122bfc998c4c | 415 | uint8_t logByte[1] = {0,}; |
jelord | 3:122bfc998c4c | 416 | E2PROM.read(0x00014,logByte,1); |
jelord | 3:122bfc998c4c | 417 | logInerval = logByte[0]; |
jelord | 3:122bfc998c4c | 418 | |
caseyquinn | 7:29b01d5812ee | 419 | |
jelord | 3:122bfc998c4c | 420 | //Use the flow rate value stored in eeprom |
jelord | 3:122bfc998c4c | 421 | uint8_t flowRateBytes[4] = {0,}; |
jelord | 3:122bfc998c4c | 422 | E2PROM.read(0x00010,flowRateBytes,4); |
jelord | 3:122bfc998c4c | 423 | E2PROM.byteToFloat(flowRateBytes, &volflowSet); |
jelord | 3:122bfc998c4c | 424 | |
jelord | 3:122bfc998c4c | 425 | if(volflowSet<=1.0) { |
jelord | 3:122bfc998c4c | 426 | gainFlow = 100; |
jelord | 3:122bfc998c4c | 427 | } else if(volflowSet>=2.0) { |
jelord | 3:122bfc998c4c | 428 | gainFlow = 25; |
jelord | 3:122bfc998c4c | 429 | } else { |
jelord | 3:122bfc998c4c | 430 | gainFlow = 25; |
jelord | 0:2cb2b2ea316f | 431 | } |
jelord | 3:122bfc998c4c | 432 | |
jelord | 3:122bfc998c4c | 433 | RGB_LED.set_led(1,0,0); |
jelord | 3:122bfc998c4c | 434 | press = bmesensor.getPressure(); |
jelord | 3:122bfc998c4c | 435 | temp = bmesensor.getTemperature(); |
jelord | 3:122bfc998c4c | 436 | rh = bmesensor.getHumidity(); |
jelord | 3:122bfc998c4c | 437 | |
jelord | 3:122bfc998c4c | 438 | 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 | 439 | massflowSet = volflowSet*atmoRho; |
jelord | 3:122bfc998c4c | 440 | |
jelord | 3:122bfc998c4c | 441 | |
jelord | 3:122bfc998c4c | 442 | DigPot.writeRegister(digital_pot_setpoint); |
jelord | 3:122bfc998c4c | 443 | wait(1); |
caseyquinn | 5:c3252e5d45ca | 444 | //blower = 1; |
jelord | 3:122bfc998c4c | 445 | |
jelord | 3:122bfc998c4c | 446 | uint8_t subjectLabelOriginal[8] = {0,}; |
caseyquinn | 4:5d004fd997d5 | 447 | E2PROM.read(0x00001, subjectLabelOriginal,8); |
caseyquinn | 5:c3252e5d45ca | 448 | |
caseyquinn | 4:5d004fd997d5 | 449 | time_t seconds = time(NULL); |
caseyquinn | 4:5d004fd997d5 | 450 | strftime(timestr, 32, "%y-%m-%d-%H=%M=%S", localtime(&seconds)); |
caseyquinn | 9:8646fd501832 | 451 | //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 | 452 | sprintf(filename, "/sd/UPASboardtest_%s.txt", timestr); |
jelord | 3:122bfc998c4c | 453 | FILE *fp = fopen(filename, "w"); |
jelord | 3:122bfc998c4c | 454 | fclose(fp); |
jelord | 3:122bfc998c4c | 455 | |
jelord | 3:122bfc998c4c | 456 | |
jelord | 3:122bfc998c4c | 457 | sampledVol = 0.0; |
jelord | 3:122bfc998c4c | 458 | RGB_LED.set_led(0,1,0); |
caseyquinn | 9:8646fd501832 | 459 | |
caseyquinn | 9:8646fd501832 | 460 | stop.attach(&check_stop, 9); // check if we should shut down every 9 number seconds, starting after the start. |
caseyquinn | 7:29b01d5812ee | 461 | logg.attach(&log_data, logInerval); |
caseyquinn | 8:c4a8f9b67cee | 462 | flowCtl.attach(&flowControl, 1); |
caseyquinn | 7:29b01d5812ee | 463 | |
jelord | 3:122bfc998c4c | 464 | |
jelord | 3:122bfc998c4c | 465 | //** end of initalization **// |
jelord | 3:122bfc998c4c | 466 | //---------------------------------------------------------------------------------------------// |
jelord | 3:122bfc998c4c | 467 | //---------------------------------------------------------------------------------------------// |
jelord | 3:122bfc998c4c | 468 | // Main Control Loop |
jelord | 3:122bfc998c4c | 469 | |
caseyquinn | 7:29b01d5812ee | 470 | while (1) { |
caseyquinn | 7:29b01d5812ee | 471 | // Do other things... |
caseyquinn | 7:29b01d5812ee | 472 | } |
caseyquinn | 7:29b01d5812ee | 473 | |
caseyquinn | 8:c4a8f9b67cee | 474 | |
caseyquinn | 4:5d004fd997d5 | 475 | |
jelord | 3:122bfc998c4c | 476 | |
jelord | 0:2cb2b2ea316f | 477 | } |