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:
- 112:fd14d51e3493
- Parent:
- 111:5f2ba5f1a468
- Child:
- 113:846f67efaa80
diff -r 5f2ba5f1a468 -r fd14d51e3493 main.cpp --- a/main.cpp Fri Feb 12 03:46:24 2016 +0000 +++ b/main.cpp Wed Feb 17 02:06:46 2016 +0000 @@ -178,33 +178,20 @@ } - +int r =0; +int g =1; +int b=1; void log_data() { - logg.detach(); - logg.attach(&log_data, logInerval); // reading and logging data must take significintly less than 0.5s. This can be increased. - + //logg.detach(); + //logg.attach(&log_data, logInerval); // reading and logging data must take significintly less than 0.5s. This can be increased. + if(r==0) r=1; + else r=0; + RGB_LED.set_led(r,g,b); + wait(0.5); RTC.get_time(); - //*****************************************// - //RTC.get_time(); //debug - //pc.printf("%02d:%02d:%02d on %d/%d/%d before fmod \r\n",RTC.hour, RTC.minutes, RTC.seconds, RTC.month, RTC.date, RTC.year);//debug - //*****************************************// - secondsD = RTC.seconds; - /* - while(fmod(secondsD,logInerval)!=0 || floor(secondsD)==floor(lastsecondD)) { - //pc.printf("%f, %f\r\n", floor(secondsD), floor(lastsecondD)); - RTC.get_time(); - secondsD = RTC.seconds; - wait_ms(100); - } - lastsecondD = secondsD; - // - //RTC.get_time(); //debug - //pc.printf("%02d:%02d:%02d on %d/%d/%d after fmod \r\n",RTC.hour, RTC.minutes, RTC.seconds, RTC.month, RTC.date, RTC.year);//debug - // - */ omronReading = ads.readADC_SingleEnded(0, 0xC583); // read channel 0 PGA = 2 : Full Scale Range = 2.048V omronVolt = (omronReading*4.096)/(32768*2); @@ -280,20 +267,6 @@ fprintf(fp, "%d,%d,%d,%1.3f,%1.3f\r\n", gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow); fclose(fp); - /* - FILE *fp = fopen(filename, "a"); - fprintf(fp, "%02d,%02d,%02d,%02d,%02d,%02d,",RTC.year, RTC.month,RTC.date,RTC.hour,RTC.minutes,RTC.seconds); - 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\r\n", gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow); - //fprintf(fp, "%d,%f,", serial_num, volflowSet); - //fprintf(fp, "%f,%f,%f,%f,%f\r\n", calibrations.MF4, calibrations.MF3, calibrations.MF2, calibrations.MF1, calibrations.MF0); - fclose(fp); - //wait_ms(5); - */ - } /*EEPROM ADDRESSING: 0:Status bit-Unused @@ -406,14 +379,6 @@ pbKill = 0; } } - - //}else{ -// RunReady = 12; -// } - - //If 24 hour mode was set by app, make sure to clear it for next app cycle...commented out for now - // presetRunModeCheck[0] = 0x01; -// E2PROM.write(0x00033,presetRunModeCheck,1); E2PROM.read(0x00015, startAndEndTime, 12); //Grab start and end times from EEPROM while(!RTC.compare(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 @@ -424,69 +389,6 @@ } - //Commented out to prevent mem issues - //MARK: editting 24 hour mode code here - //if(RunReady == 12) { -// RTC.get_time(); -// startAndEndTime[6] = RTC.seconds; -// startAndEndTime[7] = RTC.minutes; -// startAndEndTime[8] = RTC.hour; -// if(RTC.month == 1 | RTC.month == 3 | RTC.month == 5 | RTC.month == 7 | RTC.month == 8 | RTC.month == 10) { -// if(RTC.date == 31) { -// startAndEndTime[9] = 1; -// startAndEndTime[10] = RTC.month +1; -// startAndEndTime[11] = RTC.year; -// } else { -// startAndEndTime[9] = RTC.date+1; -// startAndEndTime[10] = RTC.month; -// startAndEndTime[11] = RTC.year; -// } -// } else if(RTC.month == 4 | RTC.month == 6 | RTC.month == 9 | RTC.month == 11) { -// if(RTC.date == 30) { -// startAndEndTime[9] = 1; -// startAndEndTime[10] = RTC.month +1; -// startAndEndTime[11] = RTC.year; -// } else { -// startAndEndTime[9] = RTC.date+1; -// startAndEndTime[10] = RTC.month; -// startAndEndTime[11] = RTC.year; -// } -// } else if(RTC.month == 2) { -// if(RTC.year == 16 | RTC.year == 20 | RTC.year == 24| RTC.year == 28) { -// if(RTC.date == 29) { -// startAndEndTime[9] = 1; -// startAndEndTime[10] = RTC.month +1; -// startAndEndTime[11] = RTC.year; -// } else { -// startAndEndTime[9] = RTC.date+1; -// startAndEndTime[10] = RTC.month; -// startAndEndTime[11] = RTC.year; -// } -// } else { -// if(RTC.date == 28) { -// startAndEndTime[9] = 1; -// startAndEndTime[10] = RTC.month +1; -// startAndEndTime[11] = RTC.year; -// } else { -// startAndEndTime[9] = RTC.date+1; -// startAndEndTime[10] = RTC.month; -// startAndEndTime[11] = RTC.year; -// } -// } -// } else if(RTC.month == 12) { -// if(RTC.date == 31) { -// startAndEndTime[9] = 1; -// startAndEndTime[10] = 1; -// startAndEndTime[11] = RTC.year+1; -// } else { -// startAndEndTime[9] = RTC.date+1; -// startAndEndTime[10] = RTC.month; -// startAndEndTime[11] = RTC.year; -// } -// } -// } - //MARK: end of 24 hour mode code - RGB_LED.set_led(0,1,0); //Get the proper serial number @@ -505,7 +407,7 @@ RunReady = 0; - stop.attach(&check_stop, 30); // check if we should shut down every 9 seconds, starting 60s after the start. + //stop.attach(&check_stop, 30); // check if we should shut down every 9 seconds, starting 60s after the start. //Use the flow rate value stored in eeprom E2PROM.read(0x00010,flowRateOriginal,4); @@ -605,14 +507,94 @@ RGB_LED.set_led(0,1,0); - - //** end of initalization **// - //---------------------------------------------------------------------------------------------// - //---------------------------------------------------------------------------------------------// - // Main Control Loop - - - logg.attach(&log_data, logInerval); // uses callbacks or block Interrupts for anything that uses i2c + while(1){ + if(RTC.compare(startAndEndTime[6], startAndEndTime[7], startAndEndTime[8], startAndEndTime[9], startAndEndTime[10], startAndEndTime[11])) + pbKill = 0; // this is were we shut everything down + + wait(logInerval - 0.2); +// if(r==0) r=1; +// else r=0; +// RGB_LED.set_led(r,g,b); +// wait(0.5); + + 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<=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)>=50) { + digital_pot_set = (int)(digital_pot_set+(int)((10.0*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); + } + + 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; + + 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(); + + + FILE *fp = fopen(filename, "a"); + fprintf(fp, "%02d,%02d,%02d,%02d,%02d,%02d,",RTC.year, RTC.month,RTC.date,RTC.hour,RTC.minutes,RTC.seconds); + 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\r\n", gasG.getVolts(), gasG.getCharge(),digital_pot_set, deltaMflow, deltaVflow); + fclose(fp); + + }