Соберите данные от устройств мониторинга фитнеса

В этом примере показано, как собрать и отобразить данные на графике из устройств мониторинга фитнеса с помощью коммуникации Bluetooth® Low Energy.

Настройка оборудования

Этот пример использует Под поясом монитора сердечного ритма Armour® и парой Под Броней элегантные кроссовки. Оба устройства поддерживают Bluetooth Низкая энергетическая коммуникация.

Узнайте и свяжите с устройствами

Во-первых, проверяйте, что Bluetooth Низкие энергетические устройства поддерживает связи путем нахождения их в MATLAB. blelist функционируйте сканирует соседний Bluetooth Низкие энергетические периферийные устройства, которые дают объявление.

blelist
ans=14×5 table
    Index           Name                           Address                    RSSI    Advertisement
    _____    ___________________    ______________________________________    ____    _____________

      1      ""                     "21996E3A-8F31-496D-B332-79D03B759BC7"    -65     [1×1 struct] 
      2      ""                     "12377421-4EA3-4F77-9365-EFD580C34DE9"    -66     [1×1 struct] 
      3      "UA E39 MODULE"        "8206F662-BA4A-483F-A908-516FF506BFB0"    -67     [1×1 struct] 
      4      ""                     "CF65AD36-2146-4CA1-BCEA-FED47F6195CA"    -76     [1×1 struct] 
      5      "UA Footpod 239AE2"    "CF7B1A17-4104-4D7B-AE70-1837CAE9C9D0"    -78     [1×1 struct] 
      6      ""                     "67A1A92A-5F1C-4AF8-857A-99F194E9A5F8"    -82     [1×1 struct] 
      7      ""                     "5609D68D-0EED-41D7-BE19-F3ACAA119C7A"    -84     [1×1 struct] 
      8      ""                     "5A17DF46-6F71-4DAC-AF0D-0F28E3911187"    -85     [1×1 struct] 
      9      ""                     "9675A0FA-0394-468B-B908-040696E1C5BC"    -88     [1×1 struct] 
     10      ""                     "61540D17-C2DD-41D4-B107-E2E7374B11F4"    -88     [1×1 struct] 
     11      ""                     "C2A5CCC3-CA6C-4688-AAE9-A5BE039561F9"    -92     [1×1 struct] 
     12      ""                     "AF5E1195-4088-4A4B-ADA5-0BD3C91BFE62"    -93     [1×1 struct] 
     13      ""                     "83C69EFB-0FAD-4A35-B167-79C51A1F245D"    -94     [1×1 struct] 
     14      ""                     "993276FD-07EC-433D-85E1-E144B289B648"    -95     [1×1 struct] 

После того, как устройства найдены в MATLAB, соединяются с ними путем вызова ble. Задайте имя устройства, если имя уникально, или задайте адрес устройства.

belt = ble("UA E39 MODULE")
belt = 
  ble with properties:

               Name: "UA E39 MODULE"
            Address: "8206F662-BA4A-483F-A908-516FF506BFB0"
          Connected: 1
           Services: [4×2 table]
    Characteristics: [22×5 table]

Show services and characteristics
shoe = ble("UA Footpod 239AE2")
shoe = 
  ble with properties:

               Name: "UA Footpod 239AE2"
            Address: "CF7B1A17-4104-4D7B-AE70-1837CAE9C9D0"
          Connected: 1
           Services: [8×2 table]
    Characteristics: [39×5 table]

Show services and characteristics

Доступ к свойству Characteristics ble объектный пояс. Это устройство имеет сервис "Сердечного ритма", который содержит "характеристику" Измерения Сердечного ритма.

belt.Characteristics
ans=22×5 table
        ServiceName                      ServiceUUID                                   CharacteristicName                                CharacteristicUUID               Attributes 
    ____________________    ______________________________________    _____________________________________________________    ______________________________________    ____________

    "Heart Rate"            "180D"                                    "Heart Rate Measurement"                                 "2A37"                                    {["Notify"]}
    "Heart Rate"            "180D"                                    "Body Sensor Location"                                   "2A38"                                    {["Read"  ]}
    "Heart Rate"            "180D"                                    "Heart Rate Control Point"                               "2A39"                                    {["Write" ]}
    "Battery Service"       "180F"                                    "Battery Level"                                          "2A19"                                    {1×2 string}
    "Device Information"    "180A"                                    "System ID"                                              "2A23"                                    {["Read"  ]}
    "Device Information"    "180A"                                    "Model Number String"                                    "2A24"                                    {["Read"  ]}
    "Device Information"    "180A"                                    "Serial Number String"                                   "2A25"                                    {["Read"  ]}
    "Device Information"    "180A"                                    "Firmware Revision String"                               "2A26"                                    {["Read"  ]}
    "Device Information"    "180A"                                    "Hardware Revision String"                               "2A27"                                    {["Read"  ]}
    "Device Information"    "180A"                                    "Software Revision String"                               "2A28"                                    {["Read"  ]}
    "Device Information"    "180A"                                    "Manufacturer Name String"                               "2A29"                                    {["Read"  ]}
    "Device Information"    "180A"                                    "IEEE 11073-20601 Regulatory Certification Data List"    "2A2A"                                    {["Read"  ]}
    "Device Information"    "180A"                                    "PnP ID"                                                 "2A50"                                    {["Read"  ]}
    "Custom"                "21A51000-4C86-11E2-BCFD-0800200C9A66"    "Custom"                                                 "21A51011-4C86-11E2-BCFD-0800200C9A66"    {1×2 string}
    "Custom"                "21A51000-4C86-11E2-BCFD-0800200C9A66"    "Custom"                                                 "21A51021-4C86-11E2-BCFD-0800200C9A66"    {1×2 string}
    "Custom"                "21A51000-4C86-11E2-BCFD-0800200C9A66"    "Custom"                                                 "21A51022-4C86-11E2-BCFD-0800200C9A66"    {["Write" ]}
      ⋮

Доступ к свойству Characteristics ble объектная обувь. Это устройство имеет "Рабочую Скорость и Кэденс" сервис, который содержит "характеристику" Измерения RSC.

shoe.Characteristics
ans=39×5 table
            ServiceName                         ServiceUUID                                   CharacteristicName                                CharacteristicUUID               Attributes 
    ___________________________    ______________________________________    _____________________________________________________    ______________________________________    ____________

    "Device Information"           "180A"                                    "System ID"                                              "2A23"                                    {["Read"  ]}
    "Device Information"           "180A"                                    "Model Number String"                                    "2A24"                                    {["Read"  ]}
    "Device Information"           "180A"                                    "Serial Number String"                                   "2A25"                                    {["Read"  ]}
    "Device Information"           "180A"                                    "Firmware Revision String"                               "2A26"                                    {["Read"  ]}
    "Device Information"           "180A"                                    "Hardware Revision String"                               "2A27"                                    {["Read"  ]}
    "Device Information"           "180A"                                    "Software Revision String"                               "2A28"                                    {["Read"  ]}
    "Device Information"           "180A"                                    "Manufacturer Name String"                               "2A29"                                    {["Read"  ]}
    "Device Information"           "180A"                                    "IEEE 11073-20601 Regulatory Certification Data List"    "2A2A"                                    {["Read"  ]}
    "Device Information"           "180A"                                    "PnP ID"                                                 "2A50"                                    {["Read"  ]}
    "Battery Service"              "180F"                                    "Battery Level"                                          "2A19"                                    {1×2 string}
    "Running Speed and Cadence"    "1814"                                    "RSC Measurement"                                        "2A53"                                    {["Notify"]}
    "Running Speed and Cadence"    "1814"                                    "RSC Feature"                                            "2A54"                                    {["Read"  ]}
    "Running Speed and Cadence"    "1814"                                    "SC Control Point"                                       "2A55"                                    {1×2 string}
    "Custom"                       "21A54000-4C86-11E2-BCFD-0800200C9A66"    "Custom"                                                 "21A54001-4C86-11E2-BCFD-0800200C9A66"    {1×2 string}
    "Custom"                       "21A54000-4C86-11E2-BCFD-0800200C9A66"    "Custom"                                                 "21A54002-4C86-11E2-BCFD-0800200C9A66"    {1×2 string}
    "Custom"                       "21A54000-4C86-11E2-BCFD-0800200C9A66"    "Custom"                                                 "21A54003-4C86-11E2-BCFD-0800200C9A66"    {1×3 string}
      ⋮

Считайте данные о сердечном ритме

Затем создайте объект для "характеристики" Измерения Сердечного ритма путем определения ее сервиса и характеристической информации.

hr = characteristic(belt, "heart rate", "heart rate measurement")
hr = 
  Characteristic with properties:

             Name: "Heart Rate Measurement"
             UUID: "2A37"
       Attributes: "Notify"
      Descriptors: [1x3 table]
 DataAvailableFcn: []

Show descriptors

Затем считайте текущее измерение сердечного ритма из устройства.

data = read(hr)
data = 1×4

    22    96    73     3

Согласно Сервисной спецификации Сердечного ритма в Bluetooth Низкий энергетический Список Технических требований, "характеристическое значение" Измерения Сердечного ритма содержит байт флага, сопровождаемый одним или несколькими значениями сердечного ритма. Формат значения измерения зависит от флагового значения. Преобразуйте необработанные данные в сердечный ритм в ударах в минуту (bpm).

flag = uint8(data(1));
% Get the first bit of the flag, which indicates the format of the heart rate value
heartRateValueFormat = bitget(flag, 1);
if heartRateValueFormat == 0
    % Heart rate format is uint8
    heartRate = data(2);
else
    % Heart rate format is uint16
    heartRate = double(typecast(uint8(data(2:3)), 'uint16'));
end
fprintf('Heart rate measurement: %d(bpm)\n', heartRate);
Heart rate measurement: 96(bpm)

Считайте рабочие данные о скорости и тактовом сигнале

Точно так же создайте объект для "характеристики" Измерения RSC путем определения ее сервиса и характеристической информации.

rsc = characteristic(shoe, "running speed and cadence", "rsc measurement")
rsc = 
  Characteristic with properties:

             Name: "RSC Measurement"
             UUID: "2A53"
       Attributes: "Notify"
      Descriptors: [1x3 table]
 DataAvailableFcn: []

Show descriptors

Затем считайте текущую рабочую скорость и значение тактового сигнала от устройства.

data = read(rsc)
data = 1×10

     3     0     0     0     0     0    84    57     0     0

Согласно Под управлением Сервисной спецификации Скорости и Тактового сигнала в Bluetooth Низкий энергетический Список Технических требований, "характеристическое значение" Измерения RSC содержит 2 байта, который представляет мгновенную скорость и 1 байт, который представляет мгновенный тактовый сигнал. Преобразуйте необработанные данные в рабочую скорость в метрах в секунду (m/s) и к тактовому сигналу на шагах в минуту.

instantaneousSpeed = double(typecast(uint8(data(2:3)), 'uint16'))/256;
instantaneousCadence = data(4);
fprintf('Instantaneous speed: %.2f(m/s) and instantaneous cadence: %d(steps per minute)\n', instantaneousSpeed, instantaneousCadence);
Instantaneous speed: 0.00(m/s) and instantaneous cadence: 0(steps per minute)

Коррелируйте сердечный ритм и рабочую скорость

После чтения сердечного ритма и данных RSC, отследите живые данные во время рабочего сеанса и коррелируйте эти два измерения, чтобы анализировать эффективность фитнеса.

Чтобы показать корреляцию данных о фитнесе, сначала создайте два графика создать анимацию путем добавления точек данных в цикле.

% Create a plot for running speed against heart rate
axSpeed = axes('XLim', [0, 5], 'YLim', [60, 220]);
xlabel(axSpeed, 'Running speed (m/s)');
ylabel(axSpeed, 'Heart rate (bpm)');
subplot(1, 2, 1, axSpeed);
hSpeed = animatedline(axSpeed, 'Marker', 'o', 'MarkerFaceColor', 'green');

% Create a plot for running cadence against heart rate
axCadence = axes('XLim', [0, 200], 'YLim', [60 220]);
xlabel(axCadence, 'Running cadence (steps per minute)');
ylabel(axCadence, 'Heart rate (bpm)');
subplot(1, 2, 2, axCadence);
hCadence = animatedline(axCadence, 'Marker', 'o', 'MarkerFaceColor', 'blue');

Затем считайте данные об устройстве в цикле и обновите график, в то время как пользователь прогрессирует от обхода до бега трусцой к выполнению.

for loop = 1:30
    % Get heart rate data
    data = read(hr);
    flag = uint8(data(1));
    heartRateValueFormat = bitget(flag, 1);
    if heartRateValueFormat == 0
        heartRate = data(2);
    else
        heartRate = double(typecast(uint8(data(2:3)), 'uint16'));
    end
    
    % Get running speed data
    data = read(rsc);
    instantaneousSpeed = double(typecast(uint8(data(2:3)), 'uint16'))/256;
    instantaneousCadence = data(4);
    
    % Update plot with new data
    addpoints(hSpeed, instantaneousSpeed, heartRate);
    addpoints(hCadence, instantaneousCadence, heartRate);
    drawnow;
end

Эти графики обычно показывают, что выше рабочая скорость и значения тактового сигнала соответствуют увеличенному сердечному ритму.

Отключитесь от устройства

Очистите объекты устройства, когда вы будете закончены, работая с ними.

clear belt shoe