attempt to fix posible power issues with the sharp
Dependencies: ADS1115 BME280 CronoDot SDFileSystem mbed
Fork of Outdoor_UPAS_v1_2_Tboard by
main.cpp@48:45d29f874b23, 2016-05-07 (annotated)
- Committer:
- caseyquinn
- Date:
- Sat May 07 18:43:33 2016 +0000
- Revision:
- 48:45d29f874b23
- Parent:
- 47:fe50d72c7adc
Only run flow control if pumps are on. This will hopefully eliminate the issue of getting stuck out of flow and running full power.....
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" |
caseyquinn | 12:5b4f3245606a | 12 | #include "Calibration.h" |
caseyquinn | 12:5b4f3245606a | 13 | #include "MAX_M8.h" |
caseyquinn | 43:05aa1fb68946 | 14 | //#include "DRV8830.h" |
jelord | 39:f1ebecfb32ca | 15 | #include "Tb_SD_Reader.h" |
caseyquinn | 14:7cdb643da356 | 16 | |
jelord | 0:2cb2b2ea316f | 17 | |
caseyquinn | 12:5b4f3245606a | 18 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 19 | //General Items |
caseyquinn | 12:5b4f3245606a | 20 | ///////////////////////////////////////////// |
caseyquinn | 14:7cdb643da356 | 21 | I2C i2c(PB_9, PB_8);//(D14, D15); SDA,SCL |
caseyquinn | 12:5b4f3245606a | 22 | Serial pc(USBTX, USBRX); |
caseyquinn | 18:41ef98db0423 | 23 | DigitalOut pumps(PA_9, 0);//(D8, 0); |
caseyquinn | 12:5b4f3245606a | 24 | DigitalOut pbKill(PC_12, 1); // Digital input pin that conncect to the LTC2950 battery charger used to shutdown the UPAS |
caseyquinn | 13:455601f62aad | 25 | 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 |
jelord | 2:88fcbfadec6a | 26 | MCP40D17 DigPot(&i2c); |
caseyquinn | 12:5b4f3245606a | 27 | BME280 bmesensor(PB_9, PB_8);//(D14, D15); |
caseyquinn | 12:5b4f3245606a | 28 | NCP5623BMUTBG RGB_LED(PB_9, PB_8);//(D14, D15); |
caseyquinn | 17:3e6dda6e6335 | 29 | CronoDot RTC_UPAS(PB_9, PB_8);//(D14, D15); |
caseyquinn | 12:5b4f3245606a | 30 | EEPROM E2PROM(PB_9, PB_8);//(D14, D15); |
caseyquinn | 12:5b4f3245606a | 31 | Calibration calibrations(1); //Default serial/calibration if there are no values for the selected option |
caseyquinn | 14:7cdb643da356 | 32 | |
caseyquinn | 12:5b4f3245606a | 33 | |
caseyquinn | 12:5b4f3245606a | 34 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 35 | //RN4677 BT/BLE Module |
caseyquinn | 12:5b4f3245606a | 36 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 37 | Serial microChannel(PB_10, PB_11); // tx, rx |
caseyquinn | 4:5d004fd997d5 | 38 | DigitalOut bleRTS(PB_14, 0); |
caseyquinn | 4:5d004fd997d5 | 39 | DigitalOut bleCTS(PB_13, 0); |
caseyquinn | 12:5b4f3245606a | 40 | DigitalOut BT_IRST(PC_8, 0); |
caseyquinn | 12:5b4f3245606a | 41 | DigitalOut BT_SW(PA_12, 0); |
caseyquinn | 17:3e6dda6e6335 | 42 | |
caseyquinn | 13:455601f62aad | 43 | |
caseyquinn | 12:5b4f3245606a | 44 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 45 | //Analog to Digital Converter |
caseyquinn | 12:5b4f3245606a | 46 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 47 | Adafruit_ADS1115 ads(&i2c); |
caseyquinn | 12:5b4f3245606a | 48 | //DigitalIn ADS_ALRT(PA_10); //Connected but currently unused. (ADS1115) http://www.ti.com/lit/ds/symlink/ads1115.pdf |
caseyquinn | 12:5b4f3245606a | 49 | |
caseyquinn | 12:5b4f3245606a | 50 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 51 | //Battery Monitoring |
caseyquinn | 12:5b4f3245606a | 52 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 53 | STC3100 gasG(PB_9, PB_8);//(D14, D15); // http://www.st.com/web/en/resource/technical/document/datasheet/CD00219947.pdf |
caseyquinn | 28:42932d3b105d | 54 | InterruptIn bcs1(PC_9); //Charge complete if High. Connected but currently unused. (MCP73871) http://www.mouser.com/ds/2/268/22090a-52174.pdf |
caseyquinn | 28:42932d3b105d | 55 | InterruptIn bcs2(PA_8); //Batt charging if High. Connected but currently unused. (MCP73871) http://www.mouser.com/ds/2/268/22090a-52174.pdf |
caseyquinn | 12:5b4f3245606a | 56 | |
caseyquinn | 12:5b4f3245606a | 57 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 58 | //Accelerometer and Magnometer |
caseyquinn | 12:5b4f3245606a | 59 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 60 | LSM303 movementsensor(PB_9, PB_8);//(D14, D15); // http://www.st.com/web/en/resource/technical/document/datasheet/DM00027543.pdf |
caseyquinn | 12:5b4f3245606a | 61 | //DigitalIn ACC_INT1(PC_7); //Connected but currently unused. (LSM303) |
caseyquinn | 12:5b4f3245606a | 62 | //DigitalIn ACC_INT2(PC_6); //Connected but currently unused. (LSM303) |
caseyquinn | 12:5b4f3245606a | 63 | //DigitalIn ACC_DRDY(PC_11); //Connected but currently unused. (LSM303) |
jelord | 0:2cb2b2ea316f | 64 | |
caseyquinn | 12:5b4f3245606a | 65 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 66 | //UV and Visible Light Sensor |
caseyquinn | 12:5b4f3245606a | 67 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 68 | SI1145 lightsensor(PB_9, PB_8);//(D14, D15); |
caseyquinn | 12:5b4f3245606a | 69 | //DigitalIn UV_INT(PD_2); //Connected but currently unused nor configured (interupt). (SI1145) https://www.silabs.com/Support%20Documents/TechnicalDocs/Si1145-46-47.pdf |
caseyquinn | 9:8646fd501832 | 70 | |
caseyquinn | 12:5b4f3245606a | 71 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 72 | //GPS |
caseyquinn | 12:5b4f3245606a | 73 | ///////////////////////////////////////////// |
caseyquinn | 17:3e6dda6e6335 | 74 | DigitalOut gpsEN(PB_15, 0); |
caseyquinn | 23:1ca41779b8ec | 75 | Max_M8 gps(PB_9, PB_8,(0x84)); |
caseyquinn | 12:5b4f3245606a | 76 | |
caseyquinn | 43:05aa1fb68946 | 77 | /* |
caseyquinn | 12:5b4f3245606a | 78 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 79 | //Hbridge Valve Control |
caseyquinn | 12:5b4f3245606a | 80 | ///////////////////////////////////////////// |
caseyquinn | 36:2e344db70d35 | 81 | DRV8830 schoolF1(PB_9, PB_8, 0xC4); //Work/School Filter A HB1 |
caseyquinn | 36:2e344db70d35 | 82 | DRV8830 homeF2(PB_9, PB_8, 0xCA); //Home Filter B HB2 |
caseyquinn | 36:2e344db70d35 | 83 | DRV8830 transitF3(PB_9, PB_8, 0xCC); //Transit Filter C HB3 |
caseyquinn | 36:2e344db70d35 | 84 | DRV8830 blankF4(PB_9, PB_8, 0xCE); //Blank Filter D HB4 |
caseyquinn | 28:42932d3b105d | 85 | DigitalIn hb1_school(PA_6); |
caseyquinn | 28:42932d3b105d | 86 | DigitalIn hb2_home(PA_7); |
caseyquinn | 28:42932d3b105d | 87 | DigitalIn hb3_transit(PA_5); |
caseyquinn | 28:42932d3b105d | 88 | DigitalIn hb4_blank(PA_4); |
caseyquinn | 43:05aa1fb68946 | 89 | */ |
caseyquinn | 23:1ca41779b8ec | 90 | |
caseyquinn | 12:5b4f3245606a | 91 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 92 | //SD Card |
caseyquinn | 12:5b4f3245606a | 93 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 94 | char filename[] = "/sd/XXXX0000LOG000000000000---------------.txt"; |
caseyquinn | 12:5b4f3245606a | 95 | SDFileSystem sd(PB_5, PB_4, PB_3, PB_6, "sd");//(D4, D5, D3, D10, "sd"); // (MOSI, MISO, SCK, SEL) |
jelord | 39:f1ebecfb32ca | 96 | Tb_SD_Reader sdReader; |
caseyquinn | 28:42932d3b105d | 97 | DigitalIn sdCD(PA_11, PullUp); |
jelord | 39:f1ebecfb32ca | 98 | char fileTest[] = "test.txt"; |
caseyquinn | 14:7cdb643da356 | 99 | |
caseyquinn | 12:5b4f3245606a | 100 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 101 | //Callbacks |
caseyquinn | 12:5b4f3245606a | 102 | ///////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 103 | Ticker stop; //This is the stop callback object |
caseyquinn | 8:c4a8f9b67cee | 104 | Ticker logg; //This is the logging callback object |
caseyquinn | 9:8646fd501832 | 105 | Ticker flowCtl; //This is the control loop callback object |
jelord | 3:122bfc998c4c | 106 | |
caseyquinn | 12:5b4f3245606a | 107 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 108 | //Varible Definitions |
caseyquinn | 12:5b4f3245606a | 109 | ///////////////////////////////////////////// |
jelord | 3:122bfc998c4c | 110 | uint16_t serial_num = 1; // Default serial/calibration number |
jelord | 3:122bfc998c4c | 111 | int RunReady =0; |
jelord | 3:122bfc998c4c | 112 | |
caseyquinn | 25:fbf7d44e7da4 | 113 | bool ledOn = 0; |
caseyquinn | 25:fbf7d44e7da4 | 114 | |
caseyquinn | 4:5d004fd997d5 | 115 | struct tm STtime; |
caseyquinn | 7:29b01d5812ee | 116 | char timestr[32]; |
caseyquinn | 43:05aa1fb68946 | 117 | char yrstr[4]; |
caseyquinn | 43:05aa1fb68946 | 118 | char mostr[4]; |
caseyquinn | 43:05aa1fb68946 | 119 | char daystr[4]; |
caseyquinn | 43:05aa1fb68946 | 120 | char hrstr[4]; |
caseyquinn | 43:05aa1fb68946 | 121 | char minstr[4]; |
caseyquinn | 43:05aa1fb68946 | 122 | char secstr[4]; |
caseyquinn | 43:05aa1fb68946 | 123 | |
caseyquinn | 43:05aa1fb68946 | 124 | int stYr, stMo, stDay, stHr, stMin, stSec; |
jelord | 3:122bfc998c4c | 125 | |
caseyquinn | 36:2e344db70d35 | 126 | |
caseyquinn | 9:8646fd501832 | 127 | float press; |
caseyquinn | 9:8646fd501832 | 128 | float temp; |
caseyquinn | 9:8646fd501832 | 129 | float rh; |
jelord | 3:122bfc998c4c | 130 | |
caseyquinn | 9:8646fd501832 | 131 | int uv; |
caseyquinn | 9:8646fd501832 | 132 | int vis; |
caseyquinn | 9:8646fd501832 | 133 | int ir; |
jelord | 3:122bfc998c4c | 134 | |
caseyquinn | 9:8646fd501832 | 135 | float compass; |
caseyquinn | 9:8646fd501832 | 136 | float accel_x; |
caseyquinn | 9:8646fd501832 | 137 | float accel_y; |
caseyquinn | 9:8646fd501832 | 138 | float accel_z; |
caseyquinn | 9:8646fd501832 | 139 | float accel_comp; |
caseyquinn | 9:8646fd501832 | 140 | float angle_x; |
caseyquinn | 9:8646fd501832 | 141 | float angle_y; |
caseyquinn | 9:8646fd501832 | 142 | float angle_z; |
caseyquinn | 9:8646fd501832 | 143 | float mag_x; |
caseyquinn | 9:8646fd501832 | 144 | float mag_y; |
caseyquinn | 9:8646fd501832 | 145 | float mag_z; |
jelord | 3:122bfc998c4c | 146 | |
caseyquinn | 9:8646fd501832 | 147 | int vInReading; |
caseyquinn | 25:fbf7d44e7da4 | 148 | int vInReadingLast; |
caseyquinn | 9:8646fd501832 | 149 | int vBlowerReading; |
caseyquinn | 9:8646fd501832 | 150 | int omronDiff; |
caseyquinn | 9:8646fd501832 | 151 | float omronVolt; //V |
caseyquinn | 9:8646fd501832 | 152 | int omronReading; |
caseyquinn | 9:8646fd501832 | 153 | float atmoRho; //g/L |
jelord | 3:122bfc998c4c | 154 | |
caseyquinn | 25:fbf7d44e7da4 | 155 | int amps; |
caseyquinn | 25:fbf7d44e7da4 | 156 | int bVolt; |
caseyquinn | 25:fbf7d44e7da4 | 157 | int bFuel; |
caseyquinn | 25:fbf7d44e7da4 | 158 | //bool pumpOn; |
caseyquinn | 9:8646fd501832 | 159 | float massflow; //g/min |
caseyquinn | 9:8646fd501832 | 160 | float volflow; //L/min |
jelord | 3:122bfc998c4c | 161 | float volflowSet = 1.0; //L/min |
caseyquinn | 14:7cdb643da356 | 162 | int logInerval = 5;//seconds |
jelord | 3:122bfc998c4c | 163 | double secondsD = 0; |
jelord | 3:122bfc998c4c | 164 | double lastsecondD = 0; |
caseyquinn | 9:8646fd501832 | 165 | float massflowSet; |
jelord | 3:122bfc998c4c | 166 | float deltaVflow = 0.0; |
jelord | 3:122bfc998c4c | 167 | float deltaMflow = 0.0; |
caseyquinn | 9:8646fd501832 | 168 | float gainFlow; |
caseyquinn | 9:8646fd501832 | 169 | float sampledVol; //L, total sampled volume |
jelord | 3:122bfc998c4c | 170 | |
caseyquinn | 29:fd74725294d5 | 171 | int digital_pot_setpoint = 30; //min = 0x7F, max = 0x00 |
caseyquinn | 9:8646fd501832 | 172 | int digital_pot_set; |
caseyquinn | 9:8646fd501832 | 173 | int digital_pot_change; |
jelord | 3:122bfc998c4c | 174 | int digitalpotMax = 127; |
caseyquinn | 9:8646fd501832 | 175 | int digitalpotMin = 10; |
jelord | 3:122bfc998c4c | 176 | |
caseyquinn | 46:99d129bfdbbd | 177 | //int dutyUp; |
caseyquinn | 46:99d129bfdbbd | 178 | //int dutyDown; |
caseyquinn | 46:99d129bfdbbd | 179 | int dutycycleSecOn; |
caseyquinn | 46:99d129bfdbbd | 180 | int dutyCycleI; |
caseyquinn | 12:5b4f3245606a | 181 | |
caseyquinn | 23:1ca41779b8ec | 182 | bool gpsFix; |
caseyquinn | 12:5b4f3245606a | 183 | uint8_t gpssatellites = 0; |
caseyquinn | 23:1ca41779b8ec | 184 | double gpsspeed = 0.0; |
caseyquinn | 28:42932d3b105d | 185 | double gpscourse = 0.0; |
caseyquinn | 23:1ca41779b8ec | 186 | double gpslatitude = 0.0; |
caseyquinn | 23:1ca41779b8ec | 187 | double gpslongitude = 0.0; |
caseyquinn | 23:1ca41779b8ec | 188 | float gpsaltitude = 0.0; |
caseyquinn | 12:5b4f3245606a | 189 | |
caseyquinn | 26:6aa294d83af4 | 190 | float home_lat = 40.00000; //40.580508; |
caseyquinn | 26:6aa294d83af4 | 191 | float home_lon = -105.000000; //-105.081823; |
caseyquinn | 36:2e344db70d35 | 192 | float home_lat2 = 40.00000; //40.580508; |
caseyquinn | 36:2e344db70d35 | 193 | float home_lon2 = -105.000000; //-105.081823; |
caseyquinn | 26:6aa294d83af4 | 194 | float work_lat = 40.100000; //40.594062; //40.569136; |
caseyquinn | 26:6aa294d83af4 | 195 | float work_lon = -105.100000; //-105.075683; //-105.081966; |
caseyquinn | 12:5b4f3245606a | 196 | int location = 0; |
caseyquinn | 12:5b4f3245606a | 197 | |
caseyquinn | 12:5b4f3245606a | 198 | float homeDistance = 99999; |
caseyquinn | 36:2e344db70d35 | 199 | float home2Distance = 99999; |
caseyquinn | 12:5b4f3245606a | 200 | float workDistance = 99999; |
caseyquinn | 12:5b4f3245606a | 201 | |
jelord | 3:122bfc998c4c | 202 | //*************************************************// |
jelord | 3:122bfc998c4c | 203 | |
jelord | 2:88fcbfadec6a | 204 | void sendData(); |
jelord | 39:f1ebecfb32ca | 205 | void Read_File(char[]); |
caseyquinn | 11:aa21628a9b15 | 206 | |
caseyquinn | 11:aa21628a9b15 | 207 | void pc_recv(){ |
caseyquinn | 11:aa21628a9b15 | 208 | while(pc.readable()){ |
caseyquinn | 11:aa21628a9b15 | 209 | pc.getc(); |
caseyquinn | 11:aa21628a9b15 | 210 | } |
caseyquinn | 11:aa21628a9b15 | 211 | } |
caseyquinn | 11:aa21628a9b15 | 212 | |
jelord | 0:2cb2b2ea316f | 213 | static uint8_t rx_buf[20]; |
jelord | 0:2cb2b2ea316f | 214 | static uint8_t rx_len=0; |
jelord | 1:9fbb5b665068 | 215 | static int haltBLE = 1; |
jelord | 1:9fbb5b665068 | 216 | static int transmissionValue = 0; |
jelord | 2:88fcbfadec6a | 217 | uint8_t writeData[20] = {0,}; |
jelord | 2:88fcbfadec6a | 218 | static uint8_t dataLength = 0; |
jelord | 3:122bfc998c4c | 219 | static int runReady = 0; |
jelord | 3:122bfc998c4c | 220 | static uint8_t startAndEndTime[12] = {0,}; |
jelord | 39:f1ebecfb32ca | 221 | static uint8_t fileTransferLock = 0; |
caseyquinn | 5:c3252e5d45ca | 222 | |
caseyquinn | 9:8646fd501832 | 223 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 224 | //BLE Functions |
caseyquinn | 9:8646fd501832 | 225 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 226 | |
caseyquinn | 9:8646fd501832 | 227 | void uartMicro(){ |
caseyquinn | 25:fbf7d44e7da4 | 228 | |
jelord | 3:122bfc998c4c | 229 | if(runReady!=1){ |
jelord | 3:122bfc998c4c | 230 | haltBLE = 2; |
jelord | 3:122bfc998c4c | 231 | while(microChannel.readable()){ |
jelord | 3:122bfc998c4c | 232 | rx_buf[rx_len++] = microChannel.getc(); |
jelord | 2:88fcbfadec6a | 233 | |
jelord | 3:122bfc998c4c | 234 | //Code block to verify what is being transmitted. To function correctly, all data must terminate with \0 or \n |
jelord | 3:122bfc998c4c | 235 | if(transmissionValue==0){ |
jelord | 3:122bfc998c4c | 236 | |
caseyquinn | 4:5d004fd997d5 | 237 | if (rx_buf[0] == 0x01)transmissionValue = 1; //rtc |
jelord | 3:122bfc998c4c | 238 | else if(rx_buf[0] == 0x02)transmissionValue = 2; //sample start and end times |
jelord | 3:122bfc998c4c | 239 | else if(rx_buf[0] == 0x03)transmissionValue = 3; //sample name |
jelord | 3:122bfc998c4c | 240 | else if(rx_buf[0] == 0x04)transmissionValue = 4; //Send Data Check |
jelord | 3:122bfc998c4c | 241 | |
jelord | 3:122bfc998c4c | 242 | else if(rx_buf[0] == 0x05)transmissionValue = 5; //log interval |
jelord | 3:122bfc998c4c | 243 | else if(rx_buf[0] == 0x06)transmissionValue = 6; //Flow Rate |
jelord | 3:122bfc998c4c | 244 | else if(rx_buf[0] == 0x07)transmissionValue = 7; //Serial Number |
jelord | 3:122bfc998c4c | 245 | else if(rx_buf[0] == 0x08)transmissionValue = 8; //Run Enable |
caseyquinn | 25:fbf7d44e7da4 | 246 | else if(rx_buf[0] == 0x0A)transmissionValue = 10; //GPS Coordinates |
jelord | 33:03d0e7f5ef0a | 247 | else if(rx_buf[0] == 0x0B)transmissionValue = 11; //GPS Coordinates (Second Set) |
jelord | 38:65ae9771f1e3 | 248 | else if(rx_buf[0] == 0x0C)transmissionValue = 12; //Cartridge ID |
jelord | 38:65ae9771f1e3 | 249 | else if(rx_buf[0] == 0x0D)transmissionValue = 13; //Duty Cycle |
jelord | 39:f1ebecfb32ca | 250 | else if (rx_buf[0] == 0x0F)transmissionValue = 15; //BT TRANSFER TEST |
caseyquinn | 25:fbf7d44e7da4 | 251 | //else if(rx_buf[0] == 0x30)RGB_LED.set_led(1,0,0); |
jelord | 3:122bfc998c4c | 252 | else transmissionValue = 100; //Not useful data |
jelord | 3:122bfc998c4c | 253 | } |
jelord | 3:122bfc998c4c | 254 | |
jelord | 38:65ae9771f1e3 | 255 | if(rx_buf[rx_len-1]=='\0' || rx_buf[rx_len-1]=='\n' || rx_buf[rx_len-1] == 0xff || transmissionValue==15){ |
jelord | 3:122bfc998c4c | 256 | if((transmissionValue == 1 || transmissionValue == 2 || transmissionValue == 3 || transmissionValue == 4 || transmissionValue == 5 || |
jelord | 38:65ae9771f1e3 | 257 | transmissionValue == 6 || transmissionValue == 7 || transmissionValue ==10 || transmissionValue ==11 || transmissionValue ==12) && rx_buf[rx_len-1] != 0xff) |
jelord | 3:122bfc998c4c | 258 | {}else{ |
caseyquinn | 21:bb10efc5bf57 | 259 | if(transmissionValue == 4 ) sendData(); |
jelord | 39:f1ebecfb32ca | 260 | if(transmissionValue == 15){ |
jelord | 39:f1ebecfb32ca | 261 | if(fileTransferLock==0){ |
jelord | 39:f1ebecfb32ca | 262 | fileTransferLock=1; |
jelord | 39:f1ebecfb32ca | 263 | Read_File(fileTest); |
jelord | 39:f1ebecfb32ca | 264 | fileTransferLock=0; |
jelord | 39:f1ebecfb32ca | 265 | RGB_LED.set_led(1,1,1); |
jelord | 39:f1ebecfb32ca | 266 | } |
jelord | 39:f1ebecfb32ca | 267 | } |
jelord | 3:122bfc998c4c | 268 | if(transmissionValue == 8){ |
jelord | 3:122bfc998c4c | 269 | runReady = 1; |
jelord | 3:122bfc998c4c | 270 | microChannel.attach(NULL,microChannel.RxIrq); |
jelord | 3:122bfc998c4c | 271 | } |
jelord | 3:122bfc998c4c | 272 | haltBLE = 1; |
jelord | 3:122bfc998c4c | 273 | transmissionValue = 0; |
jelord | 3:122bfc998c4c | 274 | dataLength = 0; |
caseyquinn | 25:fbf7d44e7da4 | 275 | //if(fileWrite == 1){ |
caseyquinn | 25:fbf7d44e7da4 | 276 | //FILE *fp = fopen(gpsConfigFilename, "a"); |
caseyquinn | 25:fbf7d44e7da4 | 277 | //fprintf(fp,"HELLO"); |
caseyquinn | 25:fbf7d44e7da4 | 278 | //fclose(fp); |
caseyquinn | 25:fbf7d44e7da4 | 279 | //free(fp); |
caseyquinn | 25:fbf7d44e7da4 | 280 | //fileWrite=0; |
caseyquinn | 25:fbf7d44e7da4 | 281 | //} |
jelord | 3:122bfc998c4c | 282 | } |
jelord | 2:88fcbfadec6a | 283 | } |
jelord | 1:9fbb5b665068 | 284 | } |
caseyquinn | 12:5b4f3245606a | 285 | |
jelord | 3:122bfc998c4c | 286 | if(haltBLE!=1){ |
jelord | 2:88fcbfadec6a | 287 | |
jelord | 3:122bfc998c4c | 288 | if((transmissionValue!=100) && (dataLength!= 0)) writeData[dataLength-1] = rx_buf[0]; |
jelord | 3:122bfc998c4c | 289 | |
jelord | 3:122bfc998c4c | 290 | if(transmissionValue ==100){ |
caseyquinn | 10:06fbb1c9e3bd | 291 | pc.putc(rx_buf[0]); |
jelord | 2:88fcbfadec6a | 292 | |
jelord | 3:122bfc998c4c | 293 | }else if(transmissionValue ==1){ //process and store RTC values |
jelord | 3:122bfc998c4c | 294 | |
caseyquinn | 7:29b01d5812ee | 295 | //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 | 296 | if(dataLength==6){ |
caseyquinn | 17:3e6dda6e6335 | 297 | RTC_UPAS.set_time(writeData[0],writeData[1],writeData[2],writeData[3],writeData[3],writeData[4],writeData[5]);//sets chronodot RTC |
caseyquinn | 12:5b4f3245606a | 298 | /////////////////////// |
caseyquinn | 7:29b01d5812ee | 299 | //sets ST RTC |
caseyquinn | 12:5b4f3245606a | 300 | ////////////////////// |
caseyquinn | 7:29b01d5812ee | 301 | STtime.tm_sec = writeData[0]; // 0-59 |
caseyquinn | 7:29b01d5812ee | 302 | STtime.tm_min = writeData[1]; // 0-59 |
caseyquinn | 7:29b01d5812ee | 303 | STtime.tm_hour = writeData[2]; // 0-23 |
caseyquinn | 7:29b01d5812ee | 304 | STtime.tm_mday = writeData[3]; // 1-31 |
caseyquinn | 7:29b01d5812ee | 305 | STtime.tm_mon = writeData[4]-1; // 0-11 |
caseyquinn | 7:29b01d5812ee | 306 | STtime.tm_year = 100+writeData[5]; // year since 1900 (116 = 2016) |
caseyquinn | 7:29b01d5812ee | 307 | time_t STseconds = mktime(&STtime); |
caseyquinn | 12:5b4f3245606a | 308 | set_time(STseconds); // Set RTC time |
caseyquinn | 7:29b01d5812ee | 309 | } |
jelord | 3:122bfc998c4c | 310 | |
caseyquinn | 12:5b4f3245606a | 311 | } |
caseyquinn | 14:7cdb643da356 | 312 | else if(transmissionValue ==2){ //process and store sample start/end |
jelord | 3:122bfc998c4c | 313 | if(dataLength ==12)E2PROM.write(0x00015, writeData, 12); |
jelord | 3:122bfc998c4c | 314 | |
jelord | 3:122bfc998c4c | 315 | }else if(transmissionValue ==3){ //process and store sample name |
jelord | 39:f1ebecfb32ca | 316 | if(dataLength ==15)E2PROM.write(0x00001,writeData,15); |
jelord | 3:122bfc998c4c | 317 | |
jelord | 3:122bfc998c4c | 318 | }else if(transmissionValue ==5){ //process and store Log Interval |
jelord | 3:122bfc998c4c | 319 | if(dataLength ==1)E2PROM.write(0x00014,writeData,1); |
jelord | 2:88fcbfadec6a | 320 | |
jelord | 3:122bfc998c4c | 321 | }else if(transmissionValue ==6){ //process and store Flow Rate |
jelord | 3:122bfc998c4c | 322 | if(dataLength ==4)E2PROM.write(0x00010,writeData,4); |
jelord | 3:122bfc998c4c | 323 | |
jelord | 3:122bfc998c4c | 324 | }else if(transmissionValue ==7){ //process and store Serial Number |
jelord | 3:122bfc998c4c | 325 | if(dataLength ==2)E2PROM.write(0x00034,writeData,2); |
caseyquinn | 25:fbf7d44e7da4 | 326 | }else if (transmissionValue == 10){ |
caseyquinn | 25:fbf7d44e7da4 | 327 | if(dataLength == 16)E2PROM.write(0x00050,writeData,16); |
jelord | 33:03d0e7f5ef0a | 328 | }else if (transmissionValue == 11){ |
jelord | 33:03d0e7f5ef0a | 329 | if(dataLength == 8)E2PROM.write(0x00060,writeData,8); |
jelord | 38:65ae9771f1e3 | 330 | }else if (transmissionValue == 12){ |
jelord | 38:65ae9771f1e3 | 331 | if(dataLength == 3)E2PROM.write(0x00070,writeData,3); |
jelord | 38:65ae9771f1e3 | 332 | }else if (transmissionValue == 13){ |
jelord | 38:65ae9771f1e3 | 333 | if(dataLength == 3)E2PROM.write(0x00076,writeData,3); |
jelord | 3:122bfc998c4c | 334 | } |
caseyquinn | 25:fbf7d44e7da4 | 335 | |
jelord | 3:122bfc998c4c | 336 | dataLength++; |
jelord | 1:9fbb5b665068 | 337 | } |
jelord | 3:122bfc998c4c | 338 | |
jelord | 3:122bfc998c4c | 339 | rx_len = 0; |
jelord | 3:122bfc998c4c | 340 | }else{ |
jelord | 3:122bfc998c4c | 341 | while(microChannel.readable()) |
jelord | 3:122bfc998c4c | 342 | uint8_t extract = microChannel.getc(); |
jelord | 3:122bfc998c4c | 343 | } |
jelord | 2:88fcbfadec6a | 344 | |
caseyquinn | 12:5b4f3245606a | 345 | |
jelord | 2:88fcbfadec6a | 346 | } |
caseyquinn | 14:7cdb643da356 | 347 | |
jelord | 2:88fcbfadec6a | 348 | void sendData(){ |
jelord | 2:88fcbfadec6a | 349 | |
caseyquinn | 27:922f53fa649c | 350 | //First byte is designator for the App |
caseyquinn | 21:bb10efc5bf57 | 351 | uint8_t sampleTimePassValues[13] = {0x01,0x00,0x00,0x0A,0x01,0x01,0x10,0x00,0x00,0x0A,0x01,0x01,0x10}; |
caseyquinn | 40:cac5bdffba44 | 352 | uint8_t subjectLabelOriginal[16] = {0x02,0x52,0x45,0x53,0x45,0x54,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x0F}; |
caseyquinn | 21:bb10efc5bf57 | 353 | uint8_t dataLogOriginal[2] = {0x03,0x0A,}; |
caseyquinn | 21:bb10efc5bf57 | 354 | uint8_t flowRateOriginal[5] = {0x04,0x00,0x00,0x80,0x3F}; |
caseyquinn | 29:fd74725294d5 | 355 | uint8_t serialBytes[3] = {0x07,0x00,0x00}; |
caseyquinn | 25:fbf7d44e7da4 | 356 | uint8_t latLongSchoolOriginal[17] = {0x0A,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F}; |
jelord | 33:03d0e7f5ef0a | 357 | uint8_t latLongHome2[9] = {0x0B,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F}; |
jelord | 38:65ae9771f1e3 | 358 | uint8_t cartridgeIDOriginal[4] = {0x0C,0x48,0x48,0x48}; |
jelord | 38:65ae9771f1e3 | 359 | uint8_t dutyCycleOriginal[4] = {0x0D,0x31,0x30,0x30}; |
caseyquinn | 25:fbf7d44e7da4 | 360 | // Latitude School EEPROM = 0x50-0x53 |
caseyquinn | 25:fbf7d44e7da4 | 361 | // Longitude School EEPROM = 0x54-0x57 |
caseyquinn | 25:fbf7d44e7da4 | 362 | // Latitude Home EEPROM = 0x58-0x5B |
caseyquinn | 25:fbf7d44e7da4 | 363 | // Longitude Home EEPROM = 0x5C-0x5F |
caseyquinn | 25:fbf7d44e7da4 | 364 | uint8_t NEW_EEPROM_CHECK[1] = {0,}; //THIS IS USED TO ENSURE COOPERATION WITH MOBILE APPS |
jelord | 33:03d0e7f5ef0a | 365 | uint8_t TERMINATE_BYTE[1] = {0xff,}; //used for compatibility with android app |
caseyquinn | 25:fbf7d44e7da4 | 366 | |
caseyquinn | 25:fbf7d44e7da4 | 367 | //NEW EEPROM Check bit = 0x75 |
caseyquinn | 25:fbf7d44e7da4 | 368 | E2PROM.read(0x00075,NEW_EEPROM_CHECK,1); |
caseyquinn | 25:fbf7d44e7da4 | 369 | |
jelord | 39:f1ebecfb32ca | 370 | if(NEW_EEPROM_CHECK[0] == 0x0C){ //increment when you add a new parameter to pass to app |
caseyquinn | 25:fbf7d44e7da4 | 371 | E2PROM.read(0x00015, sampleTimePassValues+1, 12); |
jelord | 39:f1ebecfb32ca | 372 | E2PROM.read(0x00001, subjectLabelOriginal+1,15); |
caseyquinn | 25:fbf7d44e7da4 | 373 | E2PROM.read(0x00014,dataLogOriginal+1,1); |
caseyquinn | 25:fbf7d44e7da4 | 374 | E2PROM.read(0x00010,flowRateOriginal+1,4); |
caseyquinn | 29:fd74725294d5 | 375 | E2PROM.read(0x00034,serialBytes+1,2); |
caseyquinn | 25:fbf7d44e7da4 | 376 | E2PROM.read(0x00050,latLongSchoolOriginal+1,16); |
jelord | 33:03d0e7f5ef0a | 377 | E2PROM.read(0x00060,latLongHome2+1,8); |
jelord | 38:65ae9771f1e3 | 378 | E2PROM.read(0x00070,cartridgeIDOriginal+1,3); |
jelord | 38:65ae9771f1e3 | 379 | E2PROM.read(0x00076,dutyCycleOriginal+1,3); |
jelord | 38:65ae9771f1e3 | 380 | |
caseyquinn | 25:fbf7d44e7da4 | 381 | }else{ |
jelord | 39:f1ebecfb32ca | 382 | NEW_EEPROM_CHECK[0] = 0x0C; //increment as well |
caseyquinn | 25:fbf7d44e7da4 | 383 | E2PROM.write(0x00075,NEW_EEPROM_CHECK,1); |
caseyquinn | 25:fbf7d44e7da4 | 384 | E2PROM.write(0x00015, sampleTimePassValues+1, 12); |
jelord | 39:f1ebecfb32ca | 385 | E2PROM.write(0x00001, subjectLabelOriginal+1,15); |
caseyquinn | 25:fbf7d44e7da4 | 386 | E2PROM.write(0x00014,dataLogOriginal+1,1); |
caseyquinn | 25:fbf7d44e7da4 | 387 | E2PROM.write(0x00010,flowRateOriginal+1,4); |
caseyquinn | 29:fd74725294d5 | 388 | E2PROM.write(0x00034,serialBytes+1,2); |
caseyquinn | 25:fbf7d44e7da4 | 389 | E2PROM.write(0x00050,latLongSchoolOriginal+1,16); |
jelord | 33:03d0e7f5ef0a | 390 | E2PROM.write(0x00060,latLongHome2+1,8); |
jelord | 38:65ae9771f1e3 | 391 | E2PROM.write(0x00070,cartridgeIDOriginal+1,3); |
jelord | 38:65ae9771f1e3 | 392 | E2PROM.write(0x00076,dutyCycleOriginal+1,3); |
caseyquinn | 25:fbf7d44e7da4 | 393 | } |
caseyquinn | 21:bb10efc5bf57 | 394 | |
jelord | 2:88fcbfadec6a | 395 | |
jelord | 2:88fcbfadec6a | 396 | for(int i=0; i<13; i++){ |
jelord | 2:88fcbfadec6a | 397 | microChannel.putc(sampleTimePassValues[i]); |
jelord | 2:88fcbfadec6a | 398 | } |
jelord | 33:03d0e7f5ef0a | 399 | wait(.15); |
jelord | 2:88fcbfadec6a | 400 | |
jelord | 39:f1ebecfb32ca | 401 | for(int i=0; i<16; i++){ |
jelord | 2:88fcbfadec6a | 402 | microChannel.putc(subjectLabelOriginal[i]); |
jelord | 2:88fcbfadec6a | 403 | } |
jelord | 33:03d0e7f5ef0a | 404 | wait(.15); |
jelord | 2:88fcbfadec6a | 405 | |
jelord | 2:88fcbfadec6a | 406 | for(int i=0; i<2; i++){ |
jelord | 2:88fcbfadec6a | 407 | microChannel.putc(dataLogOriginal[i]); |
jelord | 2:88fcbfadec6a | 408 | } |
jelord | 33:03d0e7f5ef0a | 409 | wait(.15); |
jelord | 2:88fcbfadec6a | 410 | |
jelord | 2:88fcbfadec6a | 411 | for(int i=0; i<5; i++){ |
jelord | 2:88fcbfadec6a | 412 | microChannel.putc(flowRateOriginal[i]); |
caseyquinn | 25:fbf7d44e7da4 | 413 | } |
jelord | 33:03d0e7f5ef0a | 414 | wait(.15); |
caseyquinn | 25:fbf7d44e7da4 | 415 | |
caseyquinn | 25:fbf7d44e7da4 | 416 | for(int i=0;i<17;i++){ |
caseyquinn | 25:fbf7d44e7da4 | 417 | microChannel.putc(latLongSchoolOriginal[i]); |
jelord | 2:88fcbfadec6a | 418 | } |
jelord | 33:03d0e7f5ef0a | 419 | wait(.15); |
jelord | 33:03d0e7f5ef0a | 420 | |
jelord | 33:03d0e7f5ef0a | 421 | for(int i=0;i<9;i++){ |
jelord | 33:03d0e7f5ef0a | 422 | microChannel.putc(latLongHome2[i]); |
jelord | 33:03d0e7f5ef0a | 423 | } |
jelord | 33:03d0e7f5ef0a | 424 | wait(.15); |
jelord | 38:65ae9771f1e3 | 425 | for(int i=0;i<4;i++){ |
jelord | 38:65ae9771f1e3 | 426 | microChannel.putc(cartridgeIDOriginal[i]); |
jelord | 38:65ae9771f1e3 | 427 | } |
jelord | 38:65ae9771f1e3 | 428 | wait(.15); |
jelord | 38:65ae9771f1e3 | 429 | for(int i=0;i<4;i++){ |
jelord | 38:65ae9771f1e3 | 430 | microChannel.putc(dutyCycleOriginal[i]); |
jelord | 38:65ae9771f1e3 | 431 | } |
jelord | 38:65ae9771f1e3 | 432 | wait(.15); |
jelord | 33:03d0e7f5ef0a | 433 | microChannel.putc(TERMINATE_BYTE[0]); |
jelord | 0:2cb2b2ea316f | 434 | |
jelord | 2:88fcbfadec6a | 435 | |
caseyquinn | 25:fbf7d44e7da4 | 436 | } |
jelord | 39:f1ebecfb32ca | 437 | void Read_File(char filename[]){ |
jelord | 39:f1ebecfb32ca | 438 | char new_str[] = "/sd/XXXX0000LOG000000000000---------------.txt"; |
jelord | 39:f1ebecfb32ca | 439 | |
jelord | 39:f1ebecfb32ca | 440 | sprintf(new_str, "/sd/%s", filename); |
jelord | 39:f1ebecfb32ca | 441 | FILE *fp = fopen(new_str, "r"); |
jelord | 39:f1ebecfb32ca | 442 | if(fp == NULL) { |
jelord | 39:f1ebecfb32ca | 443 | pc.printf("Could not open file, check disk.\r\n"); |
jelord | 39:f1ebecfb32ca | 444 | while(1) {}; |
jelord | 39:f1ebecfb32ca | 445 | } else { |
jelord | 39:f1ebecfb32ca | 446 | pc.printf("file opened\r\n"); |
jelord | 39:f1ebecfb32ca | 447 | } |
jelord | 39:f1ebecfb32ca | 448 | unsigned char c; |
jelord | 39:f1ebecfb32ca | 449 | uint8_t sendMe[1] = {254}; |
jelord | 39:f1ebecfb32ca | 450 | RGB_LED.set_led(0,1,0); |
jelord | 39:f1ebecfb32ca | 451 | //pc.printf("%s\r\n",fp.c_str()); |
jelord | 39:f1ebecfb32ca | 452 | microChannel.putc(sendMe[0]); |
jelord | 39:f1ebecfb32ca | 453 | while (c != 255){ // while not end of file or forever |
jelord | 39:f1ebecfb32ca | 454 | c=fgetc(fp); // get a character/byte from the file |
jelord | 39:f1ebecfb32ca | 455 | //printf("%c",c); // and show it in hex format |
jelord | 39:f1ebecfb32ca | 456 | microChannel.putc(c); |
jelord | 39:f1ebecfb32ca | 457 | //wait(0.005); |
jelord | 39:f1ebecfb32ca | 458 | } |
jelord | 39:f1ebecfb32ca | 459 | //RGB_LED.set_led(1,0,0); |
jelord | 39:f1ebecfb32ca | 460 | printf("\r\n"); |
jelord | 39:f1ebecfb32ca | 461 | fclose(fp); // close the file |
jelord | 39:f1ebecfb32ca | 462 | |
jelord | 39:f1ebecfb32ca | 463 | }; |
caseyquinn | 14:7cdb643da356 | 464 | |
caseyquinn | 12:5b4f3245606a | 465 | ////////////////////////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 466 | // GPS: Calculate distance from target location |
caseyquinn | 12:5b4f3245606a | 467 | ////////////////////////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 468 | double GPSdistanceCalc (float tlat, float tlon) |
caseyquinn | 12:5b4f3245606a | 469 | { |
caseyquinn | 12:5b4f3245606a | 470 | |
caseyquinn | 12:5b4f3245606a | 471 | float tlatrad, flatrad; |
caseyquinn | 12:5b4f3245606a | 472 | float sdlong, cdlong; |
caseyquinn | 12:5b4f3245606a | 473 | float sflat, cflat; |
caseyquinn | 12:5b4f3245606a | 474 | float stlat, ctlat; |
caseyquinn | 12:5b4f3245606a | 475 | float delta, denom; |
caseyquinn | 12:5b4f3245606a | 476 | |
caseyquinn | 12:5b4f3245606a | 477 | double distance; |
caseyquinn | 27:922f53fa649c | 478 | delta = (gpslongitude-tlon)*0.0174532925; |
caseyquinn | 12:5b4f3245606a | 479 | sdlong = sin(delta); |
caseyquinn | 12:5b4f3245606a | 480 | cdlong = cos(delta); |
caseyquinn | 27:922f53fa649c | 481 | flatrad = (gpslatitude)*0.0174532925; |
caseyquinn | 12:5b4f3245606a | 482 | tlatrad = (tlat)*0.0174532925; |
caseyquinn | 12:5b4f3245606a | 483 | sflat = sin(flatrad); |
caseyquinn | 12:5b4f3245606a | 484 | cflat = cos(flatrad); |
caseyquinn | 12:5b4f3245606a | 485 | stlat = sin(tlatrad); |
caseyquinn | 12:5b4f3245606a | 486 | ctlat = cos(tlatrad); |
caseyquinn | 12:5b4f3245606a | 487 | delta = (cflat * stlat) - (sflat * ctlat * cdlong); |
caseyquinn | 12:5b4f3245606a | 488 | delta = pow(delta,2); |
caseyquinn | 12:5b4f3245606a | 489 | delta += pow(ctlat * sdlong,2); |
caseyquinn | 12:5b4f3245606a | 490 | delta = sqrt(delta); |
caseyquinn | 12:5b4f3245606a | 491 | denom = (sflat * stlat) + (cflat * ctlat * cdlong); |
caseyquinn | 12:5b4f3245606a | 492 | delta = atan2(delta, denom); |
caseyquinn | 12:5b4f3245606a | 493 | distance = delta * 6372795; |
caseyquinn | 12:5b4f3245606a | 494 | return distance; |
caseyquinn | 12:5b4f3245606a | 495 | } |
caseyquinn | 12:5b4f3245606a | 496 | |
caseyquinn | 43:05aa1fb68946 | 497 | ////////////////////////////////////////////////////////////// |
caseyquinn | 45:5e0942088e31 | 498 | //Time Comparison Function |
caseyquinn | 43:05aa1fb68946 | 499 | ////////////////////////////////////////////////////////////// |
caseyquinn | 43:05aa1fb68946 | 500 | bool timecompare(uint8_t t_sec, uint8_t t_minutes, uint8_t t_hour, uint8_t t_date, uint8_t t_month, uint8_t t_year) |
caseyquinn | 43:05aa1fb68946 | 501 | { |
caseyquinn | 43:05aa1fb68946 | 502 | |
caseyquinn | 43:05aa1fb68946 | 503 | time_t seconds = time(NULL); |
caseyquinn | 43:05aa1fb68946 | 504 | //strftime(timestr, 32, "%y%m%d%H%M%S", localtime(&seconds)); |
caseyquinn | 43:05aa1fb68946 | 505 | |
caseyquinn | 43:05aa1fb68946 | 506 | strftime(yrstr, 4, "%y", localtime(&seconds)); |
caseyquinn | 43:05aa1fb68946 | 507 | stYr = atoi(yrstr); |
caseyquinn | 43:05aa1fb68946 | 508 | |
caseyquinn | 43:05aa1fb68946 | 509 | strftime(mostr, 4, "%m", localtime(&seconds)); |
caseyquinn | 43:05aa1fb68946 | 510 | stMo = atoi(mostr); |
caseyquinn | 43:05aa1fb68946 | 511 | |
caseyquinn | 43:05aa1fb68946 | 512 | strftime(daystr, 4, "%d", localtime(&seconds)); |
caseyquinn | 43:05aa1fb68946 | 513 | stDay = atoi(daystr); |
caseyquinn | 43:05aa1fb68946 | 514 | |
caseyquinn | 43:05aa1fb68946 | 515 | strftime(hrstr, 4, "%H", localtime(&seconds)); |
caseyquinn | 43:05aa1fb68946 | 516 | stHr = atoi(hrstr); |
caseyquinn | 43:05aa1fb68946 | 517 | |
caseyquinn | 43:05aa1fb68946 | 518 | strftime(minstr, 4, "%M", localtime(&seconds)); |
caseyquinn | 43:05aa1fb68946 | 519 | stMin = atoi(minstr); |
caseyquinn | 43:05aa1fb68946 | 520 | |
caseyquinn | 43:05aa1fb68946 | 521 | strftime(secstr, 4, "%S", localtime(&seconds)); |
caseyquinn | 43:05aa1fb68946 | 522 | stSec = atoi(secstr); |
caseyquinn | 43:05aa1fb68946 | 523 | |
caseyquinn | 43:05aa1fb68946 | 524 | if(t_year != stYr){ |
caseyquinn | 43:05aa1fb68946 | 525 | return t_year < stYr; |
caseyquinn | 43:05aa1fb68946 | 526 | } |
caseyquinn | 43:05aa1fb68946 | 527 | if(t_month != stMo){ |
caseyquinn | 43:05aa1fb68946 | 528 | return t_month < stMo; |
caseyquinn | 43:05aa1fb68946 | 529 | } |
caseyquinn | 43:05aa1fb68946 | 530 | if(t_date != stDay){ |
caseyquinn | 43:05aa1fb68946 | 531 | return t_date < stDay; |
caseyquinn | 43:05aa1fb68946 | 532 | } |
caseyquinn | 43:05aa1fb68946 | 533 | if(t_hour != stHr){ |
caseyquinn | 43:05aa1fb68946 | 534 | return t_hour < stHr; |
caseyquinn | 43:05aa1fb68946 | 535 | } |
caseyquinn | 43:05aa1fb68946 | 536 | if(t_minutes != stMin){ |
caseyquinn | 43:05aa1fb68946 | 537 | return t_minutes < stMin; |
caseyquinn | 43:05aa1fb68946 | 538 | } |
caseyquinn | 43:05aa1fb68946 | 539 | return t_sec < stSec; |
caseyquinn | 43:05aa1fb68946 | 540 | |
caseyquinn | 43:05aa1fb68946 | 541 | } |
caseyquinn | 43:05aa1fb68946 | 542 | |
caseyquinn | 5:c3252e5d45ca | 543 | |
caseyquinn | 9:8646fd501832 | 544 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 545 | //Shutdown Function |
caseyquinn | 9:8646fd501832 | 546 | ////////////////////////////////////////////////////////////// |
jelord | 3:122bfc998c4c | 547 | void check_stop() // this checks if it's time to stop and shutdown |
jelord | 3:122bfc998c4c | 548 | { |
caseyquinn | 17:3e6dda6e6335 | 549 | |
caseyquinn | 43:05aa1fb68946 | 550 | if(timecompare(startAndEndTime[6], startAndEndTime[7], startAndEndTime[8], startAndEndTime[9], startAndEndTime[10], startAndEndTime[11])) { |
jelord | 3:122bfc998c4c | 551 | pbKill = 0; // this is were we shut everything down |
caseyquinn | 4:5d004fd997d5 | 552 | //pc.printf("If you're reading this something has gone very wrong."); |
jelord | 3:122bfc998c4c | 553 | } |
caseyquinn | 17:3e6dda6e6335 | 554 | |
jelord | 3:122bfc998c4c | 555 | } |
caseyquinn | 5:c3252e5d45ca | 556 | |
caseyquinn | 9:8646fd501832 | 557 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 558 | //SD Logging Function |
caseyquinn | 9:8646fd501832 | 559 | ////////////////////////////////////////////////////////////// |
jelord | 3:122bfc998c4c | 560 | void log_data() |
jelord | 3:122bfc998c4c | 561 | { |
caseyquinn | 44:075fa63d5df1 | 562 | //Get RTC time(s) |
caseyquinn | 28:42932d3b105d | 563 | /////////////////////////// |
caseyquinn | 43:05aa1fb68946 | 564 | RTC_UPAS.get_time(); |
caseyquinn | 7:29b01d5812ee | 565 | time_t seconds = time(NULL); |
caseyquinn | 42:c8ed2dc04dfe | 566 | strftime(timestr, 32, "%y%m%d%H%M%S", localtime(&seconds)); |
caseyquinn | 43:05aa1fb68946 | 567 | |
caseyquinn | 43:05aa1fb68946 | 568 | strftime(yrstr, 4, "%y", localtime(&seconds)); |
caseyquinn | 43:05aa1fb68946 | 569 | stYr = atoi(yrstr); |
caseyquinn | 43:05aa1fb68946 | 570 | |
caseyquinn | 43:05aa1fb68946 | 571 | strftime(mostr, 4, "%m", localtime(&seconds)); |
caseyquinn | 43:05aa1fb68946 | 572 | stMo = atoi(mostr); |
caseyquinn | 43:05aa1fb68946 | 573 | |
caseyquinn | 43:05aa1fb68946 | 574 | strftime(daystr, 4, "%d", localtime(&seconds)); |
caseyquinn | 43:05aa1fb68946 | 575 | stDay = atoi(daystr); |
caseyquinn | 43:05aa1fb68946 | 576 | |
caseyquinn | 43:05aa1fb68946 | 577 | strftime(hrstr, 4, "%H", localtime(&seconds)); |
caseyquinn | 43:05aa1fb68946 | 578 | stHr = atoi(hrstr); |
caseyquinn | 43:05aa1fb68946 | 579 | |
caseyquinn | 43:05aa1fb68946 | 580 | strftime(minstr, 4, "%M", localtime(&seconds)); |
caseyquinn | 43:05aa1fb68946 | 581 | stMin = atoi(minstr); |
caseyquinn | 43:05aa1fb68946 | 582 | |
caseyquinn | 43:05aa1fb68946 | 583 | strftime(secstr, 4, "%S", localtime(&seconds)); |
caseyquinn | 43:05aa1fb68946 | 584 | stSec = atoi(secstr); |
caseyquinn | 43:05aa1fb68946 | 585 | |
caseyquinn | 44:075fa63d5df1 | 586 | //pc.printf("%s,%s,%d,%s,%d,%s,%d,%s,%d,%s,%d,%s,%d\r\n", timestr,yrstr,stYr,mostr,stMo,daystr,stDay,hrstr,stHr,minstr,stMin,secstr,stSec); |
caseyquinn | 36:2e344db70d35 | 587 | |
caseyquinn | 46:99d129bfdbbd | 588 | ///////////////////////////// |
caseyquinn | 46:99d129bfdbbd | 589 | ///Dutycycle |
caseyquinn | 46:99d129bfdbbd | 590 | //////////////////////////// |
caseyquinn | 46:99d129bfdbbd | 591 | if(stSec >= dutycycleSecOn && pumps == 1){ |
caseyquinn | 46:99d129bfdbbd | 592 | pumps = 0; |
caseyquinn | 46:99d129bfdbbd | 593 | } |
caseyquinn | 46:99d129bfdbbd | 594 | else if(stSec < dutycycleSecOn && pumps == 0) { |
caseyquinn | 46:99d129bfdbbd | 595 | pumps = 1; |
caseyquinn | 46:99d129bfdbbd | 596 | } |
caseyquinn | 46:99d129bfdbbd | 597 | |
caseyquinn | 28:42932d3b105d | 598 | //Get Sensor Data except GPS |
caseyquinn | 28:42932d3b105d | 599 | //////////////////////////// |
caseyquinn | 7:29b01d5812ee | 600 | press = bmesensor.getPressure(); |
caseyquinn | 7:29b01d5812ee | 601 | temp = bmesensor.getTemperature()-5.0; |
caseyquinn | 7:29b01d5812ee | 602 | rh = bmesensor.getHumidity(); |
caseyquinn | 7:29b01d5812ee | 603 | uv = lightsensor.getUV(); |
caseyquinn | 14:7cdb643da356 | 604 | movementsensor.getACCEL(); |
caseyquinn | 14:7cdb643da356 | 605 | movementsensor.getCOMPASS(); |
caseyquinn | 14:7cdb643da356 | 606 | compass = movementsensor.getCOMPASS_HEADING(); |
caseyquinn | 14:7cdb643da356 | 607 | accel_x = movementsensor.AccelData.x; |
caseyquinn | 14:7cdb643da356 | 608 | accel_y = movementsensor.AccelData.y; |
caseyquinn | 14:7cdb643da356 | 609 | accel_z = movementsensor.AccelData.z; |
caseyquinn | 14:7cdb643da356 | 610 | accel_comp = pow(accel_x,(float)2)+pow(accel_y,(float)2)+pow(accel_z,(float)2)-1.0; |
caseyquinn | 14:7cdb643da356 | 611 | mag_x = movementsensor.MagData.x; |
caseyquinn | 14:7cdb643da356 | 612 | mag_y = movementsensor.MagData.y; |
caseyquinn | 14:7cdb643da356 | 613 | mag_z = movementsensor.MagData.z; |
caseyquinn | 25:fbf7d44e7da4 | 614 | vInReadingLast = vInReading; |
caseyquinn | 25:fbf7d44e7da4 | 615 | vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0 |
caseyquinn | 25:fbf7d44e7da4 | 616 | amps = gasG.getAmps(); |
caseyquinn | 25:fbf7d44e7da4 | 617 | bVolt = gasG.getVolts(); |
caseyquinn | 25:fbf7d44e7da4 | 618 | bFuel = gasG.getCharge(); |
caseyquinn | 35:e0bdd6389a75 | 619 | |
caseyquinn | 28:42932d3b105d | 620 | //Check for fully charged battery |
caseyquinn | 28:42932d3b105d | 621 | if(bVolt > 1750 && amps > 8191) { |
caseyquinn | 46:99d129bfdbbd | 622 | //RGB_LED.set_led(0,0,0); |
caseyquinn | 46:99d129bfdbbd | 623 | RGB_LED.set_led(0,1,0); |
caseyquinn | 44:075fa63d5df1 | 624 | //Check for battery with ~2 hours left of runtime at 2lpm to remind user to plug in sampler |
caseyquinn | 44:075fa63d5df1 | 625 | }else if(amps > 8191 && bVolt < 1500) { |
caseyquinn | 28:42932d3b105d | 626 | if(ledOn) { |
caseyquinn | 28:42932d3b105d | 627 | RGB_LED.set_led(0,0,0); |
caseyquinn | 28:42932d3b105d | 628 | ledOn = 0; |
caseyquinn | 28:42932d3b105d | 629 | }else { |
caseyquinn | 28:42932d3b105d | 630 | RGB_LED.set_led(1,0,0); |
caseyquinn | 28:42932d3b105d | 631 | ledOn = 1; |
caseyquinn | 28:42932d3b105d | 632 | } |
caseyquinn | 28:42932d3b105d | 633 | //No LED on when not low battery and not fully charged |
caseyquinn | 28:42932d3b105d | 634 | }else{ |
caseyquinn | 28:42932d3b105d | 635 | RGB_LED.set_led(0,0,0); |
caseyquinn | 28:42932d3b105d | 636 | } |
caseyquinn | 28:42932d3b105d | 637 | |
caseyquinn | 35:e0bdd6389a75 | 638 | |
caseyquinn | 28:42932d3b105d | 639 | // Get GPS Data |
caseyquinn | 28:42932d3b105d | 640 | ////////////////////////////// |
caseyquinn | 28:42932d3b105d | 641 | //if(gpsEN ==1){ |
caseyquinn | 28:42932d3b105d | 642 | |
caseyquinn | 28:42932d3b105d | 643 | gpsFix = gps.read(1); |
caseyquinn | 28:42932d3b105d | 644 | gpsspeed = gps.speed; |
caseyquinn | 28:42932d3b105d | 645 | //gpscourse = gps.course; |
caseyquinn | 28:42932d3b105d | 646 | gpssatellites = gps.satellites; |
caseyquinn | 28:42932d3b105d | 647 | gpslatitude = gps.lat; |
caseyquinn | 28:42932d3b105d | 648 | gpslongitude = gps.lon; |
caseyquinn | 28:42932d3b105d | 649 | gpsaltitude = gps.altitude; |
caseyquinn | 43:05aa1fb68946 | 650 | //} |
caseyquinn | 28:42932d3b105d | 651 | |
caseyquinn | 28:42932d3b105d | 652 | //Check for 3.3V rail cut out and turn off pumps in this event |
caseyquinn | 28:42932d3b105d | 653 | if(vInReading > 5950 && amps > 8191) { |
caseyquinn | 35:e0bdd6389a75 | 654 | pumps = 0; |
caseyquinn | 28:42932d3b105d | 655 | wait(1); |
caseyquinn | 28:42932d3b105d | 656 | //Turn pumps back on once the sampler is plugged in and charging after pumps shutoff and 3.3V rail drops out |
caseyquinn | 28:42932d3b105d | 657 | } else if(pumps == 0 && amps < 8191) { |
caseyquinn | 46:99d129bfdbbd | 658 | //pumps = 1; |
caseyquinn | 28:42932d3b105d | 659 | } |
caseyquinn | 28:42932d3b105d | 660 | |
caseyquinn | 28:42932d3b105d | 661 | |
caseyquinn | 14:7cdb643da356 | 662 | |
caseyquinn | 25:fbf7d44e7da4 | 663 | if(pumps == 1){ |
caseyquinn | 34:da333abe3476 | 664 | omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V |
caseyquinn | 34:da333abe3476 | 665 | omronVolt = (omronReading*4.096)/(32768*1); |
caseyquinn | 25:fbf7d44e7da4 | 666 | |
caseyquinn | 25:fbf7d44e7da4 | 667 | if(omronVolt<=calibrations.omronVMin) { |
caseyquinn | 25:fbf7d44e7da4 | 668 | massflow = calibrations.omronMFMin; |
caseyquinn | 25:fbf7d44e7da4 | 669 | } else if(omronVolt>=calibrations.omronVMax) { |
caseyquinn | 25:fbf7d44e7da4 | 670 | massflow = calibrations.omronMFMax; |
caseyquinn | 25:fbf7d44e7da4 | 671 | } else { |
caseyquinn | 25:fbf7d44e7da4 | 672 | 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 | 25:fbf7d44e7da4 | 673 | } |
caseyquinn | 25:fbf7d44e7da4 | 674 | |
caseyquinn | 25:fbf7d44e7da4 | 675 | 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 | 25:fbf7d44e7da4 | 676 | volflow = massflow/atmoRho; |
caseyquinn | 25:fbf7d44e7da4 | 677 | sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow); |
caseyquinn | 25:fbf7d44e7da4 | 678 | deltaVflow = volflow-volflowSet; |
caseyquinn | 25:fbf7d44e7da4 | 679 | massflowSet = volflowSet*atmoRho; |
caseyquinn | 25:fbf7d44e7da4 | 680 | deltaMflow = massflow-massflowSet; |
caseyquinn | 25:fbf7d44e7da4 | 681 | |
caseyquinn | 25:fbf7d44e7da4 | 682 | vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0 |
caseyquinn | 25:fbf7d44e7da4 | 683 | omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3 |
caseyquinn | 14:7cdb643da356 | 684 | } |
caseyquinn | 14:7cdb643da356 | 685 | |
caseyquinn | 27:922f53fa649c | 686 | |
caseyquinn | 21:bb10efc5bf57 | 687 | |
caseyquinn | 7:29b01d5812ee | 688 | FILE *fp = fopen(filename, "a"); |
caseyquinn | 21:bb10efc5bf57 | 689 | 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 | 690 | fprintf(fp, "%s,", timestr); |
caseyquinn | 7:29b01d5812ee | 691 | fprintf(fp, "%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,", omronVolt,massflow,temp,press,rh,atmoRho); |
caseyquinn | 7:29b01d5812ee | 692 | 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 | 693 | fprintf(fp, "%.1f,%.1f,%.1f,%.3f,%.3f,%.3f,%.1f,", angle_x,angle_y,angle_z,mag_x, mag_y, mag_z,compass); |
caseyquinn | 25:fbf7d44e7da4 | 694 | fprintf(fp, "%d,%d,%d,%d,%d,%d," ,uv,omronReading, vInReading, vBlowerReading, omronDiff,amps); |
caseyquinn | 25:fbf7d44e7da4 | 695 | fprintf(fp, "%d,%d,%d,%1.3f,%1.3f,", bVolt, bFuel,digital_pot_set, deltaMflow, deltaVflow); |
caseyquinn | 27:922f53fa649c | 696 | fprintf(fp, "%f,%f,%06d,%06d,", gpslatitude, gpslongitude, (long)gps.date, (long)gps.utc); |
caseyquinn | 28:42932d3b105d | 697 | //fprintf(fp, "%f,%d,%f,%f,%d,", gpsspeed, gpssatellites, gpscourse, gpsaltitude, gpsFix); |
caseyquinn | 28:42932d3b105d | 698 | fprintf(fp, "%f,%d,%f,%d,", gpsspeed, gpssatellites, gpsaltitude, gpsFix); |
caseyquinn | 46:99d129bfdbbd | 699 | fprintf(fp, "%d,%d\r\n", dutyCycleI, pumps == 1); // test and add in speed, etc that Josh added in to match the adafruit GPS |
caseyquinn | 7:29b01d5812ee | 700 | fclose(fp); |
caseyquinn | 7:29b01d5812ee | 701 | free(fp); |
caseyquinn | 25:fbf7d44e7da4 | 702 | |
caseyquinn | 25:fbf7d44e7da4 | 703 | |
caseyquinn | 14:7cdb643da356 | 704 | |
caseyquinn | 12:5b4f3245606a | 705 | |
caseyquinn | 25:fbf7d44e7da4 | 706 | |
caseyquinn | 12:5b4f3245606a | 707 | |
jelord | 3:122bfc998c4c | 708 | |
jelord | 3:122bfc998c4c | 709 | } |
caseyquinn | 8:c4a8f9b67cee | 710 | |
caseyquinn | 9:8646fd501832 | 711 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 712 | //Flow Control Function |
caseyquinn | 9:8646fd501832 | 713 | ////////////////////////////////////////////////////////////// |
caseyquinn | 8:c4a8f9b67cee | 714 | void flowControl() |
caseyquinn | 8:c4a8f9b67cee | 715 | { |
caseyquinn | 48:45d29f874b23 | 716 | if(pumps == 1){ |
caseyquinn | 25:fbf7d44e7da4 | 717 | //RGB_LED.set_led(0,1,0); |
caseyquinn | 34:da333abe3476 | 718 | omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V |
caseyquinn | 34:da333abe3476 | 719 | omronVolt = (omronReading*4.096)/(32768*1); |
caseyquinn | 8:c4a8f9b67cee | 720 | |
caseyquinn | 8:c4a8f9b67cee | 721 | if(omronVolt<=calibrations.omronVMin) { |
caseyquinn | 8:c4a8f9b67cee | 722 | massflow = calibrations.omronMFMin; |
caseyquinn | 8:c4a8f9b67cee | 723 | } else if(omronVolt>=calibrations.omronVMax) { |
caseyquinn | 8:c4a8f9b67cee | 724 | massflow = calibrations.omronMFMax; |
caseyquinn | 8:c4a8f9b67cee | 725 | } else { |
caseyquinn | 8:c4a8f9b67cee | 726 | 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 | 727 | } |
caseyquinn | 8:c4a8f9b67cee | 728 | |
caseyquinn | 8:c4a8f9b67cee | 729 | 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 | 730 | volflow = massflow/atmoRho; |
caseyquinn | 47:fe50d72c7adc | 731 | //sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow); |
caseyquinn | 8:c4a8f9b67cee | 732 | deltaVflow = volflow-volflowSet; |
caseyquinn | 8:c4a8f9b67cee | 733 | massflowSet = volflowSet*atmoRho; |
caseyquinn | 8:c4a8f9b67cee | 734 | deltaMflow = massflow-massflowSet; |
caseyquinn | 12:5b4f3245606a | 735 | |
caseyquinn | 8:c4a8f9b67cee | 736 | if(abs(deltaMflow)>.025) { |
caseyquinn | 8:c4a8f9b67cee | 737 | digital_pot_change = (int)(gainFlow*deltaMflow); |
caseyquinn | 8:c4a8f9b67cee | 738 | |
caseyquinn | 8:c4a8f9b67cee | 739 | |
caseyquinn | 12:5b4f3245606a | 740 | if(abs(digital_pot_change)>=10) { |
caseyquinn | 12:5b4f3245606a | 741 | digital_pot_set = (int)(digital_pot_set+ (int)(1*deltaMflow)); |
caseyquinn | 25:fbf7d44e7da4 | 742 | //RGB_LED.set_led(1,0,0); |
caseyquinn | 12:5b4f3245606a | 743 | } else { |
caseyquinn | 8:c4a8f9b67cee | 744 | digital_pot_set = (digital_pot_set+ digital_pot_change); |
caseyquinn | 25:fbf7d44e7da4 | 745 | //RGB_LED.set_led(1,1,0); |
caseyquinn | 8:c4a8f9b67cee | 746 | } |
caseyquinn | 8:c4a8f9b67cee | 747 | |
caseyquinn | 12:5b4f3245606a | 748 | if(digital_pot_set>=digitalpotMax) { |
caseyquinn | 12:5b4f3245606a | 749 | digital_pot_set = digitalpotMax; |
caseyquinn | 25:fbf7d44e7da4 | 750 | //RGB_LED.set_led(1,0,0); |
caseyquinn | 12:5b4f3245606a | 751 | } else if(digital_pot_set<=digitalpotMin) { |
caseyquinn | 12:5b4f3245606a | 752 | digital_pot_set = digitalpotMin; |
caseyquinn | 25:fbf7d44e7da4 | 753 | //RGB_LED.set_led(1,0,0); |
caseyquinn | 12:5b4f3245606a | 754 | } |
caseyquinn | 8:c4a8f9b67cee | 755 | |
caseyquinn | 8:c4a8f9b67cee | 756 | DigPot.writeRegister(digital_pot_set); |
caseyquinn | 12:5b4f3245606a | 757 | |
caseyquinn | 8:c4a8f9b67cee | 758 | } else { |
caseyquinn | 25:fbf7d44e7da4 | 759 | //RGB_LED.set_led(0,1,0); |
caseyquinn | 8:c4a8f9b67cee | 760 | } |
caseyquinn | 48:45d29f874b23 | 761 | } |
caseyquinn | 25:fbf7d44e7da4 | 762 | |
caseyquinn | 8:c4a8f9b67cee | 763 | } |
caseyquinn | 9:8646fd501832 | 764 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 765 | //Main Function |
caseyquinn | 9:8646fd501832 | 766 | ////////////////////////////////////////////////////////////// |
jelord | 1:9fbb5b665068 | 767 | int main(){ |
caseyquinn | 27:922f53fa649c | 768 | |
caseyquinn | 29:fd74725294d5 | 769 | |
caseyquinn | 23:1ca41779b8ec | 770 | RGB_LED.set_led(0,0,1); |
caseyquinn | 36:2e344db70d35 | 771 | |
caseyquinn | 36:2e344db70d35 | 772 | |
caseyquinn | 29:fd74725294d5 | 773 | /* |
caseyquinn | 27:922f53fa649c | 774 | while(1){ |
caseyquinn | 27:922f53fa649c | 775 | if(sdCD == 0){ |
caseyquinn | 27:922f53fa649c | 776 | RGB_LED.set_led(0,1,0); |
caseyquinn | 27:922f53fa649c | 777 | }else{ |
caseyquinn | 27:922f53fa649c | 778 | RGB_LED.set_led(1,0,0); |
caseyquinn | 27:922f53fa649c | 779 | } |
caseyquinn | 27:922f53fa649c | 780 | |
caseyquinn | 27:922f53fa649c | 781 | wait(10); |
caseyquinn | 27:922f53fa649c | 782 | } |
caseyquinn | 35:e0bdd6389a75 | 783 | |
caseyquinn | 43:05aa1fb68946 | 784 | */ |
caseyquinn | 30:aa6324845a84 | 785 | |
caseyquinn | 23:1ca41779b8ec | 786 | |
caseyquinn | 23:1ca41779b8ec | 787 | gpsEN = 1; |
caseyquinn | 23:1ca41779b8ec | 788 | wait(1); |
caseyquinn | 23:1ca41779b8ec | 789 | BT_SW = 1; |
caseyquinn | 23:1ca41779b8ec | 790 | wait(1); |
caseyquinn | 23:1ca41779b8ec | 791 | BT_IRST = 1; |
caseyquinn | 23:1ca41779b8ec | 792 | wait(1); |
caseyquinn | 23:1ca41779b8ec | 793 | |
caseyquinn | 12:5b4f3245606a | 794 | |
caseyquinn | 10:06fbb1c9e3bd | 795 | pc.baud(115200); // set what you want here depending on your terminal program speed |
caseyquinn | 10:06fbb1c9e3bd | 796 | pc.printf("\f\n\r-------------Startup-------------\n\r"); |
jelord | 1:9fbb5b665068 | 797 | wait(0.5); |
caseyquinn | 5:c3252e5d45ca | 798 | |
caseyquinn | 29:fd74725294d5 | 799 | |
caseyquinn | 29:fd74725294d5 | 800 | |
caseyquinn | 29:fd74725294d5 | 801 | uint8_t serialNumberAndType[6] = {0x50,0x53,}; //ex) PS0018 // 0x50,0x53 <- ASCII 80 + 83 (PS) //0x4d,0x53 <- ASCII 77 + 83 (MS) |
caseyquinn | 29:fd74725294d5 | 802 | E2PROM.read(0x00034,serialNumberAndType+2,2); |
caseyquinn | 29:fd74725294d5 | 803 | |
caseyquinn | 29:fd74725294d5 | 804 | int tempSerialNum = ((serialNumberAndType[2]-48)*10 + serialNumberAndType[3]-48); |
caseyquinn | 29:fd74725294d5 | 805 | if(tempSerialNum < 18){ |
caseyquinn | 29:fd74725294d5 | 806 | serialNumberAndType[0] = 0x4D; |
caseyquinn | 29:fd74725294d5 | 807 | } |
caseyquinn | 13:455601f62aad | 808 | |
jelord | 3:122bfc998c4c | 809 | int serialNumDigits[4]; |
jelord | 3:122bfc998c4c | 810 | serialNumDigits[0] = tempSerialNum / 1000 % 10; |
jelord | 3:122bfc998c4c | 811 | serialNumDigits[1] = tempSerialNum / 100 % 10; |
jelord | 3:122bfc998c4c | 812 | serialNumDigits[2] = tempSerialNum / 10 % 10; |
jelord | 3:122bfc998c4c | 813 | serialNumDigits[3] = tempSerialNum % 10; |
jelord | 3:122bfc998c4c | 814 | |
caseyquinn | 29:fd74725294d5 | 815 | |
jelord | 3:122bfc998c4c | 816 | serialNumberAndType[2] = serialNumDigits[0]+48; |
jelord | 3:122bfc998c4c | 817 | serialNumberAndType[3] = serialNumDigits[1]+48; |
jelord | 3:122bfc998c4c | 818 | serialNumberAndType[4] = serialNumDigits[2]+48; |
jelord | 3:122bfc998c4c | 819 | serialNumberAndType[5] = serialNumDigits[3]+48; |
caseyquinn | 12:5b4f3245606a | 820 | |
caseyquinn | 29:fd74725294d5 | 821 | /* |
caseyquinn | 29:fd74725294d5 | 822 | serialNumberAndType[2] = serialNumDigits[0]; |
caseyquinn | 29:fd74725294d5 | 823 | serialNumberAndType[3] = serialNumDigits[1]; |
caseyquinn | 29:fd74725294d5 | 824 | serialNumberAndType[4] = serialNumDigits[2]; |
caseyquinn | 29:fd74725294d5 | 825 | serialNumberAndType[5] = serialNumDigits[3]; |
caseyquinn | 29:fd74725294d5 | 826 | */ |
caseyquinn | 29:fd74725294d5 | 827 | |
caseyquinn | 29:fd74725294d5 | 828 | RGB_LED.set_led(0,1,0); |
caseyquinn | 13:455601f62aad | 829 | |
caseyquinn | 10:06fbb1c9e3bd | 830 | pc.attach(pc_recv); |
jelord | 1:9fbb5b665068 | 831 | microChannel.attach(uartMicro,microChannel.RxIrq); |
jelord | 3:122bfc998c4c | 832 | microChannel.baud(115200); |
jelord | 1:9fbb5b665068 | 833 | microChannel.printf("$$$"); |
jelord | 3:122bfc998c4c | 834 | wait(0.5); |
jelord | 3:122bfc998c4c | 835 | microChannel.printf("SN,"); |
jelord | 3:122bfc998c4c | 836 | for(int i=0;i<6;i++)microChannel.putc(serialNumberAndType[i]); |
jelord | 3:122bfc998c4c | 837 | microChannel.printf("\r"); |
jelord | 3:122bfc998c4c | 838 | wait(0.5); |
jelord | 1:9fbb5b665068 | 839 | microChannel.printf("A\r"); |
jelord | 3:122bfc998c4c | 840 | wait(0.5); |
jelord | 2:88fcbfadec6a | 841 | microChannel.printf("---\r"); |
jelord | 3:122bfc998c4c | 842 | wait(0.5); |
jelord | 2:88fcbfadec6a | 843 | |
caseyquinn | 18:41ef98db0423 | 844 | RGB_LED.set_led(1,1,1); |
caseyquinn | 36:2e344db70d35 | 845 | |
jelord | 3:122bfc998c4c | 846 | while(runReady!=1) { |
jelord | 3:122bfc998c4c | 847 | wait(1); |
caseyquinn | 26:6aa294d83af4 | 848 | pc.printf("Waiting for BLE instruction\r\n"); |
jelord | 3:122bfc998c4c | 849 | |
jelord | 3:122bfc998c4c | 850 | } |
jelord | 3:122bfc998c4c | 851 | |
caseyquinn | 36:2e344db70d35 | 852 | BT_SW = 0; |
caseyquinn | 36:2e344db70d35 | 853 | wait(1); |
caseyquinn | 36:2e344db70d35 | 854 | BT_IRST = 0; |
caseyquinn | 36:2e344db70d35 | 855 | wait(1); |
caseyquinn | 36:2e344db70d35 | 856 | |
caseyquinn | 36:2e344db70d35 | 857 | |
caseyquinn | 36:2e344db70d35 | 858 | |
jelord | 3:122bfc998c4c | 859 | E2PROM.read(0x00015, startAndEndTime, 12); //Grab start and end times from EEPROM |
jelord | 3:122bfc998c4c | 860 | RGB_LED.set_led(0,1,0); |
caseyquinn | 14:7cdb643da356 | 861 | |
caseyquinn | 26:6aa294d83af4 | 862 | |
caseyquinn | 26:6aa294d83af4 | 863 | //Pull MicroEnviornment Lat/Lons from EEPROM |
caseyquinn | 26:6aa294d83af4 | 864 | // Latitude School EEPROM = 0x50-0x53 |
caseyquinn | 26:6aa294d83af4 | 865 | // Longitude School EEPROM = 0x54-0x57 |
caseyquinn | 26:6aa294d83af4 | 866 | // Latitude Home EEPROM = 0x58-0x5B |
caseyquinn | 26:6aa294d83af4 | 867 | // Longitude Home EEPROM = 0x5C-0x5F |
caseyquinn | 26:6aa294d83af4 | 868 | |
caseyquinn | 26:6aa294d83af4 | 869 | uint8_t workLat[4] = {0,}; |
caseyquinn | 26:6aa294d83af4 | 870 | E2PROM.read(0x00050,workLat,4); |
caseyquinn | 26:6aa294d83af4 | 871 | E2PROM.byteToFloat(workLat, &work_lat); |
caseyquinn | 26:6aa294d83af4 | 872 | |
caseyquinn | 26:6aa294d83af4 | 873 | uint8_t workLon[4] = {0,}; |
caseyquinn | 26:6aa294d83af4 | 874 | E2PROM.read(0x00054,workLon,4); |
caseyquinn | 26:6aa294d83af4 | 875 | E2PROM.byteToFloat(workLon, &work_lon); |
caseyquinn | 26:6aa294d83af4 | 876 | |
caseyquinn | 26:6aa294d83af4 | 877 | uint8_t homeLat[4] = {0,}; |
caseyquinn | 26:6aa294d83af4 | 878 | E2PROM.read(0x00058,homeLat,4); |
caseyquinn | 26:6aa294d83af4 | 879 | E2PROM.byteToFloat(homeLat, &home_lat); |
caseyquinn | 26:6aa294d83af4 | 880 | |
caseyquinn | 26:6aa294d83af4 | 881 | uint8_t homeLon[4] = {0,}; |
caseyquinn | 26:6aa294d83af4 | 882 | E2PROM.read(0x0005C,homeLon,4); |
caseyquinn | 26:6aa294d83af4 | 883 | E2PROM.byteToFloat(homeLon, &home_lon); |
caseyquinn | 26:6aa294d83af4 | 884 | |
caseyquinn | 36:2e344db70d35 | 885 | uint8_t homeLat2[4] = {0,}; |
caseyquinn | 36:2e344db70d35 | 886 | E2PROM.read(0x00060,homeLat2,4); |
caseyquinn | 36:2e344db70d35 | 887 | E2PROM.byteToFloat(homeLat2, &home_lat2); |
caseyquinn | 26:6aa294d83af4 | 888 | |
caseyquinn | 36:2e344db70d35 | 889 | uint8_t homeLon2[4] = {0,}; |
caseyquinn | 36:2e344db70d35 | 890 | E2PROM.read(0x00064,homeLon2,4); |
caseyquinn | 36:2e344db70d35 | 891 | E2PROM.byteToFloat(homeLon2, &home_lon2); |
caseyquinn | 36:2e344db70d35 | 892 | |
caseyquinn | 36:2e344db70d35 | 893 | pc.printf("%f,%f\r\n %f,%f\r\n %f,%f\r\n", home_lat, home_lon, work_lat, work_lon, home_lat2, home_lon2); |
caseyquinn | 36:2e344db70d35 | 894 | |
caseyquinn | 36:2e344db70d35 | 895 | //Get the subject line information |
caseyquinn | 40:cac5bdffba44 | 896 | uint8_t subjectLabelOriginal[15] = {0,}; |
caseyquinn | 40:cac5bdffba44 | 897 | E2PROM.read(0x00001, subjectLabelOriginal,15); |
jelord | 3:122bfc998c4c | 898 | |
caseyquinn | 44:075fa63d5df1 | 899 | //Get the cartridge ID information |
caseyquinn | 44:075fa63d5df1 | 900 | uint8_t cartridgeID[3] = {0,}; |
caseyquinn | 44:075fa63d5df1 | 901 | E2PROM.read(0x00070, cartridgeID,3); |
caseyquinn | 44:075fa63d5df1 | 902 | |
caseyquinn | 46:99d129bfdbbd | 903 | //Get the dutycycle information |
caseyquinn | 46:99d129bfdbbd | 904 | uint8_t dutycycleStr[3] = {0,}; |
caseyquinn | 46:99d129bfdbbd | 905 | E2PROM.read(0x00076, dutycycleStr,3); |
caseyquinn | 46:99d129bfdbbd | 906 | dutyCycleI = ((dutycycleStr[0]-48)*100 + (dutycycleStr[1]-48)*10 + (dutycycleStr[2]-48)); |
caseyquinn | 46:99d129bfdbbd | 907 | float dutycycleF = ((float)dutyCycleI/100); |
caseyquinn | 46:99d129bfdbbd | 908 | dutycycleSecOn = (int)(dutycycleF*60); |
caseyquinn | 46:99d129bfdbbd | 909 | |
caseyquinn | 46:99d129bfdbbd | 910 | //wait(1); |
caseyquinn | 46:99d129bfdbbd | 911 | //pc.printf("%s,%d,%f,%d\r\n", dutycycleStr,dutyCycleI,dutycycleF,dutycycleSecOn); |
caseyquinn | 46:99d129bfdbbd | 912 | |
jelord | 3:122bfc998c4c | 913 | //Get the proper serial number |
jelord | 3:122bfc998c4c | 914 | uint8_t serialBytes[2] = {0,}; |
caseyquinn | 29:fd74725294d5 | 915 | E2PROM.read(0x00034,serialBytes,2); |
caseyquinn | 29:fd74725294d5 | 916 | serial_num = (uint16_t)(((serialBytes[0]-48)*10 + serialBytes[1]-48)); |
caseyquinn | 29:fd74725294d5 | 917 | |
caseyquinn | 29:fd74725294d5 | 918 | |
caseyquinn | 29:fd74725294d5 | 919 | //////////////////////////////////////////////////////////////////// |
caseyquinn | 29:fd74725294d5 | 920 | //Temporary fix for setting serial_num |
caseyquinn | 29:fd74725294d5 | 921 | //////////////////////////////////////////////////////////////////// |
caseyquinn | 29:fd74725294d5 | 922 | //uint8_t serialsubjectLabelOriginal[2] = {0,}; |
caseyquinn | 29:fd74725294d5 | 923 | //E2PROM.read(0x00001, serialsubjectLabelOriginal,2); |
caseyquinn | 29:fd74725294d5 | 924 | //uint8_t newserialBytes[2] = {0,}; |
caseyquinn | 29:fd74725294d5 | 925 | |
caseyquinn | 30:aa6324845a84 | 926 | if(subjectLabelOriginal[2] == 126){ |
caseyquinn | 29:fd74725294d5 | 927 | E2PROM.write(0x00034,subjectLabelOriginal,2); |
caseyquinn | 29:fd74725294d5 | 928 | serial_num = (uint16_t)(((subjectLabelOriginal[0]-48)*10 + subjectLabelOriginal[1]-48)); |
caseyquinn | 29:fd74725294d5 | 929 | } |
caseyquinn | 29:fd74725294d5 | 930 | |
caseyquinn | 29:fd74725294d5 | 931 | //---------------------------------------------- |
jelord | 3:122bfc998c4c | 932 | calibrations.initialize(serial_num); |
caseyquinn | 29:fd74725294d5 | 933 | pc.printf("%d\r\n", serial_num); |
caseyquinn | 29:fd74725294d5 | 934 | pc.printf("%f\r\n",calibrations.MF4); |
caseyquinn | 29:fd74725294d5 | 935 | //---------------------------------------------- |
caseyquinn | 29:fd74725294d5 | 936 | //////////////////////////////////////////////////////////////////// |
caseyquinn | 29:fd74725294d5 | 937 | |
jelord | 3:122bfc998c4c | 938 | |
jelord | 3:122bfc998c4c | 939 | uint8_t logByte[1] = {0,}; |
jelord | 3:122bfc998c4c | 940 | E2PROM.read(0x00014,logByte,1); |
jelord | 3:122bfc998c4c | 941 | logInerval = logByte[0]; |
jelord | 3:122bfc998c4c | 942 | |
jelord | 3:122bfc998c4c | 943 | //Use the flow rate value stored in eeprom |
jelord | 3:122bfc998c4c | 944 | uint8_t flowRateBytes[4] = {0,}; |
jelord | 3:122bfc998c4c | 945 | E2PROM.read(0x00010,flowRateBytes,4); |
jelord | 3:122bfc998c4c | 946 | E2PROM.byteToFloat(flowRateBytes, &volflowSet); |
caseyquinn | 29:fd74725294d5 | 947 | |
caseyquinn | 29:fd74725294d5 | 948 | |
caseyquinn | 43:05aa1fb68946 | 949 | |
caseyquinn | 36:2e344db70d35 | 950 | /* |
caseyquinn | 36:2e344db70d35 | 951 | while(!gpsFix){ |
caseyquinn | 36:2e344db70d35 | 952 | gpsFix = gps.read(1); |
caseyquinn | 36:2e344db70d35 | 953 | if(ledOn) { |
caseyquinn | 36:2e344db70d35 | 954 | RGB_LED.set_led(0,0,0); |
caseyquinn | 36:2e344db70d35 | 955 | ledOn = 0; |
caseyquinn | 36:2e344db70d35 | 956 | }else { |
caseyquinn | 36:2e344db70d35 | 957 | RGB_LED.set_led(1,0,0); |
caseyquinn | 36:2e344db70d35 | 958 | ledOn = 1; |
caseyquinn | 36:2e344db70d35 | 959 | } |
caseyquinn | 36:2e344db70d35 | 960 | wait(1); |
caseyquinn | 36:2e344db70d35 | 961 | } |
caseyquinn | 36:2e344db70d35 | 962 | */ |
caseyquinn | 36:2e344db70d35 | 963 | |
caseyquinn | 36:2e344db70d35 | 964 | |
caseyquinn | 36:2e344db70d35 | 965 | |
caseyquinn | 43:05aa1fb68946 | 966 | while(!timecompare(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 |
caseyquinn | 36:2e344db70d35 | 967 | wait(0.5); |
caseyquinn | 36:2e344db70d35 | 968 | |
caseyquinn | 36:2e344db70d35 | 969 | } |
caseyquinn | 46:99d129bfdbbd | 970 | |
caseyquinn | 46:99d129bfdbbd | 971 | |
caseyquinn | 43:05aa1fb68946 | 972 | |
caseyquinn | 43:05aa1fb68946 | 973 | time_t seconds = time(NULL); |
caseyquinn | 43:05aa1fb68946 | 974 | strftime(timestr, 32, "%y-%m-%d-%H=%M=%S", localtime(&seconds)); |
caseyquinn | 43:05aa1fb68946 | 975 | RTC_UPAS.get_time(); |
caseyquinn | 43:05aa1fb68946 | 976 | if(tempSerialNum < 18){ |
caseyquinn | 44:075fa63d5df1 | 977 | sprintf(filename, "/sd/MS%04dLOG_%02d-%02d-%02d_%02d=%02d=%02d_%c%c%c%c%c%c%c%c%c%c%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],subjectLabelOriginal[8],subjectLabelOriginal[9],subjectLabelOriginal[10],subjectLabelOriginal[11],subjectLabelOriginal[12],subjectLabelOriginal[13],subjectLabelOriginal[14],cartridgeID[0],cartridgeID[1],cartridgeID[2]); |
caseyquinn | 36:2e344db70d35 | 978 | |
caseyquinn | 43:05aa1fb68946 | 979 | } |
caseyquinn | 43:05aa1fb68946 | 980 | else{ |
caseyquinn | 44:075fa63d5df1 | 981 | sprintf(filename, "/sd/PS%04dLOG_%02d-%02d-%02d_%02d=%02d=%02d_%c%c%c%c%c%c%c%c%c%c%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],subjectLabelOriginal[8],subjectLabelOriginal[9],subjectLabelOriginal[10],subjectLabelOriginal[11],subjectLabelOriginal[12],subjectLabelOriginal[13],subjectLabelOriginal[14],cartridgeID[0],cartridgeID[1],cartridgeID[2]); |
caseyquinn | 43:05aa1fb68946 | 982 | } |
caseyquinn | 43:05aa1fb68946 | 983 | //sprintf(filename, "/sd/UPAS_TboardtestLog_%s_%c%c%c%c%c%c%c%c.txt", timestr,subjectLabelOriginal[0],subjectLabelOriginal[1],subjectLabelOriginal[2],subjectLabelOriginal[3],subjectLabelOriginal[4],subjectLabelOriginal[5],subjectLabelOriginal[6],subjectLabelOriginal[7]); |
caseyquinn | 43:05aa1fb68946 | 984 | //sprintf(filename, "/sd/UPAS_TboardtestLog_%s.txt", timestr); |
caseyquinn | 43:05aa1fb68946 | 985 | FILE *fp = fopen(filename, "w"); |
caseyquinn | 43:05aa1fb68946 | 986 | fclose(fp); |
caseyquinn | 36:2e344db70d35 | 987 | |
caseyquinn | 36:2e344db70d35 | 988 | RGB_LED.set_led(1,0,1); |
caseyquinn | 36:2e344db70d35 | 989 | |
jelord | 3:122bfc998c4c | 990 | if(volflowSet<=1.0) { |
jelord | 3:122bfc998c4c | 991 | gainFlow = 100; |
jelord | 3:122bfc998c4c | 992 | } else if(volflowSet>=2.0) { |
jelord | 3:122bfc998c4c | 993 | gainFlow = 25; |
jelord | 3:122bfc998c4c | 994 | } else { |
jelord | 3:122bfc998c4c | 995 | gainFlow = 25; |
jelord | 0:2cb2b2ea316f | 996 | } |
caseyquinn | 36:2e344db70d35 | 997 | |
jelord | 3:122bfc998c4c | 998 | press = bmesensor.getPressure(); |
jelord | 3:122bfc998c4c | 999 | temp = bmesensor.getTemperature(); |
jelord | 3:122bfc998c4c | 1000 | rh = bmesensor.getHumidity(); |
jelord | 3:122bfc998c4c | 1001 | |
jelord | 3:122bfc998c4c | 1002 | 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 | 1003 | massflowSet = volflowSet*atmoRho; |
jelord | 3:122bfc998c4c | 1004 | |
jelord | 3:122bfc998c4c | 1005 | DigPot.writeRegister(digital_pot_setpoint); |
jelord | 3:122bfc998c4c | 1006 | wait(1); |
caseyquinn | 28:42932d3b105d | 1007 | pumps = 1; |
caseyquinn | 25:fbf7d44e7da4 | 1008 | //pumpOn = 1; |
jelord | 3:122bfc998c4c | 1009 | |
caseyquinn | 35:e0bdd6389a75 | 1010 | |
caseyquinn | 29:fd74725294d5 | 1011 | if(volflowSet<=1.0) { |
caseyquinn | 29:fd74725294d5 | 1012 | gainFlow = 100; |
caseyquinn | 29:fd74725294d5 | 1013 | } else if(volflowSet>=2.0) { |
caseyquinn | 29:fd74725294d5 | 1014 | gainFlow = 25; |
caseyquinn | 29:fd74725294d5 | 1015 | } else { |
caseyquinn | 29:fd74725294d5 | 1016 | gainFlow = 25; |
caseyquinn | 29:fd74725294d5 | 1017 | } |
caseyquinn | 29:fd74725294d5 | 1018 | |
caseyquinn | 29:fd74725294d5 | 1019 | RGB_LED.set_led(1,0,0); |
caseyquinn | 29:fd74725294d5 | 1020 | press = bmesensor.getPressure(); |
caseyquinn | 29:fd74725294d5 | 1021 | temp = bmesensor.getTemperature(); |
caseyquinn | 29:fd74725294d5 | 1022 | rh = bmesensor.getHumidity(); |
caseyquinn | 29:fd74725294d5 | 1023 | |
caseyquinn | 29:fd74725294d5 | 1024 | 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 | 29:fd74725294d5 | 1025 | massflowSet = volflowSet*atmoRho; |
caseyquinn | 29:fd74725294d5 | 1026 | |
caseyquinn | 29:fd74725294d5 | 1027 | //Digtal pot tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx |
caseyquinn | 29:fd74725294d5 | 1028 | digital_pot_setpoint = (int)floor(calibrations.DP4*pow(massflowSet,4)+calibrations.DP3*pow(massflowSet,3)+calibrations.DP2*pow(massflowSet,2)+calibrations.DP1*massflowSet+calibrations.DP0); //min = 0x7F, max = 0x00 |
caseyquinn | 29:fd74725294d5 | 1029 | |
caseyquinn | 29:fd74725294d5 | 1030 | if(digital_pot_setpoint>=digitalpotMax) { |
caseyquinn | 29:fd74725294d5 | 1031 | digital_pot_setpoint = digitalpotMax; |
caseyquinn | 29:fd74725294d5 | 1032 | } else if(digital_pot_setpoint<=digitalpotMin) { |
caseyquinn | 29:fd74725294d5 | 1033 | digital_pot_setpoint = digitalpotMin; |
caseyquinn | 29:fd74725294d5 | 1034 | } |
caseyquinn | 29:fd74725294d5 | 1035 | |
caseyquinn | 29:fd74725294d5 | 1036 | pc.printf("%d\r\n", digital_pot_setpoint); |
caseyquinn | 29:fd74725294d5 | 1037 | DigPot.writeRegister(digital_pot_setpoint); |
caseyquinn | 29:fd74725294d5 | 1038 | wait(1); |
caseyquinn | 35:e0bdd6389a75 | 1039 | pumps = 1; |
caseyquinn | 35:e0bdd6389a75 | 1040 | |
jelord | 3:122bfc998c4c | 1041 | |
caseyquinn | 25:fbf7d44e7da4 | 1042 | |
caseyquinn | 34:da333abe3476 | 1043 | omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V |
caseyquinn | 34:da333abe3476 | 1044 | omronVolt = (omronReading*4.096)/(32768*1); |
caseyquinn | 12:5b4f3245606a | 1045 | if(omronVolt<=calibrations.omronVMin) { |
caseyquinn | 12:5b4f3245606a | 1046 | massflow = calibrations.omronMFMin; |
caseyquinn | 12:5b4f3245606a | 1047 | } else if(omronVolt>=calibrations.omronVMax) { |
caseyquinn | 12:5b4f3245606a | 1048 | massflow = calibrations.omronMFMax; |
caseyquinn | 12:5b4f3245606a | 1049 | } else { |
caseyquinn | 12:5b4f3245606a | 1050 | 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 | 12:5b4f3245606a | 1051 | } |
caseyquinn | 12:5b4f3245606a | 1052 | deltaMflow = massflow-massflowSet; |
caseyquinn | 12:5b4f3245606a | 1053 | digital_pot_set = digital_pot_setpoint; |
caseyquinn | 12:5b4f3245606a | 1054 | wait(5); |
caseyquinn | 12:5b4f3245606a | 1055 | |
caseyquinn | 12:5b4f3245606a | 1056 | //---------------------------------------------------------------------------------------------// |
caseyquinn | 12:5b4f3245606a | 1057 | //Sets the flow withen +-1.5% of the desired flow rate based on mass flow |
caseyquinn | 35:e0bdd6389a75 | 1058 | |
caseyquinn | 12:5b4f3245606a | 1059 | while(abs(deltaMflow)>.025) { |
caseyquinn | 12:5b4f3245606a | 1060 | |
caseyquinn | 34:da333abe3476 | 1061 | omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V |
caseyquinn | 34:da333abe3476 | 1062 | omronVolt = (omronReading*4.096)/(32768*1); |
caseyquinn | 36:2e344db70d35 | 1063 | pc.printf("%d,%f\r\n", omronReading, omronVolt); |
caseyquinn | 12:5b4f3245606a | 1064 | //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx |
caseyquinn | 12:5b4f3245606a | 1065 | if(omronVolt<=calibrations.omronVMin) { |
caseyquinn | 12:5b4f3245606a | 1066 | massflow = calibrations.omronMFMin; |
caseyquinn | 12:5b4f3245606a | 1067 | } else if(omronVolt>=calibrations.omronVMax) { |
caseyquinn | 12:5b4f3245606a | 1068 | massflow = calibrations.omronMFMax; |
caseyquinn | 12:5b4f3245606a | 1069 | } else { |
caseyquinn | 12:5b4f3245606a | 1070 | 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 | 12:5b4f3245606a | 1071 | } |
caseyquinn | 12:5b4f3245606a | 1072 | |
caseyquinn | 12:5b4f3245606a | 1073 | 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 | 12:5b4f3245606a | 1074 | volflow = massflow/atmoRho; |
caseyquinn | 36:2e344db70d35 | 1075 | pc.printf("%f\r\n", volflow); |
caseyquinn | 12:5b4f3245606a | 1076 | massflowSet = volflowSet*atmoRho; |
caseyquinn | 12:5b4f3245606a | 1077 | deltaMflow = massflow-massflowSet; |
caseyquinn | 12:5b4f3245606a | 1078 | |
caseyquinn | 12:5b4f3245606a | 1079 | digital_pot_set = (int)(digital_pot_set+(int)((gainFlow*deltaMflow))); |
caseyquinn | 12:5b4f3245606a | 1080 | if(digital_pot_set>=digitalpotMax) { |
caseyquinn | 12:5b4f3245606a | 1081 | digital_pot_set = digitalpotMax; |
caseyquinn | 12:5b4f3245606a | 1082 | } else if(digital_pot_set<=digitalpotMin) { |
caseyquinn | 12:5b4f3245606a | 1083 | digital_pot_set = digitalpotMin; |
caseyquinn | 12:5b4f3245606a | 1084 | } |
caseyquinn | 12:5b4f3245606a | 1085 | |
caseyquinn | 12:5b4f3245606a | 1086 | wait(2); |
caseyquinn | 12:5b4f3245606a | 1087 | DigPot.writeRegister(digital_pot_set); |
caseyquinn | 12:5b4f3245606a | 1088 | pc.printf("%d,\r\n", digital_pot_set); |
caseyquinn | 12:5b4f3245606a | 1089 | wait(1); |
caseyquinn | 12:5b4f3245606a | 1090 | |
caseyquinn | 12:5b4f3245606a | 1091 | |
caseyquinn | 12:5b4f3245606a | 1092 | } |
caseyquinn | 36:2e344db70d35 | 1093 | //pumps = 0; |
jelord | 3:122bfc998c4c | 1094 | sampledVol = 0.0; |
jelord | 3:122bfc998c4c | 1095 | RGB_LED.set_led(0,1,0); |
caseyquinn | 25:fbf7d44e7da4 | 1096 | wait(1); |
caseyquinn | 25:fbf7d44e7da4 | 1097 | RGB_LED.set_led(0,0,0); |
caseyquinn | 14:7cdb643da356 | 1098 | |
caseyquinn | 46:99d129bfdbbd | 1099 | while(fmod((double)stSec,10)!=0) { |
caseyquinn | 46:99d129bfdbbd | 1100 | //pc.printf("%f, %f\r\n", floor(secondsD), floor(lastsecondD)); |
caseyquinn | 46:99d129bfdbbd | 1101 | time_t seconds = time(NULL); |
caseyquinn | 46:99d129bfdbbd | 1102 | strftime(secstr, 4, "%S", localtime(&seconds)); |
caseyquinn | 46:99d129bfdbbd | 1103 | stSec = atoi(secstr); |
caseyquinn | 46:99d129bfdbbd | 1104 | wait_ms(100); |
caseyquinn | 46:99d129bfdbbd | 1105 | } |
caseyquinn | 46:99d129bfdbbd | 1106 | |
caseyquinn | 46:99d129bfdbbd | 1107 | logg.attach(&log_data, logInerval); |
caseyquinn | 43:05aa1fb68946 | 1108 | stop.attach(&check_stop, 9); // check if we should shut down every 9 number seconds, starting after the start. |
caseyquinn | 35:e0bdd6389a75 | 1109 | flowCtl.attach(&flowControl, 3); |
caseyquinn | 30:aa6324845a84 | 1110 | |
caseyquinn | 35:e0bdd6389a75 | 1111 | |
caseyquinn | 35:e0bdd6389a75 | 1112 | |
caseyquinn | 30:aa6324845a84 | 1113 | |
jelord | 3:122bfc998c4c | 1114 | //** end of initalization **// |
jelord | 3:122bfc998c4c | 1115 | //---------------------------------------------------------------------------------------------// |
jelord | 3:122bfc998c4c | 1116 | //---------------------------------------------------------------------------------------------// |
jelord | 3:122bfc998c4c | 1117 | // Main Control Loop |
jelord | 3:122bfc998c4c | 1118 | |
caseyquinn | 7:29b01d5812ee | 1119 | while (1) { |
caseyquinn | 7:29b01d5812ee | 1120 | // Do other things... |
caseyquinn | 46:99d129bfdbbd | 1121 | |
caseyquinn | 46:99d129bfdbbd | 1122 | } |
caseyquinn | 7:29b01d5812ee | 1123 | |
caseyquinn | 8:c4a8f9b67cee | 1124 | |
caseyquinn | 4:5d004fd997d5 | 1125 | |
jelord | 3:122bfc998c4c | 1126 | |
jelord | 0:2cb2b2ea316f | 1127 | } |