آموزش ساخت پالس اکسیمتر با آردوینو
یکی از مهمترین پارامترهای سلامتی بدن میزان اکسیژن خون است. اندازهگیری این مقدار به وسیله پالس اکسیمترهای انگشت صورت میگیرد. این وسایل پزشکی بعد از شروع همهگیری بیماری کووید ۱۹ بسیار کمیاب شدند و در بازههای قیمتی غیرمعقول قرار گرفتهاند.
در این مقاله سعی داریم روش ساخت یک پالس اکسیمتر را برای شما دوستان توضیح دهیم. پالس اکسیمتر در بیشتر وقتها شاید توضیح اصلی روند کسالت و بیحالی باشد. با دانستن شرایط بدن مانند ضربان، میزان فشارخون، قند و اکسیژن خون میتوان دید بهتری به وضعیت سلامتی خود داشت. سعی بر آن شده است تا با استفاده از حداکثر ماژولهای آماده روند ساخت بر همه خوانندگان آسان باشد.
وسایل مورد نیاز ساخت پالس اکسیمتر
- برد آردوینو نانو ورژن ۳
- برد پالس متر MAX30102
- صفحه نمایش OLED 2864 I2C
- پرینتر سهبعدی
- دستگاه هویه
آشنایی با ماژولها
ماژول max30102 یک سنسور مانیتورینگ ضربان قلب است. این ماژول از ترکیب دو LED، یک نوریگر نوری، اپتیک نوری و پردازشگر سیگنال آنالوگ تهیه شده است. این ماژول با برق ۱.۸ الی ۳.۳ ولت کار میکند و قابلیت کار به وسیله میکرو کنترلرهای مجتمع آردوینو را دارد. این برد با پروتکلهای I2C ارتباط برقرار میکند. این ماژول در ابعاد مختلفی در بازار موجود است. لازم است ابعاد آن را در محاسبات ساختار لحاظ شود.
ماژول آردوینو نانو یک برد کوچک کامل است. این برد دارای یک میکرو کنترلر ATmega328 است که در برد آردوینو اونو نیز موجود است. ولتاژ کاری این برد ۵ ولت است البته تمهیدات دیده شده تا با منبع ولتاژ ۶ الی ۲۰ ولت بتواند به آن برد وصل شود. این برد دارای ۱۴ پایه دیجیتال است. از این پایهها ۶ پایه دارای موج PWM است. در این برد ۶ پایه نیز جهت ورودی آنالوگ در نظر گرفته شده است.
روش ساخت ساخت پالس اکسیمتر
در مرحله اول قالبی را که طراحیشده است به وسیله پرینتر سه بعدی چاپ میکنیم. این قطعات بهتر است با مقدار ۷۰ الی ۸۰ درصد پرشدگی و با استقامت بالا چاپ شوند. فایل های طرح در انتها موجود است. بعد از چاپ قطعات آنها را از مواد و سطوح ناهماهنگ پاک و با سمباده نرم پرداخت میکنیم.
برای نصب بردها به صورت زیر عمل میکنیم. پایههای GND، VCC، SCL و SDA که به ترتیب از شماره یک تا چهار نمایشگر OLED مشخص شده است را به پایهها GND ، ۵ VOLT ، آنالوگ ۵ و آنالوگ ۴ متصل کنید. پایههای برد همین پایهها را نیز برای برد سنسور به برد آردوینو متصل میکنیم.
با نصب میکرو کنترلر به کامپیوتر برنامهای که در انتها موجود است را در کنترلر آپلود میکنیم. برنامه موجود در محیط نرم افزار c و یا c++ تهیه شده است. البته می توان آن را در نرم افزار لودر آردوینو هم استفاده نمود. همچنین می بایست از کتابخانه های موجود کتابخانه های برد نمایشگر و سنسور را به برد آپلود نماید. سپس بردهای نصب شده را بر روی قالب جای گذاری میکنیم و بعد از آن با پیچ های در نظر گرفته شده آنها را به هم متصل میکنیم. میتوان از یک باتری و یا شیلد باتری و کلید روشن و خاموش نیز در این دستگاه استفاده نمود.
برای راه اندازی ابتدا لازم است این برد و سنسور با ۱۰۰ داده کالیبره شود تا میزان خطا به حداقل برسد.
نحوه استفاده از ماژول
برای استفاده از پالس اکسیمتر، نوک انگشت خود را روی سنسور قرار دهید و در بالایی را به آرامی ببندید. سپس یک منبع تغذیه را وصل کنید و به راحتی صبر کنید تا ببینید داده ها نمایش داده می شوند.
/*
Hardware Connections (Breakoutboard to Arduino):
-۵V = 5V (3.3V is allowed)
-GND = GND
-SDA = A4 (or SDA)
-SCL = A5 (or SCL)
-INT = Not connected
The MAX30105 Breakout can handle 5V or 3.3V I2C logic. We recommend powering the board with 5V
but it will also run at 3.3V.
*/
#include <Wire.h>
#include “MAX30105.h”
#include “spo2_algorithm.h”
#include “SSD1306Ascii.h”
#include “SSD1306AsciiWire.h”
MAX30105 particleSensor;
SSD1306AsciiWire oled;
#define MAX_BRIGHTNESS 255
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
//Arduino Uno doesn’t have enough SRAM to store 50 samples of IR led data and red led data in 32-bit format
//To solve this problem, 16-bit MSB of the sampled data will be truncated. Samples become 16-bit data.
uint16_t irBuffer[50]; //infrared LED sensor data
uint16_t redBuffer[50]; //red LED sensor data
#else
uint32_t irBuffer[50]; //infrared LED sensor data
uint32_t redBuffer[50]; //red LED sensor data
#endif
int32_t spo2; //SPO2 value
int8_t validSPO2; //indicator to show if the SPO2 calculation is valid
int32_t heartRate; //heart rate value
int8_t validHeartRate; //indicator to show if the heart rate calculation is valid
void setup()
{
Serial.begin(115200); // initialize serial communication at 115200 bits per second:
oled.begin(&Adafruit128x64, 0x3C);
oled.setFont(Arial14);
// Initialize sensor
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
{
Serial.println(F(“MAX30105 was not found. Please check wiring/power.”));
while (1);
}
particleSensor.setup(55, 4, 2, 200, 411, 4096); //Configure sensor with these settings
}
void loop()
{
//read the first 50 samples, and determine the signal range
for (byte i = 0 ; i < 50 ; i++)
{
while (particleSensor.available() == false) //do we have new data?
particleSensor.check(); //Check the sensor for new data
redBuffer[i] = particleSensor.getRed();
irBuffer[i] = particleSensor.getIR();
particleSensor.nextSample(); //We’re finished with this sample so move to next sample
Serial.print(F(“red=”));
Serial.print(redBuffer[i], DEC);
Serial.print(F(“, ir=”));
Serial.println(irBuffer[i], DEC);
}
//calculate heart rate and SpO2 after first 50 samples (first 4 seconds of samples)
maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
//Continuously taking samples from MAX30102. Heart rate and SpO2 are calculated every 1 second
while (1)
{
//dumping the first 25 sets of samples in the memory and shift the last 25 sets of samples to the top
for (byte i = 25; i < 50; i++)
{
redBuffer[i – 25] = redBuffer[i];
irBuffer[i – 25] = irBuffer[i];
}
//take 25 sets of samples before calculating the heart rate.
for (byte i = 25; i < 50; i++)
{
while (particleSensor.available() == false) //do we have new data?
particleSensor.check(); //Check the sensor for new data
redBuffer[i] = particleSensor.getRed();
irBuffer[i] = particleSensor.getIR();
particleSensor.nextSample(); //We’re finished with this sample so move to next sample
Serial.print(F(“red=”));
Serial.print(redBuffer[i], DEC);
Serial.print(F(“, ir=”));
Serial.print(irBuffer[i], DEC);
Serial.print(F(“, HR=”));
Serial.print(heartRate, DEC);
Serial.print(F(“, HRvalid=”));
Serial.print(validHeartRate, DEC);
Serial.print(F(“, SPO2=”));
Serial.print(spo2, DEC);
Serial.print(F(“, SPO2Valid=”));
Serial.println(validSPO2, DEC);
}
//After gathering 25 new samples recalculate HR and SP02
maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
printToScreen();
}
}
void printToScreen() {
oled.clear();
oled.setCursor(0,0);
if(validSPO2 && validHeartRate) {
oled.print(F(“HR: “)); oled.println(heartRate, DEC);
oled.print(F(“SPO2: “)); oled.println(spo2, DEC);
} else {
oled.print(F(“Not valid”));
}
}
سلام وقتتون به خیر.
میخواستم بدونم سنسوری هست که از طریق مچ دست ضربان و پالس اکسیژن رو اندازه گیری کند؟
و آیا میشود اطلاعاتی که سنسور بدست می آورد را به جای اینکه روی صفحه نمایش نشان دهد از طریق وای فای یا بلوتوث به کامپیوتر یا موبایل ارسال کند؟اگر میشه لطفا توضیح دهید.
با تشکر.
با سلام امکان ساخت همه چیز هست فقط مسأله اساسی قیمت دستگاه و پیچیدگی آن مطرح است در سنسور های نوری فرستنده یک سیگنال نوری است و دریافت کننده نیز یک فوتو دیود و بهترین نقطه نوک انگشتان به علت تراکم کمتر بافت . حال اگر بخواهید از مچ دست استفاده نیم مکانیزم کمی متفاوت تر میشود مانند ساعت های هوشمند . و البته گران تر و برنامه ای با فیلتر های سیگنالی بیشتر