מדריך חיבור חיישן דופק וריווי חמצן בדם MAX30102 ל-Arduino ו-ESP32:
במדריך זה נלמד כיצד לחבר חיישן MAX30102 לבקר Arduino UNO ולבקר ESP32.
נראה איך החיישן משתמש באור אדום ואינפרא-אדום למדידת אות אופטי מהאצבע,
איך לקרוא את הנתונים דרך I2C, ואיך לזהות פעימות לב ולחשב קצב דופק בסיסי.
בנוסף, נסביר מדוע חישוב ריווי חמצן בדם (SpO2) דורש אלגוריתם מתאים,
ולמה החיישן אינו מוציא ערך רפואי מוכן ישירות מהשבב.
מהו חיישן MAX30102?
MAX30102 הוא חיישן אופטי המיועד לקריאת אותות הקשורים לדופק ולמדידת דופק אוקסימטרית.
בתוך החיישן נמצאים נורית אדומה, נורית אינפרא-אדומה, פוטודיטקטור ומעגלים אלקטרוניים לעיבוד האות.
החיישן מתאים לפרויקטים עם Arduino ו-ESP32, מכשירים לבישים,
ניסויים באותות ביולוגיים ומערכות ניטור לימודיות.
חשוב לדעת: MAX30102 אינו מכשיר רפואי בפני עצמו.
איכות התוצאה תלויה באלגוריתם, ביציבות האצבע, במגע עם החיישן,
בתאורה חיצונית ובתנועה בזמן המדידה.
איך החיישן עובד?
כאשר מניחים אצבע על החיישן, הנוריות מאירות את הרקמה.
חלק מהאור נבלע בגוף וחלק ממנו מוחזר אל הפוטודיטקטור.
כמות הדם בכלי הדם משתנה מעט בכל פעימת לב.
השינוי הזה גורם לשינוי בכמות האור שחוזרת אל החיישן,
וכך מתקבל אות מחזורי שנקרא PPG.
- הערוץ האינפרא-אדום משמש לקריאת שינוי באות הדופק.
- הערוץ האדום והערוץ האינפרא-אדום משמשים יחד בחישובי SpO2.
- הפוטודיטקטור מודד את עוצמת האור המוחזר.
- הבקר קורא את הנתונים דרך תקשורת I2C.
השבב אינו שולח לבקר ערך מוכן של BPM או SpO2.
הבקר מקבל דגימות אופטיות, ולאחר מכן התוכנה צריכה לזהות פעימות
ולבצע את החישובים המתאימים.
פינים במודול MAX30102
| פין | תפקיד |
|---|---|
| VIN | מתח הזנה למודול |
| GND | אדמה |
| SCL | קו שעון בתקשורת I2C |
| SDA | קו נתונים בתקשורת I2C |
| INT | יציאת פסיקה אופציונלית |
| IRD | חיבור הקשור לדרייבר הנורית האינפרא-אדומה; לא נדרש בחיבור בסיסי |
| RD | חיבור הקשור לדרייבר הנורית האדומה; לא נדרש בחיבור בסיסי |
לקריאה בסיסית דרך I2C משתמשים בדרך כלל רק בארבעה חיבורים:
VIN, GND, SDA ו-SCL.
רכיבים נדרשים
- חיישן MAX30102
- Arduino UNO או ESP32
- Breadboard
- חוטי Dupont
- כבל USB
- Arduino IDE
- ספריית SparkFun MAX3010x Sensor Library
חיבור MAX30102 ל-Arduino UNO

| MAX30102 | Arduino UNO |
| VIN | 5V |
| GND | GND |
| SDA | A4 |
| SCL | A5 |
הסבר חיבור
ב-Arduino UNO קווי I2C נמצאים בפינים A4 עבור SDA ו-A5 עבור SCL.
החיישן שולח את הדגימות האופטיות לבקר דרך שני הקווים האלה.
הפינים INT, IRD ו-RD אינם נדרשים לקריאה בסיסית בעזרת הספרייה.
לאחר החיבור יש להתקין דרך Library Manager את הספרייה:
SparkFun MAX3010x Sensor Library.
קוד Arduino בסיסי לקריאת אות החיישן
#include <Wire.h>
#include "MAX30105.h"
MAX30105 particleSensor;
void setup() {
Serial.begin(9600);
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println("MAX30102 was not found");
while (1);
}
particleSensor.setup();
particleSensor.setPulseAmplitudeRed(0x0A);
particleSensor.setPulseAmplitudeGreen(0);
Serial.println("Place your finger on the sensor");
}
void loop() {
long irValue = particleSensor.getIR();
Serial.print("IR value: ");
Serial.println(irValue);
delay(100);
}הסבר הקוד
הקוד מפעיל את החיישן וקורא את הערך של הערוץ האינפרא-אדום.
כאשר אין אצבע על החיישן מתקבל אות בסיסי,
וכאשר מניחים אצבע ניתן לראות שינוי ברור בערכים.
זהו השלב הראשון והחשוב ביותר:
לבדוק שהחיישן מחובר נכון ושהבקר מקבל נתונים יציבים לפני שמנסים לחשב דופק.
קוד Arduino בסיסי לחישוב דופק
#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"
MAX30105 particleSensor;
const byte RATE_SIZE = 4;
byte rates[RATE_SIZE];
byte rateSpot = 0;
long lastBeat = 0;
float beatsPerMinute;
int beatAverage;
void setup() {
Serial.begin(9600);
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println("MAX30102 was not found");
while (1);
}
particleSensor.setup();
particleSensor.setPulseAmplitudeRed(0x0A);
particleSensor.setPulseAmplitudeGreen(0);
Serial.println("Place your finger on the sensor and keep it still");
}
void loop() {
long irValue = particleSensor.getIR();
if (checkForBeat(irValue)) {
long delta = millis() - lastBeat;
lastBeat = millis();
beatsPerMinute = 60.0 / (delta / 1000.0);
if (beatsPerMinute > 20 && beatsPerMinute < 255) {
rates[rateSpot++] = (byte)beatsPerMinute;
rateSpot %= RATE_SIZE;
beatAverage = 0;
for (byte i = 0; i < RATE_SIZE; i++) {
beatAverage += rates[i];
}
beatAverage /= RATE_SIZE;
}
}
Serial.print("IR: ");
Serial.print(irValue);
Serial.print(" | BPM: ");
Serial.print(beatsPerMinute);
Serial.print(" | Average BPM: ");
Serial.println(beatAverage);
delay(20);
}הסבר הקוד
הקוד קורא את האות האינפרא-אדום ומחפש בו תבנית שמתאימה לפעימת לב.
כאשר מזוהה פעימה, הקוד מודד את הזמן שעבר מאז הפעימה הקודמת
ומחשב את קצב הדופק בדקה.
כדי שהערך יהיה יציב יותר, הקוד שומר מספר מדידות אחרונות
ומחשב מהן ממוצע.
בזמן המדידה יש להניח את האצבע בצורה יציבה ולא ללחוץ חזק מדי על החיישן.
תנועה קטנה יכולה ליצור הפרעה משמעותית באות.
למה הקוד הבסיסי לא מציג SpO2?
מדידת SpO2 דורשת שימוש גם בערוץ האדום וגם בערוץ האינפרא-אדום.
התוכנה צריכה לנתח את השינויים בשני האותות ולחשב את היחס ביניהם.
לכן לא מספיק לקרוא ערך אחד מהחיישן ולהמיר אותו ישירות לאחוזים.
יש להשתמש באלגוריתם מתאים, בקצב דגימה נכון ובתנאי מדידה יציבים.
ספריות ודוגמאות שונות כוללות אלגוריתמים לחישוב SpO2,
אך התוצאה בפרויקט לימודי אינה תחליף למדידה במכשיר רפואי מאושר.
חיבור MAX30102 ל-ESP32

| MAX30102 | ESP32 |
| VIN | 3V3 |
| GND | GND |
| SDA | GPIO21 |
| SCL | GPIO22 |
הסבר חיבור
ב-ESP32 מקובל להשתמש ב-GPIO21 עבור SDA וב-GPIO22 עבור SCL.
החיישן מתקשר עם הבקר דרך I2C בדיוק כמו בחיבור ל-Arduino.
בחיבור זה מזינים את המודול מ-3V3,
כך שרמות המתח מתאימות לבקר ESP32.
חשוב לבדוק את סימון הפינים על המודול לפני החיבור,
מכיוון שקיימות מספר גרסאות של לוחות MAX30102.
קוד ESP32 בסיסי לחישוב דופק
#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"
MAX30105 particleSensor;
const byte RATE_SIZE = 4;
byte rates[RATE_SIZE];
byte rateSpot = 0;
long lastBeat = 0;
float beatsPerMinute;
int beatAverage;
void setup() {
Serial.begin(115200);
Wire.begin(21, 22);
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
Serial.println("MAX30102 was not found");
while (1);
}
particleSensor.setup();
particleSensor.setPulseAmplitudeRed(0x0A);
particleSensor.setPulseAmplitudeGreen(0);
Serial.println("Place your finger on the sensor and keep it still");
}
void loop() {
long irValue = particleSensor.getIR();
if (checkForBeat(irValue)) {
long delta = millis() - lastBeat;
lastBeat = millis();
beatsPerMinute = 60.0 / (delta / 1000.0);
if (beatsPerMinute > 20 && beatsPerMinute < 255) {
rates[rateSpot++] = (byte)beatsPerMinute;
rateSpot %= RATE_SIZE;
beatAverage = 0;
for (byte i = 0; i < RATE_SIZE; i++) {
beatAverage += rates[i];
}
beatAverage /= RATE_SIZE;
}
}
Serial.print("IR: ");
Serial.print(irValue);
Serial.print(" | BPM: ");
Serial.print(beatsPerMinute);
Serial.print(" | Average BPM: ");
Serial.println(beatAverage);
delay(20);
}הסבר הקוד
הקוד עבור ESP32 עובד באותו עיקרון כמו הקוד עבור Arduino.
ההבדל העיקרי הוא הגדרת פיני I2C בעזרת Wire.begin.
החיישן שולח את אות ה-IR, והקוד מחפש את נקודות הפעימה
ומחשב את הזמן בין פעימה לפעימה.
אם החיישן לא מזוהה, מומלץ להריץ I2C Scanner.
הכתובת הנפוצה של MAX30102 היא 0x57.
טיפים לקבלת קריאה יציבה
- להניח את האצבע כך שתכסה את אזור החיישן.
- לא להזיז את האצבע בזמן המדידה.
- לא ללחוץ חזק מדי על החיישן.
- להפחית חדירת אור חיצוני אל הפוטודיטקטור.
- להמתין מספר שניות עד שהערכים מתייצבים.
- לבצע ממוצע של מספר פעימות כדי לצמצם רעש.
- לא להשתמש בתוצאה לצורך אבחון רפואי.
שגיאות נפוצות
אם מתקבלים ערכים לא יציבים, הסיבה הנפוצה ביותר היא תנועה של האצבע.
גם אור חזק מהסביבה או מגע לא טוב עם החיישן יכולים להפריע למדידה.
אם החיישן אינו מזוהה כלל, יש לבדוק את חיבורי SDA ו-SCL,
את מתח ההזנה ואת כתובת I2C.
אם ערכי BPM משתנים בצורה קיצונית,
יש להשאיר את האצבע יציבה ולתת למערכת זמן לצבור מספר פעימות לפני שימוש בערך הממוצע.
פרויקט לדוגמה
מד דופק עם MAX30102, מסך OLED ו-Buzzer

בפרויקט זה משתמשים בחיישן MAX30102 יחד עם Arduino UNO,
מסך OLED בגודל 128×32 ו-Buzzer.
החיישן קורא את אות הדופק מהאצבע,
והמערכת מציגה על המסך את קצב הדופק הממוצע.
בכל פעם שמזוהה פעימת לב ניתן גם להפעיל את ה-Buzzer לקבלת חיווי קולי.
מעבר לחיישן עצמו, הפרויקט כולל תצוגה בזמן אמת וחיווי קולי,
ולכן הוא מתאים ללמידה על חיישנים אופטיים, I2C,
עיבוד אות והצגת נתונים למשתמש.
סיכום
MAX30102 הוא חיישן אופטי שמאפשר לקרוא אותות הקשורים לזרימת הדם ולפעימות הלב
בפרויקטים עם Arduino ו-ESP32.
בעזרת ערוץ ה-IR ניתן לזהות פעימות ולחשב BPM,
ובעזרת שילוב נכון של הערוץ האדום והאינפרא-אדום
ניתן לבנות אלגוריתם להערכת SpO2.
כדי לקבל תוצאה יציבה חשוב לשמור על מיקום קבוע של האצבע,
להפחית תנועה ואור חיצוני, ולהשתמש באלגוריתם מתאים לעיבוד הנתונים.
המודול מתאים לפרויקטים לימודיים ולניסויים באלקטרוניקה,
אך אינו מחליף מכשיר רפואי מאושר.