Higenis와 함께하는 ESP32 심박 측정 키트 제작기

개요

해당 게시글은 Higenis 블로그에 게시된 Espressif SystemsESP32 기반 심박 측정 키트 제작기에 기반합니다.

디지키에서 주요 부품 구매하기

우선, ESP32 심박 측정 키트의 주요 구성품들을 디지키에서 직접 구매해 보겠습니다.
심박 측정 키트를 만들기 위해 필요한 주요 구성품은 무려 20여종에 달하기에, 디지키 웹사이트에 접속해 하나씩 검색해 장바구니에 담아보았습니다.

키트 하나의 제작에 필요한 부품 수량만 주문하다 보니 소량을 주문하였지만, 단가도 합리적이고 재고 확인도 간편해서 편리하였습니다. 이렇게 간단하게 부품들을 검색하고 구매할 수 있다니!!!

mylists 기능을 사용하면, 이렇게 만든 부품 리스트를 다른 사람과 쉽게 공유할 수 있습니다.

다음 링크를 클릭하시면 실제 구입한 부품들을 확인해 볼 수 있습니다: 디지키 아이디어 댓글 이벤트 - 심박 센서 키트.

최종 주문 금액은 46,459원으로 여기에는 배송비 20,000원이 포함되어 있습니다.

한 가지 팁을 드리자면, 저희는 디지키와의 콜라보이기에 6만 원이 넘지 않았음에도 결제를 하였지만, 6만 원 이상 주문 시 무료 배송받을 수 있으니 잊지 말고 무료 배송을 이용해 보시길 바랍니다.

배송 및 언박싱

해외 배송이라고는 믿기지 않을 정도로 빠르게, 약 3~4일 만에 도착하였습니다.
경우에 따라 타이밍이 맞으면, 국내 배송으로 착각할 만큼 빠르게 배송되어, 아침에 주문한 상품을 다음 날 오후에 수령하는 경우도 있습니다.

디지키에서 주문한 제품이 빠르게 도착하여 포장을 개봉해보았습니다.

포장은 매우 깔끔하게 처리되어 있었으며, 내부에는 완충을 위한 에어캡 포장이 적용되어 있어 경량 부품임에도 불구하고 충격 방지에 신경 쓴 흔적이 엿보였습니다. 그리고 각 부품은 개별 포장되어 있어서 구분하기도 쉬웠습니다.

개별 포장에는 RoHS 관련 표기가 명확하게 되어 있었으며, 또한, 취급 시 주의가 필요한 부품에는 별도의 경고 라벨이 부착되어 있어 안전한 사용을 위한 배려가 돋보였습니다.


포장 품질이 매우 우수하여, 일부 부품의 경우 포장 비용이 제품 단가를 초과했을 것으로 예상될 정도였습니다. 이처럼 소형 부품 하나하나까지 세심하게 포장해주는 모습에서 글로벌 유통사로서의 전문성과 신뢰를 다시 한번 느낄 수 있었습니다.

제작 배경

그럼 본격적으로 ESP32 심박 측정 키트를 만들게 된 이유를 설명해 보겠습니다.

일반적으로 심박수 측정 프로젝트를 진행하려면 아래의 하드웨어를 각각 구매하고 직접 배선을 연결해야만 합니다.

  • MAX30102 센서
  • ESP32 보드
  • OLED 디스플레이
  • 점퍼 선과 브레드 보드

하지만 초보자에게 직접 배선은 꽤 큰 장벽입니다.
특히 소프트웨어 엔지니어의 경우, 하드웨어를 직접 다뤄야 한다는 점과 시스템의 불안정한 동작은 큰 부담이 될 수 있습니다.
그래서 저희는 전원만 연결하면 즉시 코드가 실행 가능한 보드의 구현을 목표로 삼았습니다.

보드 구성

  • ESP32 DevkitC V4
  • 1.3인치 OLED 디스플레이
  • MAX30102 심박/산소포화도 센서 (XD-58C 호환)
  • 버튼 4개 / LED 2개 / 부저 1개
  • 확장용 핀헤더 제공

단순한 심박 측정 기능을 넘어, 다양한 IoT 실험으로 확장 가능한 구조를 갖추고 있습니다.

기본 동작

전원을 연결하면 기본 데모 코드가 실행됩니다.

  1. 센서가 손끝에서 심박수(BPM)와 산소포화도(SpO₂) 측정
  2. 결과가 OLED 화면에 실시간 표시
  3. 버튼/LED/부저를 활용한 간단한 실험 가능

키트의 기본 동작은 다음 영상을 통해 확인할 수 있습니다:

코드 분석 - 핵심 이해하기

전체 예제는 GitHub(GitHub - dong-higenis/esp32_heat_rate_kit)에 공개되어 있으며, 기능별로 쉽게 켜고 끌 수 있도록 설계하였습니다.

이 글에서는 핵심적인 몇 가지 코드만 중급 수정에서 살펴보겠습니다.

  1. 심박수 계산
if (checkForBeat(irValue)) {
  RealBPM = 60 / ((millis() - lastBeat) / 1000.0);
  lastBeat = millis();
}

checkForBeat()가 혈류의 피크를 감지하면, 박자 간격으로 BPM을 계산합니다.
중급 학습 포인트: 임계값 조건을 직접 수정해 보며 측정 민감도를 조정할 수 있습니다.

  1. OLED 출력
display.setCursor(0, 0);
display.print("BPM:");
display.print((int)RealBPM);

중급 학습 포인트: 단순한 데이터 출력에 그치지 말고, 심박수 범위에 따라 텍스트의 색상이나 크기를 동적으로 변경하는 기능을 구현해 보세요.

  1. 산소포화도 계산
maxim_heart_rate_and_oxygen_saturation(
SPO2_irBuffer, bufferLength, SPO2_redBuffer,
&spo2, &validSPO2, &heartRate, &validHeartRate);

IR/Red 비율로 SpO₂를 계산합니다.
중급 학습 포인트: 버퍼 길이(bufferLength)를 바꿔 계산 속도 vs 안정성 차이를 확인해 보세요.

  1. 부저 알림
tone(BUZZER_PIN, NOTE_C7, 100);

중급 학습 포인트: 단순한 경고음 출력에 그치지 말고, 심박수 범위 조건을 추가하여 상황에 따라 경고음을 제어하는 기능을 구현해 보세요.

따라 해보기 - 중급 실험 미션

이번 단계는 단순 실행을 넘어, 코드를 직접 수정하면서 시스템의 동작 변화를 체험하는 중급 미션입니다.

  • Mission 1. 버튼으로 모드 전환
    • OLED 화면에 심박/SpO₂/그래프 표시를 버튼으로 전환할 수 있도록 구현해 보세요.
  • Mission 2. LED 경고 시스템
    • BPM이 정상 범위(예: 60~100)면 녹색 LED, 고심박이면 빨간 LED가 점등되도록 구현해 보세요.
  • Mission 3. 데이터 업로드
    • ESP32의 Wi-Fi 기능을 활용해 Firebase, Google Sheets, 혹은 간단한 MQTT 브로커에 데이터를 업로드해 보세요.

이러한 미션을 통해 단순한 실행을 넘어, "코드 수정으로 시스템의 동작을 변화시킬 수 있다"는 경험을 통해 실전 IoT 개발 역량을 키울 수 있습니다.

확장 아이디어

ESP32 보드는 Wi-Fi와 BLE를 지원하므로 다음과 같은 프로젝트로 확장할 수 있습니다.

  • 스마트폰 앱(Blynk, MIT App Inventor)과 연동
  • 클라우드(Firebase, Google Sheets)에 데이터 저장
  • IoT 대시보드(ThingsBoard, Node-RED) 구축

저자 소개

천동이는 IT·컴퓨터 분야에서 활동하는 개발자로, 다양한 기술에 대한 호기심과 열정을 바탕으로 블로그를 운영하고 있습니다. 임베디드 시스템, Android OS, WinCE, 펌웨어, RTOS 개발 경험을 갖추고 있으며, 자동차 통신 분석(MOST, CAN, LIN, AVC-LAN 등)에도 전문성을 보유하고 있습니다. 잡다한 기술을 좋아하는 성향 덕분에 블로그에서는 임베디드 프로그래밍, 하드웨어 인터페이스, IoT, 자동차 네트워크 등 폭넓은 주제를 다룹니다.