all working version 2.0
Dependencies: ADS1115 BME280 CronoDot SDFileSystem mbed
Fork of Outdoor_UPAS_v1_2_powerfunction by
main.cpp@25:fbf7d44e7da4, 2016-04-20 (annotated)
- Committer:
- caseyquinn
- Date:
- Wed Apr 20 03:36:48 2016 +0000
- Revision:
- 25:fbf7d44e7da4
- Parent:
- 24:e274a34492cf
- Child:
- 26:6aa294d83af4
Added in microenvironment gps setting for 2 locations settable by the updated app. Battery near dead or after 8 pm red led blink to remind to plug in. Turn pumps off if the 3.3 rail drops out, turn back on once plugged in. Primarily for FOCO school
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 | 12:5b4f3245606a | 14 | #include "DRV8830.h" |
caseyquinn | 14:7cdb643da356 | 15 | |
jelord | 0:2cb2b2ea316f | 16 | |
caseyquinn | 12:5b4f3245606a | 17 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 18 | //General Items |
caseyquinn | 12:5b4f3245606a | 19 | ///////////////////////////////////////////// |
caseyquinn | 14:7cdb643da356 | 20 | I2C i2c(PB_9, PB_8);//(D14, D15); SDA,SCL |
caseyquinn | 12:5b4f3245606a | 21 | Serial pc(USBTX, USBRX); |
caseyquinn | 18:41ef98db0423 | 22 | DigitalOut pumps(PA_9, 0);//(D8, 0); |
caseyquinn | 12:5b4f3245606a | 23 | DigitalOut pbKill(PC_12, 1); // Digital input pin that conncect to the LTC2950 battery charger used to shutdown the UPAS |
caseyquinn | 13:455601f62aad | 24 | 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 | 25 | MCP40D17 DigPot(&i2c); |
caseyquinn | 12:5b4f3245606a | 26 | BME280 bmesensor(PB_9, PB_8);//(D14, D15); |
caseyquinn | 12:5b4f3245606a | 27 | NCP5623BMUTBG RGB_LED(PB_9, PB_8);//(D14, D15); |
caseyquinn | 17:3e6dda6e6335 | 28 | CronoDot RTC_UPAS(PB_9, PB_8);//(D14, D15); |
caseyquinn | 12:5b4f3245606a | 29 | EEPROM E2PROM(PB_9, PB_8);//(D14, D15); |
caseyquinn | 12:5b4f3245606a | 30 | Calibration calibrations(1); //Default serial/calibration if there are no values for the selected option |
caseyquinn | 14:7cdb643da356 | 31 | |
caseyquinn | 12:5b4f3245606a | 32 | |
caseyquinn | 12:5b4f3245606a | 33 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 34 | //RN4677 BT/BLE Module |
caseyquinn | 12:5b4f3245606a | 35 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 36 | Serial microChannel(PB_10, PB_11); // tx, rx |
caseyquinn | 4:5d004fd997d5 | 37 | DigitalOut bleRTS(PB_14, 0); |
caseyquinn | 4:5d004fd997d5 | 38 | DigitalOut bleCTS(PB_13, 0); |
caseyquinn | 12:5b4f3245606a | 39 | DigitalOut BT_IRST(PC_8, 0); |
caseyquinn | 12:5b4f3245606a | 40 | DigitalOut BT_SW(PA_12, 0); |
caseyquinn | 17:3e6dda6e6335 | 41 | |
caseyquinn | 13:455601f62aad | 42 | |
caseyquinn | 12:5b4f3245606a | 43 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 44 | //Analog to Digital Converter |
caseyquinn | 12:5b4f3245606a | 45 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 46 | Adafruit_ADS1115 ads(&i2c); |
caseyquinn | 12:5b4f3245606a | 47 | //DigitalIn ADS_ALRT(PA_10); //Connected but currently unused. (ADS1115) http://www.ti.com/lit/ds/symlink/ads1115.pdf |
caseyquinn | 12:5b4f3245606a | 48 | |
caseyquinn | 12:5b4f3245606a | 49 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 50 | //Battery Monitoring |
caseyquinn | 12:5b4f3245606a | 51 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 52 | STC3100 gasG(PB_9, PB_8);//(D14, D15); // http://www.st.com/web/en/resource/technical/document/datasheet/CD00219947.pdf |
caseyquinn | 12:5b4f3245606a | 53 | DigitalIn bcs1(PC_9); //Charge complete if High. Connected but currently unused. (MCP73871) http://www.mouser.com/ds/2/268/22090a-52174.pdf |
caseyquinn | 12:5b4f3245606a | 54 | DigitalIn 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 | 55 | |
caseyquinn | 12:5b4f3245606a | 56 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 57 | //Accelerometer and Magnometer |
caseyquinn | 12:5b4f3245606a | 58 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 59 | LSM303 movementsensor(PB_9, PB_8);//(D14, D15); // http://www.st.com/web/en/resource/technical/document/datasheet/DM00027543.pdf |
caseyquinn | 12:5b4f3245606a | 60 | //DigitalIn ACC_INT1(PC_7); //Connected but currently unused. (LSM303) |
caseyquinn | 12:5b4f3245606a | 61 | //DigitalIn ACC_INT2(PC_6); //Connected but currently unused. (LSM303) |
caseyquinn | 12:5b4f3245606a | 62 | //DigitalIn ACC_DRDY(PC_11); //Connected but currently unused. (LSM303) |
jelord | 0:2cb2b2ea316f | 63 | |
caseyquinn | 12:5b4f3245606a | 64 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 65 | //UV and Visible Light Sensor |
caseyquinn | 12:5b4f3245606a | 66 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 67 | SI1145 lightsensor(PB_9, PB_8);//(D14, D15); |
caseyquinn | 12:5b4f3245606a | 68 | //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 | 69 | |
caseyquinn | 12:5b4f3245606a | 70 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 71 | //GPS |
caseyquinn | 12:5b4f3245606a | 72 | ///////////////////////////////////////////// |
caseyquinn | 17:3e6dda6e6335 | 73 | DigitalOut gpsEN(PB_15, 0); |
caseyquinn | 23:1ca41779b8ec | 74 | Max_M8 gps(PB_9, PB_8,(0x84)); |
caseyquinn | 12:5b4f3245606a | 75 | |
caseyquinn | 12:5b4f3245606a | 76 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 77 | //Hbridge Valve Control |
caseyquinn | 12:5b4f3245606a | 78 | ///////////////////////////////////////////// |
caseyquinn | 23:1ca41779b8ec | 79 | |
caseyquinn | 24:e274a34492cf | 80 | /* |
caseyquinn | 24:e274a34492cf | 81 | DRV8830 motor1(PB_9, PB_8, 0xC4); //Not working due to trace issue on tboard |
caseyquinn | 23:1ca41779b8ec | 82 | DRV8830 motor2(PB_9, PB_8, 0xC8); //Works with 0xC8, not 0xCA since R8 isn't on the Tboards. |
caseyquinn | 24:e274a34492cf | 83 | DRV8830 motor3(PB_9, PB_8, 0xCC); //Not working due to trace issue on tboard |
caseyquinn | 23:1ca41779b8ec | 84 | DRV8830 motor4(PB_9, PB_8, 0xCE); //Works! |
caseyquinn | 12:5b4f3245606a | 85 | DigitalIn hb_fault1(PA_6); |
caseyquinn | 12:5b4f3245606a | 86 | DigitalIn hb_fault2(PA_7); |
caseyquinn | 12:5b4f3245606a | 87 | DigitalIn hb_fault3(PA_5); |
caseyquinn | 12:5b4f3245606a | 88 | DigitalIn hb_fault4(PA_4); |
caseyquinn | 24:e274a34492cf | 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) |
caseyquinn | 12:5b4f3245606a | 96 | DigitalIn sdCD(PA_11); |
caseyquinn | 14:7cdb643da356 | 97 | |
caseyquinn | 12:5b4f3245606a | 98 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 99 | //Callbacks |
caseyquinn | 12:5b4f3245606a | 100 | ///////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 101 | Ticker stop; //This is the stop callback object |
caseyquinn | 8:c4a8f9b67cee | 102 | Ticker logg; //This is the logging callback object |
caseyquinn | 9:8646fd501832 | 103 | Ticker flowCtl; //This is the control loop callback object |
jelord | 3:122bfc998c4c | 104 | |
caseyquinn | 12:5b4f3245606a | 105 | ///////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 106 | //Varible Definitions |
caseyquinn | 12:5b4f3245606a | 107 | ///////////////////////////////////////////// |
jelord | 3:122bfc998c4c | 108 | uint16_t serial_num = 1; // Default serial/calibration number |
jelord | 3:122bfc998c4c | 109 | int RunReady =0; |
jelord | 3:122bfc998c4c | 110 | |
caseyquinn | 25:fbf7d44e7da4 | 111 | bool ledOn = 0; |
caseyquinn | 25:fbf7d44e7da4 | 112 | |
caseyquinn | 4:5d004fd997d5 | 113 | struct tm STtime; |
caseyquinn | 7:29b01d5812ee | 114 | char timestr[32]; |
jelord | 3:122bfc998c4c | 115 | |
caseyquinn | 9:8646fd501832 | 116 | float press; |
caseyquinn | 9:8646fd501832 | 117 | float temp; |
caseyquinn | 9:8646fd501832 | 118 | float rh; |
jelord | 3:122bfc998c4c | 119 | |
caseyquinn | 9:8646fd501832 | 120 | int uv; |
caseyquinn | 9:8646fd501832 | 121 | int vis; |
caseyquinn | 9:8646fd501832 | 122 | int ir; |
jelord | 3:122bfc998c4c | 123 | |
caseyquinn | 9:8646fd501832 | 124 | float compass; |
caseyquinn | 9:8646fd501832 | 125 | float accel_x; |
caseyquinn | 9:8646fd501832 | 126 | float accel_y; |
caseyquinn | 9:8646fd501832 | 127 | float accel_z; |
caseyquinn | 9:8646fd501832 | 128 | float accel_comp; |
caseyquinn | 9:8646fd501832 | 129 | float angle_x; |
caseyquinn | 9:8646fd501832 | 130 | float angle_y; |
caseyquinn | 9:8646fd501832 | 131 | float angle_z; |
caseyquinn | 9:8646fd501832 | 132 | float mag_x; |
caseyquinn | 9:8646fd501832 | 133 | float mag_y; |
caseyquinn | 9:8646fd501832 | 134 | float mag_z; |
jelord | 3:122bfc998c4c | 135 | |
caseyquinn | 9:8646fd501832 | 136 | int vInReading; |
caseyquinn | 25:fbf7d44e7da4 | 137 | int vInReadingLast; |
caseyquinn | 9:8646fd501832 | 138 | int vBlowerReading; |
caseyquinn | 9:8646fd501832 | 139 | int omronDiff; |
caseyquinn | 9:8646fd501832 | 140 | float omronVolt; //V |
caseyquinn | 9:8646fd501832 | 141 | int omronReading; |
caseyquinn | 9:8646fd501832 | 142 | float atmoRho; //g/L |
jelord | 3:122bfc998c4c | 143 | |
caseyquinn | 25:fbf7d44e7da4 | 144 | int amps; |
caseyquinn | 25:fbf7d44e7da4 | 145 | int bVolt; |
caseyquinn | 25:fbf7d44e7da4 | 146 | int bFuel; |
caseyquinn | 25:fbf7d44e7da4 | 147 | //bool pumpOn; |
caseyquinn | 9:8646fd501832 | 148 | float massflow; //g/min |
caseyquinn | 9:8646fd501832 | 149 | float volflow; //L/min |
jelord | 3:122bfc998c4c | 150 | float volflowSet = 1.0; //L/min |
caseyquinn | 14:7cdb643da356 | 151 | int logInerval = 5;//seconds |
jelord | 3:122bfc998c4c | 152 | double secondsD = 0; |
jelord | 3:122bfc998c4c | 153 | double lastsecondD = 0; |
caseyquinn | 9:8646fd501832 | 154 | float massflowSet; |
jelord | 3:122bfc998c4c | 155 | float deltaVflow = 0.0; |
jelord | 3:122bfc998c4c | 156 | float deltaMflow = 0.0; |
caseyquinn | 9:8646fd501832 | 157 | float gainFlow; |
caseyquinn | 9:8646fd501832 | 158 | float sampledVol; //L, total sampled volume |
jelord | 3:122bfc998c4c | 159 | |
caseyquinn | 25:fbf7d44e7da4 | 160 | int digital_pot_setpoint = 30; //min = 0x7F, max = 0x00 |
caseyquinn | 9:8646fd501832 | 161 | int digital_pot_set; |
caseyquinn | 9:8646fd501832 | 162 | int digital_pot_change; |
jelord | 3:122bfc998c4c | 163 | int digitalpotMax = 127; |
caseyquinn | 9:8646fd501832 | 164 | int digitalpotMin = 10; |
jelord | 3:122bfc998c4c | 165 | |
caseyquinn | 12:5b4f3245606a | 166 | int dutyUp; |
caseyquinn | 12:5b4f3245606a | 167 | int dutyDown; |
caseyquinn | 12:5b4f3245606a | 168 | |
caseyquinn | 12:5b4f3245606a | 169 | float flat = 0; |
caseyquinn | 12:5b4f3245606a | 170 | float flon = 0; |
jelord | 3:122bfc998c4c | 171 | |
caseyquinn | 23:1ca41779b8ec | 172 | bool gpsFix; |
caseyquinn | 12:5b4f3245606a | 173 | uint8_t gpssatellites = 0; |
caseyquinn | 23:1ca41779b8ec | 174 | double gpsspeed = 0.0; |
caseyquinn | 23:1ca41779b8ec | 175 | double gpslatitude = 0.0; |
caseyquinn | 23:1ca41779b8ec | 176 | double gpslongitude = 0.0; |
caseyquinn | 23:1ca41779b8ec | 177 | float gpsaltitude = 0.0; |
caseyquinn | 23:1ca41779b8ec | 178 | char gpslat = 'W'; |
caseyquinn | 23:1ca41779b8ec | 179 | char gpslon = 'N'; |
caseyquinn | 12:5b4f3245606a | 180 | |
caseyquinn | 12:5b4f3245606a | 181 | |
caseyquinn | 12:5b4f3245606a | 182 | float home_lat = 40.580508; |
caseyquinn | 12:5b4f3245606a | 183 | float home_lon = -105.081823; |
caseyquinn | 12:5b4f3245606a | 184 | float work_lat = 40.594062; //40.569136; |
caseyquinn | 12:5b4f3245606a | 185 | float work_lon = -105.075683; //-105.081966; |
caseyquinn | 12:5b4f3245606a | 186 | int location = 0; |
caseyquinn | 12:5b4f3245606a | 187 | |
caseyquinn | 12:5b4f3245606a | 188 | float homeDistance = 99999; |
caseyquinn | 12:5b4f3245606a | 189 | float workDistance = 99999; |
caseyquinn | 12:5b4f3245606a | 190 | |
jelord | 3:122bfc998c4c | 191 | //*************************************************// |
jelord | 3:122bfc998c4c | 192 | |
jelord | 2:88fcbfadec6a | 193 | void sendData(); |
caseyquinn | 11:aa21628a9b15 | 194 | |
caseyquinn | 11:aa21628a9b15 | 195 | |
caseyquinn | 11:aa21628a9b15 | 196 | void pc_recv(){ |
caseyquinn | 11:aa21628a9b15 | 197 | while(pc.readable()){ |
caseyquinn | 11:aa21628a9b15 | 198 | pc.getc(); |
caseyquinn | 11:aa21628a9b15 | 199 | } |
caseyquinn | 11:aa21628a9b15 | 200 | } |
caseyquinn | 11:aa21628a9b15 | 201 | |
jelord | 0:2cb2b2ea316f | 202 | static uint8_t rx_buf[20]; |
jelord | 0:2cb2b2ea316f | 203 | static uint8_t rx_len=0; |
jelord | 1:9fbb5b665068 | 204 | static int haltBLE = 1; |
jelord | 1:9fbb5b665068 | 205 | static int transmissionValue = 0; |
jelord | 2:88fcbfadec6a | 206 | uint8_t writeData[20] = {0,}; |
jelord | 2:88fcbfadec6a | 207 | static uint8_t dataLength = 0; |
jelord | 3:122bfc998c4c | 208 | static int runReady = 0; |
jelord | 3:122bfc998c4c | 209 | static uint8_t startAndEndTime[12] = {0,}; |
caseyquinn | 5:c3252e5d45ca | 210 | |
caseyquinn | 9:8646fd501832 | 211 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 212 | //BLE Functions |
caseyquinn | 9:8646fd501832 | 213 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 214 | |
caseyquinn | 9:8646fd501832 | 215 | void uartMicro(){ |
caseyquinn | 25:fbf7d44e7da4 | 216 | |
jelord | 3:122bfc998c4c | 217 | if(runReady!=1){ |
jelord | 3:122bfc998c4c | 218 | haltBLE = 2; |
jelord | 3:122bfc998c4c | 219 | while(microChannel.readable()){ |
jelord | 3:122bfc998c4c | 220 | rx_buf[rx_len++] = microChannel.getc(); |
jelord | 2:88fcbfadec6a | 221 | |
jelord | 3:122bfc998c4c | 222 | //Code block to verify what is being transmitted. To function correctly, all data must terminate with \0 or \n |
jelord | 3:122bfc998c4c | 223 | if(transmissionValue==0){ |
jelord | 3:122bfc998c4c | 224 | |
caseyquinn | 4:5d004fd997d5 | 225 | if (rx_buf[0] == 0x01)transmissionValue = 1; //rtc |
jelord | 3:122bfc998c4c | 226 | else if(rx_buf[0] == 0x02)transmissionValue = 2; //sample start and end times |
jelord | 3:122bfc998c4c | 227 | else if(rx_buf[0] == 0x03)transmissionValue = 3; //sample name |
jelord | 3:122bfc998c4c | 228 | else if(rx_buf[0] == 0x04)transmissionValue = 4; //Send Data Check |
jelord | 3:122bfc998c4c | 229 | |
jelord | 3:122bfc998c4c | 230 | else if(rx_buf[0] == 0x05)transmissionValue = 5; //log interval |
jelord | 3:122bfc998c4c | 231 | else if(rx_buf[0] == 0x06)transmissionValue = 6; //Flow Rate |
jelord | 3:122bfc998c4c | 232 | else if(rx_buf[0] == 0x07)transmissionValue = 7; //Serial Number |
jelord | 3:122bfc998c4c | 233 | else if(rx_buf[0] == 0x08)transmissionValue = 8; //Run Enable |
caseyquinn | 25:fbf7d44e7da4 | 234 | else if(rx_buf[0] == 0x0A)transmissionValue = 10; //GPS Coordinates |
caseyquinn | 25:fbf7d44e7da4 | 235 | //else if(rx_buf[0] == 0x30)RGB_LED.set_led(1,0,0); |
jelord | 3:122bfc998c4c | 236 | else transmissionValue = 100; //Not useful data |
jelord | 3:122bfc998c4c | 237 | } |
jelord | 3:122bfc998c4c | 238 | |
jelord | 3:122bfc998c4c | 239 | if(rx_buf[rx_len-1]=='\0' || rx_buf[rx_len-1]=='\n' || rx_buf[rx_len-1] == 0xff){ |
jelord | 3:122bfc998c4c | 240 | if((transmissionValue == 1 || transmissionValue == 2 || transmissionValue == 3 || transmissionValue == 4 || transmissionValue == 5 || |
caseyquinn | 25:fbf7d44e7da4 | 241 | transmissionValue == 6 || transmissionValue == 7 || transmissionValue ==10) && rx_buf[rx_len-1] != 0xff) |
jelord | 3:122bfc998c4c | 242 | {}else{ |
caseyquinn | 21:bb10efc5bf57 | 243 | if(transmissionValue == 4 ) sendData(); |
jelord | 3:122bfc998c4c | 244 | if(transmissionValue == 8){ |
jelord | 3:122bfc998c4c | 245 | runReady = 1; |
jelord | 3:122bfc998c4c | 246 | microChannel.attach(NULL,microChannel.RxIrq); |
jelord | 3:122bfc998c4c | 247 | } |
jelord | 3:122bfc998c4c | 248 | haltBLE = 1; |
jelord | 3:122bfc998c4c | 249 | transmissionValue = 0; |
jelord | 3:122bfc998c4c | 250 | dataLength = 0; |
caseyquinn | 25:fbf7d44e7da4 | 251 | //if(fileWrite == 1){ |
caseyquinn | 25:fbf7d44e7da4 | 252 | //FILE *fp = fopen(gpsConfigFilename, "a"); |
caseyquinn | 25:fbf7d44e7da4 | 253 | //fprintf(fp,"HELLO"); |
caseyquinn | 25:fbf7d44e7da4 | 254 | //fclose(fp); |
caseyquinn | 25:fbf7d44e7da4 | 255 | //free(fp); |
caseyquinn | 25:fbf7d44e7da4 | 256 | //fileWrite=0; |
caseyquinn | 25:fbf7d44e7da4 | 257 | //} |
jelord | 3:122bfc998c4c | 258 | } |
jelord | 2:88fcbfadec6a | 259 | } |
jelord | 1:9fbb5b665068 | 260 | } |
caseyquinn | 12:5b4f3245606a | 261 | |
jelord | 3:122bfc998c4c | 262 | if(haltBLE!=1){ |
jelord | 2:88fcbfadec6a | 263 | |
jelord | 3:122bfc998c4c | 264 | if((transmissionValue!=100) && (dataLength!= 0)) writeData[dataLength-1] = rx_buf[0]; |
jelord | 3:122bfc998c4c | 265 | |
jelord | 3:122bfc998c4c | 266 | if(transmissionValue ==100){ |
caseyquinn | 10:06fbb1c9e3bd | 267 | pc.putc(rx_buf[0]); |
jelord | 2:88fcbfadec6a | 268 | |
jelord | 3:122bfc998c4c | 269 | }else if(transmissionValue ==1){ //process and store RTC values |
jelord | 3:122bfc998c4c | 270 | |
caseyquinn | 7:29b01d5812ee | 271 | //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 | 272 | if(dataLength==6){ |
caseyquinn | 17:3e6dda6e6335 | 273 | RTC_UPAS.set_time(writeData[0],writeData[1],writeData[2],writeData[3],writeData[3],writeData[4],writeData[5]);//sets chronodot RTC |
caseyquinn | 12:5b4f3245606a | 274 | /////////////////////// |
caseyquinn | 7:29b01d5812ee | 275 | //sets ST RTC |
caseyquinn | 12:5b4f3245606a | 276 | ////////////////////// |
caseyquinn | 7:29b01d5812ee | 277 | STtime.tm_sec = writeData[0]; // 0-59 |
caseyquinn | 7:29b01d5812ee | 278 | STtime.tm_min = writeData[1]; // 0-59 |
caseyquinn | 7:29b01d5812ee | 279 | STtime.tm_hour = writeData[2]; // 0-23 |
caseyquinn | 7:29b01d5812ee | 280 | STtime.tm_mday = writeData[3]; // 1-31 |
caseyquinn | 7:29b01d5812ee | 281 | STtime.tm_mon = writeData[4]-1; // 0-11 |
caseyquinn | 7:29b01d5812ee | 282 | STtime.tm_year = 100+writeData[5]; // year since 1900 (116 = 2016) |
caseyquinn | 7:29b01d5812ee | 283 | time_t STseconds = mktime(&STtime); |
caseyquinn | 12:5b4f3245606a | 284 | set_time(STseconds); // Set RTC time |
caseyquinn | 7:29b01d5812ee | 285 | } |
jelord | 3:122bfc998c4c | 286 | |
caseyquinn | 12:5b4f3245606a | 287 | } |
caseyquinn | 14:7cdb643da356 | 288 | else if(transmissionValue ==2){ //process and store sample start/end |
jelord | 3:122bfc998c4c | 289 | if(dataLength ==12)E2PROM.write(0x00015, writeData, 12); |
jelord | 3:122bfc998c4c | 290 | |
jelord | 3:122bfc998c4c | 291 | }else if(transmissionValue ==3){ //process and store sample name |
jelord | 3:122bfc998c4c | 292 | if(dataLength ==8)E2PROM.write(0x00001,writeData,8); |
jelord | 3:122bfc998c4c | 293 | |
jelord | 3:122bfc998c4c | 294 | }else if(transmissionValue ==5){ //process and store Log Interval |
jelord | 3:122bfc998c4c | 295 | if(dataLength ==1)E2PROM.write(0x00014,writeData,1); |
jelord | 2:88fcbfadec6a | 296 | |
jelord | 3:122bfc998c4c | 297 | }else if(transmissionValue ==6){ //process and store Flow Rate |
jelord | 3:122bfc998c4c | 298 | if(dataLength ==4)E2PROM.write(0x00010,writeData,4); |
jelord | 3:122bfc998c4c | 299 | |
jelord | 3:122bfc998c4c | 300 | }else if(transmissionValue ==7){ //process and store Serial Number |
jelord | 3:122bfc998c4c | 301 | if(dataLength ==2)E2PROM.write(0x00034,writeData,2); |
caseyquinn | 25:fbf7d44e7da4 | 302 | }else if (transmissionValue == 10){ |
caseyquinn | 25:fbf7d44e7da4 | 303 | if(dataLength == 16)E2PROM.write(0x00050,writeData,16); |
jelord | 3:122bfc998c4c | 304 | } |
caseyquinn | 25:fbf7d44e7da4 | 305 | |
jelord | 3:122bfc998c4c | 306 | dataLength++; |
jelord | 1:9fbb5b665068 | 307 | } |
jelord | 3:122bfc998c4c | 308 | |
jelord | 3:122bfc998c4c | 309 | rx_len = 0; |
jelord | 3:122bfc998c4c | 310 | }else{ |
jelord | 3:122bfc998c4c | 311 | while(microChannel.readable()) |
jelord | 3:122bfc998c4c | 312 | uint8_t extract = microChannel.getc(); |
jelord | 3:122bfc998c4c | 313 | } |
jelord | 2:88fcbfadec6a | 314 | |
caseyquinn | 12:5b4f3245606a | 315 | |
jelord | 2:88fcbfadec6a | 316 | } |
caseyquinn | 14:7cdb643da356 | 317 | |
jelord | 2:88fcbfadec6a | 318 | void sendData(){ |
jelord | 2:88fcbfadec6a | 319 | |
caseyquinn | 21:bb10efc5bf57 | 320 | uint8_t sampleTimePassValues[13] = {0x01,0x00,0x00,0x0A,0x01,0x01,0x10,0x00,0x00,0x0A,0x01,0x01,0x10}; |
caseyquinn | 21:bb10efc5bf57 | 321 | uint8_t subjectLabelOriginal[9] = {0x02,0x52,0x45,0x53,0x45,0x54,0x5F,0x5F,0x5f}; |
caseyquinn | 21:bb10efc5bf57 | 322 | uint8_t dataLogOriginal[2] = {0x03,0x0A,}; |
caseyquinn | 21:bb10efc5bf57 | 323 | uint8_t flowRateOriginal[5] = {0x04,0x00,0x00,0x80,0x3F}; |
caseyquinn | 25:fbf7d44e7da4 | 324 | uint8_t latLongSchoolOriginal[17] = {0x0A,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F}; |
caseyquinn | 25:fbf7d44e7da4 | 325 | // Latitude School EEPROM = 0x50-0x53 |
caseyquinn | 25:fbf7d44e7da4 | 326 | // Longitude School EEPROM = 0x54-0x57 |
caseyquinn | 25:fbf7d44e7da4 | 327 | // Latitude Home EEPROM = 0x58-0x5B |
caseyquinn | 25:fbf7d44e7da4 | 328 | // Longitude Home EEPROM = 0x5C-0x5F |
caseyquinn | 25:fbf7d44e7da4 | 329 | uint8_t NEW_EEPROM_CHECK[1] = {0,}; //THIS IS USED TO ENSURE COOPERATION WITH MOBILE APPS |
caseyquinn | 25:fbf7d44e7da4 | 330 | |
caseyquinn | 25:fbf7d44e7da4 | 331 | //NEW EEPROM Check bit = 0x75 |
caseyquinn | 25:fbf7d44e7da4 | 332 | E2PROM.read(0x00075,NEW_EEPROM_CHECK,1); |
caseyquinn | 25:fbf7d44e7da4 | 333 | |
caseyquinn | 25:fbf7d44e7da4 | 334 | if(NEW_EEPROM_CHECK[0] == 0x0A){ |
caseyquinn | 25:fbf7d44e7da4 | 335 | E2PROM.read(0x00015, sampleTimePassValues+1, 12); |
caseyquinn | 25:fbf7d44e7da4 | 336 | E2PROM.read(0x00001, subjectLabelOriginal+1,8); |
caseyquinn | 25:fbf7d44e7da4 | 337 | E2PROM.read(0x00014,dataLogOriginal+1,1); |
caseyquinn | 25:fbf7d44e7da4 | 338 | E2PROM.read(0x00010,flowRateOriginal+1,4); |
caseyquinn | 25:fbf7d44e7da4 | 339 | E2PROM.read(0x00050,latLongSchoolOriginal+1,16); |
caseyquinn | 25:fbf7d44e7da4 | 340 | }else{ |
caseyquinn | 25:fbf7d44e7da4 | 341 | NEW_EEPROM_CHECK[0] = 0x0A; |
caseyquinn | 25:fbf7d44e7da4 | 342 | E2PROM.write(0x00075,NEW_EEPROM_CHECK,1); |
caseyquinn | 25:fbf7d44e7da4 | 343 | E2PROM.write(0x00015, sampleTimePassValues+1, 12); |
caseyquinn | 25:fbf7d44e7da4 | 344 | E2PROM.write(0x00001, subjectLabelOriginal+1,8); |
caseyquinn | 25:fbf7d44e7da4 | 345 | E2PROM.write(0x00014,dataLogOriginal+1,1); |
caseyquinn | 25:fbf7d44e7da4 | 346 | E2PROM.write(0x00010,flowRateOriginal+1,4); |
caseyquinn | 25:fbf7d44e7da4 | 347 | E2PROM.write(0x00050,latLongSchoolOriginal+1,16); |
caseyquinn | 25:fbf7d44e7da4 | 348 | } |
caseyquinn | 21:bb10efc5bf57 | 349 | |
jelord | 2:88fcbfadec6a | 350 | |
jelord | 2:88fcbfadec6a | 351 | for(int i=0; i<13; i++){ |
jelord | 2:88fcbfadec6a | 352 | microChannel.putc(sampleTimePassValues[i]); |
jelord | 2:88fcbfadec6a | 353 | } |
jelord | 2:88fcbfadec6a | 354 | wait(.25); |
jelord | 2:88fcbfadec6a | 355 | |
jelord | 2:88fcbfadec6a | 356 | for(int i=0; i<9; i++){ |
jelord | 2:88fcbfadec6a | 357 | microChannel.putc(subjectLabelOriginal[i]); |
jelord | 2:88fcbfadec6a | 358 | } |
jelord | 2:88fcbfadec6a | 359 | wait(.25); |
jelord | 2:88fcbfadec6a | 360 | |
jelord | 2:88fcbfadec6a | 361 | for(int i=0; i<2; i++){ |
jelord | 2:88fcbfadec6a | 362 | microChannel.putc(dataLogOriginal[i]); |
jelord | 2:88fcbfadec6a | 363 | } |
jelord | 2:88fcbfadec6a | 364 | wait(.25); |
jelord | 2:88fcbfadec6a | 365 | |
jelord | 2:88fcbfadec6a | 366 | for(int i=0; i<5; i++){ |
jelord | 2:88fcbfadec6a | 367 | microChannel.putc(flowRateOriginal[i]); |
caseyquinn | 25:fbf7d44e7da4 | 368 | } |
caseyquinn | 25:fbf7d44e7da4 | 369 | wait(.25); |
caseyquinn | 25:fbf7d44e7da4 | 370 | |
caseyquinn | 25:fbf7d44e7da4 | 371 | for(int i=0;i<17;i++){ |
caseyquinn | 25:fbf7d44e7da4 | 372 | microChannel.putc(latLongSchoolOriginal[i]); |
jelord | 2:88fcbfadec6a | 373 | } |
jelord | 0:2cb2b2ea316f | 374 | |
jelord | 2:88fcbfadec6a | 375 | |
caseyquinn | 25:fbf7d44e7da4 | 376 | } |
caseyquinn | 14:7cdb643da356 | 377 | |
caseyquinn | 12:5b4f3245606a | 378 | ////////////////////////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 379 | // GPS: Degree-minute format to decimal-degrees |
caseyquinn | 12:5b4f3245606a | 380 | ////////////////////////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 381 | double convertDegMinToDecDeg (float degMin) |
caseyquinn | 12:5b4f3245606a | 382 | { |
caseyquinn | 12:5b4f3245606a | 383 | double min = 0.0; |
caseyquinn | 12:5b4f3245606a | 384 | double decDeg = 0.0; |
caseyquinn | 12:5b4f3245606a | 385 | |
caseyquinn | 12:5b4f3245606a | 386 | //get the minutes, fmod() requires double |
caseyquinn | 12:5b4f3245606a | 387 | min = fmod((double)degMin, 100.0); |
caseyquinn | 12:5b4f3245606a | 388 | |
caseyquinn | 12:5b4f3245606a | 389 | //rebuild coordinates in decimal degrees |
caseyquinn | 12:5b4f3245606a | 390 | degMin = (int) ( degMin / 100 ); |
caseyquinn | 12:5b4f3245606a | 391 | decDeg = degMin + ( min / 60 ); |
caseyquinn | 12:5b4f3245606a | 392 | |
caseyquinn | 12:5b4f3245606a | 393 | return decDeg; |
caseyquinn | 12:5b4f3245606a | 394 | } |
caseyquinn | 12:5b4f3245606a | 395 | |
caseyquinn | 12:5b4f3245606a | 396 | ////////////////////////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 397 | // GPS: Calculate distance from target location |
caseyquinn | 12:5b4f3245606a | 398 | ////////////////////////////////////////////////////////////// |
caseyquinn | 12:5b4f3245606a | 399 | double GPSdistanceCalc (float tlat, float tlon) |
caseyquinn | 12:5b4f3245606a | 400 | { |
caseyquinn | 12:5b4f3245606a | 401 | |
caseyquinn | 12:5b4f3245606a | 402 | |
caseyquinn | 12:5b4f3245606a | 403 | |
caseyquinn | 12:5b4f3245606a | 404 | float tlatrad, flatrad; |
caseyquinn | 12:5b4f3245606a | 405 | float sdlong, cdlong; |
caseyquinn | 12:5b4f3245606a | 406 | float sflat, cflat; |
caseyquinn | 12:5b4f3245606a | 407 | float stlat, ctlat; |
caseyquinn | 12:5b4f3245606a | 408 | float delta, denom; |
caseyquinn | 12:5b4f3245606a | 409 | |
caseyquinn | 12:5b4f3245606a | 410 | double distance; |
caseyquinn | 12:5b4f3245606a | 411 | delta = (flon-tlon)*0.0174532925; |
caseyquinn | 12:5b4f3245606a | 412 | sdlong = sin(delta); |
caseyquinn | 12:5b4f3245606a | 413 | cdlong = cos(delta); |
caseyquinn | 12:5b4f3245606a | 414 | flatrad = (flat)*0.0174532925; |
caseyquinn | 12:5b4f3245606a | 415 | tlatrad = (tlat)*0.0174532925; |
caseyquinn | 12:5b4f3245606a | 416 | sflat = sin(flatrad); |
caseyquinn | 12:5b4f3245606a | 417 | cflat = cos(flatrad); |
caseyquinn | 12:5b4f3245606a | 418 | stlat = sin(tlatrad); |
caseyquinn | 12:5b4f3245606a | 419 | ctlat = cos(tlatrad); |
caseyquinn | 12:5b4f3245606a | 420 | delta = (cflat * stlat) - (sflat * ctlat * cdlong); |
caseyquinn | 12:5b4f3245606a | 421 | delta = pow(delta,2); |
caseyquinn | 12:5b4f3245606a | 422 | delta += pow(ctlat * sdlong,2); |
caseyquinn | 12:5b4f3245606a | 423 | delta = sqrt(delta); |
caseyquinn | 12:5b4f3245606a | 424 | denom = (sflat * stlat) + (cflat * ctlat * cdlong); |
caseyquinn | 12:5b4f3245606a | 425 | delta = atan2(delta, denom); |
caseyquinn | 12:5b4f3245606a | 426 | distance = delta * 6372795; |
caseyquinn | 12:5b4f3245606a | 427 | return distance; |
caseyquinn | 12:5b4f3245606a | 428 | } |
caseyquinn | 12:5b4f3245606a | 429 | |
caseyquinn | 5:c3252e5d45ca | 430 | |
caseyquinn | 9:8646fd501832 | 431 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 432 | //Shutdown Function |
caseyquinn | 9:8646fd501832 | 433 | ////////////////////////////////////////////////////////////// |
jelord | 3:122bfc998c4c | 434 | void check_stop() // this checks if it's time to stop and shutdown |
jelord | 3:122bfc998c4c | 435 | { |
caseyquinn | 9:8646fd501832 | 436 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
caseyquinn | 9:8646fd501832 | 437 | //UPDATE THIS TO WORK WITH ST RTC INSTEAD |
caseyquinn | 9:8646fd501832 | 438 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
caseyquinn | 17:3e6dda6e6335 | 439 | |
jelord | 3:122bfc998c4c | 440 | if(RTC_UPAS.compare(startAndEndTime[6], startAndEndTime[7], startAndEndTime[8], startAndEndTime[9], startAndEndTime[10], startAndEndTime[11])) { |
jelord | 3:122bfc998c4c | 441 | pbKill = 0; // this is were we shut everything down |
caseyquinn | 4:5d004fd997d5 | 442 | //pc.printf("If you're reading this something has gone very wrong."); |
jelord | 3:122bfc998c4c | 443 | } |
caseyquinn | 17:3e6dda6e6335 | 444 | |
jelord | 3:122bfc998c4c | 445 | } |
caseyquinn | 5:c3252e5d45ca | 446 | |
caseyquinn | 9:8646fd501832 | 447 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 448 | //SD Logging Function |
caseyquinn | 9:8646fd501832 | 449 | ////////////////////////////////////////////////////////////// |
jelord | 3:122bfc998c4c | 450 | void log_data() |
jelord | 3:122bfc998c4c | 451 | { |
caseyquinn | 14:7cdb643da356 | 452 | |
caseyquinn | 25:fbf7d44e7da4 | 453 | |
caseyquinn | 23:1ca41779b8ec | 454 | |
caseyquinn | 7:29b01d5812ee | 455 | time_t seconds = time(NULL); |
caseyquinn | 7:29b01d5812ee | 456 | strftime(timestr, 32, "%y%m%d%H%M%S", localtime(&seconds)); |
caseyquinn | 13:455601f62aad | 457 | |
caseyquinn | 17:3e6dda6e6335 | 458 | RTC_UPAS.get_time(); |
caseyquinn | 25:fbf7d44e7da4 | 459 | |
caseyquinn | 25:fbf7d44e7da4 | 460 | |
caseyquinn | 25:fbf7d44e7da4 | 461 | |
caseyquinn | 7:29b01d5812ee | 462 | press = bmesensor.getPressure(); |
caseyquinn | 7:29b01d5812ee | 463 | temp = bmesensor.getTemperature()-5.0; |
caseyquinn | 7:29b01d5812ee | 464 | rh = bmesensor.getHumidity(); |
caseyquinn | 7:29b01d5812ee | 465 | uv = lightsensor.getUV(); |
caseyquinn | 14:7cdb643da356 | 466 | movementsensor.getACCEL(); |
caseyquinn | 14:7cdb643da356 | 467 | movementsensor.getCOMPASS(); |
caseyquinn | 14:7cdb643da356 | 468 | compass = movementsensor.getCOMPASS_HEADING(); |
caseyquinn | 14:7cdb643da356 | 469 | accel_x = movementsensor.AccelData.x; |
caseyquinn | 14:7cdb643da356 | 470 | accel_y = movementsensor.AccelData.y; |
caseyquinn | 14:7cdb643da356 | 471 | accel_z = movementsensor.AccelData.z; |
caseyquinn | 14:7cdb643da356 | 472 | accel_comp = pow(accel_x,(float)2)+pow(accel_y,(float)2)+pow(accel_z,(float)2)-1.0; |
caseyquinn | 14:7cdb643da356 | 473 | mag_x = movementsensor.MagData.x; |
caseyquinn | 14:7cdb643da356 | 474 | mag_y = movementsensor.MagData.y; |
caseyquinn | 14:7cdb643da356 | 475 | mag_z = movementsensor.MagData.z; |
caseyquinn | 25:fbf7d44e7da4 | 476 | vInReadingLast = vInReading; |
caseyquinn | 25:fbf7d44e7da4 | 477 | vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0 |
caseyquinn | 25:fbf7d44e7da4 | 478 | |
caseyquinn | 25:fbf7d44e7da4 | 479 | if(vInReading > 5950 && amps > 8191) { |
caseyquinn | 25:fbf7d44e7da4 | 480 | pumps = 0; |
caseyquinn | 25:fbf7d44e7da4 | 481 | wait(1); |
caseyquinn | 25:fbf7d44e7da4 | 482 | } else if(pumps == 0 && amps < 8191) { |
caseyquinn | 25:fbf7d44e7da4 | 483 | pumps = 1; |
caseyquinn | 25:fbf7d44e7da4 | 484 | } |
caseyquinn | 25:fbf7d44e7da4 | 485 | |
caseyquinn | 25:fbf7d44e7da4 | 486 | amps = gasG.getAmps(); |
caseyquinn | 25:fbf7d44e7da4 | 487 | bVolt = gasG.getVolts(); |
caseyquinn | 25:fbf7d44e7da4 | 488 | bFuel = gasG.getCharge(); |
caseyquinn | 25:fbf7d44e7da4 | 489 | |
caseyquinn | 14:7cdb643da356 | 490 | |
caseyquinn | 25:fbf7d44e7da4 | 491 | if(pumps == 1){ |
caseyquinn | 25:fbf7d44e7da4 | 492 | omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V |
caseyquinn | 25:fbf7d44e7da4 | 493 | omronVolt = (omronReading*4.096)/(32768*2); |
caseyquinn | 25:fbf7d44e7da4 | 494 | |
caseyquinn | 25:fbf7d44e7da4 | 495 | if(omronVolt<=calibrations.omronVMin) { |
caseyquinn | 25:fbf7d44e7da4 | 496 | massflow = calibrations.omronMFMin; |
caseyquinn | 25:fbf7d44e7da4 | 497 | } else if(omronVolt>=calibrations.omronVMax) { |
caseyquinn | 25:fbf7d44e7da4 | 498 | massflow = calibrations.omronMFMax; |
caseyquinn | 25:fbf7d44e7da4 | 499 | } else { |
caseyquinn | 25:fbf7d44e7da4 | 500 | 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 | 501 | } |
caseyquinn | 25:fbf7d44e7da4 | 502 | |
caseyquinn | 25:fbf7d44e7da4 | 503 | 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 | 504 | volflow = massflow/atmoRho; |
caseyquinn | 25:fbf7d44e7da4 | 505 | sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow); |
caseyquinn | 25:fbf7d44e7da4 | 506 | deltaVflow = volflow-volflowSet; |
caseyquinn | 25:fbf7d44e7da4 | 507 | massflowSet = volflowSet*atmoRho; |
caseyquinn | 25:fbf7d44e7da4 | 508 | deltaMflow = massflow-massflowSet; |
caseyquinn | 25:fbf7d44e7da4 | 509 | |
caseyquinn | 25:fbf7d44e7da4 | 510 | vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0 |
caseyquinn | 25:fbf7d44e7da4 | 511 | omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3 |
caseyquinn | 14:7cdb643da356 | 512 | } |
caseyquinn | 14:7cdb643da356 | 513 | |
caseyquinn | 23:1ca41779b8ec | 514 | //if(gpsEN ==1){ |
caseyquinn | 25:fbf7d44e7da4 | 515 | /* |
caseyquinn | 23:1ca41779b8ec | 516 | if(gpsFix){ |
caseyquinn | 23:1ca41779b8ec | 517 | RGB_LED.set_led(1,1,1); |
caseyquinn | 23:1ca41779b8ec | 518 | }else{ |
caseyquinn | 23:1ca41779b8ec | 519 | RGB_LED.set_led(1,0,0); |
caseyquinn | 23:1ca41779b8ec | 520 | } |
caseyquinn | 25:fbf7d44e7da4 | 521 | */ |
caseyquinn | 23:1ca41779b8ec | 522 | gpsFix = gps.read(1); |
caseyquinn | 21:bb10efc5bf57 | 523 | //RGB_LED.set_led(1,1,0); |
caseyquinn | 12:5b4f3245606a | 524 | gpsspeed = gps.speed; |
caseyquinn | 12:5b4f3245606a | 525 | gpssatellites = gps.satellites; |
caseyquinn | 12:5b4f3245606a | 526 | gpslatitude = gps.lat; |
caseyquinn | 12:5b4f3245606a | 527 | // gpslat = 'N'; //gps.lat; need to fix this (if statement?) |
caseyquinn | 12:5b4f3245606a | 528 | gpslongitude = gps.lon; |
caseyquinn | 12:5b4f3245606a | 529 | // gpslon = 'W'; //gps.lon; need to fix this (if statement?) |
caseyquinn | 12:5b4f3245606a | 530 | gpsaltitude = gps.altitude; |
caseyquinn | 12:5b4f3245606a | 531 | |
caseyquinn | 21:bb10efc5bf57 | 532 | /* |
caseyquinn | 16:577cb22cec99 | 533 | if (abs(gpslatitude) > 0 && abs(gpslongitude) > 0) { |
caseyquinn | 12:5b4f3245606a | 534 | |
caseyquinn | 12:5b4f3245606a | 535 | if(gpslat == 'S') |
caseyquinn | 12:5b4f3245606a | 536 | { |
caseyquinn | 12:5b4f3245606a | 537 | flat = convertDegMinToDecDeg (gpslatitude) * -1; |
caseyquinn | 12:5b4f3245606a | 538 | } |
caseyquinn | 12:5b4f3245606a | 539 | else |
caseyquinn | 12:5b4f3245606a | 540 | { |
caseyquinn | 12:5b4f3245606a | 541 | flat = convertDegMinToDecDeg (gpslatitude); |
caseyquinn | 12:5b4f3245606a | 542 | } |
caseyquinn | 12:5b4f3245606a | 543 | |
caseyquinn | 12:5b4f3245606a | 544 | if(gpslon == 'W') |
caseyquinn | 12:5b4f3245606a | 545 | { |
caseyquinn | 12:5b4f3245606a | 546 | flon = convertDegMinToDecDeg (gpslongitude) * -1; |
caseyquinn | 12:5b4f3245606a | 547 | } |
caseyquinn | 12:5b4f3245606a | 548 | else |
caseyquinn | 12:5b4f3245606a | 549 | { |
caseyquinn | 12:5b4f3245606a | 550 | flon = convertDegMinToDecDeg (gpslongitude); |
caseyquinn | 12:5b4f3245606a | 551 | } |
caseyquinn | 12:5b4f3245606a | 552 | |
caseyquinn | 12:5b4f3245606a | 553 | workDistance = GPSdistanceCalc (work_lat, work_lon); |
caseyquinn | 12:5b4f3245606a | 554 | homeDistance = GPSdistanceCalc (home_lat, home_lon); |
caseyquinn | 12:5b4f3245606a | 555 | } |
caseyquinn | 12:5b4f3245606a | 556 | |
caseyquinn | 12:5b4f3245606a | 557 | if (homeDistance == 99999 && workDistance == 99999) { |
caseyquinn | 12:5b4f3245606a | 558 | // digitalWrite (work_yellow_led, HIGH); |
caseyquinn | 12:5b4f3245606a | 559 | // digitalWrite (home_green_led, HIGH); |
caseyquinn | 12:5b4f3245606a | 560 | // digitalWrite (travel_red_led, HIGH); |
caseyquinn | 12:5b4f3245606a | 561 | location = 0; |
caseyquinn | 12:5b4f3245606a | 562 | } |
caseyquinn | 12:5b4f3245606a | 563 | |
caseyquinn | 12:5b4f3245606a | 564 | else if (workDistance < 30) { |
caseyquinn | 12:5b4f3245606a | 565 | // digitalWrite (work_yellow_led, HIGH); |
caseyquinn | 12:5b4f3245606a | 566 | // digitalWrite (home_green_led, LOW); |
caseyquinn | 12:5b4f3245606a | 567 | // digitalWrite (travel_red_led, LOW); |
caseyquinn | 12:5b4f3245606a | 568 | location = 1; |
caseyquinn | 12:5b4f3245606a | 569 | } |
caseyquinn | 12:5b4f3245606a | 570 | |
caseyquinn | 12:5b4f3245606a | 571 | else if (homeDistance < 20) { |
caseyquinn | 12:5b4f3245606a | 572 | // digitalWrite (work_yellow_led, LOW); |
caseyquinn | 12:5b4f3245606a | 573 | // digitalWrite (home_green_led, HIGH); |
caseyquinn | 12:5b4f3245606a | 574 | // digitalWrite (travel_red_led, LOW); |
caseyquinn | 12:5b4f3245606a | 575 | location = 2; |
caseyquinn | 12:5b4f3245606a | 576 | } |
caseyquinn | 12:5b4f3245606a | 577 | |
caseyquinn | 12:5b4f3245606a | 578 | else { |
caseyquinn | 12:5b4f3245606a | 579 | // digitalWrite (work_yellow_led, LOW); |
caseyquinn | 12:5b4f3245606a | 580 | // digitalWrite (home_green_led, LOW); |
caseyquinn | 12:5b4f3245606a | 581 | // digitalWrite (travel_red_led, HIGH); |
caseyquinn | 12:5b4f3245606a | 582 | location = 3; |
caseyquinn | 12:5b4f3245606a | 583 | } |
caseyquinn | 21:bb10efc5bf57 | 584 | |
caseyquinn | 23:1ca41779b8ec | 585 | |
caseyquinn | 17:3e6dda6e6335 | 586 | } |
caseyquinn | 23:1ca41779b8ec | 587 | */ |
caseyquinn | 21:bb10efc5bf57 | 588 | |
caseyquinn | 7:29b01d5812ee | 589 | FILE *fp = fopen(filename, "a"); |
caseyquinn | 21:bb10efc5bf57 | 590 | 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 | 591 | fprintf(fp, "%s,", timestr); |
caseyquinn | 7:29b01d5812ee | 592 | fprintf(fp, "%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,", omronVolt,massflow,temp,press,rh,atmoRho); |
caseyquinn | 7:29b01d5812ee | 593 | 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 | 594 | 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 | 595 | fprintf(fp, "%d,%d,%d,%d,%d,%d," ,uv,omronReading, vInReading, vBlowerReading, omronDiff,amps); |
caseyquinn | 25:fbf7d44e7da4 | 596 | fprintf(fp, "%d,%d,%d,%1.3f,%1.3f,", bVolt, bFuel,digital_pot_set, deltaMflow, deltaVflow); |
caseyquinn | 25:fbf7d44e7da4 | 597 | fprintf(fp, "%f,%f,%06d,%06d,%f,%d,%f,%d,%d\r\n", gpslatitude, gpslongitude, (long)gps.date, (long)gps.utc, gpsspeed, gpssatellites, gpsaltitude, gpsFix, pumps == 1); // test and add in speed, etc that Josh added in to match the adafruit GPS |
caseyquinn | 7:29b01d5812ee | 598 | fclose(fp); |
caseyquinn | 7:29b01d5812ee | 599 | free(fp); |
caseyquinn | 25:fbf7d44e7da4 | 600 | |
caseyquinn | 25:fbf7d44e7da4 | 601 | |
caseyquinn | 25:fbf7d44e7da4 | 602 | if(bVolt > 1750 && amps > 8191) { |
caseyquinn | 25:fbf7d44e7da4 | 603 | RGB_LED.set_led(0,1,0); |
caseyquinn | 25:fbf7d44e7da4 | 604 | } else if(amps > 8191 && (RTC_UPAS.hour >=20 || bVolt < 1500)) { |
caseyquinn | 25:fbf7d44e7da4 | 605 | if(ledOn) { |
caseyquinn | 25:fbf7d44e7da4 | 606 | RGB_LED.set_led(0,0,0); |
caseyquinn | 25:fbf7d44e7da4 | 607 | ledOn = 0; |
caseyquinn | 25:fbf7d44e7da4 | 608 | } else { |
caseyquinn | 25:fbf7d44e7da4 | 609 | RGB_LED.set_led(1,0,0); |
caseyquinn | 25:fbf7d44e7da4 | 610 | ledOn = 1; |
caseyquinn | 25:fbf7d44e7da4 | 611 | } |
caseyquinn | 25:fbf7d44e7da4 | 612 | } else { |
caseyquinn | 25:fbf7d44e7da4 | 613 | RGB_LED.set_led(0,0,0); |
caseyquinn | 25:fbf7d44e7da4 | 614 | } |
caseyquinn | 14:7cdb643da356 | 615 | |
caseyquinn | 12:5b4f3245606a | 616 | |
caseyquinn | 25:fbf7d44e7da4 | 617 | |
caseyquinn | 25:fbf7d44e7da4 | 618 | //pc.printf("%s,", timestr); |
caseyquinn | 12:5b4f3245606a | 619 | |
jelord | 3:122bfc998c4c | 620 | |
jelord | 3:122bfc998c4c | 621 | } |
caseyquinn | 8:c4a8f9b67cee | 622 | |
caseyquinn | 9:8646fd501832 | 623 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 624 | //Flow Control Function |
caseyquinn | 9:8646fd501832 | 625 | ////////////////////////////////////////////////////////////// |
caseyquinn | 8:c4a8f9b67cee | 626 | void flowControl() |
caseyquinn | 8:c4a8f9b67cee | 627 | { |
caseyquinn | 25:fbf7d44e7da4 | 628 | |
caseyquinn | 25:fbf7d44e7da4 | 629 | //RGB_LED.set_led(0,1,0); |
caseyquinn | 8:c4a8f9b67cee | 630 | omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V |
caseyquinn | 8:c4a8f9b67cee | 631 | omronVolt = (omronReading*4.096)/(32768*2); |
caseyquinn | 8:c4a8f9b67cee | 632 | |
caseyquinn | 8:c4a8f9b67cee | 633 | if(omronVolt<=calibrations.omronVMin) { |
caseyquinn | 8:c4a8f9b67cee | 634 | massflow = calibrations.omronMFMin; |
caseyquinn | 8:c4a8f9b67cee | 635 | } else if(omronVolt>=calibrations.omronVMax) { |
caseyquinn | 8:c4a8f9b67cee | 636 | massflow = calibrations.omronMFMax; |
caseyquinn | 8:c4a8f9b67cee | 637 | } else { |
caseyquinn | 8:c4a8f9b67cee | 638 | 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 | 639 | } |
caseyquinn | 8:c4a8f9b67cee | 640 | |
caseyquinn | 8:c4a8f9b67cee | 641 | 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 | 642 | volflow = massflow/atmoRho; |
caseyquinn | 8:c4a8f9b67cee | 643 | sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow); |
caseyquinn | 8:c4a8f9b67cee | 644 | deltaVflow = volflow-volflowSet; |
caseyquinn | 8:c4a8f9b67cee | 645 | massflowSet = volflowSet*atmoRho; |
caseyquinn | 8:c4a8f9b67cee | 646 | deltaMflow = massflow-massflowSet; |
caseyquinn | 12:5b4f3245606a | 647 | |
caseyquinn | 8:c4a8f9b67cee | 648 | if(abs(deltaMflow)>.025) { |
caseyquinn | 8:c4a8f9b67cee | 649 | digital_pot_change = (int)(gainFlow*deltaMflow); |
caseyquinn | 8:c4a8f9b67cee | 650 | |
caseyquinn | 8:c4a8f9b67cee | 651 | |
caseyquinn | 12:5b4f3245606a | 652 | if(abs(digital_pot_change)>=10) { |
caseyquinn | 12:5b4f3245606a | 653 | digital_pot_set = (int)(digital_pot_set+ (int)(1*deltaMflow)); |
caseyquinn | 25:fbf7d44e7da4 | 654 | //RGB_LED.set_led(1,0,0); |
caseyquinn | 12:5b4f3245606a | 655 | } else { |
caseyquinn | 8:c4a8f9b67cee | 656 | digital_pot_set = (digital_pot_set+ digital_pot_change); |
caseyquinn | 25:fbf7d44e7da4 | 657 | //RGB_LED.set_led(1,1,0); |
caseyquinn | 8:c4a8f9b67cee | 658 | } |
caseyquinn | 8:c4a8f9b67cee | 659 | |
caseyquinn | 12:5b4f3245606a | 660 | if(digital_pot_set>=digitalpotMax) { |
caseyquinn | 12:5b4f3245606a | 661 | digital_pot_set = digitalpotMax; |
caseyquinn | 25:fbf7d44e7da4 | 662 | //RGB_LED.set_led(1,0,0); |
caseyquinn | 12:5b4f3245606a | 663 | } else if(digital_pot_set<=digitalpotMin) { |
caseyquinn | 12:5b4f3245606a | 664 | digital_pot_set = digitalpotMin; |
caseyquinn | 25:fbf7d44e7da4 | 665 | //RGB_LED.set_led(1,0,0); |
caseyquinn | 12:5b4f3245606a | 666 | } |
caseyquinn | 8:c4a8f9b67cee | 667 | |
caseyquinn | 8:c4a8f9b67cee | 668 | DigPot.writeRegister(digital_pot_set); |
caseyquinn | 12:5b4f3245606a | 669 | |
caseyquinn | 8:c4a8f9b67cee | 670 | } else { |
caseyquinn | 25:fbf7d44e7da4 | 671 | //RGB_LED.set_led(0,1,0); |
caseyquinn | 8:c4a8f9b67cee | 672 | } |
caseyquinn | 12:5b4f3245606a | 673 | |
caseyquinn | 25:fbf7d44e7da4 | 674 | |
caseyquinn | 8:c4a8f9b67cee | 675 | } |
caseyquinn | 9:8646fd501832 | 676 | ////////////////////////////////////////////////////////////// |
caseyquinn | 9:8646fd501832 | 677 | //Main Function |
caseyquinn | 9:8646fd501832 | 678 | ////////////////////////////////////////////////////////////// |
jelord | 1:9fbb5b665068 | 679 | int main(){ |
caseyquinn | 23:1ca41779b8ec | 680 | |
caseyquinn | 23:1ca41779b8ec | 681 | RGB_LED.set_led(0,0,1); |
caseyquinn | 14:7cdb643da356 | 682 | |
caseyquinn | 7:29b01d5812ee | 683 | |
caseyquinn | 25:fbf7d44e7da4 | 684 | /* |
caseyquinn | 16:577cb22cec99 | 685 | motor1.getFault(); |
caseyquinn | 23:1ca41779b8ec | 686 | wait(1); |
caseyquinn | 16:577cb22cec99 | 687 | motor2.getFault(); |
caseyquinn | 23:1ca41779b8ec | 688 | wait(1); |
caseyquinn | 16:577cb22cec99 | 689 | motor3.getFault(); |
caseyquinn | 23:1ca41779b8ec | 690 | wait(1); |
caseyquinn | 16:577cb22cec99 | 691 | motor4.getFault(); |
caseyquinn | 23:1ca41779b8ec | 692 | wait(1); |
caseyquinn | 13:455601f62aad | 693 | |
caseyquinn | 23:1ca41779b8ec | 694 | motor1.drive(254); //closed = 253, open = 254 |
caseyquinn | 25:fbf7d44e7da4 | 695 | motor2.drive(253); //closed = 253, open = 254 |
caseyquinn | 25:fbf7d44e7da4 | 696 | motor3.drive(253); //closed = 253, open = 254 |
caseyquinn | 25:fbf7d44e7da4 | 697 | motor4.drive(253); //closed = 253, open = 254 |
caseyquinn | 23:1ca41779b8ec | 698 | |
caseyquinn | 23:1ca41779b8ec | 699 | |
caseyquinn | 25:fbf7d44e7da4 | 700 | wait(1); |
caseyquinn | 23:1ca41779b8ec | 701 | motor1.stop(); |
caseyquinn | 23:1ca41779b8ec | 702 | motor2.stop(); |
caseyquinn | 23:1ca41779b8ec | 703 | motor3.stop(); |
caseyquinn | 23:1ca41779b8ec | 704 | motor4.stop(); |
caseyquinn | 24:e274a34492cf | 705 | */ |
caseyquinn | 23:1ca41779b8ec | 706 | |
caseyquinn | 23:1ca41779b8ec | 707 | |
caseyquinn | 23:1ca41779b8ec | 708 | gpsEN = 1; |
caseyquinn | 23:1ca41779b8ec | 709 | wait(1); |
caseyquinn | 23:1ca41779b8ec | 710 | BT_SW = 1; |
caseyquinn | 23:1ca41779b8ec | 711 | wait(1); |
caseyquinn | 23:1ca41779b8ec | 712 | BT_IRST = 1; |
caseyquinn | 23:1ca41779b8ec | 713 | wait(1); |
caseyquinn | 23:1ca41779b8ec | 714 | |
caseyquinn | 12:5b4f3245606a | 715 | |
caseyquinn | 10:06fbb1c9e3bd | 716 | pc.baud(115200); // set what you want here depending on your terminal program speed |
caseyquinn | 10:06fbb1c9e3bd | 717 | pc.printf("\f\n\r-------------Startup-------------\n\r"); |
jelord | 1:9fbb5b665068 | 718 | wait(0.5); |
caseyquinn | 5:c3252e5d45ca | 719 | |
caseyquinn | 12:5b4f3245606a | 720 | |
jelord | 20:30a00cd18e21 | 721 | uint8_t serialNumberAndType[6] = {0x50,0x53,}; |
caseyquinn | 13:455601f62aad | 722 | |
jelord | 3:122bfc998c4c | 723 | E2PROM.read(0x00034,serialNumberAndType+2,2); |
caseyquinn | 4:5d004fd997d5 | 724 | |
jelord | 3:122bfc998c4c | 725 | int tempSerialNum = serialNumberAndType[2]+serialNumberAndType[3]; |
jelord | 3:122bfc998c4c | 726 | int serialNumDigits[4]; |
jelord | 3:122bfc998c4c | 727 | serialNumDigits[0] = tempSerialNum / 1000 % 10; |
jelord | 3:122bfc998c4c | 728 | serialNumDigits[1] = tempSerialNum / 100 % 10; |
jelord | 3:122bfc998c4c | 729 | serialNumDigits[2] = tempSerialNum / 10 % 10; |
jelord | 3:122bfc998c4c | 730 | serialNumDigits[3] = tempSerialNum % 10; |
jelord | 3:122bfc998c4c | 731 | |
jelord | 3:122bfc998c4c | 732 | serialNumberAndType[2] = serialNumDigits[0]+48; |
jelord | 3:122bfc998c4c | 733 | serialNumberAndType[3] = serialNumDigits[1]+48; |
jelord | 3:122bfc998c4c | 734 | serialNumberAndType[4] = serialNumDigits[2]+48; |
jelord | 3:122bfc998c4c | 735 | serialNumberAndType[5] = serialNumDigits[3]+48; |
caseyquinn | 12:5b4f3245606a | 736 | |
caseyquinn | 5:c3252e5d45ca | 737 | RGB_LED.set_led(0,1,0); |
caseyquinn | 13:455601f62aad | 738 | |
caseyquinn | 10:06fbb1c9e3bd | 739 | pc.attach(pc_recv); |
jelord | 1:9fbb5b665068 | 740 | microChannel.attach(uartMicro,microChannel.RxIrq); |
jelord | 3:122bfc998c4c | 741 | microChannel.baud(115200); |
jelord | 1:9fbb5b665068 | 742 | microChannel.printf("$$$"); |
jelord | 3:122bfc998c4c | 743 | wait(0.5); |
jelord | 3:122bfc998c4c | 744 | microChannel.printf("SN,"); |
jelord | 3:122bfc998c4c | 745 | for(int i=0;i<6;i++)microChannel.putc(serialNumberAndType[i]); |
jelord | 3:122bfc998c4c | 746 | microChannel.printf("\r"); |
jelord | 3:122bfc998c4c | 747 | wait(0.5); |
jelord | 1:9fbb5b665068 | 748 | microChannel.printf("A\r"); |
jelord | 3:122bfc998c4c | 749 | wait(0.5); |
jelord | 2:88fcbfadec6a | 750 | microChannel.printf("---\r"); |
jelord | 3:122bfc998c4c | 751 | wait(0.5); |
jelord | 2:88fcbfadec6a | 752 | |
caseyquinn | 18:41ef98db0423 | 753 | RGB_LED.set_led(1,1,1); |
jelord | 3:122bfc998c4c | 754 | while(runReady!=1) { |
jelord | 3:122bfc998c4c | 755 | wait(1); |
caseyquinn | 11:aa21628a9b15 | 756 | pc.printf("Waiting for BLE instruction"); |
jelord | 3:122bfc998c4c | 757 | |
jelord | 3:122bfc998c4c | 758 | } |
jelord | 3:122bfc998c4c | 759 | |
caseyquinn | 14:7cdb643da356 | 760 | |
jelord | 3:122bfc998c4c | 761 | E2PROM.read(0x00015, startAndEndTime, 12); //Grab start and end times from EEPROM |
jelord | 3:122bfc998c4c | 762 | RGB_LED.set_led(0,1,0); |
caseyquinn | 14:7cdb643da356 | 763 | |
caseyquinn | 7:29b01d5812ee | 764 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
caseyquinn | 7:29b01d5812ee | 765 | //UPDATE THIS TO WORK WITH ST RTC INSTEAD |
caseyquinn | 7:29b01d5812ee | 766 | //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
caseyquinn | 14:7cdb643da356 | 767 | |
caseyquinn | 21:bb10efc5bf57 | 768 | BT_SW = 0; |
caseyquinn | 21:bb10efc5bf57 | 769 | wait(1); |
caseyquinn | 21:bb10efc5bf57 | 770 | BT_IRST = 0; |
caseyquinn | 21:bb10efc5bf57 | 771 | wait(1); |
caseyquinn | 21:bb10efc5bf57 | 772 | |
jelord | 3:122bfc998c4c | 773 | 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 | 774 | wait(0.5); |
jelord | 3:122bfc998c4c | 775 | |
jelord | 3:122bfc998c4c | 776 | RTC_UPAS.get_time(); |
jelord | 3:122bfc998c4c | 777 | |
jelord | 3:122bfc998c4c | 778 | } |
caseyquinn | 14:7cdb643da356 | 779 | |
caseyquinn | 14:7cdb643da356 | 780 | |
jelord | 3:122bfc998c4c | 781 | |
jelord | 3:122bfc998c4c | 782 | //Get the proper serial number |
jelord | 3:122bfc998c4c | 783 | uint8_t serialBytes[2] = {0,}; |
jelord | 3:122bfc998c4c | 784 | E2PROM.read(0x00034, serialBytes,2); |
jelord | 3:122bfc998c4c | 785 | serial_num = ((uint16_t)serialBytes[1] << 8) | serialBytes[0]; |
jelord | 3:122bfc998c4c | 786 | calibrations.initialize(serial_num); |
jelord | 3:122bfc998c4c | 787 | |
jelord | 3:122bfc998c4c | 788 | uint8_t logByte[1] = {0,}; |
jelord | 3:122bfc998c4c | 789 | E2PROM.read(0x00014,logByte,1); |
jelord | 3:122bfc998c4c | 790 | logInerval = logByte[0]; |
jelord | 3:122bfc998c4c | 791 | |
jelord | 3:122bfc998c4c | 792 | //Use the flow rate value stored in eeprom |
jelord | 3:122bfc998c4c | 793 | uint8_t flowRateBytes[4] = {0,}; |
jelord | 3:122bfc998c4c | 794 | E2PROM.read(0x00010,flowRateBytes,4); |
jelord | 3:122bfc998c4c | 795 | E2PROM.byteToFloat(flowRateBytes, &volflowSet); |
jelord | 3:122bfc998c4c | 796 | |
jelord | 3:122bfc998c4c | 797 | if(volflowSet<=1.0) { |
jelord | 3:122bfc998c4c | 798 | gainFlow = 100; |
jelord | 3:122bfc998c4c | 799 | } else if(volflowSet>=2.0) { |
jelord | 3:122bfc998c4c | 800 | gainFlow = 25; |
jelord | 3:122bfc998c4c | 801 | } else { |
jelord | 3:122bfc998c4c | 802 | gainFlow = 25; |
jelord | 0:2cb2b2ea316f | 803 | } |
caseyquinn | 17:3e6dda6e6335 | 804 | |
jelord | 3:122bfc998c4c | 805 | RGB_LED.set_led(1,0,0); |
jelord | 3:122bfc998c4c | 806 | press = bmesensor.getPressure(); |
jelord | 3:122bfc998c4c | 807 | temp = bmesensor.getTemperature(); |
jelord | 3:122bfc998c4c | 808 | rh = bmesensor.getHumidity(); |
jelord | 3:122bfc998c4c | 809 | |
jelord | 3:122bfc998c4c | 810 | 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 | 811 | massflowSet = volflowSet*atmoRho; |
jelord | 3:122bfc998c4c | 812 | |
jelord | 3:122bfc998c4c | 813 | DigPot.writeRegister(digital_pot_setpoint); |
jelord | 3:122bfc998c4c | 814 | wait(1); |
caseyquinn | 25:fbf7d44e7da4 | 815 | pumps = 1; |
caseyquinn | 25:fbf7d44e7da4 | 816 | //pumpOn = 1; |
jelord | 3:122bfc998c4c | 817 | |
jelord | 3:122bfc998c4c | 818 | uint8_t subjectLabelOriginal[8] = {0,}; |
caseyquinn | 4:5d004fd997d5 | 819 | E2PROM.read(0x00001, subjectLabelOriginal,8); |
caseyquinn | 12:5b4f3245606a | 820 | |
caseyquinn | 13:455601f62aad | 821 | |
caseyquinn | 12:5b4f3245606a | 822 | |
caseyquinn | 21:bb10efc5bf57 | 823 | time_t seconds = time(NULL); |
caseyquinn | 4:5d004fd997d5 | 824 | strftime(timestr, 32, "%y-%m-%d-%H=%M=%S", localtime(&seconds)); |
caseyquinn | 13:455601f62aad | 825 | |
caseyquinn | 25:fbf7d44e7da4 | 826 | sprintf(filename, "/sd/AMAS%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 | 22:baa5a077d908 | 827 | //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 | 25:fbf7d44e7da4 | 828 | //sprintf(filename, "/sd/UPAS_TboardtestLog_%s.txt", timestr); |
jelord | 3:122bfc998c4c | 829 | FILE *fp = fopen(filename, "w"); |
jelord | 3:122bfc998c4c | 830 | fclose(fp); |
jelord | 3:122bfc998c4c | 831 | |
caseyquinn | 25:fbf7d44e7da4 | 832 | |
caseyquinn | 12:5b4f3245606a | 833 | omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V |
caseyquinn | 12:5b4f3245606a | 834 | omronVolt = (omronReading*4.096)/(32768*2); |
caseyquinn | 12:5b4f3245606a | 835 | if(omronVolt<=calibrations.omronVMin) { |
caseyquinn | 12:5b4f3245606a | 836 | massflow = calibrations.omronMFMin; |
caseyquinn | 12:5b4f3245606a | 837 | } else if(omronVolt>=calibrations.omronVMax) { |
caseyquinn | 12:5b4f3245606a | 838 | massflow = calibrations.omronMFMax; |
caseyquinn | 12:5b4f3245606a | 839 | } else { |
caseyquinn | 12:5b4f3245606a | 840 | 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 | 841 | } |
caseyquinn | 12:5b4f3245606a | 842 | deltaMflow = massflow-massflowSet; |
caseyquinn | 12:5b4f3245606a | 843 | digital_pot_set = digital_pot_setpoint; |
caseyquinn | 12:5b4f3245606a | 844 | wait(5); |
caseyquinn | 12:5b4f3245606a | 845 | |
caseyquinn | 12:5b4f3245606a | 846 | //---------------------------------------------------------------------------------------------// |
caseyquinn | 12:5b4f3245606a | 847 | //Sets the flow withen +-1.5% of the desired flow rate based on mass flow |
caseyquinn | 25:fbf7d44e7da4 | 848 | /* |
caseyquinn | 12:5b4f3245606a | 849 | while(abs(deltaMflow)>.025) { |
caseyquinn | 12:5b4f3245606a | 850 | |
caseyquinn | 12:5b4f3245606a | 851 | omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V |
caseyquinn | 12:5b4f3245606a | 852 | omronVolt = (omronReading*4.096)/(32768*2); |
caseyquinn | 12:5b4f3245606a | 853 | //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx |
caseyquinn | 12:5b4f3245606a | 854 | if(omronVolt<=calibrations.omronVMin) { |
caseyquinn | 12:5b4f3245606a | 855 | massflow = calibrations.omronMFMin; |
caseyquinn | 12:5b4f3245606a | 856 | } else if(omronVolt>=calibrations.omronVMax) { |
caseyquinn | 12:5b4f3245606a | 857 | massflow = calibrations.omronMFMax; |
caseyquinn | 12:5b4f3245606a | 858 | } else { |
caseyquinn | 12:5b4f3245606a | 859 | 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 | 860 | } |
caseyquinn | 12:5b4f3245606a | 861 | |
caseyquinn | 12:5b4f3245606a | 862 | 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 | 863 | volflow = massflow/atmoRho; |
caseyquinn | 12:5b4f3245606a | 864 | massflowSet = volflowSet*atmoRho; |
caseyquinn | 12:5b4f3245606a | 865 | deltaMflow = massflow-massflowSet; |
caseyquinn | 12:5b4f3245606a | 866 | |
caseyquinn | 12:5b4f3245606a | 867 | digital_pot_set = (int)(digital_pot_set+(int)((gainFlow*deltaMflow))); |
caseyquinn | 12:5b4f3245606a | 868 | if(digital_pot_set>=digitalpotMax) { |
caseyquinn | 12:5b4f3245606a | 869 | digital_pot_set = digitalpotMax; |
caseyquinn | 12:5b4f3245606a | 870 | } else if(digital_pot_set<=digitalpotMin) { |
caseyquinn | 12:5b4f3245606a | 871 | digital_pot_set = digitalpotMin; |
caseyquinn | 12:5b4f3245606a | 872 | } |
caseyquinn | 12:5b4f3245606a | 873 | |
caseyquinn | 12:5b4f3245606a | 874 | wait(2); |
caseyquinn | 12:5b4f3245606a | 875 | DigPot.writeRegister(digital_pot_set); |
caseyquinn | 12:5b4f3245606a | 876 | pc.printf("%d,\r\n", digital_pot_set); |
caseyquinn | 12:5b4f3245606a | 877 | wait(1); |
caseyquinn | 12:5b4f3245606a | 878 | |
caseyquinn | 12:5b4f3245606a | 879 | |
caseyquinn | 12:5b4f3245606a | 880 | } |
caseyquinn | 25:fbf7d44e7da4 | 881 | |
caseyquinn | 14:7cdb643da356 | 882 | */ |
jelord | 3:122bfc998c4c | 883 | sampledVol = 0.0; |
jelord | 3:122bfc998c4c | 884 | RGB_LED.set_led(0,1,0); |
caseyquinn | 25:fbf7d44e7da4 | 885 | wait(1); |
caseyquinn | 25:fbf7d44e7da4 | 886 | RGB_LED.set_led(0,0,0); |
caseyquinn | 14:7cdb643da356 | 887 | |
caseyquinn | 18:41ef98db0423 | 888 | stop.attach(&check_stop, 9); // check if we should shut down every 9 number seconds, starting after the start. |
caseyquinn | 14:7cdb643da356 | 889 | logg.attach(&log_data, logInerval); |
caseyquinn | 25:fbf7d44e7da4 | 890 | //flowCtl.attach(&flowControl, 3); |
caseyquinn | 7:29b01d5812ee | 891 | |
jelord | 3:122bfc998c4c | 892 | |
jelord | 3:122bfc998c4c | 893 | //** end of initalization **// |
jelord | 3:122bfc998c4c | 894 | //---------------------------------------------------------------------------------------------// |
jelord | 3:122bfc998c4c | 895 | //---------------------------------------------------------------------------------------------// |
jelord | 3:122bfc998c4c | 896 | // Main Control Loop |
jelord | 3:122bfc998c4c | 897 | |
caseyquinn | 7:29b01d5812ee | 898 | while (1) { |
caseyquinn | 7:29b01d5812ee | 899 | // Do other things... |
caseyquinn | 14:7cdb643da356 | 900 | /* |
caseyquinn | 18:41ef98db0423 | 901 | pumps = 1; |
caseyquinn | 13:455601f62aad | 902 | wait(5); |
caseyquinn | 18:41ef98db0423 | 903 | pumps = 0; |
caseyquinn | 13:455601f62aad | 904 | wait(5); |
caseyquinn | 14:7cdb643da356 | 905 | */ |
caseyquinn | 7:29b01d5812ee | 906 | } |
caseyquinn | 7:29b01d5812ee | 907 | |
caseyquinn | 8:c4a8f9b67cee | 908 | |
caseyquinn | 4:5d004fd997d5 | 909 | |
jelord | 3:122bfc998c4c | 910 | |
jelord | 0:2cb2b2ea316f | 911 | } |