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