all working version 2.0
Dependencies: ADS1115 BME280 CronoDot SDFileSystem mbed
Fork of Outdoor_UPAS_v1_2_powerfunction by
Diff: main.cpp
- Revision:
- 25:fbf7d44e7da4
- Parent:
- 24:e274a34492cf
- Child:
- 26:6aa294d83af4
--- a/main.cpp Thu Apr 07 00:32:31 2016 +0000 +++ b/main.cpp Wed Apr 20 03:36:48 2016 +0000 @@ -108,6 +108,8 @@ uint16_t serial_num = 1; // Default serial/calibration number int RunReady =0; +bool ledOn = 0; + struct tm STtime; char timestr[32]; @@ -132,12 +134,17 @@ float mag_z; int vInReading; +int vInReadingLast; int vBlowerReading; int omronDiff; float omronVolt; //V int omronReading; float atmoRho; //g/L +int amps; +int bVolt; +int bFuel; +//bool pumpOn; float massflow; //g/min float volflow; //L/min float volflowSet = 1.0; //L/min @@ -150,7 +157,7 @@ float gainFlow; float sampledVol; //L, total sampled volume -int digital_pot_setpoint = 100; //min = 0x7F, max = 0x00 +int digital_pot_setpoint = 30; //min = 0x7F, max = 0x00 int digital_pot_set; int digital_pot_change; int digitalpotMax = 127; @@ -206,6 +213,7 @@ ////////////////////////////////////////////////////////////// void uartMicro(){ + if(runReady!=1){ haltBLE = 2; while(microChannel.readable()){ @@ -223,12 +231,14 @@ else if(rx_buf[0] == 0x06)transmissionValue = 6; //Flow Rate else if(rx_buf[0] == 0x07)transmissionValue = 7; //Serial Number else if(rx_buf[0] == 0x08)transmissionValue = 8; //Run Enable + else if(rx_buf[0] == 0x0A)transmissionValue = 10; //GPS Coordinates + //else if(rx_buf[0] == 0x30)RGB_LED.set_led(1,0,0); else transmissionValue = 100; //Not useful data } if(rx_buf[rx_len-1]=='\0' || rx_buf[rx_len-1]=='\n' || rx_buf[rx_len-1] == 0xff){ if((transmissionValue == 1 || transmissionValue == 2 || transmissionValue == 3 || transmissionValue == 4 || transmissionValue == 5 || - transmissionValue == 6 || transmissionValue == 7) && rx_buf[rx_len-1] != 0xff) + transmissionValue == 6 || transmissionValue == 7 || transmissionValue ==10) && rx_buf[rx_len-1] != 0xff) {}else{ if(transmissionValue == 4 ) sendData(); if(transmissionValue == 8){ @@ -238,7 +248,13 @@ haltBLE = 1; transmissionValue = 0; dataLength = 0; - + //if(fileWrite == 1){ + //FILE *fp = fopen(gpsConfigFilename, "a"); + //fprintf(fp,"HELLO"); + //fclose(fp); + //free(fp); + //fileWrite=0; + //} } } } @@ -283,8 +299,10 @@ }else if(transmissionValue ==7){ //process and store Serial Number if(dataLength ==2)E2PROM.write(0x00034,writeData,2); + }else if (transmissionValue == 10){ + if(dataLength == 16)E2PROM.write(0x00050,writeData,16); } - + dataLength++; } @@ -303,11 +321,31 @@ uint8_t subjectLabelOriginal[9] = {0x02,0x52,0x45,0x53,0x45,0x54,0x5F,0x5F,0x5f}; uint8_t dataLogOriginal[2] = {0x03,0x0A,}; uint8_t flowRateOriginal[5] = {0x04,0x00,0x00,0x80,0x3F}; - //uint8_t presetRunModeCheck[1] = {0,}; Commented and currently unused to prevent mem issues - E2PROM.read(0x00015, sampleTimePassValues+1, 12); - E2PROM.read(0x00001, subjectLabelOriginal+1,8); - E2PROM.read(0x00014,dataLogOriginal+1,1); - E2PROM.read(0x00010,flowRateOriginal+1,4); + uint8_t latLongSchoolOriginal[17] = {0x0A,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F}; + // Latitude School EEPROM = 0x50-0x53 + // Longitude School EEPROM = 0x54-0x57 + // Latitude Home EEPROM = 0x58-0x5B + // Longitude Home EEPROM = 0x5C-0x5F + uint8_t NEW_EEPROM_CHECK[1] = {0,}; //THIS IS USED TO ENSURE COOPERATION WITH MOBILE APPS + + //NEW EEPROM Check bit = 0x75 + E2PROM.read(0x00075,NEW_EEPROM_CHECK,1); + + if(NEW_EEPROM_CHECK[0] == 0x0A){ + E2PROM.read(0x00015, sampleTimePassValues+1, 12); + E2PROM.read(0x00001, subjectLabelOriginal+1,8); + E2PROM.read(0x00014,dataLogOriginal+1,1); + E2PROM.read(0x00010,flowRateOriginal+1,4); + E2PROM.read(0x00050,latLongSchoolOriginal+1,16); + }else{ + NEW_EEPROM_CHECK[0] = 0x0A; + E2PROM.write(0x00075,NEW_EEPROM_CHECK,1); + E2PROM.write(0x00015, sampleTimePassValues+1, 12); + E2PROM.write(0x00001, subjectLabelOriginal+1,8); + E2PROM.write(0x00014,dataLogOriginal+1,1); + E2PROM.write(0x00010,flowRateOriginal+1,4); + E2PROM.write(0x00050,latLongSchoolOriginal+1,16); + } for(int i=0; i<13; i++){ @@ -327,10 +365,15 @@ for(int i=0; i<5; i++){ microChannel.putc(flowRateOriginal[i]); + } + wait(.25); + + for(int i=0;i<17;i++){ + microChannel.putc(latLongSchoolOriginal[i]); } -} +} ////////////////////////////////////////////////////////////// // GPS: Degree-minute format to decimal-degrees @@ -407,11 +450,15 @@ void log_data() { + time_t seconds = time(NULL); strftime(timestr, 32, "%y%m%d%H%M%S", localtime(&seconds)); RTC_UPAS.get_time(); + + + press = bmesensor.getPressure(); temp = bmesensor.getTemperature()-5.0; rh = bmesensor.getHumidity(); @@ -426,36 +473,52 @@ mag_x = movementsensor.MagData.x; mag_y = movementsensor.MagData.y; mag_z = movementsensor.MagData.z; - - omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V - omronVolt = (omronReading*4.096)/(32768*2); + vInReadingLast = vInReading; + vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0 + + if(vInReading > 5950 && amps > 8191) { + pumps = 0; + wait(1); + } else if(pumps == 0 && amps < 8191) { + pumps = 1; + } + + amps = gasG.getAmps(); + bVolt = gasG.getVolts(); + bFuel = gasG.getCharge(); + - if(omronVolt<=calibrations.omronVMin) { - massflow = calibrations.omronMFMin; - } else if(omronVolt>=calibrations.omronVMax) { - massflow = calibrations.omronMFMax; - } else { - massflow = calibrations.MF4*pow(omronVolt,(float)4)+calibrations.MF3*pow(omronVolt,(float)3)+calibrations.MF2*pow(omronVolt,(float)2)+calibrations.MF1*omronVolt+calibrations.MF0; + if(pumps == 1){ + omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V + omronVolt = (omronReading*4.096)/(32768*2); + + if(omronVolt<=calibrations.omronVMin) { + massflow = calibrations.omronMFMin; + } else if(omronVolt>=calibrations.omronVMax) { + massflow = calibrations.omronMFMax; + } else { + massflow = calibrations.MF4*pow(omronVolt,(float)4)+calibrations.MF3*pow(omronVolt,(float)3)+calibrations.MF2*pow(omronVolt,(float)2)+calibrations.MF1*omronVolt+calibrations.MF0; + } + + 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)); + volflow = massflow/atmoRho; + sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow); + deltaVflow = volflow-volflowSet; + massflowSet = volflowSet*atmoRho; + deltaMflow = massflow-massflowSet; + + vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0 + omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3 } - 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)); - volflow = massflow/atmoRho; - sampledVol = sampledVol + ((((float)logInerval)/60.0)*volflow); - deltaVflow = volflow-volflowSet; - massflowSet = volflowSet*atmoRho; - deltaMflow = massflow-massflowSet; - - vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0 - vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0 - omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3 - //if(gpsEN ==1){ - + /* if(gpsFix){ RGB_LED.set_led(1,1,1); }else{ RGB_LED.set_led(1,0,0); } + */ gpsFix = gps.read(1); //RGB_LED.set_led(1,1,0); gpsspeed = gps.speed; @@ -529,15 +592,30 @@ fprintf(fp, "%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,", omronVolt,massflow,temp,press,rh,atmoRho); fprintf(fp, "%1.3f,%5.1f,%1.1f,%1.1f,%1.1f,%1.1f,", volflow, sampledVol, accel_x, accel_y, accel_z, accel_comp); fprintf(fp, "%.1f,%.1f,%.1f,%.3f,%.3f,%.3f,%.1f,", angle_x,angle_y,angle_z,mag_x, mag_y, mag_z,compass); - fprintf(fp, "%d,%d,%d,%d,%d,%d," ,uv,omronReading, vInReading, vBlowerReading, omronDiff,gasG.getAmps()); - fprintf(fp, "%d,%d,%d,%1.3f,%1.3f,", gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow); - fprintf(fp, "%f,%f,%06d,%06d,%f,%d,%f,%d\r\n", gps.lat, gps.lon, (long)gps.date, (long)gps.utc, gpsspeed, gpssatellites, gpsaltitude, gpsFix); // test and add in speed, etc that Josh added in to match the adafruit GPS + fprintf(fp, "%d,%d,%d,%d,%d,%d," ,uv,omronReading, vInReading, vBlowerReading, omronDiff,amps); + fprintf(fp, "%d,%d,%d,%1.3f,%1.3f,", bVolt, bFuel,digital_pot_set, deltaMflow, deltaVflow); + 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 fclose(fp); free(fp); - RGB_LED.set_led(0,1,0); + + + if(bVolt > 1750 && amps > 8191) { + RGB_LED.set_led(0,1,0); + } else if(amps > 8191 && (RTC_UPAS.hour >=20 || bVolt < 1500)) { + if(ledOn) { + RGB_LED.set_led(0,0,0); + ledOn = 0; + } else { + RGB_LED.set_led(1,0,0); + ledOn = 1; + } + } else { + RGB_LED.set_led(0,0,0); + } -pc.printf("%s,", timestr); + +//pc.printf("%s,", timestr); } @@ -547,8 +625,8 @@ ////////////////////////////////////////////////////////////// void flowControl() { -/* - RGB_LED.set_led(0,1,0); + + //RGB_LED.set_led(0,1,0); omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V omronVolt = (omronReading*4.096)/(32768*2); @@ -573,27 +651,27 @@ if(abs(digital_pot_change)>=10) { digital_pot_set = (int)(digital_pot_set+ (int)(1*deltaMflow)); - RGB_LED.set_led(1,0,0); + //RGB_LED.set_led(1,0,0); } else { digital_pot_set = (digital_pot_set+ digital_pot_change); - RGB_LED.set_led(1,1,0); + //RGB_LED.set_led(1,1,0); } if(digital_pot_set>=digitalpotMax) { digital_pot_set = digitalpotMax; - RGB_LED.set_led(1,0,0); + //RGB_LED.set_led(1,0,0); } else if(digital_pot_set<=digitalpotMin) { digital_pot_set = digitalpotMin; - RGB_LED.set_led(1,0,0); + //RGB_LED.set_led(1,0,0); } DigPot.writeRegister(digital_pot_set); } else { - RGB_LED.set_led(0,1,0); + //RGB_LED.set_led(0,1,0); } -*/ + } ////////////////////////////////////////////////////////////// //Main Function @@ -602,79 +680,24 @@ RGB_LED.set_led(0,0,1); - /* - //CODE ADDED TO TEST EEPROM - ////////////////////////////////////////// - uint8_t serialNumWriter [2] = {0x00,0x12}; - uint8_t putDataInMe[2] = {0x02,0x00}; - E2PROM.write(0x00034,serialNumWriter,2); - wait(.5); - E2PROM.read(0x00034,putDataInMe,2); - if(putDataInMe[0] == 0x02)pumps=1; - ////////////////////////////////////////// - //END CODE ADDED TO TEST EEPROM - - RGB_LED.set_led(0,0,1); - STtime.tm_sec = 10; // 0-59 - STtime.tm_min = 30; // 0-59 - STtime.tm_hour = 13; // 0-23 - STtime.tm_mday = 24; // 1-31 - STtime.tm_mon = 2; // 0-11 - STtime.tm_year = 116; // year since 1900 - time_t seconds = mktime(&STtime); - set_time(seconds); // Set RTC time to 16 December 2013 10:05:23 UTC - wait(5); - - +/* motor1.getFault(); wait(1); - RGB_LED.set_led(0,0,0); motor2.getFault(); wait(1); - RGB_LED.set_led(0,1,0); - motor3.getFault(); wait(1); - RGB_LED.set_led(0,0,0); - motor4.getFault(); wait(1); - RGB_LED.set_led(0,1,0); - - - RGB_LED.set_led(1,0,0); - motor1.drive(254); //closed = 253, open = 254 - wait(10); - motor1.stop(); - RGB_LED.set_led(0,0,0); - - - motor2.drive(254); //closed = 253, open = 254 - wait(10); - motor2.stop(); - RGB_LED.set_led(1,0,0); - - motor3.drive(254); //closed = 253, open = 254 - wait(10); - motor3.stop(); - RGB_LED.set_led(0,0,0); - - - motor4.drive(254); //closed = 253, open = 254 - wait(10); - motor4.stop(); - RGB_LED.set_led(0,0,1); - - motor1.drive(254); //closed = 253, open = 254 - motor2.drive(254); //closed = 253, open = 254 - motor3.drive(254); //closed = 253, open = 254 - motor4.drive(254); //closed = 253, open = 254 + motor2.drive(253); //closed = 253, open = 254 + motor3.drive(253); //closed = 253, open = 254 + motor4.drive(253); //closed = 253, open = 254 - wait(10); + wait(1); motor1.stop(); motor2.stop(); motor3.stop(); @@ -789,7 +812,8 @@ DigPot.writeRegister(digital_pot_setpoint); wait(1); - //pumps = 1; + pumps = 1; + //pumpOn = 1; uint8_t subjectLabelOriginal[8] = {0,}; E2PROM.read(0x00001, subjectLabelOriginal,8); @@ -799,13 +823,13 @@ time_t seconds = time(NULL); strftime(timestr, 32, "%y-%m-%d-%H=%M=%S", localtime(&seconds)); - //sprintf(filename, "/sd/UPAS%04dLOG_%02d-%02d-%02d_%02d=%02d=%02d_%c%c%c%c%c%c%c%c.txt",serial_num,RTC_UPAS.year,RTC_UPAS.month,RTC_UPAS.date,RTC_UPAS.hour,RTC_UPAS.minutes,RTC_UPAS.seconds,subjectLabelOriginal[0],subjectLabelOriginal[1],subjectLabelOriginal[2],subjectLabelOriginal[3],subjectLabelOriginal[4],subjectLabelOriginal[5],subjectLabelOriginal[6],subjectLabelOriginal[7]); + 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]); //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]); - sprintf(filename, "/sd/UPAS_TboardtestLog_%s.txt", timestr); + //sprintf(filename, "/sd/UPAS_TboardtestLog_%s.txt", timestr); FILE *fp = fopen(filename, "w"); fclose(fp); -/* + omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V omronVolt = (omronReading*4.096)/(32768*2); if(omronVolt<=calibrations.omronVMin) { @@ -821,7 +845,7 @@ //---------------------------------------------------------------------------------------------// //Sets the flow withen +-1.5% of the desired flow rate based on mass flow - +/* while(abs(deltaMflow)>.025) { omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V @@ -854,13 +878,16 @@ } + */ sampledVol = 0.0; RGB_LED.set_led(0,1,0); + wait(1); + RGB_LED.set_led(0,0,0); stop.attach(&check_stop, 9); // check if we should shut down every 9 number seconds, starting after the start. logg.attach(&log_data, logInerval); - //flowCtl.attach(&flowControl, 1); + //flowCtl.attach(&flowControl, 3); //** end of initalization **//