مواجهة حساس قياس نسبة التأكسج في الدم ومعدل ضربات القلب MAX30100 مع أردوينو اكتب تعليقُا

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

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

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

لفتح نافذة Serial Monitor، انقر على Tools من شريط القوائم، ثم اختر من القائمة Serial Monitor

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

مخطط المشروع

طريقة توصيل الادوات مع أردوينو

حساس MAX30100:

Vin -> 5V

SCL -> A5

SDA -> A4

GND -> GND

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

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

#include <MAX30100.h>
#include <MAX30100_BeatDetector.h>
#include <MAX30100_Filters.h>
#include <MAX30100_PulseOximeter.h>
#include <MAX30100_Registers.h>
#include <MAX30100_SpO2Calculator.h>
#include <Wire.h>

#define REPORTING_PERIOD_MS 500

PulseOximeter pox;

const int numReadings=10;
float filterweight=0.5;
uint32_t tsLastReport = 0;
uint32_t last_beat=0;
int readIndex=0;
int average_beat=0;
int average_SpO2=0;
bool calculation_complete=false;
bool calculating=false;
bool initialized=false;
byte beat=0;

void onBeatDetected() //Calls back when pulse is detected
{
viewBeat();
last_beat=millis();
}

void viewBeat()
{

if (beat==0) {
Serial.print(“_”);
beat=1;
}
else
{
Serial.print(“^”);
beat=0;
}
}

void initial_display()
{
if (not initialized)
{
viewBeat();
Serial.print(” MAX30100 Pulse Oximeter Test”);
Serial.println(“******************************************”);
Serial.println(“Place place your finger on the sensor”);
Serial.println(“********************************************”);
initialized=true;
}
}

void display_calculating(int j){

viewBeat();
Serial.println(“Measuring”);
for (int i=0;i<=j;i++) {
Serial.print(“. “);
}
}

void display_values()
{
Serial.print(average_beat);
Serial.print(“| Bpm “);
Serial.print(“| SpO2 “);
Serial.print(average_SpO2);
Serial.print(“%”);
}

void calculate_average(int beat, int SpO2)
{
if (readIndex==numReadings) {
calculation_complete=true;
calculating=false;
initialized=false;
readIndex=0;
display_values();
}

if (not calculation_complete and beat>30 and beat<220 and SpO2>50) {
average_beat = filterweight * (beat) + (1 – filterweight ) * average_beat;
average_SpO2 = filterweight * (SpO2) + (1 – filterweight ) * average_SpO2;
readIndex++;
display_calculating(readIndex);
}
}

void setup()
{
Serial.begin(115200);
pox.begin();
pox.setOnBeatDetectedCallback(onBeatDetected);
}

void loop()
{

pox.update();
if ((millis() – tsLastReport > REPORTING_PERIOD_MS) and (not calculation_complete)) {
calculate_average(pox.getHeartRate(),pox.getSpO2());
tsLastReport = millis();
}
if ((millis()-last_beat>10000)) {
calculation_complete=false;
average_beat=0;
average_SpO2=0;
initial_display();
}
}

اترك تعليقاً

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