이 프로젝트는 MAX30102 센서 모듈을 사용한 간단한 심박수 모니터입니다. 아두이노 라이브러리를 기반으로 간단한 코드를 작성했으며, 측정값은 16x2 LCD 화면에 표시됩니다. 첫 번째 줄에는 평균 분당 심박수(BPM)가, 두 번째 줄에는 반사된 적외선 빔의 값이 표시됩니다. 이 값이 일정해야 더 정확한 측정이 가능합니다.
소스 코드
심박수 측정 코드
/* 광학 심박수 감지 (PBA 알고리즘) - MAX30105 브레이크아웃 보드용
작성자: Bennu @ MH-ET LIVE
날짜: 2017년 10월 2일
https://github.com/MHEtLive/MH-ET-LIVE-max30102
이 데모는 펄스 비트 진폭(PBA) 알고리즘을 사용하여 심박수(분당 박동 수, BPM)를 읽는 방법을 보여줍니다.
센서를 고무 밴드 등으로 손가락에 고정하는 것이 가장 좋습니다.
사람은 일정한 압력을 가하는 데 서툴기 때문입니다.
하드웨어 연결 (브레이크아웃 보드 → 아두이노):
- 5V = 5V (3.3V도 허용)
- GND = GND
- SDA = A4 (또는 SDA)
- SCL = A5 (또는 SCL)
- INT = 미연결
MAX30105 브레이크아웃은 5V 또는 3.3V I2C 로직을 처리할 수 있습니다.
5V로 보드에 전원 공급을 권장하지만 3.3V에서도 동작합니다. */
#include
#include "MAX30105.h"
#include
#include "heartRate.h"
MAX30105 particleSensor;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const byte RATE_SIZE = 4; // 평균 계산을 위한 크기 증가 가능. 4가 적당함.
byte rates[RATE_SIZE]; // 심박수 배열
byte rateSpot = 0;
long lastBeat = 0; // 마지막 박동이 발생한 시간
float beatsPerMinute;
int beatAvg;
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
Serial.println("초기화 중...");
// 센서 초기화
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) { // 기본 I2C 포트, 400kHz 속도 사용
Serial.println("MAX30105를 찾을 수 없습니다. 배선/전원을 확인하세요.");
while (1);
}
Serial.println("검지손가락을 센서에 일정한 압력으로 대세요.");
particleSensor.setup(); // 기본 설정으로 센서 구성
particleSensor.setPulseAmplitudeRed(0x0A); // 적색 LED를 낮게 켜서 센서 작동 표시
particleSensor.setPulseAmplitudeGreen(0); // 녹색 LED 끄기
}
void loop() {
long irValue = particleSensor.getIR();
if (checkForBeat(irValue) == true) {
// 박동 감지!
long delta = millis() - lastBeat;
lastBeat = millis();
beatsPerMinute = 60 / (delta / 1000.0);
if (beatsPerMinute < 255 && beatsPerMinute > 20) {
rates[rateSpot++] = (byte)beatsPerMinute; // 읽기 값 저장
rateSpot %= RATE_SIZE; // 변수 래핑
// 읽기 값 평균 계산
beatAvg = 0;
for (byte x = 0; x < RATE_SIZE; x++) beatAvg += rates[x];
beatAvg /= RATE_SIZE;
}
}
Serial.print("IR=");
Serial.print(irValue);
Serial.print(", BPM=");
Serial.print(beatsPerMinute);
Serial.print(", Avg BPM=");
Serial.print(beatAvg);
if (irValue < 50000) Serial.print(" 손가락 없음?");
Serial.println();
lcd.setCursor(0, 0);
lcd.print("BPM: ");
lcd.print(beatAvg);
lcd.setCursor(0, 1);
lcd.print(" IR: ");
lcd.print(irValue);
}