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_powerfunction by
Diff: main.cpp
- Revision:
- 57:1695e252298d
- Parent:
- 56:49387b72460e
- Child:
- 58:3233c10a668c
--- a/main.cpp Fri May 20 15:36:07 2016 +0000
+++ b/main.cpp Fri May 20 18:27:55 2016 +0000
@@ -1,20 +1,9 @@
#include "mbed.h"
#include "SDFileSystem.h"
#include "Adafruit_ADS1015.h"
-#include "MCP40D17.h"
-#include "STC3100.h"
-#include "LSM303.h"
#include "BME280.h"
-#include "SI1145.h"
-#include "NCP5623BMUTBG.h"
#include "CronoDot.h"
-#include "EEPROM.h"
-#include "Calibration.h"
-#include "MAX_M8.h"
-//#include "DRV8830.h"
-#include "Tb_SD_Reader.h"
-#include <vector>
-#include <string>
+
//Edit for fork
/////////////////////////////////////////////
@@ -22,89 +11,32 @@
/////////////////////////////////////////////
I2C i2c(PB_9, PB_8);//(D14, D15); SDA,SCL
Serial pc(USBTX, USBRX);
-DigitalOut pumps(PA_9, 0);//(D8, 0);
-DigitalOut pbKill(PC_12, 1); // Digital input pin that conncect to the LTC2950 battery charger used to shutdown the UPAS
-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
-MCP40D17 DigPot(&i2c);
BME280 bmesensor(PB_9, PB_8);//(D14, D15);
-NCP5623BMUTBG RGB_LED(PB_9, PB_8);//(D14, D15);
CronoDot RTC_UPAS(PB_9, PB_8);//(D14, D15);
-EEPROM E2PROM(PB_9, PB_8);//(D14, D15);
-Calibration calibrations(1); //Default serial/calibration if there are no values for the selected option
-
-
-/////////////////////////////////////////////
-//RN4677 BT/BLE Module
-/////////////////////////////////////////////
-Serial microChannel(PB_10, PB_11); // tx, rx
-DigitalOut bleRTS(PB_14, 0);
-DigitalOut bleCTS(PB_13, 0);
-DigitalOut BT_IRST(PC_8, 0);
-DigitalOut BT_SW(PA_12, 0);
/////////////////////////////////////////////
//Analog to Digital Converter
/////////////////////////////////////////////
Adafruit_ADS1115 ads(&i2c);
+//Adafruit_ADS1115 ads2(&i2c, 0x49);
//DigitalIn ADS_ALRT(PA_10); //Connected but currently unused. (ADS1115) http://www.ti.com/lit/ds/symlink/ads1115.pdf
-/////////////////////////////////////////////
-//Battery Monitoring
-/////////////////////////////////////////////
-STC3100 gasG(PB_9, PB_8);//(D14, D15); // http://www.st.com/web/en/resource/technical/document/datasheet/CD00219947.pdf
-InterruptIn bcs1(PC_9); //Charge complete if High. Connected but currently unused. (MCP73871) http://www.mouser.com/ds/2/268/22090a-52174.pdf
-InterruptIn bcs2(PA_8); //Batt charging if High. Connected but currently unused. (MCP73871) http://www.mouser.com/ds/2/268/22090a-52174.pdf
-/////////////////////////////////////////////
-//Accelerometer and Magnometer
-/////////////////////////////////////////////
-LSM303 movementsensor(PB_9, PB_8);//(D14, D15); // http://www.st.com/web/en/resource/technical/document/datasheet/DM00027543.pdf
-//DigitalIn ACC_INT1(PC_7); //Connected but currently unused. (LSM303)
-//DigitalIn ACC_INT2(PC_6); //Connected but currently unused. (LSM303)
-//DigitalIn ACC_DRDY(PC_11); //Connected but currently unused. (LSM303)
-
-/////////////////////////////////////////////
-//UV and Visible Light Sensor
-/////////////////////////////////////////////
-SI1145 lightsensor(PB_9, PB_8);//(D14, D15);
-//DigitalIn UV_INT(PD_2); //Connected but currently unused nor configured (interupt). (SI1145) https://www.silabs.com/Support%20Documents/TechnicalDocs/Si1145-46-47.pdf
-
-/////////////////////////////////////////////
-//GPS
-/////////////////////////////////////////////
-DigitalOut gpsEN(PB_15, 0);
-Max_M8 gps(PB_9, PB_8,(0x84));
-
-/*
-/////////////////////////////////////////////
-//Hbridge Valve Control
-/////////////////////////////////////////////
-DRV8830 schoolF1(PB_9, PB_8, 0xC4); //Work/School Filter A HB1
-DRV8830 homeF2(PB_9, PB_8, 0xCA); //Home Filter B HB2
-DRV8830 transitF3(PB_9, PB_8, 0xCC); //Transit Filter C HB3
-DRV8830 blankF4(PB_9, PB_8, 0xCE); //Blank Filter D HB4
-DigitalIn hb1_school(PA_6);
-DigitalIn hb2_home(PA_7);
-DigitalIn hb3_transit(PA_5);
-DigitalIn hb4_blank(PA_4);
-*/
/////////////////////////////////////////////
//SD Card
/////////////////////////////////////////////
-char filename[] = "/sd/MS000LOG_000000_000000_000000_000000_---------------_xxx.txt";
-SDFileSystem sd(PB_5, PB_4, PB_3, PB_6, "sd");//(D4, D5, D3, D10, "sd"); // (MOSI, MISO, SCK, SEL)
-Tb_SD_Reader sdReader;
-DigitalIn sdCD(PA_11, PullUp);
+char filename[] = "/sd/SHARP_LOG00.txt";
+SDFileSystem sd(D11, D12, D13, D10, "sd"); // (MOSI, MISO, SCK, SEL)
+//DigitalIn sdCD(PA_11, PullUp);
/////////////////////////////////////////////
//Callbacks
/////////////////////////////////////////////
-Ticker stop; //This is the stop callback object
Ticker logg; //This is the logging callback object
-Ticker flowCtl; //This is the control loop callback object
+
/////////////////////////////////////////////
//Varible Definitions
@@ -129,458 +61,33 @@
float press;
float temp;
float rh;
-
-int uv;
-int vis;
-int ir;
-
-float compass;
-float accel_x;
-float accel_y;
-float accel_z;
-float accel_comp;
-float angle_x;
-float angle_y;
-float angle_z;
-float mag_x;
-float mag_y;
-float mag_z;
+float atmoRho; //g/L
+int logInerval = 5;//seconds
-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
-int logInerval = 5;//seconds
-double secondsD = 0;
-double lastsecondD = 0;
-float massflowSet;
-float deltaVflow = 0.0;
-float deltaMflow = 0.0;
-float gainFlow;
-float sampledVol; //L, total sampled volume
-
-int digital_pot_setpoint = 30; //min = 0x7F, max = 0x00
-int digital_pot_set;
-int digital_pot_change;
-int digitalpotMax = 127;
-int digitalpotMin = 10;
+DigitalOut sharp1LED(D7, 1);
+DigitalOut sharp2LED(D6, 1);
+DigitalOut sharp3LED(D5, 1);
+DigitalOut sharp4LED(D4, 1);
-//int dutyUp;
-//int dutyDown;
-int dutycycleSecOn;
-int dutyCycleI;
-
-bool gpsFix;
-uint8_t gpssatellites = 0;
-double gpsspeed = 0.0;
-double gpscourse = 0.0;
-double gpslatitude = 0.0;
-double gpslongitude = 0.0;
-float gpsaltitude = 0.0;
-long gpsTime;
-long gpsDate;
-
-float home_lat = 40.00000; //40.580508;
-float home_lon = -105.000000; //-105.081823;
-float home_lat2 = 40.00000; //40.580508;
-float home_lon2 = -105.000000; //-105.081823;
-float work_lat = 40.100000; //40.594062; //40.569136;
-float work_lon = -105.100000; //-105.075683; //-105.081966;
-int location = 0;
+int samplingTime = 280;
+int deltaTime = 40;
+int sharp1, sharp2, sharp3, sharp4;
+float sharpVolt1, sharpVolt2, sharpVolt3, sharpVolt4; //V
-float homeDistance = 99999;
-float home2Distance = 99999;
-float workDistance = 99999;
-
-//*************************************************//
-
-void sendData();
-void Read_File();
-int file_copy(const char *src, const char *dst);
-//void Read_File(char[]);
-void pc_recv(){
- while(pc.readable()){
- pc.getc();
- }
-}
-static uint8_t rx_buf[20];
-static uint8_t rx_len=0;
-static int haltBLE = 1;
-static int transmissionValue = 0;
-uint8_t writeData[20] = {0,};
-static uint8_t dataLength = 0;
-static int runReady = 0;
-static uint8_t startAndEndTime[12] = {0,};
-static uint8_t fileTransferLock = 0;
-static uint8_t transmissionStopLock = 1;
//////////////////////////////////////////////////////////////
-//BLE Functions
+//SD Logging Function
//////////////////////////////////////////////////////////////
-
-void uartMicro(){
-
- if(runReady!=1){
- haltBLE = 2;
- while(microChannel.readable()){
- rx_buf[rx_len++] = microChannel.getc();
-
- //Code block to verify what is being transmitted. To function correctly, all data must terminate with \0 or \n
- if(transmissionValue==0){
-
- if (rx_buf[0] == 0x01)transmissionValue = 1; //rtc
- else if(rx_buf[0] == 0x02)transmissionValue = 2; //sample start and end times
- else if(rx_buf[0] == 0x03)transmissionValue = 3; //sample name
- else if(rx_buf[0] == 0x04)transmissionValue = 4; //Send Data Check
-
- else if(rx_buf[0] == 0x05)transmissionValue = 5; //log interval
- 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] == 0x0B)transmissionValue = 11; //GPS Coordinates (Second Set)
- else if(rx_buf[0] == 0x0C)transmissionValue = 12; //Cartridge ID
- else if(rx_buf[0] == 0x0D)transmissionValue = 13; //Duty Cycle
- else if (rx_buf[0] == 0x0F)transmissionValue = 15; //BT TRANSFER TEST
- //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 || transmissionValue==15){
- if((transmissionValue == 1 || transmissionValue == 2 || transmissionValue == 3 || transmissionValue == 4 || transmissionValue == 5 ||
- transmissionValue == 6 || transmissionValue == 7 || transmissionValue ==10 || transmissionValue ==11 || transmissionValue ==12) && rx_buf[rx_len-1] != 0xff)
- {}else{
- if(transmissionValue == 4 ) sendData();
- if(transmissionValue == 15){
- if(fileTransferLock==0){
- fileTransferLock=1;
- //Read_File(fileTest);
- Read_File();
- fileTransferLock=0;
- RGB_LED.set_led(1,1,1);
- }
- }
- if((transmissionValue == 10 && dataLength<17)||(transmissionValue == 11 && dataLength<9))transmissionStopLock=0;
- else transmissionStopLock=1;
- if(transmissionValue == 8){
- runReady = 1;
- microChannel.attach(NULL,microChannel.RxIrq);
- }
- if(transmissionStopLock==1){
- haltBLE = 1;
- transmissionValue = 0;
- dataLength = 0;
- }
- }
- }
- }
-
- if(haltBLE!=1){
-
- if((transmissionValue!=100) && (dataLength!= 0)) writeData[dataLength-1] = rx_buf[0];
-
- if(transmissionValue ==100){
- pc.putc(rx_buf[0]);
-
- }else if(transmissionValue ==1){ //process and store RTC values
-
- //if(dataLength==6)RTC_UPAS.set_time(writeData[0],writeData[1],writeData[2],writeData[3],writeData[3],writeData[4],writeData[5]);//sets chronodot RTC
- if(dataLength==6){
- RTC_UPAS.set_time(writeData[0],writeData[1],writeData[2],writeData[3],writeData[3],writeData[4],writeData[5]);//sets chronodot RTC
- ///////////////////////
- //sets ST RTC
- //////////////////////
- STtime.tm_sec = writeData[0]; // 0-59
- STtime.tm_min = writeData[1]; // 0-59
- STtime.tm_hour = writeData[2]; // 0-23
- STtime.tm_mday = writeData[3]; // 1-31
- STtime.tm_mon = writeData[4]-1; // 0-11
- STtime.tm_year = 100+writeData[5]; // year since 1900 (116 = 2016)
- time_t STseconds = mktime(&STtime);
- set_time(STseconds); // Set RTC time
- }
-
- }
- else if(transmissionValue ==2){ //process and store sample start/end
- if(dataLength ==12)E2PROM.write(0x00015, writeData, 12);
-
- }else if(transmissionValue ==3){ //process and store sample name
- if(dataLength ==15)E2PROM.write(0x00001,writeData,15);
-
- }else if(transmissionValue ==5){ //process and store Log Interval
- if(dataLength ==1)E2PROM.write(0x00014,writeData,1);
-
- }else if(transmissionValue ==6){ //process and store Flow Rate
- if(dataLength ==4)E2PROM.write(0x00010,writeData,4);
-
- }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);
- }else if (transmissionValue == 11){
- if(dataLength == 8)E2PROM.write(0x00060,writeData,8);
- }else if (transmissionValue == 12){
- if(dataLength == 3)E2PROM.write(0x00070,writeData,3);
- }else if (transmissionValue == 13){
- if(dataLength == 3)E2PROM.write(0x00076,writeData,3);
- }
-
- dataLength++;
- }
-
- rx_len = 0;
- }else{
- while(microChannel.readable())
- uint8_t extract = microChannel.getc();
- }
-
-
-}
-
-void sendData(){
-
- //First byte is designator for the App
- uint8_t sampleTimePassValues[13] = {0x01,0x00,0x00,0x0A,0x01,0x01,0x10,0x00,0x00,0x0A,0x01,0x01,0x10};
- uint8_t subjectLabelOriginal[16] = {0x02,0x52,0x45,0x53,0x45,0x54,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x5F,0x0F};
- uint8_t dataLogOriginal[2] = {0x03,0x0A,};
- uint8_t flowRateOriginal[5] = {0x04,0x00,0x00,0x80,0x3F};
- uint8_t serialBytes[3] = {0x07,0x00,0x00};
- uint8_t latLongSchoolOriginal[17] = {0x0A,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F};
- uint8_t latLongHome2[9] = {0x0B,0x00,0x00,0x80,0x3F,0x00,0x00,0x80,0x3F};
- uint8_t cartridgeIDOriginal[4] = {0x0C,0x48,0x48,0x48};
- uint8_t dutyCycleOriginal[4] = {0x0D,0x31,0x30,0x30};
- //uint8_t transfer_fileName[62] = {0x0E, 0x4d, 0x53, 0x30, 0x30, 0x30, 0x30, 0x4c, 0x4f, 0x47, 0x5f, 0x30, 0x30, 0x2d, 0x30, 0x30, 0x2d, 0x30, 0x30, 0x5f, 0x30, 0x30, 0x3d, 0x30, 0x30, 0x3d, 0x30, 0x30, 0x5f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5f, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5f, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2d, 0x2e, 0x74, 0x78, 0x74};
- // 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
- uint8_t TERMINATE_BYTE[1] = {0xff,}; //used for compatibility with android app
-
- //NEW EEPROM Check bit = 0x75
- E2PROM.read(0x00075,NEW_EEPROM_CHECK,1);
-
- if(NEW_EEPROM_CHECK[0] == 0x0C){ //increment when you add a new parameter to pass to app
- E2PROM.read(0x00015, sampleTimePassValues+1, 12);
- E2PROM.read(0x00001, subjectLabelOriginal+1,15);
- E2PROM.read(0x00014,dataLogOriginal+1,1);
- E2PROM.read(0x00010,flowRateOriginal+1,4);
- E2PROM.read(0x00034,serialBytes+1,2);
- E2PROM.read(0x00050,latLongSchoolOriginal+1,16);
- E2PROM.read(0x00060,latLongHome2+1,8);
- E2PROM.read(0x00070,cartridgeIDOriginal+1,3);
- E2PROM.read(0x00076,dutyCycleOriginal+1,3);
-
- }else{
- NEW_EEPROM_CHECK[0] = 0x0C; //increment as well
- E2PROM.write(0x00075,NEW_EEPROM_CHECK,1);
- E2PROM.write(0x00015, sampleTimePassValues+1, 12);
- E2PROM.write(0x00001, subjectLabelOriginal+1,15);
- E2PROM.write(0x00014,dataLogOriginal+1,1);
- E2PROM.write(0x00010,flowRateOriginal+1,4);
- E2PROM.write(0x00034,serialBytes+1,2);
- E2PROM.write(0x00050,latLongSchoolOriginal+1,16);
- E2PROM.write(0x00060,latLongHome2+1,8);
- E2PROM.write(0x00070,cartridgeIDOriginal+1,3);
- E2PROM.write(0x00076,dutyCycleOriginal+1,3);
- }
-
-
- for(int i=0; i<13; i++){
- microChannel.putc(sampleTimePassValues[i]);
- }
- wait(.15);
-
- for(int i=0; i<16; i++){
- microChannel.putc(subjectLabelOriginal[i]);
- }
- wait(.15);
-
- for(int i=0; i<2; i++){
- microChannel.putc(dataLogOriginal[i]);
- }
- wait(.15);
-
- for(int i=0; i<5; i++){
- microChannel.putc(flowRateOriginal[i]);
- }
- wait(.15);
-
- for(int i=0;i<17;i++){
- microChannel.putc(latLongSchoolOriginal[i]);
- }
- wait(.15);
-
- for(int i=0;i<9;i++){
- microChannel.putc(latLongHome2[i]);
- }
- wait(.15);
- for(int i=0;i<4;i++){
- microChannel.putc(cartridgeIDOriginal[i]);
- }
- wait(.15);
- for(int i=0;i<4;i++){
- microChannel.putc(dutyCycleOriginal[i]);
- }
- wait(.15);
- microChannel.putc(TERMINATE_BYTE[0]);
-
-
-}
-void Read_File(){
-//void Read_File(char filename[]){
-
- char transfer_fileName[] = "MS000LOG_000000_000000_000000_000000_---------------_xxx.txt";
- char transfer_fileNamedir[] = "/sd/MS000LOG_000000_000000_000000_000000_---------------_xxx.txt";
- //char transfer_fileNamedirCopy[] = "/sd/c/MS000LOG_000000_000000_000000_000000_---------------_xxx.txt";
-
-
- vector<string> filenames; //filenames are stored in a vector string
- DIR *dp;
- struct dirent *dirp;
- dp = opendir("/sd");
- //read all directory and file names in current directory into filename vector
-
- while((dirp = readdir(dp)) != NULL) {
-
- if (strcmp(dirp->d_name, ".txt") )
- {
- filenames.push_back(string(dirp->d_name));
- } else {}
- }
- closedir(dp);
- vector<string>::iterator it;
-
-
-
- for(it=filenames.begin(); it < filenames.end(); it++) {
- // string str ((*it).c_str());
-
- if((*it).substr((*it).length()-3) == "txt"){
- //if(((it - filenames.begin())+1) == 1){
- pc.printf("%d: %s\r\n", ((it - filenames.begin())+1), (*it).c_str());
- sprintf(transfer_fileName, "%s", (*it).c_str());
- sprintf(transfer_fileNamedir, "/sd/%s", (*it).c_str());
- //sprintf(transfer_fileNamedirCopy, "/sd/c/%s", (*it).c_str());
- //pc.printf("%s", transfer_fileNamedirCopy);
- FILE *fp = fopen(transfer_fileNamedir, "r");
- if(fp == NULL) {
- pc.printf("Could not open file, check disk.\r\n");
- //while(1) {};
- } else {
- pc.printf("file opened\r\n");
- }
- unsigned char c;
- uint8_t sendMe[1] = {254};
- RGB_LED.set_led(0,1,0);
- //pc.printf("%s\r\n",fp.c_str());
- microChannel.putc(sendMe[0]);
- for(int i=0;i<60;i++){
- microChannel.putc(transfer_fileName[i]);
- }
- while (c != 255){ // while not end of file or forever
- c=fgetc(fp); // get a character/byte from the file
- //printf("%c",c); // and show it in hex format
- microChannel.putc(c);
- //wait(0.005);
- }
- //RGB_LED.set_led(1,0,0);
- printf("\r\n");
- fclose(fp);
-
- //int status = file_copy(transfer_fileNamedir, transfer_fileNamedirCopy);
- remove(transfer_fileNamedir);
- //break; // close the file
- }else{
- //pc.printf("%d: %s\r\n", ((it - filenames.begin())+1), (*it).c_str());
- }
-
- }
-
-
-
-};
-
-int file_copy(const char *src, const char *dst)
+void log_data()
{
- int retval = 0;
- int ch;
-
- FILE *fpsrc = fopen(src, "r"); // src file
- FILE *fpdst = fopen(dst, "w"); // dest file
-
- while (1) { // Copy src to dest
- ch = fgetc(fpsrc); // until src EOF read.
- if (ch == EOF) break;
- fputc(ch, fpdst);
- }
- fclose(fpsrc);
- fclose(fpdst);
-
- fpdst = fopen(dst, "r"); // Reopen dest to insure
- if (fpdst == NULL) { // that it was created.
- retval = -1; // Return error.
- } else {
- fclose(fpdst);
- retval = 0; // Return success.
- }
- return retval;
-};
-
-//////////////////////////////////////////////////////////////
-// GPS: Calculate distance from target location
-//////////////////////////////////////////////////////////////
-double GPSdistanceCalc (float tlat, float tlon)
-{
-
-float tlatrad, flatrad;
-float sdlong, cdlong;
-float sflat, cflat;
-float stlat, ctlat;
-float delta, denom;
-
- double distance;
- delta = (gpslongitude-tlon)*0.0174532925;
- sdlong = sin(delta);
- cdlong = cos(delta);
- flatrad = (gpslatitude)*0.0174532925;
- tlatrad = (tlat)*0.0174532925;
- sflat = sin(flatrad);
- cflat = cos(flatrad);
- stlat = sin(tlatrad);
- ctlat = cos(tlatrad);
- delta = (cflat * stlat) - (sflat * ctlat * cdlong);
- delta = pow(delta,2);
- delta += pow(ctlat * sdlong,2);
- delta = sqrt(delta);
- denom = (sflat * stlat) + (cflat * ctlat * cdlong);
- delta = atan2(delta, denom);
- distance = delta * 6372795;
- return distance;
-}
-
-//////////////////////////////////////////////////////////////
-//Time Comparison Function
-//////////////////////////////////////////////////////////////
-bool timecompare(uint8_t t_sec, uint8_t t_minutes, uint8_t t_hour, uint8_t t_date, uint8_t t_month, uint8_t t_year)
-{
-
- time_t seconds = time(NULL);
- //strftime(timestr, 32, "%y%m%d%H%M%S", localtime(&seconds));
-
+ //Get RTC time(s)
+ ///////////////////////////
+ RTC_UPAS.get_time();
+ time_t seconds = time(NULL);
+ strftime(timestr, 32, "%y%m%d%H%M%S", localtime(&seconds));
+/*
strftime(yrstr, 4, "%y", localtime(&seconds));
stYr = atoi(yrstr);
@@ -598,234 +105,49 @@
strftime(secstr, 4, "%S", localtime(&seconds));
stSec = atoi(secstr);
-
- if(t_year != stYr){
- return t_year < stYr;
- }
- if(t_month != stMo){
- return t_month < stMo;
- }
- if(t_date != stDay){
- return t_date < stDay;
- }
- if(t_hour != stHr){
- return t_hour < stHr;
- }
- if(t_minutes != stMin){
- return t_minutes < stMin;
- }
- return t_sec < stSec;
-
-}
-
-
-//////////////////////////////////////////////////////////////
-//Shutdown Function
-//////////////////////////////////////////////////////////////
-void check_stop() // this checks if it's time to stop and shutdown
-{
-
- if(timecompare(startAndEndTime[6], startAndEndTime[7], startAndEndTime[8], startAndEndTime[9], startAndEndTime[10], startAndEndTime[11])) {
- pbKill = 0; // this is were we shut everything down
- //pc.printf("If you're reading this something has gone very wrong.");
- }
-
-}
-
-//////////////////////////////////////////////////////////////
-//SD Logging Function
-//////////////////////////////////////////////////////////////
-void log_data()
-{
- //Get RTC time(s)
- ///////////////////////////
- RTC_UPAS.get_time();
- time_t seconds = time(NULL);
- strftime(timestr, 32, "%y%m%d%H%M%S", localtime(&seconds));
-
- strftime(yrstr, 4, "%y", localtime(&seconds));
- stYr = atoi(yrstr);
-
- strftime(mostr, 4, "%m", localtime(&seconds));
- stMo = atoi(mostr);
-
- strftime(daystr, 4, "%d", localtime(&seconds));
- stDay = atoi(daystr);
-
- strftime(hrstr, 4, "%H", localtime(&seconds));
- stHr = atoi(hrstr);
-
- strftime(minstr, 4, "%M", localtime(&seconds));
- stMin = atoi(minstr);
-
- strftime(secstr, 4, "%S", localtime(&seconds));
- stSec = atoi(secstr);
-
+*/
//pc.printf("%s,%s,%d,%s,%d,%s,%d,%s,%d,%s,%d,%s,%d\r\n", timestr,yrstr,stYr,mostr,stMo,daystr,stDay,hrstr,stHr,minstr,stMin,secstr,stSec);
- /////////////////////////////
- ///Dutycycle
- ////////////////////////////
- if(stSec >= dutycycleSecOn && pumps == 1){
- pumps = 0;
- }
- else if(stSec < dutycycleSecOn && pumps == 0) {
- pumps = 1;
- }
//Get Sensor Data except GPS
////////////////////////////
press = bmesensor.getPressure();
temp = bmesensor.getTemperature()-5.0;
rh = bmesensor.getHumidity();
- uv = lightsensor.getUV();
- movementsensor.getACCEL();
- movementsensor.getCOMPASS();
- compass = movementsensor.getCOMPASS_HEADING();
- accel_x = movementsensor.AccelData.x;
- accel_y = movementsensor.AccelData.y;
- accel_z = movementsensor.AccelData.z;
- accel_comp = pow(accel_x,(float)2)+pow(accel_y,(float)2)+pow(accel_z,(float)2)-1.0;
- mag_x = movementsensor.MagData.x;
- mag_y = movementsensor.MagData.y;
- mag_z = movementsensor.MagData.z;
- vInReadingLast = vInReading;
- vInReading = ads.readADC_SingleEnded(1, 0xD583); // read channel 0
- amps = gasG.getAmps();
- bVolt = gasG.getVolts();
- bFuel = gasG.getCharge();
+ 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));
- //Check for fully charged battery
- if(bVolt > 1750 && amps > 8191) {
- RGB_LED.set_led(0,0,0);
- //RGB_LED.set_led(0,1,0);
- //Check for battery with ~2 hours left of runtime at 2lpm to remind user to plug in sampler
- }else if(amps > 8191 && bVolt < 1500) {
- if(ledOn) {
- RGB_LED.set_led(0,0,0);
- ledOn = 0;
- }else {
- RGB_LED.set_led(1,0,0);
- ledOn = 1;
- }
- //No LED on when not low battery and not fully charged
- }else{
- RGB_LED.set_led(0,0,0);
- }
-
+ sharp1LED = 0;
+ sharp2LED = 0;
+ sharp3LED = 0;
+ sharp4LED = 0;
- // Get GPS Data
- //////////////////////////////
- //if(gpsEN ==1){
-
- gpsFix = gps.read(1);
- gpsspeed = gps.speed;
- //gpscourse = gps.course;
- gpssatellites = gps.satellites;
- gpslatitude = gps.lat;
- gpslongitude = gps.lon;
- gpsaltitude = gps.altitude;
- gpsTime = (long)gps.utc;
- gpsDate = (long)gps.date;
- //}
-
- //Check for 3.3V rail cut out and turn off pumps in this event
- if(vInReading > 5950 && amps > 8191) {
- pumps = 0;
- wait(1);
- //Turn pumps back on once the sampler is plugged in and charging after pumps shutoff and 3.3V rail drops out
- } else if(pumps == 0 && amps < 8191) {
- //pumps = 1;
- }
-
-
+ wait_ms(samplingTime);
- if(pumps == 1){
- omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
- omronVolt = (omronReading*4.096)/(32768*1);
-
- 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
- /*
- omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
- omronVolt = (omronReading*4.096)/(32768*1);
- vBlowerReading = ads.readADC_SingleEnded(2, 0xE783); // read channel 0
- omronDiff = ads.readADC_Differential(0x8583); // differential channel 2-3
-
- 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;
- }
+ sharp1 = ads.readADC_SingleEnded(0, 0xC383); // read channel 1
+ sharpVolt1 = (sharp1*4.096)/(32768*1);
+ sharp2 = ads.readADC_SingleEnded(1, 0xD383); // read channel 1
+ sharpVolt2 = (sharp2*4.096)/(32768*1);
+ sharp3 = ads.readADC_SingleEnded(2, 0xE383); // read channel 1
+ sharpVolt3 = (sharp3*4.096)/(32768*1);
+ sharp4 = ads.readADC_SingleEnded(3, 0xF383); // read channel 1
+ sharpVolt4 = (sharp4*4.096)/(32768*1);
- 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;
-
- if(abs(deltaMflow)>.025) {
- digital_pot_change = (int)(gainFlow*deltaMflow);
-
+ wait_ms(deltaTime);
- if(abs(digital_pot_change)>=10) {
- digital_pot_set = (int)(digital_pot_set+ (int)(1*deltaMflow));
- //RGB_LED.set_led(1,0,0);
- } else {
- digital_pot_set = (digital_pot_set+ digital_pot_change);
- //RGB_LED.set_led(1,1,0);
- }
-
- if(digital_pot_set>=digitalpotMax) {
- digital_pot_set = digitalpotMax;
- //RGB_LED.set_led(1,0,0);
- } else if(digital_pot_set<=digitalpotMin) {
- digital_pot_set = digitalpotMin;
- //RGB_LED.set_led(1,0,0);
- }
-
- DigPot.writeRegister(digital_pot_set);
-
- } else {
- //RGB_LED.set_led(0,1,0);
- }
- */
-
- }
+ sharp1LED = 1;
+ sharp2LED = 1;
+ sharp3LED = 1;
+ sharp4LED = 1;
FILE *fp = fopen(filename, "a");
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);
fprintf(fp, "%s,", timestr);
- 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,amps);
- fprintf(fp, "%d,%d,%d,%1.3f,%1.3f,", bVolt, bFuel,digital_pot_set, deltaMflow, deltaVflow);
- fprintf(fp, "%f,%f,%06d,%06d,", gpslatitude, gpslongitude, gpsDate, gpsTime);
- //fprintf(fp, "%f,%d,%f,%f,%d,", gpsspeed, gpssatellites, gpscourse, gpsaltitude, gpsFix);
- fprintf(fp, "%f,%d,%f,%d,", gpsspeed, gpssatellites, gpsaltitude, gpsFix);
- fprintf(fp, "%d,%d\r\n", dutyCycleI, pumps == 1); // test and add in speed, etc that Josh added in to match the adafruit GPS
- fclose(fp);
+ fprintf(fp, "%2.2f,%4.2f,%2.1f,%1.3f,", temp,press,rh,atmoRho);
+ fprintf(fp, "%d,%f,%d,%f," ,sharp1,sharpVolt1, sharp2, sharpVolt2);
+ fprintf(fp, "%d,%f,%d,%f\r\n" ,sharp3,sharpVolt3, sharp4, sharpVolt4);
+ fclose(fp);
free(fp);
@@ -835,270 +157,36 @@
}
-//////////////////////////////////////////////////////////////
-//Flow Control Function
-//////////////////////////////////////////////////////////////
-void flowControl()
-{
- if(pumps == 1){
- //RGB_LED.set_led(1,1,1);
- omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
- omronVolt = (omronReading*4.096)/(32768*1);
-
- 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;
-
- if(abs(deltaMflow)>.025) {
- digital_pot_change = (int)(gainFlow*deltaMflow);
-
-
- if(abs(digital_pot_change)>=10) {
- digital_pot_set = (int)(digital_pot_set+ (int)((2/volflowSet)*deltaMflow));
- //RGB_LED.set_led(1,0,0);
- } else {
- digital_pot_set = (digital_pot_set+ digital_pot_change);
- //RGB_LED.set_led(1,1,0);
- }
-
- if(digital_pot_set>=digitalpotMax) {
- digital_pot_set = digitalpotMax;
- //RGB_LED.set_led(1,0,0);
- } else if(digital_pot_set<=digitalpotMin) {
- digital_pot_set = digitalpotMin;
- //RGB_LED.set_led(1,0,0);
- }
-
- DigPot.writeRegister(digital_pot_set);
-
- } else {
- //RGB_LED.set_led(0,1,0);
- }
- }
-}
//////////////////////////////////////////////////////////////
//Main Function
//////////////////////////////////////////////////////////////
int main(){
- RGB_LED.set_led(0,0,1);
-
-
- /*
- while(1){
- if(sdCD == 0){
- RGB_LED.set_led(0,1,0);
- }else{
- RGB_LED.set_led(1,0,0);
- }
-
- wait(10);
- }
-
-*/
-
-
- gpsEN = 1;
- wait(1);
- BT_SW = 1;
- wait(1);
- BT_IRST = 1;
- wait(1);
-
-
+
pc.baud(115200); // set what you want here depending on your terminal program speed
pc.printf("\f\n\r-------------Startup-------------\n\r");
wait(0.5);
-
-
- uint8_t serialNumberAndType[6] = {0x50,0x53,}; //ex) PS0018 // 0x50,0x53 <- ASCII 80 + 83 (PS) //0x4d,0x53 <- ASCII 77 + 83 (MS)
- E2PROM.read(0x00034,serialNumberAndType+2,2);
-
- int tempSerialNum = ((serialNumberAndType[2]-48)*10 + serialNumberAndType[3]-48);
- if(tempSerialNum < 18){
- serialNumberAndType[0] = 0x4D;
- }
-
- int serialNumDigits[4];
- serialNumDigits[0] = tempSerialNum / 1000 % 10;
- serialNumDigits[1] = tempSerialNum / 100 % 10;
- serialNumDigits[2] = tempSerialNum / 10 % 10;
- serialNumDigits[3] = tempSerialNum % 10;
-
-
- serialNumberAndType[2] = serialNumDigits[0]+48;
- serialNumberAndType[3] = serialNumDigits[1]+48;
- serialNumberAndType[4] = serialNumDigits[2]+48;
- serialNumberAndType[5] = serialNumDigits[3]+48;
-
- /*
- serialNumberAndType[2] = serialNumDigits[0];
- serialNumberAndType[3] = serialNumDigits[1];
- serialNumberAndType[4] = serialNumDigits[2];
- serialNumberAndType[5] = serialNumDigits[3];
- */
-
- RGB_LED.set_led(0,1,0);
-
- pc.attach(pc_recv);
- microChannel.attach(uartMicro,microChannel.RxIrq);
- microChannel.baud(115200);
- microChannel.printf("$$$");
- wait(0.5);
- microChannel.printf("SN,");
- for(int i=0;i<6;i++)microChannel.putc(serialNumberAndType[i]);
- microChannel.printf("\r");
- wait(0.5);
- microChannel.printf("A\r");
- wait(0.5);
- microChannel.printf("---\r");
- wait(0.5);
-
- RGB_LED.set_led(1,1,1);
-
- while(runReady!=1) {
- wait(1);
- pc.printf("Waiting for BLE instruction\r\n");
-
- }
-
- BT_SW = 0;
- wait(1);
- BT_IRST = 0;
- wait(1);
-
-
- E2PROM.read(0x00015, startAndEndTime, 12); //Grab start and end times from EEPROM
- RGB_LED.set_led(0,1,0);
-
-
- //Pull MicroEnviornment Lat/Lons from EEPROM
- // Latitude School EEPROM = 0x50-0x53
- // Longitude School EEPROM = 0x54-0x57
- // Latitude Home EEPROM = 0x58-0x5B
- // Longitude Home EEPROM = 0x5C-0x5F
-
- uint8_t workLat[4] = {0,};
- E2PROM.read(0x00050,workLat,4);
- E2PROM.byteToFloat(workLat, &work_lat);
-
- uint8_t workLon[4] = {0,};
- E2PROM.read(0x00054,workLon,4);
- E2PROM.byteToFloat(workLon, &work_lon);
-
- uint8_t homeLat[4] = {0,};
- E2PROM.read(0x00058,homeLat,4);
- E2PROM.byteToFloat(homeLat, &home_lat);
-
- uint8_t homeLon[4] = {0,};
- E2PROM.read(0x0005C,homeLon,4);
- E2PROM.byteToFloat(homeLon, &home_lon);
-
- uint8_t homeLat2[4] = {0,};
- E2PROM.read(0x00060,homeLat2,4);
- E2PROM.byteToFloat(homeLat2, &home_lat2);
-
- uint8_t homeLon2[4] = {0,};
- E2PROM.read(0x00064,homeLon2,4);
- E2PROM.byteToFloat(homeLon2, &home_lon2);
-
- pc.printf("%f,%f\r\n %f,%f\r\n %f,%f\r\n", home_lat, home_lon, work_lat, work_lon, home_lat2, home_lon2);
-
- //Get the subject line information
- uint8_t subjectLabelOriginal[15] = {0,};
- E2PROM.read(0x00001, subjectLabelOriginal,15);
-
- //Get the cartridge ID information
- uint8_t cartridgeID[3] = {0,};
- E2PROM.read(0x00070, cartridgeID,3);
-
- //Get the dutycycle information
- uint8_t dutycycleStr[3] = {0,};
- E2PROM.read(0x00076, dutycycleStr,3);
- dutyCycleI = ((dutycycleStr[0]-48)*100 + (dutycycleStr[1]-48)*10 + (dutycycleStr[2]-48));
- float dutycycleF = ((float)dutyCycleI/100);
- dutycycleSecOn = (int)(dutycycleF*60);
-
- //wait(1);
- //pc.printf("%s,%d,%f,%d\r\n", dutycycleStr,dutyCycleI,dutycycleF,dutycycleSecOn);
-
- //Get the proper serial number
- uint8_t serialBytes[2] = {0,};
- E2PROM.read(0x00034,serialBytes,2);
- serial_num = (uint16_t)(((serialBytes[0]-48)*10 + serialBytes[1]-48));
-
-
-////////////////////////////////////////////////////////////////////
- //Temporary fix for setting serial_num
-////////////////////////////////////////////////////////////////////
- //uint8_t serialsubjectLabelOriginal[2] = {0,};
- //E2PROM.read(0x00001, serialsubjectLabelOriginal,2);
- //uint8_t newserialBytes[2] = {0,};
-
- if(subjectLabelOriginal[2] == 126){
- E2PROM.write(0x00034,subjectLabelOriginal,2);
- serial_num = (uint16_t)(((subjectLabelOriginal[0]-48)*10 + subjectLabelOriginal[1]-48));
- }
+ RTC_UPAS.set_time(0,0,0,1,1,1,16);//sets chronodot RTC
- //----------------------------------------------
- calibrations.initialize(serial_num);
- pc.printf("%d\r\n", serial_num);
- pc.printf("%f\r\n",calibrations.MF4);
- //----------------------------------------------
-////////////////////////////////////////////////////////////////////
-
-
- uint8_t logByte[1] = {0,};
- E2PROM.read(0x00014,logByte,1);
- logInerval = logByte[0];
-
- //Use the flow rate value stored in eeprom
- uint8_t flowRateBytes[4] = {0,};
- E2PROM.read(0x00010,flowRateBytes,4);
- E2PROM.byteToFloat(flowRateBytes, &volflowSet);
-
+ ///////////////////////
+ //sets ST RTC
+ //////////////////////
+ STtime.tm_sec = 0; // 0-59
+ STtime.tm_min = 0; // 0-59
+ STtime.tm_hour = 0; // 0-23
+ STtime.tm_mday = 1; // 1-31
+ STtime.tm_mon = 0; // 0-11
+ STtime.tm_year = 116; // year since 1900 (116 = 2016)
+ time_t STseconds = mktime(&STtime);
+ set_time(STseconds); // Set RTC time
-
- /*
- while(!gpsFix){
- gpsFix = gps.read(1);
- if(ledOn) {
- RGB_LED.set_led(0,0,0);
- ledOn = 0;
- }else {
- RGB_LED.set_led(1,0,0);
- ledOn = 1;
- }
- wait(1);
- }
- */
-
-
-
- while(!timecompare(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
- wait(0.5);
-
- }
+
RTC_UPAS.get_time();
- gps.read(1);
- gpsTime = (long)gps.utc;
- gpsDate = (long)gps.date;
time_t seconds = time(NULL);
strftime(timestr, 32, "%y-%m-%d-%H=%M=%S", localtime(&seconds));
@@ -1124,130 +212,21 @@
-
- if(tempSerialNum < 18){
- sprintf(filename, "/sd/MS%03dLOG_%02d%02d%02d_%02d%02d%02d_%06d_%06d_%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c_%c%c%c.txt",serial_num,stYr,stMo,stDay,stHr,stMin,stSec,gpsDate,gpsTime,subjectLabelOriginal[0],subjectLabelOriginal[1],subjectLabelOriginal[2],subjectLabelOriginal[3],subjectLabelOriginal[4],subjectLabelOriginal[5],subjectLabelOriginal[6],subjectLabelOriginal[7],subjectLabelOriginal[8],subjectLabelOriginal[9],subjectLabelOriginal[10],subjectLabelOriginal[11],subjectLabelOriginal[12],subjectLabelOriginal[13],subjectLabelOriginal[14],cartridgeID[0],cartridgeID[1],cartridgeID[2]);
-
- }
- else{
- sprintf(filename, "/sd/PS%03dLOG_%02d%02d%02d_%02d%02d%02d_%06d_%06d_%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c_%c%c%c.txt",serial_num,stYr,stMo,stDay,stHr,stMin,stSec,gpsDate,gpsTime,subjectLabelOriginal[0],subjectLabelOriginal[1],subjectLabelOriginal[2],subjectLabelOriginal[3],subjectLabelOriginal[4],subjectLabelOriginal[5],subjectLabelOriginal[6],subjectLabelOriginal[7],subjectLabelOriginal[8],subjectLabelOriginal[9],subjectLabelOriginal[10],subjectLabelOriginal[11],subjectLabelOriginal[12],subjectLabelOriginal[13],subjectLabelOriginal[14],cartridgeID[0],cartridgeID[1],cartridgeID[2]);
-
- }
- //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);
- FILE *fp = fopen(filename, "w");
- fclose(fp);
-
- RGB_LED.set_led(1,0,1);
-
- if(volflowSet<=1.0) {
- gainFlow = 100;
- } else if(volflowSet>=2.0) {
- gainFlow = 25;
- } else {
- gainFlow = 25;
- }
+ // sprintf(filename,"/sd/SHARP_LOG00.txt");
+
+ for (uint8_t i = 0; i < 100; i++) {
+ filename[13] = i/10 + '0';
+ filename[14] = i%10 + '0';
+ FILE *fp = fopen(filename, "r");
+ if (fp == NULL) {
+ // only open a new file if it doesn't exist
+ FILE *fp = fopen(filename, "w");
+ fclose(fp);
+ break; // leave the loop!
+ }
+ }
- press = bmesensor.getPressure();
- temp = bmesensor.getTemperature();
- rh = bmesensor.getHumidity();
-
- 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));
- massflowSet = volflowSet*atmoRho;
-
- DigPot.writeRegister(digital_pot_setpoint);
- wait(1);
- pumps = 1;
- //pumpOn = 1;
-
-
- if(volflowSet<=1.0) {
- gainFlow = 100;
- } else if(volflowSet>=2.0) {
- gainFlow = 25;
- } else {
- gainFlow = 25;
- }
-
- RGB_LED.set_led(1,0,0);
- press = bmesensor.getPressure();
- temp = bmesensor.getTemperature();
- rh = bmesensor.getHumidity();
-
- 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));
- massflowSet = volflowSet*atmoRho;
-
- //Digtal pot tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
- digital_pot_setpoint = (int)floor(calibrations.DP4*pow(massflowSet,4)+calibrations.DP3*pow(massflowSet,3)+calibrations.DP2*pow(massflowSet,2)+calibrations.DP1*massflowSet+calibrations.DP0); //min = 0x7F, max = 0x00
-
- if(digital_pot_setpoint>=digitalpotMax) {
- digital_pot_setpoint = digitalpotMax;
- } else if(digital_pot_setpoint<=digitalpotMin) {
- digital_pot_setpoint = digitalpotMin;
- }
- pc.printf("%d\r\n", digital_pot_setpoint);
- DigPot.writeRegister(digital_pot_setpoint);
- wait(1);
- pumps = 1;
-
-
-
- omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
- omronVolt = (omronReading*4.096)/(32768*1);
- 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;
- }
- deltaMflow = massflow-massflowSet;
- digital_pot_set = digital_pot_setpoint;
- wait(5);
-
- //---------------------------------------------------------------------------------------------//
- //Sets the flow withen +-1.5% of the desired flow rate based on mass flow
-
- while(abs(deltaMflow)>.025) {
-
- omronReading = ads.readADC_SingleEnded(0, 0xC383); // read channel 0 PGA = 2 : Full Scale Range = 2.048V
- omronVolt = (omronReading*4.096)/(32768*1);
- pc.printf("%d,%f\r\n", omronReading, omronVolt);
- //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx
- 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;
- pc.printf("%f\r\n", volflow);
- massflowSet = volflowSet*atmoRho;
- deltaMflow = massflow-massflowSet;
-
- digital_pot_set = (int)(digital_pot_set+(int)((gainFlow*deltaMflow)));
- if(digital_pot_set>=digitalpotMax) {
- digital_pot_set = digitalpotMax;
- } else if(digital_pot_set<=digitalpotMin) {
- digital_pot_set = digitalpotMin;
- }
-
- wait(2);
- DigPot.writeRegister(digital_pot_set);
- pc.printf("%d,\r\n", digital_pot_set);
- wait(1);
-
-
- }
- //pumps = 0;
- sampledVol = 0.0;
- RGB_LED.set_led(0,1,0);
- wait(1);
- RGB_LED.set_led(0,0,0);
while(fmod((double)stSec,10)!=0) {
//pc.printf("%f, %f\r\n", floor(secondsD), floor(lastsecondD));
@@ -1257,10 +236,8 @@
wait_ms(100);
}
- logg.attach(&log_data, logInerval);
- stop.attach(&check_stop, 9); // check if we should shut down every 9 number seconds, starting after the start.
- flowCtl.attach(&flowControl, 3);
-
+ logg.attach(&log_data, 10);
+
