Code supports writing to the SD card as well as working with the Volckens group smartphone apps for the mbed HRM1017
Dependencies: ADS1115 BLE_API BME280 Calibration CronoDot EEPROM LSM303 MCP40D17 NCP5623BMUTBG SDFileSystem SI1145 STC3100 mbed nRF51822
Fork of UPAS_BLE_and_USB by
Diff: main.cpp
- Revision:
- 59:a9b21b3d9afc
- Parent:
- 58:7239c2ab2b65
- Child:
- 60:5913d77c8a4a
--- a/main.cpp Thu Jul 02 03:42:39 2015 +0000 +++ b/main.cpp Thu Jul 02 19:16:12 2015 +0000 @@ -96,111 +96,105 @@ int digitalpotMax = 127; int digitalpotMin = 2; -uint32_t start_time = 0; // when should the test start? default is ASAP -uint32_t stop_time = 0; // when should the test stop? default is 24hr after start +int dutyUp; +int dutyDown; + int refresh_Time = 10; // refresh time in s, note calling read_GPS()(or similar) will still take how ever long it needs(hopefully < 1s) char device_name[] = "---------------"; char filename[] = "/sd/UPAS0012LOG000000000000---------------.txt"; SDFileSystem sd(SPIS_PSELMOSI, SPIS_PSELMISO, SPIS_PSELSCK, SPIS_PSELSS, "sd"); // I believe this matches Todd's pinout, let me know if this doesn't work. (p12, p13, p15, p14) -/* -char Seconds = 0; //Seconds -char Minutes = 0; //Minutes -char Hour = 0; //Hour -char Date = 0; //Date -char Month = 0; //Month -char Year = 0; //Year - -char * RTCtime; -*/ - -void check_stop() // this checks if it's time to stop and shutdown +/*void check_stop() // this checks if it's time to stop and shutdown { - RTC.get_time(); - if(RTC.our_time >= stop_time) { + //RTC.get_time(); //debug + //pc.printf("%02d:%02d:%02d on %d/%d/%d) \r\n",RTC.hour, RTC.minutes, RTC.seconds, RTC.month, RTC.date, RTC.year);//debig + if(RTC.compare(Menu.f_sec, Menu.f_min, Menu.f_hour, Menu.f_day, Menu.f_month, Menu.f_year)) { pbKill = 0; // this is were we shut everything down } + wait(0.1); stop.detach(); stop.attach(&check_stop, 5); // checks stop time every 5 seconds -} +}*/ void log_data() -{ - RTC.get_time(); - omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V - omronVolt = (omronReading*4.096)/(32768*2); +{ + RTC.get_time(); + omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V + omronVolt = (omronReading*4.096)/(32768*2); + + if(omronVolt<=omronVMin) { + massflow = omronMFMin; + } else if(omronVolt>=omronVMax) { + massflow = omronMFMax; + } else { + massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+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)>=50) { + digital_pot_set = (int)(digital_pot_set+(int)((10.0*deltaMflow))); + RGB_LED.set_led(1,0,0); - if(omronVolt<=omronVMin){ - massflow = omronMFMin; - }else if(omronVolt>=omronVMax){ - massflow = omronMFMax; - }else{ - massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+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)>=50){ - digital_pot_set = (int)(digital_pot_set+(int)((10.0*deltaMflow))); - RGB_LED.set_led(1,0,0); - - }else if(digital_pot_change+digital_pot_set>=digitalpotMax&abs(digital_pot_change)<50){ - digital_pot_set = digitalpotMax; - RGB_LED.set_led(1,0,0); - }else if(digital_pot_change+digital_pot_set<=digitalpotMin&abs(digital_pot_change)<50){ - digital_pot_set = digitalpotMin; - RGB_LED.set_led(1,0,0); - }else{ - digital_pot_set = (digital_pot_set+ digital_pot_change); - RGB_LED.set_led(1,1,0);} - - DigPot.writeRegister(digital_pot_set); - - }else{ - RGB_LED.set_led(0,1,0);} - - movementsensor.getACCEL(); - movementsensor.getCOMPASS(); - 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; - - 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 - press = bmesensor.getPressure(); - temp = bmesensor.getTemperature()-5.0; - rh = bmesensor.getHumidity(); - uv = lightsensor.getUV(); - vis = lightsensor.getVIS(); - ir = lightsensor.getIR(); - - //Mount the filesystem - //sd.mount(); - FILE *fp = fopen(filename, "a"); - fprintf(fp, "%02d,%02d,%02d,%02d,%02d,%02d,%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,%1.3f,%5.1f,%1.1f,%1.1f,%1.1f,%1.1f,%d,%d,%d,%d,%d,%d,%d,%d,%d,%1.3f,%1.3f\r\n",RTC.year, RTC.month,RTC.date,RTC.hour,RTC.minutes,RTC.seconds,omronVolt,massflow,temp,press,rh,atmoRho,volflow,sampledVol,accel_x,accel_y,accel_z,accel_comp,uv,omronReading, vInReading, vBlowerReading, omronDiff,gasG.getAmps(), gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow); - fclose(fp); - //Unmount the filesystem - //sd.unmount(); - - wait(1); - - } + } else if(digital_pot_change+digital_pot_set>=digitalpotMax&abs(digital_pot_change)<50) { + digital_pot_set = digitalpotMax; + RGB_LED.set_led(1,0,0); + } else if(digital_pot_change+digital_pot_set<=digitalpotMin&abs(digital_pot_change)<50) { + digital_pot_set = digitalpotMin; + RGB_LED.set_led(1,0,0); + } else { + digital_pot_set = (digital_pot_set+ digital_pot_change); + RGB_LED.set_led(1,1,0); + } + + DigPot.writeRegister(digital_pot_set); + + } else { + RGB_LED.set_led(0,1,0); + } + + movementsensor.getACCEL(); + movementsensor.getCOMPASS(); + 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; + + 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 + press = bmesensor.getPressure(); + temp = bmesensor.getTemperature()-5.0; + rh = bmesensor.getHumidity(); + uv = lightsensor.getUV(); + vis = lightsensor.getVIS(); + ir = lightsensor.getIR(); + + //Mount the filesystem + //sd.mount(); + FILE *fp = fopen(filename, "a"); + fprintf(fp, "%02d,%02d,%02d,%02d,%02d,%02d,%1.3f,%1.3f,%2.2f,%4.2f,%2.1f,%1.3f,%1.3f,%5.1f,%1.1f,%1.1f,%1.1f,%1.1f,%d,%d,%d,%d,%d,%d,%d,%d,%d,%1.3f,%1.3f\r\n",RTC.year, RTC.month,RTC.date,RTC.hour,RTC.minutes,RTC.seconds,omronVolt,massflow,temp,press,rh,atmoRho,volflow,sampledVol,accel_x,accel_y,accel_z,accel_comp,uv,omronReading, vInReading, vBlowerReading, omronDiff,gasG.getAmps(), gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow); + fclose(fp); + //Unmount the filesystem + //sd.unmount(); + + wait(1); +} int main() { @@ -210,49 +204,43 @@ Timer refresh_Timer; //sets up a timer for use in loop; how often do we log data? refresh_Timer.start(); //starts the clock on the timer - RGB_LED.set_led(0,1,1); refresh_Timer.reset(); // resets the timer to zero - - Menu.read_menu(E2PROM, refresh_Time, volflowSet, start_time, stop_time, device_name); //Read all data from the EEPROM here - //reset defaults if the bits in byte 0 say so - //RTC.get_time(); - //start_time = RTC.our_time; // default start ASAP - //stop_time = start_time + 86400; // default 24hr run time + Menu.read_menu(E2PROM, refresh_Time, volflowSet, device_name, dutyUp, dutyDown); //Read all data from the EEPROM here fix_error: - Menu.Start(pc, E2PROM, RTC, refresh_Time, volflowSet, start_time, stop_time, device_name); //Forces you to open the menu - Menu.save_menu(E2PROM, refresh_Time, volflowSet, start_time, stop_time, device_name); //Save all data to the EEPROM - + Menu.Start(pc, E2PROM, RTC, refresh_Time, volflowSet, device_name, dutyUp, dutyDown); //Forces you to open the menu + Menu.save_menu(E2PROM, refresh_Time, volflowSet, device_name, dutyUp, dutyDown); //Save all data to the EEPROM + //Test for errors - if(RTC.OSF()){ //Don't proceed if the RTC needs reset + if(RTC.OSF()) { //Don't proceed if the RTC needs reset RGB_LED.set_led(1,0,0); // error code/color pc.printf("!Reset the time!\r\n"); goto fix_error; } RTC.get_time(); - if(RTC.our_time > stop_time){ //Don't proceed if it's already time to stop + if(RTC.compare(Menu.f_sec, Menu.f_min, Menu.f_hour, Menu.f_day, Menu.f_month, Menu.f_year)) { //Don't proceed if it's already time to stop RGB_LED.set_led(1,0,0); // error code/color pc.printf("!Fix the stop time!\r\n"); goto fix_error; } - - + pc.printf("You're done, you can now disconect the USB cable."); + RGB_LED.set_led(1,1,0); - while(RTC.our_time < start_time) { // this while waits for the start time by looping until the start time - RTC.get_time(); + while(!RTC.compare(Menu.s_sec, Menu.s_min, Menu.s_hour, Menu.s_day, Menu.s_month, Menu.s_year)) { // this while waits for the start time by looping until the start time // serial print a count down?? } - stop.attach(&check_stop, 60); // check if we should shut down every 5 seconds, starting 60s after the start. + //stop.attach(&check_stop, 30); // check if we should shut down every 5 seconds, starting 60s after the start. - if(volflowSet==1.0){ - gainFlow = 100;} - else if(volflowSet==2.0){ - gainFlow = 25;} - else{ - gainFlow = 25;} - + 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(); @@ -262,14 +250,13 @@ massflowSet = volflowSet*atmoRho; //Digtal pot tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx digital_pot_setpoint = (int)floor(DP4*pow(massflowSet,4)+DP3*pow(massflowSet,3)+DP2*pow(massflowSet,2)+DP1*massflowSet+DP0); //min = 0x7F, max = 0x00 - - if(digital_pot_setpoint>=digitalpotMax){ + + if(digital_pot_setpoint>=digitalpotMax) { digital_pot_setpoint = digitalpotMax; - } - else if(digital_pot_setpoint<=digitalpotMin){ + } else if(digital_pot_setpoint<=digitalpotMin) { digital_pot_setpoint = digitalpotMin; - } - + } + DigPot.writeRegister(digital_pot_setpoint); wait(1); blower = 1; @@ -278,84 +265,89 @@ sprintf(filename, "/sd/UPAS0012LOG_%02d-%02d-%02d_%02d-%02d-%02d%s.txt",RTC.year,RTC.month,RTC.date,RTC.hour,RTC.minutes,RTC.seconds,device_name); FILE *fp = fopen(filename, "w"); fclose(fp); - //pc.printf("%d\r\n",digital_pot_setpoint); - - //---------------------------------------------------------------------------------------------// - //Following lines are needed to enter into the initiallization flow control loop - + //pc.printf("%d\r\n",digital_pot_setpoint); + + //---------------------------------------------------------------------------------------------// + //Following lines are needed to enter into the initiallization flow control loop + wait(10); - + omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V omronVolt = (omronReading*4.096)/(32768*2); - if(omronVolt<=omronVMin){ + if(omronVolt<=omronVMin) { massflow = omronMFMin; - }else if(omronVolt>=omronVMax){ + } else if(omronVolt>=omronVMax) { massflow = omronMFMax; - }else{ - massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+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)>.015){ - - omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V - omronVolt = (omronReading*4.096)/(32768*2); - //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx - if(omronVolt<=omronVMin){ - massflow = omronMFMin; - }else if(omronVolt>=omronVMax){ - massflow = omronMFMax; - }else{ - massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+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; - massflowSet = volflowSet*atmoRho; - deltaMflow = massflow-massflowSet; - //pc.printf("%f,%f,%f,%f,%d,%u,%x\r\n",omronVolt,massflow,massflowSet,deltaMflow,digital_pot_set,digital_pot_set,digital_pot_set); - 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); - wait(1); - - - } - - sampledVol = 0.0; - RGB_LED.set_led(0,1,0); - refresh_Timer.reset(); //restarts the clock on the timer + } else { + massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+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)>.015) { + + omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V + omronVolt = (omronReading*4.096)/(32768*2); + //Mass Flow tf from file: UPAS v2 OSU-PrimaryFlowData FullSet 2015-05-29 CQ mods.xlsx + if(omronVolt<=omronVMin) { + massflow = omronMFMin; + } else if(omronVolt>=omronVMax) { + massflow = omronMFMax; + } else { + massflow = MF4*pow(omronVolt,(float)4)+MF3*pow(omronVolt,(float)3)+MF2*pow(omronVolt,(float)2)+MF1*omronVolt+MF0; + } - //** end of initalization **// - - //---------------------------------------------------------------------------------------------// - //---------------------------------------------------------------------------------------------// - //---------------------------------------------------------------------------------------------// - // Main Control Loop - - while(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; + massflowSet = volflowSet*atmoRho; + deltaMflow = massflow-massflowSet; + //pc.printf("%f,%f,%f,%f,%d,%u,%x\r\n",omronVolt,massflow,massflowSet,deltaMflow,digital_pot_set,digital_pot_set,digital_pot_set); + 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); + wait(1); + + + } + + sampledVol = 0.0; + RGB_LED.set_led(0,1,0); + refresh_Timer.reset(); //restarts the clock on the timer + + //** end of initalization **// + + //---------------------------------------------------------------------------------------------// + //---------------------------------------------------------------------------------------------// + //---------------------------------------------------------------------------------------------// + // Main Control Loop + + while(1) { + RTC.get_time(); secondsD = (double)RTC.seconds; - + if(fmod(secondsD,logInerval)==0) { - - log_data(); - refresh_Timer.reset(); // resets the timer to zero - + + log_data(); + refresh_Timer.reset(); // resets the timer to zero + + if(RTC.compare(Menu.f_sec, Menu.f_min, Menu.f_hour, Menu.f_day, Menu.f_month, Menu.f_year)) { + pbKill = 0; // this is were we shut everything down + } } } - + }