תארו לעצמכם שאתם משיקים אפליקציית כושר שמודדת דופק. PPG דרך מצלמה נותן ±15 פעימות לדקה – חפצי תנועה, סנוור, מגבלות קצב פריימים ב-iOS. חיישן BLE מאבד חיבור עקב ניתוח שגוי של מאפיין מדידת הדופק. HealthKit דורש הגדרת הרשאות מורכבת, ואפל דוחה פרסום עקב אי-עמידה בסעיף 5.1. אנחנו פותרים בעיות אלה תוך 2–4 שבועות במפתח מלא: מלכידת פריימים ועד פרסום בחנות. צרו קשר כדי לקבל תוכנית אינטגרציה מפורטת לפרויקט שלכם.
אילו בעיות אנחנו פותרים?
חוסר הדיוק של מדידת PPG הוא הכאב העיקרי: חפצי תנועה, שינויי תאורה, מגבלות פנס ב-iOS. אינטגרציית BLE גם היא לא טריוויאלית: ניתוח דגלים שגוי, ניתוח מרווחי RR מוביל לשגיאות HRV. HealthKit/Health Connect – סיבוכים עם הרשאות ואיסוף ברקע. אנחנו מכסים כל אחת מהשכבות האלה: מלכידת פריימים ועד פרסום.
חיישני BLE מדויקים פי 5–10 מ-PPG בסטיית תקן (±1 לעומת ±10 פעימות לדקה במנוחה). לאפליקציות שמכוונות לניטור ספורט או HRV – רק BLE.
איך אנחנו מיישמים PPG דרך מצלמה: שלב אחר שלב
- לכידת זרם וידאו: AVCaptureVideoDataOutputSampleBufferDelegate (iOS) או CameraX (Android). 30 פריימים לשנייה.
- חישוב ממוצע הערוץ הירוק: קחו אזור מרכזי – 1/3 מהממדים. הימנעו מסנוור.
- סינון: העבירו את האות דרך מסנן מעביר פס 0.67–3.33 הרץ (FFT או IIR).
- זיהוי פסגות: אלגוריתמים המבוססים על אוטוקורלציה או ניתוח חציית אפס.
- חישוב דופק: מספר פסגות ב-5 השניות האחרונות.
- הערכת HRV: אם נדרש – מדידת מרווחי RR (BLE טבעי, PPG עקיף).
חישוב מפורט של דופק ו-HRV
קצב דגימה 30 פריימים לשנייה → רזולוציית זמן 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) כדי להבטיח חיבור יציב ונתונים מדויקים. הזמינו בדיקה של האינטגרציה שלכם – קבלו דוח תוך יומיים.
קריאה מ-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 – 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 } } } (DanielGindi) או 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) (iOS 16+). באנדרואיד – Charts או Compose Canvas עם ציור מותאם אישית.
אזורי דופק מחושבים מהדופק המרבי (220 פחות גיל או נוסחת Karvonen עם דופק מנוחה):
| אזור | % מהמרבי | צבע |
|---|---|---|
| 1 – התאוששות | 50–60% | אפור |
| 2 – בסיס אירובי | 60–70% | כחול |
| 3 – אירובי | 70–80% | ירוק |
| 4 – סף אנאירובי | 80–90% | כתום |
| 5 – מרבי | 90–100% | אדום |
נוסחת דופק מרבי
הנוסחה הנפוצה ביותר: 220 פחות גיל (גברים) או 226 פחות גיל (נשים). לחישוב מדויק יותר, נוסחת Karvonen: HRmax = 220 - גיל ללא אימון, לספורטאים – 205.8 - 0.685 * גיל.
מה כלול בפיתוח ניטור דופק במפתח מלא?
- ניתוח דרישות ובחירת שיטה (מצלמה/BLE/פלטפורמה או שילוב)
- יישום איסוף נתונים עם ניקוי וסינון
- אלגוריתמי עיבוד (FFT, זיהוי פסגות, HRV)
- ויזואליזציה (גרף, אזורים, סטטיסטיקות)
- אינטגרציית HealthKit / Health Connect (קריאה וכתיבה)
- מצב רקע והתראות
- בדיקות על מכשירים וחיישנים אמיתיים (כולל Fitbit, Garmin וכו')
- תיעוד ארכיטקטורה, הגדרת build, סיוע בהגשה לחנות
הניסיון והמדדים שלנו
יש לנו שנים רבות של ניסיון בפיתוח מובייל. השלמנו 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 שבועות |
העלות של כל שלב מחושבת בנפרד. צרו קשר להערכת פרויקט מדויקת – קבלו תוכנית יישום שלב אחר שלב והערכת לוח זמנים תוך יומיים.







