谁有pulsesensor心率传感器,的c语言程序,带注释的。在线等挺急的?

谁有pulsesensor心率传感器,的c语言程序,带注释的。在线等挺急的?,第1张

/sendtimebetweenbeatswitha/在LCD12864上显示BPM

}

delay(138)9Set/发送并处理原始脉搏传感器数据

if(QS==true){//fadeRateVariableto255tofadeLEDwithpulse

sendDataToProcessing(BQi++){

delay(1000)}

if(Pressure<100){

beep=0}}

if(BPM<60|BPM>100){

for(i=0i<显示信息4

while(1)

{

sendDataToProcessing(}

}

}

//AD转换结果result

ADC_CONTR&=0xf8/依次执行写入 *** 作

{

putchar(ucStr3[i])

}

for(i=0

_nop_()/延时19.6ms

LCD_disp_list_char(4,DisBuff2)设置ADCCONTR控制寄存器后/S确定发现一个心跳

fadeRate=255,0/voidledFadeToBeat(){

//,BPM)///analogWrite(fadePin,fadeRate)/:GetADCResult

函数功能:获取AD转换结果函数

入口参数,Signal)

sys_init()

beep=1

LCD12864_DisplayOneLine(0x80,ucStr1)//,255)//prefix

QS=false/,IBI),4/resettheQuantifiedSelfflagfornexttime

LCD_disp_list_char(2:BYTEch(通道选择)

返回值:result(A///依次执行写入 *** 作

{

putchar(ucStr2[i])

}

for(i=0、CHS1、CHS0(清除通道选择)

_nop_()//显示信息1

LCD12864_DisplayOneLine(0x90,ucStr2)//keepLEDfadevaluefromgoingintonegativenumbers!

/B}

for(i=0i<3i++)

{

putchar(DisBuff[i])/清除ADC控制寄存器ADCCONTR的CHS2,DisBuff)/16i++)/和心率

sendDataToProcessing(setLEDfadevalue

//,要加4个空 *** 作延时才可以正确读到ADCCONTR寄存器的值

_nop_()4i++)//,4i++){

delay(1000)}

if(BPM<60|BPM>100){

beep=0i<16/i++)//8

}

for(i=0Q/}

/******************************************************************************

函数名称显示信息2

LCD12864_DisplayOneLine(0x88,ucStr3)//ledFadeToBeat()显示信息3

LCD12864_DisplayOneLine(0x98,ucStr4)//i<16}

for(i=0i<

unsignedintGetADCResult(BYTEch)

{unsignedintresult//依次执行写入 *** 作

{

putchar(ucStr1[i])/fadeLED

/i<16fadeRate=constrain(fadeRatei++)///发送一个fadeRate-=15//D转换结果)

备注:无

*******************************************************************************/

_nop_()

ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START//开ADC电源,选择AD转换速率,并选择AD通道,开始AD转换

_nop_()//设置ADCCONTR控制寄存器后,要加4个空 *** 作延时才可以正确读到ADCCONTR寄存器的值

_nop_()

_nop_()

_nop_()

while(!(ADC_CONTR&ADC_FLAG))//等待AD转换结束

ADC_CONTR&=~ADC_FLAG//关闭ADC

result=ADC_RES//将AD转换结果的高两位赋给result

result=result<<8//将result循环左移8位

result+=ADC_RESL//将AD转换结果的底8位加高两位共10位给result

returnresult//返回10位AD转换结果

}

voidsendDataToProcessing(charsymbol,intdat){

putchar(symbol)//symbolprefixtellsProcessingwhattypeofdataiscoming

printf(\"%drn

这个是主程序和部分代码由于字数限制所以你还是留个邮箱吧

void main(void)

{

unsigned char i

sys_init()

beep = 1

LCD12864_DisplayOneLine(0x80,ucStr1)//显示信息1

LCD12864_DisplayOneLine(0x90,ucStr2)//显示信息2

LCD12864_DisplayOneLine(0x88,ucStr3)//显示信息3

LCD12864_DisplayOneLine(0x98,ucStr4)//显示信息4

while(1)

{

sendDataToProcessing('S', Signal)// 发送并处理原始脉搏传感器数据

if (QS == true){ // 确定发现一个心跳

fadeRate = 255 // Set 'fadeRate' Variable to 255 to fade LED with pulse

sendDataToProcessing('B',BPM) // 发送一个'B'和心率

sendDataToProcessing('Q',IBI) // send time between beats with a 'Q' prefix

QS = false // reset the Quantified Self flag for next time

LCD_disp_list_char(2,4,DisBuff)//在LCD12864上显示BPM

}

delay(138)// 延时 19.6ms

LCD_disp_list_char(4,4,DisBuff2)

//ledFadeToBeat()

if(Pressure<100){

for(i=0i<8i++){

delay(1000)}

if (Pressure<100){

beep = 0}}

if(BPM<60|BPM>100){

for(i=0i<9i++){

delay(1000)}

if(BPM<60|BPM>100){

beep = 0}

for(i = 0i<16i++) //依次执行写入 *** 作

{

putchar(ucStr1[i])

}

for(i = 0i<16i++) //依次执行写入 *** 作

{

putchar(ucStr2[i])

}

for(i=0i<3i++)

{

putchar(DisBuff[i])}

for(i = 0i<16i++) //依次执行写入 *** 作

{

putchar(ucStr3[i])

}

for(i = 0i<16i++) //依次执行写入 *** 作

{

putchar(ucStr4[i])

}

for(i=0i<4i++)

{

putchar(DisBuff2[i])}

}

}

//void ledFadeToBeat(){

//fadeRate -= 15// set LED fade value

//fadeRate = constrain(fadeRate,0,255) // keep LED fade value from going into negative numbers!

//analogWrite(fadePin,fadeRate) // fade LED

// }

/******************************************************************************

函数名称:GetADCResult

函数功能:获取AD转换结果函数

入口参数:BYTE ch(通道选择)

返回值:result(A/D转换结果)

备注:无

*******************************************************************************/

unsigned int GetADCResult(BYTE ch)

{ unsigned int result //AD转换结果result

ADC_CONTR&=0xf8 //清除ADC控制寄存器ADC CONTR的CHS2、CHS1、CHS0(清除通道选择)

_nop_() //设置ADC CONTR控制寄存器后,要加4个空 *** 作延时才可以正确读到ADC CONTR寄存器的值

_nop_()

_nop_()

_nop_()

ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START//开ADC电源,选择AD转换速率,并选择AD通道,开始AD转换

_nop_() //设置ADC CONTR控制寄存器后,要加4个空 *** 作延时才可以正确读到ADC CONTR寄存器的值

_nop_()

_nop_()

_nop_()

while (!(ADC_CONTR &ADC_FLAG))//等待AD转换结束

ADC_CONTR &= ~ADC_FLAG//关闭ADC

result=ADC_RES//将AD转换结果的高两位赋给result

result=result<<8 //将result循环左移8位

result+=ADC_RESL //将AD转换结果的底8位加高两位共10位给result

return result //返回10位AD转换结果

}

void sendDataToProcessing(char symbol, int dat ){

putchar(symbol) // symbol prefix tells Processing what type of data is coming

printf("%d\r\n",dat) // the data to send culminating in a carriage return

}

void UART_init(void)

{

TMOD = 0x20 //定时器工作在定时器1的方式2

PCON = 0x00 //不倍频

SCON = 0x50//串口工作在方式1,并且启动串行接收

TH1 = 0xFd//设置波特率 9600

TL1 = 0xFd

TR1 = 1 //启动定时器1

}

char putchar(unsigned char dat)

{

TI=0

SBUF=dat

while(!TI)

TI=0

return SBUF

}

void _nop_ (void)

{}

void T0_init(void){

// Initializes Timer0 to throw an interrupt every 2mS.

TMOD |= 0x01//16bit TIMER

TL0=T0MS

TH0=T0MS>>8

TR0=1 //start Timer 0

ET0=1 //enable Timer Interrupt

EA=1// MAKE SURE GLOBAL INTERRUPTS ARE ENABLED

}

void T1_init(void){

// Initializes Timer0 to throw an interrupt every 2mS.

TMOD |= 0x01//16bit TIMER

TL1=T0MS2

TH1=T0MS2>>8

TR1=1 //start Timer 0

ET1=1 //enable Timer Interrupt

EA=1// MAKE SURE GLOBAL INTERRUPTS ARE ENABLED

}

void ADC_init(unsigned char channel)

{

P1ASF=ADC_MASK<<channel//选择P1. channel作为A/D输入来用

ADC_RES=0//清除ADC结果寄存器RES

ADC_RESL=0//清除ADC结果寄存器RESL

AUXR1 |= 0x04//调整ADC格式的结果

}

void Timer1_rountine(void) interrupt 1

{}

unsigned int analogRead(unsigned char channel)

{

unsigned int result

while (!(ADC_CONTR &ADC_FLAG))//Wait complete flag

ADC_CONTR &=!ADC_FLAG//clear ADC FLAG

result=ADC_RES

result=result<<8

result+=ADC_RESL

// ADC_CONTR|=channel|ADC_POWER|ADC_SPEEDLL|ADC_START

return result

}

// Timer 0中断子程序,每2MS中断一次,读取AD值,计算心率值

void Timer0_rountine(void) interrupt 1

{

int N

unsigned char i

// keep a running total of the last 10 IBI values

unsigned int runningTotal = 0 // clear the runningTotal variable

EA=0 // 关定时器中断

TL0=T0MS

TH0=T0MS>>8 //重装16位定时器初值

Pressure = (GetADCResult(PressurePin)) //****************

DisBuff2[3] = Pressure%10+48//取个位数

DisBuff2[2] = Pressure%100/10+48//取十位数

DisBuff2[1] = Pressure%1000/100+48 //百位数 ***************

DisBuff2[0] = Pressure/1000+48//取千位数

Signal = GetADCResult(PulsePin) // 读脉搏传感器

sampleCounter += 2// 使用这个值跟踪记录脉搏时间间隔在ms级

N = sampleCounter - lastBeatTime // 减上个节拍的时间来避免噪声

// 找到脉搏波的波峰和波谷

if(Signal <thresh &&N >(IBI/5)*3){ // 如果脉搏传感器输出小于电源电压一半 并且 消除噪声时间小于 3/5个脉搏时间间隔

if (Signal <Trough){// 如果脉搏传感器输出小于波谷

Trough = Signal// 跟踪脉搏波的最低点

}

}

if(Signal >thresh &&Signal >Peak){ // 如果输出大于电源电压一半并且大于波峰

Peak = Signal// 将新值设为波峰

}// 跟踪脉搏波的波峰

if (N >250){ // 避免高频噪声

if ( (Signal >thresh) &&(Pulse == false) &&(N >(IBI/5)*3) ){

Pulse = true // 当检测到一个脉搏时将脉搏标志设为真

blinkPin=0 // 点亮脉搏灯

IBI = sampleCounter - lastBeatTime// 测量两个脉搏的时间in mS

lastBeatTime = sampleCounter // 跟踪脉搏时间

if(secondBeat){// 如果这是第二个脉搏

secondBeat = false // 清除标识

for(i=0i<=9i++){ // 全部的数据作为真实脉搏BMP

rate[i] = IBI

}

}

if(firstBeat){ // 如果是第一个脉搏

firstBeat = false // 清除标志

secondBeat = true // 设置第二脉搏标志

EA=1 //开中断

return // IBI 值是不可靠的所以抛弃

}

for(i=0i<=8i++){// 移动数据在rate数组中

rate[i] = rate[i+1] // 顶替旧值

runningTotal += rate[i] // 加上第九个新值

}

rate[9] = IBI // 加最后的IBI到rate数组中

runningTotal += rate[9] // 加上一个IBI到runningTotal

runningTotal /= 10// 取平均值

BPM = 60000/runningTotal // 一分钟可以检测到多少个心跳及 BPM!

if(BPM>200)BPM=200 //限制BPM最高显示值

if(BPM<30)BPM=30 //限制BPM最低显示值

DisBuff[2] = BPM%10+48//取个位数

DisBuff[1] = BPM%100/10+48//取十位数

DisBuff[0] = BPM/100+48 //百位数

if(DisBuff[0]==48)

DisBuff[0]=32

QS = true // 设置QS标志

// QS FLAG IS NOT CLEARED INSIDE THIS ISR

}

}

if (Signal <thresh &&Pulse == true){ // 当电压归零节拍结束

blinkPin=1 // 熄灭脉搏灯

Pulse = false// 重置脉搏标识我们可以重新测

amp = Peak - Trough // 得到脉搏波的峰峰值

thresh = amp/2 + Trough // 设置thresh位脉搏峰峰值的一半

Peak = thresh // 为下一次测试重置波峰

Trough = thresh

}

if (N >2500){ //如果超过2.5秒没有检测到一个脉搏

thresh = 512 // 重新设置波谷

Peak = 512 // 重新设置波峰

Trough = 512 // 重新设置间隔

lastBeatTime = sampleCounter // 把最后的节拍时间更新

firstBeat = true // 重新设置标志避免噪声

secondBeat = false // 当我们得到心跳的时候

}

EA=1 // 开中断

}// end isr

1.搭建Arduino环境

Arduino官网下载最新版本arduino�0�2IDE

www.arduino.cc

2.搭建processing环境

下载最新版本的processing�0�2IDE

www.processing.org

Arduino�0�2UNO一块

Pulsesensor�0�2一块

杜邦线3根

Pulsesensor�0�2的S�0�2连接�0�2arduino的�0�2A0脚

Pulsesensor�0�2的‘–’�0�2连接�0�2arduin的�0�2GND脚

Pulsesensor�0�2的‘+’�0�2连接�0�2arduino的�0�2+5v脚

下载pulsensor库和processing�0�2PulseSensorAmpd_

首先把下载好的pulsesensor库放到Arduino库文件路径中

然后打开 File ->Examples ->PulseSensorAmped_Arduino_1dot2 ->PulseSensorAmped_Arduino_1dot2例程

然后把程序烧入到Arduino 板中。

然后打开processing,打开PluseSensorSensorAmpd_Processing_1dot1文件夹中的PluseSensorSensorAmpd_Processing_1dot1.pde文件

然后点击按钮开始编译,出现一个心率显示界面

把pulsesensor绑在手上。即可看到processing上显示出来的心率

为了防止手上的汗使电路短路,建议把pulsesensor焊满元器件的一面使用热熔胶封住,传感器那一面也可以使用胶带封住。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11633470.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存