scott kelleher / Outdoor_UPAS_v1_2_powerfunction

Dependencies:   ADS1115 BME280 CronoDot SDFileSystem mbed

Fork of Outdoor_UPAS_v1_2_Tboard by scott kelleher

Files at this revision

API Documentation at this revision

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 **//