مراقب معدل ضربات القلب باستخدام مستشعر Heart Rate Sensor اكتب تعليقُا

تم نشر هذا المشروع لجميع الأشخاص المهتمين في مجال تصنيع وابتكار المشاريع الإلكترونية والبرمجية، و نود التنويه أن موقع انا الكتروني يخلي مسؤوليته التامة في حال لم يعمل المشروع لدى العميل أو في حال الاستخدام الخاطئ للمكونات الإلكترونية والكهربائية التي قد تؤدي لحدوث أي مشكلة لا سمح الله.

شرح فكرة المشروع

  • في هذا المشروع، سنتطرق إلى دائرة إلكترونية تستخدم لقياس معدل ضربات القلب أي سرعة ضربات القلب.
  • مراقبة معدل ضربات القلب هي من أهم الأشياء التي يجب نقوم بها من أجل متابعة حالتنا الصحية والحفاظ عليها.
  • يتم عرض النتائج بوحدة bpm من خلال شاشة LCD.

ادوات المشروع

  • اردوينو اونو مع سلك توصيل Arduino Uno: عدد 1
  • شاشة LCD 16×02: عدد 1
  • مقاومة متغييرة 10 كيلو أوم Ohm Potentiometer: عدد 1
  • لوح تجارب 400 نقطة لون ابيض Solderless Breadboard: عدد 1
  • مستشعر النبض ، مستشعر معدل ضربات القلب Sensor Heart Rate Sensor: عدد 1
  • أسلاك توصيل من ذكر إلى أنثى 40 دبوس 20 سم wires 40pcs Male to Female 
  • أسلاك توصيل ذكر لذكر 40 قطعة 20 سم Male to Male jumper wires
  • 9V Maxell Alkaline Battery بطارية قلوية: عدد 1
  • موصل بطارية 9 فولت + مقبس تيار مستمر (غطاء موصل البطارية) Battery snap connector: عدد 1
تنويه: استخدم لوحة Bread board لتوصيل الوحدات بمنفذ 5V و GND

مخطط المشروع

الكود البرمجي

تنبيه : في حال لم تكن متأكد من قدرتك على تنفيذ خطوات المشروع يرجى استشارة شخص متخصص في هذا المجال.
  • للتعرف على تجهيز لوحة أردوينو للبرمجة قم بزيارة الرابط التالي.
  • للإطلاع على كيفية تحميل وتنصيب المكتبات قم بزيارة الرابط التالي.
  • قبل تحميل الكود البرمجي، عليك تحميل المكتبات التالية:
  • LiquidCrystal.h
  • في حال لم يعمل هذا الكود البرمجي، قم بتحميل ملف الكود بالضغط على زر التحميل الموجود في الأسفل.

#include<LiquidCrystal.h> // including the lcd library

LiquidCrystal lcd(7,6,5,4,3,2);
int sensor_pin = A0;

int led_pin = 13;
int Reset=6;
int heart_rate=0;

volatile int analog_data;

volatile int time_between_beats = 600;

volatile boolean pulse_signal = false;

volatile int beat[10]; //heartbeat values will be sotred in this array

volatile int peak_value = 512;

volatile int trough_value = 512;

volatile int thresh = 525;

volatile int amplitude = 100;

volatile boolean first_heartpulse = true;

volatile boolean second_heartpulse = false;

volatile unsigned long samplecounter = 0; //This counter will tell us the pulse timing

volatile unsigned long lastBeatTime = 0;

void setup()

{

pinMode(led_pin,OUTPUT);
pinMode(Reset, INPUT);
Serial.begin(115200);

lcd.begin(16,2); // starting the lcd
// printing heart beat on the display

lcd.setCursor(0,1); // setting the cursor from start

interruptSetup();

}

void loop()

{

Serial.print(“BPM: “);
lcd.clear();
lcd.print(“Heart Rate:”);
lcd.print(heart_rate);
Serial.println(heart_rate);
int rst = digitalRead(Reset);
Serial.print(rst);
delay(200); // take a break

}

void interruptSetup()

{

TCCR2A = 0x02; // This will disable the PWM on pin 3 and 11

OCR2A = 0X7C; // This will set the top of count to 124 for the 500Hz sample rate

TCCR2B = 0x06; // DON’T FORCE COMPARE, 256 PRESCALER

TIMSK2 = 0x02; // This will enable interrupt on match between OCR2A and Timer

sei(); // This will make sure that the global interrupts are enable

}

ISR(TIMER2_COMPA_vect)

{

cli();

analog_data = analogRead(sensor_pin);

samplecounter += 2;

int N = samplecounter – lastBeatTime;

if(analog_data < thresh && N > (time_between_beats/5)*3)

{

if (analog_data < trough_value)

{

trough_value = analog_data;

}

}

if(analog_data > thresh && analog_data > peak_value)

{

peak_value = analog_data;

}

if (N > 250)

{

if ( (analog_data > thresh) && (pulse_signal == false) && (N > (time_between_beats/5)*3) )

{

pulse_signal = true;

digitalWrite(led_pin,HIGH);

time_between_beats = samplecounter – lastBeatTime;

lastBeatTime = samplecounter;

if(second_heartpulse)

{

second_heartpulse = false;

for(int i=0; i<=9; i++)

{

beat[i] = time_between_beats; //Filling the array with the heart beat values

}

}

if(first_heartpulse)

{

first_heartpulse = false;

second_heartpulse = true;

sei();

return;

}

word runningTotal = 0;

for(int i=0; i<=8; i++)

{

beat[i] = beat[i+1];

runningTotal += beat[i];

}

beat[9] = time_between_beats;

runningTotal += beat[9];

runningTotal /= 10;

heart_rate = 60000/runningTotal;

}

}

if (analog_data < thresh && pulse_signal == true)

{

digitalWrite(led_pin,LOW);

pulse_signal = false;

amplitude = peak_value – trough_value;

thresh = amplitude/2 + trough_value;

peak_value = thresh;

trough_value = thresh;

}

if (N > 2500)

{

thresh = 512;

peak_value = 512;

trough_value = 512;

lastBeatTime = samplecounter;

first_heartpulse = true;

second_heartpulse = false;

}

sei();

}

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *