본문 바로가기

WCH/CH32V20x

CH32V208 SSM - BLE HRS(Heart Rate Service)

 

 

CH32V208 예제중 간단히 테스트 할수 있는 BLE HRS(Heart Rate Service) 예제를 테스트 해보자.

BLE 앱은 기존에 STM32WB55 를이용하여 테스트 했던 ST BLE Toolbox 를 이용하였다.

 

https://nexp.tistory.com/3995

 

STM32WB55 SSM - Arduino BLE HRS(Heart Rate Service) 테스트

ST에서 제공하는 ST BLE Toolbox앱을 이용하여 STM32CubeIDE BLE HRM(Heart Rate) 테스트 코드는 복잡하고 쉽게 수정하기 어려운 구조 이므로 Arduino 환경에서 쉽고 간단하게 다양한 라이브러리를 추가 해서 테

nexp.tistory.com

 

 

CH32V208은 TinyOS를 이용하여 heartRatePeriodicTask 에서 주기적으로 심박수 측정값을 전송하는 구조 이다.

static void heartRatePeriodicTask(void)
{
    if(gapProfileState == GAPROLE_CONNECTED)
    {
        // send heart rate measurement notification
        heartRateMeasNotify();

        // Restart timer
        tmos_start_task(heartRate_TaskID, HEART_PERIODIC_EVT, DEFAULT_HEARTRATE_PERIOD);
    }
}

 

 

heartRateMeasNotify 함수에 실제로 측정된 심박 데이터를 업데이트 하면 된다.

테스트를 위해 스위치를 누르면 심박 카운트 값을 증가 하도록 수정했다.

static uint8_t  heartRateBpm = BPM_DEFAULT;


static void heartRateMeasNotify(void)
{
    heartRateMeas.pValue = GATT_bm_alloc(gapConnHandle, ATT_HANDLE_VALUE_NOTI, HEARTRATE_MEAS_LEN, NULL, 0);

    if(heartRateMeas.pValue != NULL)
    {
        uint8_t *p = heartRateMeas.pValue;
        uint8_t  flags = heartRateFlags[heartRateFlagsIdx];

        // build heart rate measurement structure from simulated values
        *p++ = flags;
        *p++ = heartRateBpm;
        if(flags & HEARTRATE_FLAGS_FORMAT_UINT16)
        {
            // additional byte for 16 bit format
            *p++ = 0;
        }
        if(flags & HEARTRATE_FLAGS_ENERGY_EXP)
        {
            *p++ = LO_UINT16(heartRateEnergy);
            *p++ = HI_UINT16(heartRateEnergy);
        }
        if(flags & HEARTRATE_FLAGS_RR)
        {
            *p++ = LO_UINT16(heartRateRrInterval1);
            *p++ = HI_UINT16(heartRateRrInterval1);
            *p++ = LO_UINT16(heartRateRrInterval2);
            *p++ = HI_UINT16(heartRateRrInterval2);
        }
        heartRateMeas.len = (uint8_t)(p - heartRateMeas.pValue);
        if(HeartRate_MeasNotify(gapConnHandle, &heartRateMeas) != SUCCESS)
        {
            GATT_bm_free((gattMsg_t *)&heartRateMeas, ATT_HANDLE_VALUE_NOTI);
        }
        // update simulated values
        heartRateEnergy += ENERGY_INCREMENT;
        //if(++heartRateBpm == BPM_MAX)
        //{
        //    heartRateBpm = BPM_DEFAULT;
        //}
        heartRateRrInterval1 = heartRateRrInterval2 = HEARTRATE_BPM_TO_RR(heartRateBpm);
    }
}

 

 

프로그램 실행하고 장치를 스캔하면 Hart Rate Sensor로 인식이 된다.

 

 

접속하면 스위치를 눌를때 마다 변경된 심박 데이터가 전송되는 것을 확인 할 수 있다.

 

 

반응형