Уявіть: ви запускаєте фітнес-додаток, що вимірює пульс. PPG через камеру видає ±15 уд/хв — артефакти від руху, відблиски, обмеження частоти кадрів на iOS. BLE-датчик втрачає з'єднання через невірний парсинг Heart Rate Measurement characteristic. HealthKit вимагає складного налаштування дозволів, і Apple відхиляє публікацію через невідповідність Section 5.1. Ми вирішуємо ці проблеми за 2–4 тижні під ключ: від захоплення кадру до публікації в сторах. Зв'яжіться з нами — отримайте детальний план інтеграції вашого проекту.
Які проблеми вирішуємо?
Неточність PPG-вимірювання — основна біль: артефакти руху, зміна освітлення, обмеження спалаху на iOS. BLE-інтеграція теж не тривіальна: невірний парсинг флагів, RR-інтервалів веде до помилок HRV. HealthKit/Health Connect — складнощі з авторизацією та фоновим збором. Ми закриваємо кожен з цих шарів: від захоплення кадру до публікації.
BLE-датчики точніші за PPG у 5–10 разів за стандартним відхиленням (±1 проти ±10 уд/хв у спокої). Для додатків з претензією на спортивний моніторинг або HRV — тільки BLE.
Як ми реалізуємо PPG через камеру: покроково
- Захоплення відеопотоку: AVCaptureVideoDataOutputSampleBufferDelegate (iOS) або CameraX (Android). Частота 30 fps.
- Обчислення середнього зеленого каналу: беремо центральну область кадру — 1/3 від розмірів. Уникаємо відблисків.
- Фільтрація: пропускаємо сигнал через смуговий фільтр 0.67–3.33 Гц (FFT або IIR).
- Детекція піків: алгоритми на основі автокореляції або аналізу переходу через нуль.
- Розрахунок ЧСС: кількість піків за останні 5 секунд.
- Оцінка HRV: якщо потрібно — вимірюємо RR-інтервали (в BLE це native, в PPG — непряма оцінка).
Детальний розрахунок ЧСС та HRV
Частота дискретизації 30 fps => часове розділення 33 мс. Для ЧСС 180 уд/хв (3 Гц) потрібно мінімум 6 Гц (теорема Найквіста). Ми використовуємо FFT з вікном Ханна довжиною 5 секунд (150 точок). Для HRV вимірюємо SDNN та RMSSD; на PPG вони менш точні, ніж на BLE.
Чому BLE точніше за PPG?
Стандартний профіль Bluetooth LE для датчиків пульсу (Polar H10, Wahoo TICKR, Garmin HRM):
- Service UUID:
0x180D(Heart Rate) - Characteristic UUID:
0x2A37(Heart Rate Measurement)
Дані приходять через Notification. Перший байт — флаги: біт 0 визначає формат (UINT8 або UINT16), біт 4 — наявність RR-інтервалів.
override fun onCharacteristicChanged( gatt: BluetoothGatt, characteristic: BluetoothGattCharacteristic, value: ByteArray ) { val flag = value[0].toInt() val isUint16 = flag and 0x01 != 0 val heartRate = if (isUint16) { ((value[2].toInt() and 0xFF) shl 8) or (value[1].toInt() and 0xFF) } else { value[1].toInt() and 0xFF } // RR-інтервали (якщо є) — для HRV if (flag and 0x10 != 0) { var offset = if (flag and 0x08 != 0) 4 else 3 // пропускаємо енерговитрати якщо є while (offset + 1 < value.size) { val rrRaw = ((value[offset + 1].toInt() and 0xFF) shl 8) or (value[offset].toInt() and 0xFF) val rrMs = rrRaw * 1000 / 1024 // переведення з 1/1024 с в мілісекунди rrIntervals.add(rrMs) offset += 2 } } } RR-інтервали — основа для розрахунку HRV (Heart Rate Variability). Якщо продукт претендує на стрес-моніторинг або відновлення — без RR не обійтися.
Як тестувати BLE-інтеграцію пульсу?
Типові помилки: некоректна обробка флагів, відсутність перепідключення при розриві, невірний парсинг RR-інтервалів. Ми автоматизуємо тестування на 20+ моделях датчиків (Polar, Wahoo, Garmin, Scosche), щоб гарантувати стабільне з'єднання та точні дані. Замовте тестування вашої інтеграції — отримайте звіт за 2 дні.
Читання з HealthKit / Health Connect
Для додатків, які не займаються прямим вимірюванням, а лише відображають дані:
let query = HKAnchoredObjectQuery( type: HKQuantityType(.heartRate), predicate: nil, anchor: lastAnchor, limit: HKObjectQueryNoLimit ) { _, samples, _, newAnchor, _ in self.lastAnchor = newAnchor let bpmValues = (samples as? [HKQuantitySample])?.map { $0.quantity.doubleValue(for: HKUnit(from: "count/min")) } ?? [] } healthStore.execute(query) Дані приходять з джерел: Apple Watch Series 4+ дає ЧСС кожні 5–15 хвилин у спокої та кожну секунду під час тренування.
Візуалізація
Для графіка ЧСС у реальному часі: кільцевий буфер останніх N значень, оновлення раз на секунду. На iOS — Charts (DanielGindi) або Swift Charts (iOS 16+). На Android — MPAndroidChart або Compose Canvas з кастомним малюванням.
Зони ЧСС розраховуються від максимального пульсу (220 мінус вік або за формулою Кервонена з урахуванням пульсу спокою):
| Зона | % від макс | Колір |
|---|---|---|
| 1 — відновлення | 50–60% | Сірий |
| 2 — аеробна база | 60–70% | Синій |
| 3 — аеробна | 70–80% | Зелений |
| 4 — анаеробний поріг | 80–90% | Оранжевий |
| 5 — максимальна | 90–100% | Червоний |
Формула розрахунку максимального пульсу
Найпоширеніша формула: 220 мінус вік (для чоловіків) або 226 мінус вік (для жінок). Для більш точного розрахунку використовується формула Кервонена: ЧССмакс = 220 - вік для непідготовлених, а для спортсменів — 205.8 - 0.685 * вік.
Що входить в розробку моніторингу пульсу під ключ?
- Аналіз вимог та вибір методу (камера/BLE/платформа або комбінація)
- Реалізація збору даних з очищенням та фільтрацією
- Алгоритми обробки (FFT, пік-детекція, HRV)
- Візуалізація (графік, зони, статистика)
- Інтеграція з HealthKit / Health Connect (читання та запис)
- Робота з фоновим режимом та сповіщеннями
- Тестування на реальних пристроях та датчиках (включаючи Fitbit, Garmin та ін.)
- Документація архітектури, конфігурація збірки, допомога з публікацією в сторах
Наш досвід та метрики
Маємо багаторічний досвід у мобільній розробці. Виконали 50+ проектів з моніторингом пульсу, інтегрували HealthKit у 30 додатків. У портфоліо — інтеграції з Polar, Wahoo, Garmin, Fitbit, а також HealthKit та Health Connect. Гарантуємо стабільне BLE-з'єднання на 20+ моделях датчиків. Всі рішення проходять рев'ю App Store та Google Play без відхилень. Економія бюджету за рахунок оптимізації алгоритмів — обговорюється індивідуально. Отримайте консультацію інженера та попередній кошторис.
Орієнтовні терміни
| Етап | Термін |
|---|---|
| PPG-вимірювання через камеру (з алгоритмами) | 2–3 тижні |
| Bluetooth GATT-інтеграція | 1–2 тижні |
| HealthKit/Health Connect + візуалізація | 5–8 днів |
| Повний цикл під ключ (всі методи) | від 4 тижнів |
Вартість кожного етапу розраховується індивідуально. Зв'яжіться з нами для точної оцінки вашого проекту — отримайте покроковий план реалізації та розрахунок термінів за 2 дні.
Джерело: Photoplethysmogram та Bluetooth Heart Rate Profile.







