В этом примере показано, как собрать и отобразить данные на графике из устройств мониторинга фитнеса с помощью коммуникации 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