심박수는 모든 사람의 건강을 모니터링하는 데 가장 중요한 매개 변수입니다. 웨어러블 장치의 현대 시대에는 심장 박동, 혈압, 발자국, 소모 칼로리 등을 측정 할 수있는 장치가 많이 있습니다. 이 장치에는 맥박수를 감지하기 위해 내부에 맥박 센서가 있습니다. 오늘 우리는 또한 PIC 마이크로 컨트롤러와 함께 맥박 센서를 사용하여 분당 심박수 와 Inter-Beat Interval 을 계산할 것입니다.이 값은 16x2 문자 LCD에 추가로 표시됩니다. 이 프로젝트 에서는 PIC16F877A PIC 마이크로 컨트롤러를 사용할 것 입니다. 우리는 이미 환자 모니터링 시스템을 위해 펄스 센서를 Arduino와 인터페이스했습니다.
필수 구성 요소
- PIC16F877A 마이크로 컨트롤러
- 20Mhz 크리스탈
- 33pF 커패시터 2 개
- 4.7k 저항 1 개
- 16x2 문자 LCD
- LCD 대비 제어를위한 10K 포트
- SEN-11574 펄스 센서
- 벨크로 스트랩
- 5V 전원 어댑터
- 브레드 보드 및 연결 와이어
맥박 센서 SEN-11574
심장 박동을 측정하려면 맥박 센서가 필요합니다. 여기 에서는 온라인 또는 오프라인 상점에서 쉽게 구할 수있는 SEN-11574 펄스 센서 를 선택했습니다. 제조사에서 제공하는 샘플 코드가 있기 때문에이 센서를 사용했는데 아두 이노 코드입니다. 이 코드를 PIC 마이크로 컨트롤러로 변환했습니다.
센서는 정말 작고 귓볼이나 손가락 끝에서 심장 박동을 읽는 데 완벽합니다. 직경이 0.625 인치이고 둥근 PCB 측면에서 두께가 0.125 인치입니다.
이 센서는 아날로그 신호를 제공하며 센서는 3V 또는 5V로 구동 할 수 있으며 센서의 전류 소비는 4mA로 모바일 애플리케이션에 적합합니다. 센서에는 24 인치 길이의 연결 케이블이있는 3 개의 와이어와 끝에 berg male 헤더가 있습니다. 또한 센서에는 벨크로 핑거 스트랩이 함께 제공되어 손가락 끝으로 착용 할 수 있습니다.
펄스 센서 회로도는 제조업체에서 제공하며 sparkfun.com에서도 사용할 수 있습니다.
센서 회로도는 광학 심박수 센서, 소음 제거 RC 회로 또는 필터로 구성되며 회로도에서 볼 수 있습니다. R2, C2, C1, C3 및 연산 증폭기 MCP6001은 안정적인 증폭 아날로그 출력에 사용됩니다.
심장 박동 모니터링을위한 다른 센서는 거의 없지만 SEN-11574 맥박 센서 는 전자 프로젝트에서 널리 사용됩니다.
PIC 마이크로 컨트롤러와 인터페이스하는 펄스 센서의 회로도
여기서는 마이크로 컨트롤러 장치 의 두 번째 핀에 펄스 센서를 연결했습니다. 센서가 아날로그 데이터를 제공하므로 필요한 계산을 통해 아날로그 데이터를 디지털 신호로 변환해야합니다.
20Mhz 의 수정 발진기는 2 개의 세라믹 33pF 커패시터가있는 마이크로 컨트롤러 장치의 2 개의 OSC 핀에 연결됩니다. LCD는 마이크로 컨트롤러의 RB 포트를 통해 연결되어 있습니다.
PIC16F877A 심장 박동 모니터 코드 설명
초보자에게는 코드가 약간 복잡합니다. 제조업체는 SEN-11574 센서 용 샘플 코드를 제공했지만 Arduino 플랫폼 용으로 작성되었습니다. 마이크로 칩 PIC16F877A에 대한 계산을 변환해야합니다. 이 프로젝트의 끝에 데모 비디오 와 함께 완전한 코드 가 제공됩니다. 지원하는 C 파일은 여기에서 다운로드 할 수 있습니다.
코드 흐름은 비교적 간단하며 스위치 케이스를 사용하여 단계를 만들었습니다. 제조업체에 따라 2 밀리 초마다 센서에서 데이터를 가져와야합니다. 그래서 우리는 2 밀리 초마다 함수를 실행하는 타이머 인터럽트 서비스 루틴을 사용했습니다.
switch 문의 코드 흐름 은 다음과 같습니다.
사례 1: ADC 읽기
사례 2: 심장 박동 및 IBI 계산
사례 3: LCD에 하트 비트 및 IBI 표시
사례 4: IDLE (아무것도하지 않음)
타이머 인터럽트 기능 내에서 프로그램의 상태를 Case 1: 2 밀리 초마다 ADC 읽기로 변경합니다.
그래서 메인 기능에서 프로그램 상태와 모든 스위치 케이스를 정의했습니다.
void main () { system_init (); main_state = READ_ADC; while (1) { switch (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"아두 이노가 하트 비트를 발견하면 참 QS = false; // 다음에 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로 변경됩니다.
그런 다음 CALCULATE_HEART_BEAT 함수는 Arduino 예제 코드에서 가져옵니다.
void calculate_heart_beat (int adc_value) { Signal = adc_value; sampleCounter + = 2; //이 변수를 사용하여 시간을 mS 단위로 추적합니다. int N = sampleCounter-lastBeatTime; // 노이즈를 피하기 위해 마지막 비트 이후의 시간을 모니터링합니다. // 맥파의 최고점과 최저점을 찾습니다. if (Signal <thresh && N> (IBI / 5) * 3) {// 대기하여 이색 성 노이즈 방지 마지막 IBI의 if (Signal <T) {// T는 최저점입니다. T = Signal; // 맥파의 최하점 추적 } } …………. ………………………..
또한 전체 코드는 아래에 나와 있으며 주석으로 잘 설명되어 있습니다. 이 심장 박동 센서 데이터는 클라우드에 추가로 업로드하고 어디에서나 인터넷을 통해 모니터링 할 수 있으므로 IoT 기반 심장 박동 모니터링 시스템이됩니다. 링크를 따라 자세히 알아보세요.
여기에서이 PIC 펄스 센서 프로젝트에 대한 지원 C 파일을 다운로드하십시오.