ESP32 GATT(HeartRate) 구현해보기

ESP32 GATT 포스팅

목차

  1. ESP32 Arduino IDE 설정하기
  2. ESP32 Ble GAP 설정하기
  3. Ble GATT 개론
  4. ESP GATT(HeartRate) 구현해보기

본 포스팅은 아두이노 IDE(Arduino IDE)를 이용해서 GATT 구현하는 포스팅입니다.

코드를 하나하나 다 짤 수는 없는 노릇이니 예제를 먼저 불러보자

 파일 - 예제 - ESP32_BLE_Arudino - BLE_notify

를 실행하자. ESP32_BLE_Arudino는 사용자 지정 라이브러리 쪽에 위치해있다.

BLE_notify for Arduino by Kolban

갓-콜반 센세가 작성한 notify 예제를 응용해서 심박수 예제를 만들어볼거다.

이번에 사용할 서비스는 Heart Rate이고, 주소는 0x180D이다.

사용할 CHARACTERISTIC은 Heart Rate Measurement이고, 주소는 0x2A37이다.

따라서 #define을 아래와 같이 수정해주자.

Modify Servie UUID to 0x180d(HeartRate Service)
characteristic uuid to 0x2a37(heartrate mearsurement)

디바이스 이름을 바꾸고 싶다면 init안의 이름을 바꾸면 된다.

Change name what you want in BLEDevice::init

사용할 characteristic의 특징을 설정하고 싶으면 아래 부분을 수정하면 된다. 지난 포스팅에서 다뤘다시피 필수적으로 사용하는 특징은 notify이므로 notify를 제외한 모든 특성을 제거했다.

Heart Rate Measurement only uses notify property.

수정해야하는 코드는 아래 부분이다.

Modify Characteristic Property

Heart Rate Measurement 특성은 5개의 행렬을 가진다. 따라서 길이를 5로 설정해서 그 특징에 맞게 설정해줘야한다. 그 특징은 해당 사이트에서 확인해주면된다.

나는 버튼이 눌리면 bpm이 1씩 올라가는 예제를 만들고 싶었으므로 (실제로 회로를 꾸며서 계산할 생각이 없다.) button 구조체부터 만들었다.

Make Struct for button function and
declare button1.

그리고 setup에서 인터럽트를 생성한다.

Add attachinterrupt for falling edge

그리고 인터럽트 코드를 아래와 같이추가해주면 되겠다.

add code in isr()

그 다음 HeartRate measurement에 맞는 행렬을 만들어준다음 연결시 값을 notify해주는 코드를 작성해주면 되겠다.

(엄밀히 말하면 구조체로 만들어 주는 것이 맞으나, 별 기능이 없으므로 행렬로 해결했다.)

declare HeartBeat array and mofiy notify code.

이 업로드 된 상태에서 잘 되는지 nrf connect에서 확인해보자.

execute ble code

잘 된다. 근데 다소 아쉬운점이 있다면, advertising 할 때 2. 항목에서 다뤘던 것처럼 하트모양으로 만들고 싶은거다.

그래서 위처럼 바꿔보자.

BLEAdvertising *pAdvertising = pServer->getAdvertising();

코드 밑에 아래 코드 한 줄만 추가하자.

pAdvertising->addServiceUUID(SERVICE_UUID);

그러면 아래 영상처럼 하트로 변한 것을 볼 수 있을 것이다.

끗.

“ESP32 GATT(HeartRate) 구현해보기”의 2개의 댓글

  1. 잘 읽었습니다! 여쭤볼 것이 있어 댓글 남깁니다.

    저는 삼성 헬스, 오픈라이더와 같이 경로, 연결된 센서로부터 얻는 데이터를 기록을 하는 앱에서
    스마트 워치인 갤럭시 기어 S3를!
    스마트 워치가 아닌! “심박 수 센서”로써 위에 말씀드린 앱들에 연결해 사용할 수 있도록
    기어 S3에서 동작할 Tizen wearable native 앱을 만들고 있습니다.

    이 앱을 만드는 이유는 기어 S3의 다른 기능은 다 필요 없고 오직 내장되어 있는 ‘심박계’만 사용하고 싶은 마음에서 출발했습니다.

    제가 자전거 타는걸 좋아하는데요.
    목표는 스마트폰(운동 기록 앱)에 기어 S3의 심박계, 이미 쓰고 있던 케이던스 센서를 연결해
    심박 수와 케이던스를 기록하는 것입니다.

    심박 수를 기록하고 싶다? 그럼 기어 S3에서 기록 앱을 깔아서 기록하면 되잖아!라고 물으실 수 있습니다!
    그럼 케이던스 센서를 기어 S3와 연결할 수가 없어 심박 수만 기록됩니다!

    그럼 기어 S3로 심박 수 따로 기록하고 스마트폰으로 케이던스 따로 기록하면 되잖아!라고 물으실 수 있습니다!
    따로 기록된 2개의 정보를 하나로 합칠 수 없습니다!

    그래서 위 목표를 세우게 되었습니다. GATT를 구현하고, LE Advertising해서 제가 원하는 목표를 실현할 수 있을까요?
    아니면 애초에 스마트 워치에 그런 기능을 구현하려고 하는게 잘못된건가요?

    1. 안녕하세요 pedal님. 지금은 하드웨어만 개발하다보니 지식이 얕아서 도움드리기 힘든 점 양해부탁드립니다.
      지금 현재 스마트폰으로 갤럭시 기어의 심박수를 추출하는 기능이 구현되어 계신다면, 구현이 가능할 것 같습니다.
      케이던스 센서를 어떤 방식으로 수신하는지는 모르겠지만, 일정 주기마다 두 센서의 값을 받아오고 도시하는 어플리케이션은 구현 가능할 것 같습니다.
      ESP32같은 칩으로 구현하신다면 케이던스 센서와 ESP32와 신호를 물려주고 블루투스로 심박수를 받아 하나의 데이터 프레임으로 휴대폰으로 보내주는 방법도 괜찮을 듯 하네요.
      구체적인 시스템은 구상하기 나름이니, 고민하면서 해결책을 찾아나가시다보면 구현가능하지 않을까요..?

댓글 남기기

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.