هدف ما از انجام این پروژه چیست؟
هدف از انجام این پروژه، آشنایی کامل با نحوهی عملکرد و راهاندازی ماژول GebraBit MAX30003 به عنوان سنسور ECG (نوار قلب) و اندازهگیری سیگنالهای بیوپتانسیل با استفاده از برد Arduino UNO است.
در این پروژه یاد میگیریم که چگونه سیگنالهای بسیار ضعیف الکتریکی تولیدشده توسط فعالیت الکتریکی قلب انسان را توسط چیپ MAX30003 تقویت، فیلتر و دیجیتالسازی کرده و از طریق رابط SPI به آردوینو ارسال کنیم.
همچنین نحوهی پیکربندی رجیسترهای کنترل، تنظیم نرخ نمونهبرداری، فیلترها، و استخراج دادهی ECG خام را یاد میگیریم.
در پایان، دادهها بهصورت عددی یا نموداری در Serial Plotter آردوینو نمایش داده میشوند تا شکل موج ECG قابل مشاهده باشد.
در این آموزش چه چیزهایی یاد میگیریم؟
آشنایی با مفهوم سیگنال ECG و نحوهی ثبت آن توسط سنسور بیوپتانسیل.
· یادگیری نحوهی ارتباط SPI بین سنسور و Arduino UNO.
· آشنایی با رجیسترهای کنترلی MAX30003 شامل تنظیمات فیلترها، نرخ نمونهبرداری، و بایاس.
· نحوهی خواندن دادهی خام از رجیستر FIFO و نمایش در سریال مانیتور.
· راهاندازی کتابخانههای مورد نیاز در Arduino IDE.
· تحلیل اولیه دادهها و مشاهده شکل موج ECG در Serial Plotter.
· آشنایی با خطاهای اتصال، تنظیم مجدد (Reset) و بررسی وضعیت سنسور.
برای شروع این پروژه به چه چیزهایی نیاز داریم؟
برای اجرای این پروژه به سختافزار و نرمافزار نیاز داریم. عناوین این سختافزارها و نرمافزارها در جدول زیر به شما ارائه شده است و میتوانید با کلیک بر روی هر یک، آن را تهیه/دانلود کرده و برای شروع آماده شوید.
| سختافزارهای مورد نیاز | نرمافزارهای مورد نیاز |
| Arduino UNO (یا Nano / Mega) | Arduino IDE |
| ماژول بیوپتانسیل GebraBit MAX30003 | کتابخانهی MAX30003 برای Arduino |
| سیمهای جامپر (M–F) | درایور USB CH340 |
| کابل USB برای اتصال آردوینو | |
| بردبورد (در صورت نیاز) |
ماژول GebraBit MAX30003 از رابط SPI استفاده میکند. اتصالات پایهها به شکل زیر است:

| پین آردوینو | پین ماژول MAX30003 | توضیح | |
| 13 | SCK | کلاک SPI | |
| 12 | MISO | داده از سنسور به آردوینو | |
| 11 | MOSI | داده از آردوینو به سنسور | |
| 7 | CS | انتخاب چیپ (Chip Select) | |
| 5V | VCC | تغذیه | |
| GND | GND | زمین مشترک | |
| INTB | D2 (قابل تغییر) | پایه وقفه برای اعلان داده آماده |
توجه کنید که برای راه اندازی این ماژول احتیاج به Logic Level Converter دارید و در صورت اتصال مستقیم ماژول به آردوینو امکان آسیب به سنسور خواهد شد.
پس از اتصال آردوینو به ماژول توسط Logic Level Converter، کتابخانه MAX30003را دانلود و به نرم افزار آردوینو اضافه و برنامه پیوست را اجرا کنید.
نحوه اتصال لیدها به بدن
برای اتصال دستگاه به بدن از یک کابل ECG سه لید با جک هدفون نری استفاده میشود .

در کابلهای ECG سه لید، لیدها به سه رنگ قرمز ، سبز و زرد هستند که لید قرمز به دست راست، لید زرد به دست چپ شخص وصل میشود.

لیدها را همانند شکل متصل کنید، سپس کابلECG را با احتیاط و به آرامی داخل سوکت مربوطهی ماژول مورد نظر قرار داده و توجه داشته باشید که کاملا چفت شده باشد.
تغذیه را متصل کنید سیگنال خروجی را در پلاتر آردوینو مشاهده می کنید.
نکته: حتما بین پوست و چست لید از پماد لوبریکانت استفاده شود و همچنین از محکم بودن چست لید بر روی پوست اطمینان حاصل کنید.
سورس کد
برای اجرای این پروژه به protocentral_Max30003.h و protocentral_Max30003.cpp احتیاج داریم.
protocentral_Max30003.h:
تعریف دستورات پایه برای خواندن و نوشتن
#define WREG 0x00
#define RREG 0x01
این دو دستور تعیین میکنند که عملیات SPI روی رجیسترها بهصورت نوشتن (Write Register) یا خواندن (Read Register) انجام شود.
تعریف آدرس رجیسترهای داخلی MAX30003
این بخش شامل تمامی رجیسترهای مهم چیپ است که برای راهاندازی ECG، مدیریت وقفه، تنظیم فیلترها، ریست و خواندن دادههای FIFO استفاده میشوند.
#define NO_OP 0x00
#define STATUS 0x01
#define EN_INT 0x02
#define EN_INT2 0x03
#define MNGR_INT 0x04
#define MNGR_DYN 0x05
#define SW_RST 0x08
#define SYNCH 0x09
#define FIFO_RST 0x0A
#define INFO 0x0F
#define CNFG_GEN 0x10
#define CNFG_CAL 0x12
#define CNFG_EMUX 0x14
#define CNFG_ECG 0x15
#define CNFG_RTOR1 0x1D
#define CNFG_RTOR2 0x1E
#define ECG_FIFO_BURST 0x20
#define ECG_FIFO 0x21
#define RTOR 0x25
#define NO_OP 0x7F
توضیح کاربردی برخی از رجیسترهای مهم:
- STATUS (0x01):
وضعیت کلی چیپ را گزارش میدهد (آمادگی، خطا، رویدادها). - EN_INT / EN_INT2 (0x02–0x03):
فعالسازی انواع وقفهها (FIFO، RTOR، Lead-Off و …). - SW_RST (0x08):
اجرای ریست نرمافزاری چیپ. - FIFO_RST (0x0A):
پاککردن FIFO برای شروع خواندن داده جدید. - CNFG_GEN (0x10):
تنظیمات عمومی شامل فعالسازی ECG و مدیریت توان. - CNFG_EMUX (0x14):
انتخاب ورودیهای بیوپتانسیل (کانالها و مسیر سیگنال). - CNFG_ECG (0x15):
پیکربندی بخش ECG شامل فیلترها، نرخ نمونهبرداری و gain. - ECG_FIFO (0x21):
رجیستری که دادهی خام ECG از آن خوانده میشود. - RTOR (0x25):
خروجی ماژول R-to-R برای تشخیص ضربان قلب (BPM).
آدرس رجیسترها
#define BH1790_PARTID (0x10U) // R
#define BH1790_RESET (0x40U) // W
#define BH1790_MEAS_CTRL1 (0x41U) // R/W
#define BH1790_MEAS_CTRL2 (0x42U) // R/W
#define BH1790_MEAS_START (0x43U) // R/W
#define BH1790_DATAOUT_LEDOFF_LSBS (0x54U) // R
#define BH1790_DATAOUT_LEDOFF_MSBS (0x55U) // R
#define BH1790_DATAOUT_LEDON_LSBS (0x56U) // R
#define BH1790_DATAOUT_LEDON_MSBS (0x57U) // R
#define BH1790_MANUFACTURERID (0x92U) // R
تعریف پایههای سختافزاری پروژه
#define MAX30003_CS_PIN 7
#define CLK_PIN 13
#define RTOR_INTR_MASK 0x04
توضیح:
- MAX30003_CS_PIN (پین 4):
پایه Chip Select برای برقراری ارتباط SPI بین آردوینو و MAX30003. - CLK_PIN (پین 29):
تعیین پین کلاک داخلی/زمانبندی (در برخی پلتفرمها برای عملیات Sync به کار میرود).
در برد Arduino UNO استفاده نمیشود، اما در نسخههای توسعهای وجود دارد. - RTOR_INTR_MASK (0x04):
ماسک وقفه RTOR برای تشخیص ضربان قلب (R-Peak Detection).
با استفاده از این ماسک میتوان تشخیص داد که آیا وقفه مربوط به R-to-R فعال شده يا خير.
تعریف نوع دادهی نرخ نمونهبرداری (Sampling Rate Enumeration)
این قسمت از کد یک enum تعریف میکند که نرخهای مختلف نمونهبرداری (Sampling Rate) برای سنسور MAX30003 را مشخص میکند.
از آنجا که MAX30003 قابلیت ارائه داده با نرخهای متفاوت را دارد، استفاده از enum باعث خوانایی بیشتر کد و جلوگیری از اشتباه در مقداردهی رجیسترها میشود.
typedef enum
{
SAMPLINGRATE_128 = 128,
SAMPLINGRATE_256 = 256,
SAMPLINGRATE_512 = 512
}sampRate;
typedef enum { … } sampRate;
یک نوع داده جدید به نام sampRate تعریف میکند که شامل مقادیر از پیش تعیینشده برای نرخ نمونهبرداری ECG است.
SAMPLINGRATE_128 = 128
مقدار نرخ نمونهبرداری ۱۲۸ نمونه در ثانیه
مناسب برای نمایش سادهی ECG و کاهش حجم داده.
SAMPLINGRATE_256 = 256
مقدار نرخ نمونهبرداری ۲۵۶ نمونه در ثانیه
استاندارد رایج برای ضبط ECG با دقت متوسط.
SAMPLINGRATE_512 = 512
مقدار نرخ نمونهبرداری ۵۱۲ نمونه در ثانیه
کیفیت بالاتر — برای تحلیل دقیقتر R-Peak و فیلترهای حساس.
protocentral_Max30003.cpp:
تابع max30003RegWrite – نوشتن مقدار در رجیسترهای MAX30003 از طریق SPI
این تابع یک رجیستر داخلی از چیپ MAX30003 را از طریق رابط SPI مقداردهی میکند. آدرس رجیستر و دادهی ۲۴ بیتی به آن داده میشود و تابع با ساختن بایت فرمان و ارسال سه بایت داده، مقدار رجیستر مورد نظر را تنظیم میکند.
- ورودیها:
- WRITE_ADDRESS : آدرس رجیستر مقصد
- data : مقدار ۲۴ بیتی که باید در رجیستر نوشته شود
- خروجی:
- void (مقداری برنمیگرداند)
/ void MAX30003::max30003RegWrite (unsigned char WRITE_ADDRESS, unsigned long data)
{
// now combine the register address and the command into one byte:
byte dataToSend = (WRITE_ADDRESS<<1) | WREG;
// take the chip select low to select the device:
digitalWrite(MAX30003_CS_PIN, LOW);
delay(2);
SPI.transfer(dataToSend);
SPI.transfer(data>>16);
SPI.transfer(data>>8);
SPI.transfer(data);
delay(2);
// take the chip select high to de-select:
digitalWrite(MAX30003_CS_PIN, HIGH);
}
تابع max30003SwReset – ریست نرمافزاری چیپ MAX30003
این تابع با نوشتن مقدار مناسب در رجیستر SW_RST، یک ریست نرمافزاری روی چیپ MAX30003 اعمال میکند. بعد از فراخوانی این تابع، چیپ به حالت اولیه کارخانه برمیگردد و برای ادامه کار باید دوباره تنظیم شود.
- ورودیها:
- ندارد
- خروجی:
- void
void MAX30003::max30003SwReset(void)
{
max30003RegWrite(SW_RST,0x000000);
delay(100);
}
تابع max30003Synch – همگامسازی داخلی (Synchronization)
این تابع با نوشتن مقدار صفر در رجیستر SYNCH، روند داخلی اندازهگیری و FIFO را همگامسازی میکند. معمولاً پس از تنظیم رجیسترها یا قبل از شروع خواندن داده، این تابع فراخوانی میشود.
- ورودیها:
- ندارد
- خروجی:
- void
void MAX30003::max30003Synch(void)
{
max30003RegWrite(SYNCH,0x000000);
}
تابع max30003RegRead – خواندن داده از رجیسترهای MAX30003
این تابع یک رجیستر مشخص از چیپ MAX30003 را از طریق SPI میخواند و سه بایت دادهی دریافتی را در بافر کاربر ذخیره میکند. از این تابع برای خواندن رجیسترهای پیکربندی و وضعیت استفاده میشود.
- ورودیها:
- Reg_address : آدرس رجیستر موردنظر برای خواندن
- buff : اشارهگر به آرایهی ۳ بایتی برای ذخیرهی دادهی خواندهشده
- خروجی:
- void (دادهها در بافر ورودی قرار میگیرند)
void MAX30003::max30003RegRead(uint8_t Reg_address, uint8_t * buff)
{
uint8_t spiTxBuff;
digitalWrite(MAX30003_CS_PIN, LOW);
spiTxBuff = (Reg_address<<1 ) | RREG;
SPI.transfer(spiTxBuff); //Send register location
for ( int i = 0; i < 3; i++)
{
buff[i] = SPI.transfer(0xff);
}
digitalWrite(MAX30003_CS_PIN, HIGH);
}
تابع max30003ReadInfo – خواندن اطلاعات شناسنامهای چیپ (INFO Register)
این تابع رجیستر INFO را از چیپ MAX30003 میخواند و براساس بیتهای بالایی آن بررسی میکند که آیا چیپ بهدرستی شناخته شده و آمادهی کار است یا خیر. در صورت صحیح بودن مقدار، پیام موفقیت در Serial چاپ میشود.
- ورودیها:
- ندارد
- خروجی:
- bool :
- true → چیپ بهدرستی شناسایی شده و آماده است
- false → خطا در خواندن اطلاعات یا مقدار نامعتبر
- bool :
bool MAX30003::max30003ReadInfo(void)
{
uint8_t spiTxBuff;
uint8_t readBuff[4] ;
digitalWrite(MAX30003_CS_PIN, LOW);
spiTxBuff = (INFO << 1 ) | RREG;
SPI.transfer(spiTxBuff); //Send register location
for ( int i = 0; i < 3; i++)
{
readBuff[i] = SPI.transfer(0xff);
}
digitalWrite(MAX30003_CS_PIN, HIGH);
if((readBuff[0]&0xf0) == 0x50 ){
Serial.println("max30003 is ready");
Serial.print("Rev ID: ");
Serial.println((readBuff[0]&0xf0));
return true;
}else{
Serial.println("max30003 read info error\n");
return false;
}
return false;
}
تابع max30003ReadData – خواندن چند نمونه ECG از FIFO بهصورت Burst
این تابع با استفاده از فرمان ECG_FIFO_BURST تعداد مشخصی نمونهی ECG را بهصورت پشتسرهم از FIFO چیپ میخواند و در بافر کاربر ذخیره میکند. هر نمونه ۳ بایت است.
- ورودیها:
- num_samples : تعداد نمونههای موردنظر برای خواندن
- readBuffer : بافر ذخیرهسازی (باید حداقل num_samples*3 بایت باشد)
- خروجی:
- void
void MAX30003::max30003ReadData(int num_samples, uint8_t * readBuffer)
{
uint8_t spiTxBuff;
digitalWrite(MAX30003_CS_PIN, LOW);
spiTxBuff = (ECG_FIFO_BURST<<1 ) | RREG;
SPI.transfer(spiTxBuff); //Send register location
for ( int i = 0; i < num_samples*3; ++i)
{
readBuffer[i] = SPI.transfer(0x00);
}
digitalWrite(MAX30003_CS_PIN, HIGH);
}
تابع max30003Begin – راهاندازی اولیه MAX30003 در حالت ECG
این تابع تمام مراحل اولیهسازی چیپ MAX30003 برای کار در حالت اندازهگیری سیگنال ECG را انجام میدهد. شامل ریست نرمافزاری، تنظیم رجیسترهای عمومی، کالیبراسیون، انتخاب ورودیها، تنظیم ECG، تنظیم RTOR و در پایان همگامسازی میباشد.
- ورودیها:
- ندارد
- خروجی:
- void
- کاربرد:
- یک بار در ابتدای برنامه، برای شروع کار در حالت ثبت سیگنال ECG.
void MAX30003::max30003Begin()
{
max30003SwReset();
delay(100);
max30003RegWrite(CNFG_GEN, 0x081007);
delay(100);
max30003RegWrite(CNFG_CAL, 0x720000); // 0x700000
delay(100);
max30003RegWrite(CNFG_EMUX,0x0B0000);
delay(100);
max30003RegWrite(CNFG_ECG, 0x805000); // d23 - d22 : 10 for 250sps , 00:500 sps
delay(100);
max30003RegWrite(CNFG_RTOR1,0x3fc600);
max30003Synch();
delay(100);
}
تابع max30003BeginRtorMode – راهاندازی MAX30003 در حالت RTOR (محاسبه HR/RR)
این تابع چیپ را برای کار در حالت RTOR (محاسبه فاصلهی R–R و ضربان قلب) پیکربندی میکند. علاوه بر تنظیمات عمومی و ECG، رجیستر وقفهها نیز (EN_INT) برای فعالسازی وقفهی RTOR تنظیم میشود.
- ورودیها:
- ندارد
- خروجی:
- void
- کاربرد:
- زمانی که هدف، گرفتن مستقیم HR و RR از چیپ است، نه فقط دادهی خام ECG.
void MAX30003::max30003BeginRtorMode()
{
max30003SwReset();
delay(100);
max30003RegWrite(CNFG_GEN, 0x080004);
delay(100);
max30003RegWrite(CNFG_CAL, 0x720000); // 0x700000
delay(100);
max30003RegWrite(CNFG_EMUX,0x0B0000);
delay(100);
max30003RegWrite(CNFG_ECG, 0x805000); // d23 - d22 : 10 for 250sps , 00:500 sps
delay(100);
max30003RegWrite(CNFG_RTOR1,0x3fc600);
delay(100);
max30003RegWrite(EN_INT, 0x000401);
delay(100);
max30003Synch();
delay(100);
}
تابع getEcgSamples – خواندن یک نمونه ECG و تبدیل به مقدار عددی
این تابع یک نمونهی ECG را از رجیستر ECG_FIFO میخواند، سه بایت دریافتی را به یک مقدار ۲۲ بیتی تبدیل میکند و آن را در متغیر عضو ecgdata ذخیره مینماید. این مقدار آماده برای پردازش، رسم یا فیلتر کردن است.
- ورودیها:
- ندارد
- خروجی:
- void
- نتیجه:
- مقدار سیگنال ECG در متغیر ecgdata ذخیره میشود.
void MAX30003::getEcgSamples(void)
{
uint8_t regReadBuff[4];
max30003RegRead(ECG_FIFO, regReadBuff);
unsigned long data0 = (unsigned long) (regReadBuff[0]);
data0 = data0 <<24;
unsigned long data1 = (unsigned long) (regReadBuff[1]);
data1 = data1 <<16;
unsigned long data2 = (unsigned long) (regReadBuff[2]);
data2 = data2 >>6;
data2 = data2 & 0x03;
unsigned long data = (unsigned long) (data0 | data1 | data2);
ecgdata = (signed long) (data);
}
تابع getHRandRR – محاسبه ضربان قلب (HR) و فاصله R–R
این تابع رجیستر RTOR را از چیپ خوانده، مقدار خام آن را به فاصلهی R–R (بر حسب میلیثانیه) تبدیل میکند و سپس از روی همان مقدار HR (Heart Rate) را بر حسب ضربان در دقیقه (BPM) محاسبه کرده و در متغیرهای heartRate و RRinterval ذخیره میکند.
- ورودیها:
- ندارد
- خروجی:
- void
- نتیجه:
- heartRate : عدد صحیح ضربان قلب بر حسب BPM
- RRinterval : فاصله بین دو موج R متوالی بر حسب میلیثانیه (تقریباً)
<
void MAX30003::getHRandRR(void)
{
uint8_t regReadBuff[4];
max30003RegRead(RTOR, regReadBuff);
unsigned long RTOR_msb = (unsigned long) (regReadBuff[0]);
unsigned char RTOR_lsb = (unsigned char) (regReadBuff[1]);
unsigned long rtor = (RTOR_msb<<8 | RTOR_lsb);
rtor = ((rtor >>2) & 0x3fff) ;
float hr = 60 /((float)rtor*0.0078125);
heartRate = (unsigned int)hr;
unsigned int RR = (unsigned int)rtor* (7.8125) ; //8ms
RRinterval = RR;
}
برنامه نمونه در آردوینو
بعد از اتصال ماژول به آردوینو و اضافه کردن کتابخانه سنسور به نرم افزار آردوینو به مسیر زیر بروید و کد نمونه را باز کنید.
File > Examples > Example2-ECG-stream-Arduino-Plotter
شرح فایل نمونه
این کد در واقع برنامهی اصلی آردوینو برای خواندن ضربان قلب از سنسور MAX3003 است. گامبهگام (بلوکبهبلوک) توضیحش می دهیم:
تعریف آبجکت کلاس MAX30003
MAX30003 max30003;
در این خط، یک شیء (آبجکت) از کلاس MAX30003 ساخته میشود. این شیء با نام max30003 در تمام برنامه استفاده میشود تا از طریق آن بتوانیم به توابعی مثل max30003Begin(), getEcgSamples(), max30003ReadInfo() و… دسترسی داشته باشیم.
این شیء در واقع رابط برنامهی ما با چیپ سختافزاری MAX30003 است.
راهاندازی اولیه پورت سریال و پایهی CS
void setup()
{
Serial.begin(57600); //Serial begin
pinMode(MAX30003_CS_PIN,OUTPUT);
digitalWrite(MAX30003_CS_PIN,HIGH); //disable device
در ابتدای تابع setup()، ارتباط سریال با سرعت ۵۷۶۰۰ بیت بر ثانیه راهاندازی میشود تا بتوانیم پیامها و دادههای ECG را در Serial Monitor مشاهده کنیم.
سپس پایهی MAX30003_CS_PIN (چیپسلکت) بهعنوان خروجی تنظیم میشود و با مقدار HIGH غیرفعال میگردد. در پروتکل SPI، وقتی CS روی HIGH باشد، دستگاه در حالت غیرفعال بوده و وقتی LOW شود ارتباط فعال میشود.
تنظیمات اولیه رابط SPI
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
در این بخش، رابط SPI آردوینو فعال و برای کار با چیپ MAX30003 پیکربندی میشود:
- SPI.begin() → فعالسازی ماژول SPI
- setBitOrder(MSBFIRST) → ارسال بیت مهمتر (Most Significant Bit) در ابتدا
- SPI_MODE0 → مد کاری SPI روی Mode 0 تنظیم میشود (پولاریتی و فاز کلاک مطابق دیتاشیت MAX30003)
این تنظیمات باید با الزامات پروتکل چیپ MAX30003 مطابقت داشته باشند تا تبادل داده صحیح انجام شود.
خواندن اطلاعات شناسنامهای چیپ و چک کردن اتصال
bool ret = max30003.max30003ReadInfo();
if(ret){
Serial.println("Max30003 read ID Success");
}else{
while(!ret){
//stay here untill the issue is fixed.
ret = max30003.max30003ReadInfo();
Serial.println("Failed to read ID, please make sure all the pins are connected");
delay(10000);
}
}
در این بلوک، با استفاده از تابع max30003ReadInfo() بررسی میشود که آیا چیپ MAX30003 بهدرستی روی برد شناسایی شده است یا خیر.
- اگر ret == true باشد، یعنی شناسهی چیپ (ID) صحیح خوانده شده و سختافزار درست متصل است؛ یک پیام موفقیت در Serial چاپ میشود.
- اگر ret == false باشد، برنامه وارد یک حلقهی while میشود و مدام تلاش میکند ID را دوباره بخواند.
در هر تلاش ناموفق، پیغامی مبنی بر خطای اتصال پایهها چاپ شده و ۱۰ ثانیه تأخیر داده میشود.
این کار باعث میشود تا زمانی که مشکل سیمکشی/اتصال رفع نشده، برنامه جلو نرود و کاربر متوجه ایراد سختافزاری شود.
راهاندازی اولیه چیپ MAX30003 در حالت ECG
Serial.println("Initialising the chip ...");
max30003.max30003Begin(); // initialize MAX30003
}
در این بخش پیام “Initialising the chip …” روی سریال چاپ میشود تا کاربر بداند مرحلهی راهاندازی چیپ شروع شده است.
سپس تابع max30003Begin() فراخوانی میشود که در آن:
- ریست نرمافزاری انجام میشود
- رجیسترهای پیکربندی (CNFG_GEN, CNFG_CAL, CNFG_EMUX, CNFG_ECG, CNFG_RTOR1) مقداردهی میشوند
- عملیات همگامسازی (Synch) اجرا میشود
این تابع در واقع چیپ را برای شروع اندازهگیری سیگنال ECG آماده میکند.
حلقهی اصلی برنامه (loop) – خواندن نمونه ECG و ارسال روی سریال
void loop()
{
max30003.getEcgSamples(); //It reads the ecg sample and stores it to max30003.ecgdata .
Serial.println(max30003.ecgdata);
delay(8);
}
تابع loop() بهطور مداوم اجرا میشود و هستهی اصلی عملکرد برنامه است.
- در هر تکرار، ابتدا تابع getEcgSamples() فراخوانی میشود.
این تابع یک نمونهی جدید از دادهی ECG را از رجیستر FIFO چیپ میخواند و در متغیر عضوی max30003.ecgdata ذخیره میکند. - سپس مقدار max30003.ecgdata توسط Serial.println روی پورت سریال ارسال میشود.
با باز کردن Serial Plotter میتوان شکل موج ECG را بهصورت نموداری مشاهده کرد. - delay(8) باعث میشود بین هر دو نمونه حدود ۸ میلیثانیه فاصله باشد؛ این یعنی تقریباً حدود ۱۲۵ نمونه در ثانیه (نزدیک به ۱۲۸ sps)، که با نرخ تنظیمشدهی سنسور همخوانی دارد.
اجرای کد
آردوینو خود را به کامپیوتر متصل کنید و مدل و پورت آردوینو خود را انتخاب کنید. سپس نمونه کد را ابتدا Verify و سپس Upload کنید . بعد از Upload کردن کد Serial Plotter را باز کرده و می توانید خروجی های سنسور را مشاهده کنید .

