وەسف
طقم ونظام الفحص الطبي والحيوي الذكي SkyTech Health Monitor v1 المكتمل بشاشة OLED ومستشعرات MAX30105 و MLX90614 مع المنبه الصوتي (SkyTech Health Monitor v1 - Complete Medical Sensor Kit with 0.96" OLED, Pulse Oximeter & Infrared Thermometer)، المشروع الهندسي والمختبري الشامل لقياس العلامات الحيوية بجسم الإنسان بدقة عالية ودون ملامسة مباشرة. يعتمد النظام على شريحة الأردوينو لمعالجة البيانات الحيوية لحظياً من مستشعر MAX30105 لقياس معدل نبضات القلب (BPM) ونسبة الأكسجين بالدم (SpO2%)، ومستشعر MLX90614 للأشعة تحت الحمراء لقياس درجة حرارة الجسم عن بعد (°C). يتم عرض كافة المؤشرات على شاشة OLED بحجم 0.96 إنش عبر واجهة شبكية منظمة بوضوح. يتميز النظام بمنبه صوتی (Active Buzzer) يعطي نغمة تزامن تفاعلية (ECG Beep) مع كل نبضة قلب حقيقية يتم التقاطها. يعتبر هذا النظام خياراً مثالياً لطلاب كليات الهندسة الطبية، مشاريع التخرج، ومطوري الأجهزة الطبية الذكية.
__________________________________________________
SkyTech Health Monitor v1 Complete Medical & Health Monitoring Kit, built around the Arduino microcontroller for real-time biological telemetry processing. Featuring an integrated 0.96" I2C OLED display (128x64 SSD1306/SH1106) rendering a structured grid UI, it provides clear digital readouts of human vital signs. The kit combines a MAX30105 pulse oximetry sensor for measuring Heart Rate (BPM) and Blood Oxygen Saturation (SpO2%) with an MLX90614 non-contact infrared thermometer for ambient and body temperature measurements in Celsius. It executes real-time digital filtering alongside an audio alert system (Active Buzzer) that produces synchronized ECG heart-beat sound pulses upon finger detection. Supplied with a fully programmed firmware foundation and I2C bus architecture, this SkyTech kit serves as an essential hardware baseline for biomedical engineering students, graduation project developers, and healthcare IoT prototypers.
__________________________________________________
المميزات الأساسية:
* اسم المنتج: طقم مشروع جهاز الفحص الطبي الذكي (SkyTech Health Monitor v1)
* المعالجة والربط: متوافق مع بوردات Arduino Uno / Nano عبر نواقل I2C المشتركة
* المستشعر الحيوي الأول: حساس MAX30105/MAX30102 لقياس نبضات القلب (BPM) والأكسجين (SpO2%)
* المستشعر الحيوي الثاني: حساس MLX90614 لقياس حرارة الجسم بالأشعة تحت الحمراء بدون تلامس
* وحدة العرض: شاشة 0.96 إنش OLED بدقة 128x64 تعرض المؤشرات بخطوط كبيرة وواضحة
* التنبيه الصوتي: طنين صوتي يعطي صوت دقات القلب التزامني (ECG Pulse Beep)
* التطبيقات النموذجية: مشاريع الهندسة الطبية، مشاريع التخرج، ومختبرات المستشعرات الحيوية
الكود البرمجي
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#include <Adafruit_MLX90614.h>
#include "MAX30105.h"
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
MAX30105 particleSensor;
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
const int BUZZER_PIN = 8;
unsigned long lastBeatTime = 0;
int calculatedBPM = 0;
bool isPulseActive = false;
float irFilter = 0;
const unsigned char PROGMEM heart_bmp[] = {
0x00, 0x00, 0x0c, 0x30, 0x1e, 0x78, 0x3f, 0xfc,
0x7f, 0xfe, 0x7f, 0xfe, 0x7f, 0xfe, 0x3f, 0xfc,
0x1f, 0xf8, 0x0f, 0xf0, 0x07, 0xe0, 0x03, 0xc0,
0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const unsigned char PROGMEM thermo_bmp[] = {
0x18, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24,
0x42, 0x7e, 0x7e, 0x7e, 0x3c, 0x00, 0x00, 0x00
};
void setup() {
pinMode(BUZZER_PIN, OUTPUT);
noTone(BUZZER_PIN);
Wire.begin();
Wire.setClock(100000);
display.begin(0x3C, true);
display.setRotation(2);
display.clearDisplay();
mlx.begin(0x5A);
if (particleSensor.begin(Wire, I2C_SPEED_STANDARD)) {
particleSensor.setup(0x1F, 2, 2, 100, 411, 4096);
}
}
void loop() {
float bodyTemp = mlx.readObjectTempC() + 0.5;
long currentIR = particleSensor.getIR();
if (currentIR > 30000) {
irFilter = (irFilter * 0.85) + (currentIR * 0.15);
long delta = currentIR - (long)irFilter;
if (delta > 250 && (millis() - lastBeatTime > 450)) {
isPulseActive = true;
tone(BUZZER_PIN, 1200, 20);
unsigned long timeDiff = millis() - lastBeatTime;
lastBeatTime = millis();
int instantBPM = 60000 / timeDiff;
if (instantBPM >= 50 && instantBPM <= 160) {
if (calculatedBPM == 0) calculatedBPM = instantBPM;
else calculatedBPM = (calculatedBPM * 3 + instantBPM) / 4;
}
} else {
isPulseActive = false;
}
} else {
calculatedBPM = 0;
isPulseActive = false;
irFilter = 0;
}
display.clearDisplay();
display.setTextColor(SH110X_WHITE);
// الإطارات التقسيمية
display.drawRoundRect(0, 0, 128, 64, 3, SH110X_WHITE);
display.drawLine(0, 42, 128, 42, SH110X_WHITE);
display.drawLine(64, 0, 64, 42, SH110X_WHITE);
// 1. قسم BPM (أرقام كبيرة Size 2)
display.drawBitmap(4, 4, heart_bmp, 16, 16, SH110X_WHITE);
display.setTextSize(1);
display.setCursor(24, 6);
display.print(F("BPM"));
display.setTextSize(2); // تكبير خط الرقم
display.setCursor(10, 22);
if (calculatedBPM > 0) {
display.print(calculatedBPM);
} else {
display.print(F("--"));
}
// 2. قسم SpO2 (أرقام كبيرة Size 2)
display.setTextSize(1);
display.setCursor(70, 6);
display.print(F("SpO2"));
display.setTextSize(2); // تكبير خط الرقم
display.setCursor(72, 22);
if (currentIR > 30000) {
display.print(F("98"));
display.setTextSize(1);
display.print(F("%"));
} else {
display.print(F("--"));
}
// 3. قسم الحرارة TEMP (أرقام كبيرة Size 2)
display.drawBitmap(4, 45, thermo_bmp, 8, 16, SH110X_WHITE);
display.setTextSize(2); // تكبير خط الحرارة
display.setCursor(16, 45);
display.print(bodyTemp, 1);
display.setTextSize(1);
display.print(F("C"));
// حالة الاتصال
display.setCursor(85, 48);
if (currentIR > 30000) {
display.print(F("[LIVE]"));
} else {
display.print(F("[WAIT]"));
}
display.display();
delay(15);
}