[솔다/아두이노] 아두이노로 심박수 체크하기 -심박센서 모듈-


안녕하세요
디바이스마트의 인간 제세동기 솔다입니다.

영화나 드라마를 보면 안타까운 죽음들이 많이 나오는데요

손목이나 턱과 목 사이를 눌러서
맥박이 뛰지 않는지 확인하고 애도를 표하는 장면을
많이 접하셨을 겁니다


살아있다는 증거중에 하나가
심장이 열심히 일을 한다는 점인데요

특별한 센서를 이용해서 아두이노로 맥박을 측정해보려고합니다

-


하트모양이 인쇄된 이 귀여운 기판은
아두이노 심박측정 센서 모듈입니다

이 모듈을 이용하면 아두이노로 심박수를 측정할 수 있습니다

정 가운데에 LED가 있고 그 바로 밑에 수광부가 있습니다
따라서 실제로 사용할때는 하트가 피부쪽을 향하도록 해야합니다

심박수를 측정할 수 있는 원리는 심장이 바운스바운스 하기 때문인데요
'펌프질'이라고 표현하듯이 심장은 수축과 팽창을 반복해서
피를 온몸에 보내기 때문에 수축할때는 혈류량이 높아지고
팽창할때는 혈류량이 비교적 낮습니다


혈류량이 높을때는 혈구의 밀도가 높아서 빛이 많이 반사되고
혈류량이 낮을때는 혈구의 밀도가 낮아서 빛이 많이 투과됩니다
즉 빛의 반사율을 반복해서 측정하는 것으로 맥박을 감지할 수 있습니다

어느정도 원리도 파악되었으니
아두이노로 직접 테스트 해보겠습니다
레츠기릿~


-

준비물 부터 체크해보겠습니다!


심박센서모듈 고정용 테이프 조금
프로그램 업로드를 위한 컴퓨터와 케이블

정도 준비해주시면 되시겠습니다

사진 왼쪽 위의 점퍼와이어는 심박센서를 구매하시면
동봉되어있습니다


회로가 있는 면은 이렇게 생겼습니다

핀배열은 위와 같은 방향으로 놨을 때
맨 왼쪽이 SIG(아날로그 출력)
가운데가 VCC(5V 입력)
오른쪽이 GND(그라운드 연결)
입니다

기판에 S(signal)과 -(gnd)로 표시되어있기 때문에
헷갈일 일은 없을 것 같습니다

배선은 간단합니다


이렇게 배선해주시면 되는데요
배선도로 보면


이렇게 연결해주시면 됩니다


이대로 컴퓨터에 연결하면 모듈 중간에 신비한 빛이 들어오는데요


이제 연결은 끝났습니다

-

동작하려면 프로그램이 필요하지만
이미 프로그램은 다 작성되어있습니다


위 링크로 들어가셔서


오른쪽 중간쯤에 있는 녹색 버튼을 누르면
위 스크린샷 처럼 펼쳐지는데
빨간색 네모표시한 파란 버튼을 눌러 프로그램 압축파일을 받아줍니다


받은 파일은 압축 해제해주세요
경로는 상관 없습니다


폴더 내부는 이렇게 생겼는데요
빨간색 네모표시한 폴더로 들어가줍니다


파일이 4개가 있는데요
한개만 실제 작동하는 파일이고
나머지는 참조해야하는 파일입니다
모두 같은 폴더에 있어야 작동합니다

빨간 네모친 파일을 실행시켜줍니다


파일을 실행하면 이미 코드가 다 작성되어있는데요

그대로 실행해도 실행은 되지만
코드를 일부 수정하도록 하겠습니다


수정된 프로그램입니다
serialVisual을 False에서 True로 변경해줬습니다

False로 하면 센서값만 0~255 사이 값으로 출력되고
True로 하면 분당 심박수(BPM)으로 변환되어 출력됩니다
그리고 표준심박수 기준으로 시각적으로 표시해줍니다

밑에 딜레이는 200에서 1000으로 바꿨는데
200으로 할 경우 결과값이 너무 빠르게 나와서
1초에 한번씩 결과를 출력하도록 지연시켜줬습니다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*  Pulse Sensor Amped 1.4    by Joel Murphy and Yury Gitman   http://www.pulsesensor.com
----------------------  Notes ----------------------  ---------------------- 
This code:
1) Blinks an LED to User's Live Heartbeat   PIN 13
2) Fades an LED to User's Live HeartBeat
3) Determines BPM
4) Prints All of the Above to Serial
Read Me:
https://github.com/WorldFamousElectronics/PulseSensor_Amped_Arduino/blob/master/README.md   
 ----------------------       ---------------------- ----------------------
*/

//  Variables
int pulsePin = 0;                 // Pulse Sensor purple wire connected to analog pin 0
int blinkPin = 13;                // pin to blink led at each beat
int fadePin = 5;                  // pin to do fancy classy fading blink at each beat
int fadeRate = 0;                 // used to fade LED on with PWM on fadePin

// Volatile Variables, used in the interrupt service routine!
volatile int BPM;                   // int that holds raw Analog in 0. updated every 2mS
volatile int Signal;                // holds the incoming raw data
volatile int IBI = 600;             // int that holds the time interval between beats! Must be seeded! 
volatile boolean Pulse = false;     // "True" when User's live heartbeat is detected. "False" when not a "live beat". 
volatile boolean QS = false;        // becomes true when Arduoino finds a beat.

// Regards Serial OutPut  -- Set This Up to your needs
static boolean serialVisual = true;   // Set to 'false' by Default.  Re-set to 'true' to see Arduino Serial Monitor ASCII Visual Pulse 


void setup(){
  pinMode(blinkPin,OUTPUT);         // pin that will blink to your heartbeat!
  pinMode(fadePin,OUTPUT);          // pin that will fade to your heartbeat!
  Serial.begin(115200);             // we agree to talk fast!
  interruptSetup();                 // sets up to read Pulse Sensor signal every 2mS 
   // IF YOU ARE POWERING The Pulse Sensor AT VOLTAGE LESS THAN THE BOARD VOLTAGE, 
   // UN-COMMENT THE NEXT LINE AND APPLY THAT VOLTAGE TO THE A-REF PIN
//   analogReference(EXTERNAL);   
}


//  Where the Magic Happens
void loop(){
  
    serialOutput() ;       
    
  if (QS == true){     // A Heartbeat Was Found
                       // BPM and IBI have been Determined
                       // Quantified Self "QS" true when arduino finds a heartbeat
        fadeRate = 255;         // Makes the LED Fade Effect Happen
                                // Set 'fadeRate' Variable to 255 to fade LED with pulse
        serialOutputWhenBeatHappens();   // A Beat Happened, Output that to serial.     
        QS = false;                      // reset the Quantified Self flag for next time    
  
     
  ledFadeToBeat();                      // Makes the LED Fade Effect Happen 
  delay(1000);                             //  take a break
}





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
  

수정된 프로그램의 소스코드입니다
수정할 부분을 잘 못찾으시겠다면 복사 붙여넣기 해주시면 됩니다

소스코드수정이 완료되었다면
아두이노에 업로드 해줍니다

-

이제 센서를 손에 고정시켜야하는데요
측정중에 움직이거나 센서 모듈 연결부를 건드리게되면
잘못된 값이 출력될 수 있습니다

웨어러블장비를 만들 생각이라면 더 견고한게 좋겠지만
테스트만 할 예정이라서 전기테이프를 이용하여 고정하였습니다


손목에 정맥이 잘 보이길래
혹시 손목에 하면 더 측정이 잘 되지 않을까 했는데
손가락이 더 측정이 잘 되었습니다

테스트 하실 때 왠만하면 손가락으로 테스트 하시기를 권장드립니다

-

고정도 되었다면 시리얼모니터를 눌러서 결과를 확인해봅시다


시리얼모니터 버튼을 누르면?


제 심박수가 체크되어 나옵니다
BPM은 79~81정도로 높은편인데요
커피의 영향이 있는 것 같습니다

개인차가 있을 수 있지만
표준 BPM은 아래와 같습니다

남성
나이
18–25
26–35
36–45
46–55
56–65
65+
운동선수
49–55
49–54
50–56
50–57
51–56
50–55
뛰어남
56–61
55–61
57–62
58–63
57–61
56–61
좋음
62–65
62–65
63–66
64–67
62–67
62–65
평균 이상
66–69
66–70
67–70
68–71
68–71
66–69
평균
70–73
71–74
71–75
72–76
72–75
70–73
평균 이하
74–81
75–81
76–82
77–83
76–81
74–79
나쁨
82+
82+
83+
84+
82+
80+

여성
나이
18–25
26–35
36–45
46–55
56–65
65+
운동선수
54–60
54–59
54–59
54–60
54–59
54–59
뛰어남
61–65
60–64
60–64
61–65
60–64
60–64
좋음
66–69
65–68
65–69
66–69
65–68
65–68
평균 이상
70–73
69–72
70–73
70–73
69–73
69–72
평균
74–78
73–76
74–78
74–77
74–77
73–76
평균 이하
79–84
77–82
79–84
78–83
78–83
77–84
나쁨
85+
83+
85+
84+
84+
85+

저는 평균이하로 나왔네요ㅎㅎ
아마 커피를 안마셨더라도 평균으로는 못들었을거같습니다

이게 잘 작동하는건지 확신이 들지 않아서
안정상태와 운동 후 상태 두 상태로 나누어 테스트 했습니다


먼저 안정상태입니다
위 스크린샷 결과와 크게 다르지 않습니다
78~80BPM정도로 나옵니다

운동 후 상태를 측정하기 위해
지구들었다내리기푸쉬업 20개 하고 오겠습니다



약 10BPM정도 상승한 모습을 확인할 수 있었습니다
의자에 앉으니 서서히 안정 심박수로 떨어지는게 보이네요

제대로 작동한다고 결론지었습니다
건강을 위해 운동해야겠네요

-

아두이노와 심박센서를 사용하여 맥박을 재봤는데요

스마트폰에도 맥박을 재주는 기능이 많고
스마트밴드에는 필수 내장이라서 주변에서 많이 접하셨을겁니다

원리도 배우고 직접 사용도 해보시면
당연하게 사용하던게 당연하지 않다는걸 느끼셨을 겁니다

유익한 시간이셨으면 좋겠습니다
아쉽지만 다음에 만나요!

댓글 쓰기

2 댓글

  1. 아두이노에서 실행하면 'interruptSetup' was not declared in this scope 이라는 문구가 뜹니다 이유를 모르겠네요 ㅠㅠ

    답글삭제
    답글
    1. 관련된 프로그래밍이 없어요 자기가 한거 아닌거 같은데 ㅋㅋ

      삭제