![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Tapton School Project to monitor and log SEN students physiological condition using GSR (conductivity) & Heart Rate and displaying output and logging the data to an SD card
Diff: DFRobot_Heartrate.cpp
- Revision:
- 0:0e26bf847b57
diff -r 000000000000 -r 0e26bf847b57 DFRobot_Heartrate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DFRobot_Heartrate.cpp Fri Feb 09 08:34:23 2018 +0000 @@ -0,0 +1,266 @@ +#include "DFRobot_Heartrate.h" + +#define debug_ 1 + + +DigitalIn hrme (p21); + Serial pcu (USBTX, USBRX); // pc's usb tx, rx + +unsigned int value[SAMPLE_NUMBER]={0}; ///< Initialize sampling point value +unsigned int valueCount_ = 255; +/*! +* @brief Get a Sample values +* +* @brief Get a Sample values +* +* @return unsigned int +*/ +unsigned int DFRobot_Heartrate::getValue(unsigned int pin) +{ + valueCount_++; + if(valueCount_ >= SAMPLE_NUMBER){ + pcu.printf("Resetting counter"); + valueCount_ = 0; + } + value[valueCount_] = hrme; + return(value[valueCount_]); + +} + +/*! +* @brief Get a sample +* +* @brief Get the current location +* +* @return unsigned int +*/ +unsigned int DFRobot_Heartrate::getCnt(void) +{ + return(valueCount_); +} + +/*! +* @brief Points to a valid node of the wave rise +* +* @brief When the sampling point value increased 4 times in a row, considered to be a heartbeat +* +* @return char +*/ + +char DFRobot_Heartrate::maxNumber(unsigned int count) +{ + unsigned int temp1,temp2; + for(int i=0;i<4;i++){ + if(count<i){ + temp1 = SAMPLE_NUMBER+count-i; + }else{ + temp1 = count-i; + } + if(count<i+1){ + temp2 = SAMPLE_NUMBER+(count-1)-i; + }else{ + temp2 = (count-1)-i; + } + if(value[temp1]<=value[temp2])return(0); + } + if(valueFlag){ + valueFlag=1; + return(0); + }else{ + valueFlag=1; + return(1); + } +} + +/*! +* @brief Waveform down processing +* +* @brief When the sample values decreased four times in a row, clear the heartbeat +* +* @return void +*/ + +void DFRobot_Heartrate::minNumber(unsigned int count) +{ + unsigned int temp1,temp2; + for(int i=0;i<4;i++){ + if(count<i){ + temp1 = SAMPLE_NUMBER+count-i; + }else{ + temp1 = count-i; + } + if(count<i+1){ + temp2 = SAMPLE_NUMBER+(count-1)-i; + }else{ + temp2 = (count-1)-i; + } + if(value[temp1]>=value[temp2])return; + } + valueFlag = 0; + +} + + +/*! +* @brief Get heart rate value +* +* @brief Sample ten times in a row beating heart rate value is computed +* +* @return unsigned int +*/ + +unsigned int DFRobot_Heartrate::analogGetRate(void) +{ + + static unsigned int timeFlag; + static unsigned long sampleTime[10]; + unsigned long valueTime_; + minNumber(valueCount_); + if(maxNumber(valueCount_)){ + nowTim = clock_ms(); + unsigned int difTime = nowTim - lastTim; + lastTim = nowTim; + + if(difTime>300 || difTime<2000){ + sampleTime[timeFlag++] = difTime; + if(timeFlag > 9)timeFlag=0; + } + if(0 == sampleTime[9]){ + pcu.printf("Wait for valid data !"); + return(0); + } + + unsigned int Arrange[10]={0}; + for(int i=0;i<10;i++){ + Arrange[i] = sampleTime[i]; + } + unsigned int Arrange_=0; + for(int i=9;i>0;i--){ + for(int j=0;j<i;j++){ + if(Arrange[j] > Arrange[j+1]){ + Arrange_ = Arrange[j]; + Arrange[j] = Arrange[j+1]; + Arrange[j+1] = Arrange_; + } + } + } + if((Arrange[7]-Arrange[3])>150){ + pcu.printf("Wait for valid data !"); + return(0); + } + + Arrange_ = 0; + for(int i=3;i<=7;i++){ + Arrange_ += Arrange[i]; + } + + valueTime_ = 300000/Arrange_;///<60*1000*(7-2) + return((unsigned int)valueTime_); + } + return(0); +} + +/*! +* @brief Get heart rate value +* +* @brief Sample ten times in a row beating heart rate value is computed +* +* @return unsigned int +*/ + +unsigned int DFRobot_Heartrate::digitalGetRate(void) +{ + + static unsigned int timeFlag; + static unsigned long sampleTime[10]; + unsigned long valueTime_; + unsigned int count_; + + if(valueCount_){ + count_ = valueCount_-1; + }else{ + count_ = SAMPLE_NUMBER-1; + } + if((value[valueCount_]==1)){ + + nowTim = clock_ms(); + unsigned int difTime = nowTim - lastTim; + lastTim = nowTim; + pcu.printf("dif time %d, valueCount_ %d, value[valueCount_] %d\n\r ", difTime, valueCount_, value[valueCount_]); + + if(difTime>300 || difTime<2000){ + sampleTime[timeFlag++] = difTime; + if(timeFlag > 9)timeFlag=0; + } + if(0 == sampleTime[9]){ + pcu.printf("Wait for valid data !"); + return(0); + } + + unsigned int Arrange[10]={0}; + for(int i=0;i<10;i++){ + Arrange[i] = sampleTime[i]; + } + unsigned int Arrange_=0; + for(int i=9;i>0;i--){ + for(int j=0;j<i;j++){ + if(Arrange[j] > Arrange[j+1]){ + Arrange_ = Arrange[j]; + Arrange[j] = Arrange[j+1]; + Arrange[j+1] = Arrange_; + } + } + } + if((Arrange[7]-Arrange[3])>120){ + pcu.printf("Wait for valid data !"); + return(0); + } + + Arrange_ = 0; + for(int i=3;i<=7;i++){ + Arrange_ += Arrange[i]; + } + + valueTime_ = 300000/Arrange_;///<60*1000*(7-2) + return((unsigned int)valueTime_); + } + return(0); + +} + +/*! +* @brief Get heart rate value +* +* @brief Sample ten times in a row beating heart rate value is computed +* +* @return unsigned int +*/ +unsigned int DFRobot_Heartrate::getRate(void) +{ + if(mode_ == DIGITAL_MODE){ + return(digitalGetRate()); + }else{ + return(analogGetRate()); + } +} + + + +/****************************************************************************** + Copyright (C) <2015> <linfeng> + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + Contact: Musk.lin@dfrobot.com + ******************************************************************************/ + + + +