all working version 2.0

Dependencies:   ADS1115 BME280 CronoDot SDFileSystem mbed

Fork of Outdoor_UPAS_v1_2_powerfunction by scott kelleher

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