Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: ADS1115 BME280 CronoDot SDFileSystem mbed
Fork of Outdoor_UPAS_v1_2_Tboard by
Revision 25:fbf7d44e7da4, committed 2016-04-20
- Comitter:
- caseyquinn
- Date:
- Wed Apr 20 03:36:48 2016 +0000
- Parent:
- 24:e274a34492cf
- Child:
- 26:6aa294d83af4
- Commit message:
- 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
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- 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 **//
