心跳率是监测任何人健康的最重要参数。在可穿戴设备的现代时代,有许多设备可以测量心跳,血压,脚步,消耗的卡路里和许多其他东西。这些设备内部都有脉冲传感器,可感应脉冲率。今天,我们还将使用带有PIC单片机的脉冲传感器来计算每分钟的心跳和节拍间隔,这些值将进一步显示在16x2字符LCD上。我们将在该项目中使用PIC16F877A PIC单片机。我们已经将脉搏传感器与Arduino用于患者监护系统连接。
所需组件
- PIC16F877A单片机
- 20 Mhz水晶
- 33pF电容器2个
- 4.7k电阻1个
- 16x2字符LCD
- 10K电位器,用于LCD的对比度控制
- SEN-11574脉冲传感器
- 魔术贴表带
- 5V电源适配器
- 面包板和连接线
脉冲传感器SEN-11574
要测量心跳,我们需要一个脉冲传感器。在这里,我们选择了SEN-11574脉冲传感器,可以轻松地在在线或离线商店购买。我们使用此传感器是因为制造商提供了示例代码,但这是Arduino代码。我们为PIC微控制器转换了该代码。
该传感器非常小巧,非常适合读取耳垂或指尖上的心跳。从圆形PCB一侧直径为0.625英寸,厚度为0.125英寸。
该传感器提供一个模拟信号,并且该传感器可以用3V或5V驱动,该传感器的电流消耗为4 mA,非常适合移动应用。该传感器带有三根导线,末端带有24英寸长的连接电缆和berg插头。此外,传感器带有魔术贴手指带,可将其戴在指尖上。
脉冲传感器原理图也由制造商提供,也可在sparkfun.com上获得。
传感器原理图由光学心率传感器,噪声消除RC电路或滤波器组成,可以在示意图中看到。R2,C2,C1,C3和运算放大器MCP6001用于可靠的放大模拟输出。
用于心跳监测的其他传感器很少,但是SEN-11574脉冲传感器已广泛用于电子项目中。
脉冲传感器与PIC微控制器接口的电路图
在这里,我们已将脉冲传感器跨接在微控制器单元的第二个引脚上。由于传感器提供模拟数据,因此我们需要通过进行必要的计算将模拟数据转换为数字信号。
20Mhz的晶体振荡器通过两个陶瓷33pF电容器连接到微控制器单元的两个OSC引脚上。该LCD横跨微控制器的RB口相连。
PIC16F877A心跳监视器的代码说明
对于初学者来说,该代码有些复杂。制造商提供了SEN-11574传感器的示例代码,但它是为Arduino平台编写的。我们需要转换我们的PIC16F877A芯片的计算结果。完整的代码在该项目的结尾处提供了一个演示视频。并且可以从此处下载支持的C文件。
我们的代码流程相对简单,我们使用 开关 盒进行了 操作 。根据制造商,我们需要每2毫秒从传感器获取数据。因此,我们使用了计时器中断服务程序,该程序每2毫秒触发一次函数。
switch 语句中的代码流将如下所示:
情况1:读取ADC
情况2:计算心跳和IBI
情况3:在LCD上显示心跳和IBI
情况4:IDLE(不执行任何操作)
在定时器中断功能内部,我们将程序的状态更改为情况1:每2毫秒读取一次ADC。
因此,在 主要 功能中,我们定义了程序状态和所有 开关 情况。
void main(){ system_init(); main_state = READ_ADC; 而(1){ 开关(main_state){ case READ_ADC: { adc_value = ADC_Read(0); // 0是通道号 main_state = CALCULATE_HEART_BEAT; 打破; } case CALCULATE_HEART_BEAT: { calculate_heart_beat(adc_value); main_state = SHOW_HEART_BEAT; 打破; } case SHOW_HEART_BEAT: { if(QS == true){//找到了心跳 // //确定了BPM和IBI //量化的自“ QS”当Arduino发现心跳 QS = false时为true; //下次重置Quantified Self标志 // 0.9用于获取更好的数据。实际上不应该使用 BPM = BPM * 0.9; IBI = IBI / 0.9; lcd_com(0x80); lcd_puts(“ BPM:-”); lcd_print_number(BPM); lcd_com(0xC0); lcd_puts(“ IBI:-”); lcd_print_number(IBI); } } main_state = IDLE; 打破; 案件IDLE: { 中断; } 默认值: { } } } }
我们正在使用PIC16F877A的两个硬件外设:Timer0和ADC。
在timer0.c文件中,
TMR0 =(uint8_t)(tmr0_mask&(256-((((2 * _XTAL_FREQ)/(256 * 4))/ 1000)));;
该计算提供了2毫秒的计时器中断。计算公式为
// TimerCountMax-(((delay(ms)* Focs(hz))/(PreScale_Val * 4))/ 1000)
如果我们看到 timer_isr 函数,则它是-
void timer_isr(){ main_state = READ_ADC; }
在此功能中,程序状态每2ms更改为READ_ADC。
然后从Arduino示例代码中获取 CALCULATE_HEART_BEAT 函数。
void compute_heart_beat(int adc_value){ 信号= adc_value; sampleCounter + = 2; //使用此变量 int 跟踪以毫秒为单位的时间N = sampleCounter-lastBeatTime; //监视自最后一个拍子以来的时间以避免噪声 // // 如果(Signal <thresh && N>(IBI / 5)* 3) 找到脉冲波的波谷和波谷,// //等待3/5来避免二值噪声最后IBI的如果(信号<T){// T是槽 T =信号; //跟踪脉搏波的最低点 } } …………。 …………………………..
此外,完整的代码在下面给出,并通过注释进行了很好的解释。这种心跳传感器数据可以进一步上传到云中,并可以从任何地方通过Internet进行监视,因此使其成为基于IoT的心跳监视系统,请点击链接以了解更多信息。
从此处下载此PIC脉冲传感器项目的支持C文件。