อุปกรณ์การวัดค่าอัตราการเต้นของหัวใจและออกซิเจนในเลือด

บทความโดย จิรสิน จุ้ยเอี่ยม #COE15

วิชา : 04-513-201 การโปรแกรมคอมพิวเตอร์ขั้นสูง

1.ความเป็นมา

เนื่องด้วยการรักษาทางการแพทย์ในปัจจุบันมีความก้าวหน้าไปอย่างมาก ทำให้มีเครื่องมือที่ทันสมัยขึ้นมารองรับประชากรผู้ป่วยที่มาใช้บริการ แต่อย่างไรก็ตามในปัจจุบันมีประชากรเพิ่มขึ้นเป็นเท่าตัว นั่นหมายความว่าใน1ปีนั้นจะมีผู้ป่วยเพิ่มขึ้นจากเดิมอย่างแน่นอน จะอย่างไรปัจจุบันก็มีเทคโนโลยีที่ทันสมัยกว่าเดิมเพิ่มขึ้นมาเรื่อยๆ เช่น ตัวSENSER MAX30100 เข้ามาวัดค่าของ อัตราการเต้นของหัวใจและออกซิเจนในเลือด โดยข้อมูลเหล่านี้จะถูกส่งไปยัง
แอพลิเคชันหนึ่งที่เรียกว่า Line notifly ที่สามารถส่งข้อมูลของผู้ป่วยเเบบเรียลไทม์ได้ทันท่วงที

ดังนั้น การใช้งานการวัดค่า อัตราการเต้นของหัวใจและออกซิเจนในเลือด จึงมีบทบาทสำคัญในการช่วยให้การทำงานของคุณหมอและพยาบาลเป็นไปได้อย่างราบรื่น และสะดวกต่อการใช้งานแก่ผู้ป่วย

2.วัตถุประสงค์

– เพื่อความสะดวกสบายของผู้ป่วย
– เพื่อการรักษาโดยการเข้าถึงอย่างทันท่วงที
– เพื่อการรับข้อมูลแบบเรียลไทม์ได้อย่างรวดเร็ว

3.ขอบเขต

1.การแจ้งเตือนผ่านLine ระบบสามารถส่งข้อความแจ้งเตือนไปยังแชทของผู้ใช้ใน Line

2. ระบบสามารถเชื่อมต่อกับอินเทอร์เน็ตและเซิร์ฟเวอร์ของ Line เพื่อส่งข้อความไปยัง Line 

3.รับค่า input จากผู้ใช้และแสดงผลออกไป output ให้ออดดังจาก Buzzer

4.ประโยชน์ที่คาดว่าจะได้รับ

1.สามารถทราบค่าข้อมูลได้อย่างเรียลไทม์

2.สามารถทราบค่าอัตราการเต้นของหัวใจและค่าออกซิเจนในเลือด

3.สามารถนำไปพัฒนาต่อยอดแก้ไขได้ภายในอนาคต

5.ความรู้ที่เกี่ยวข้อง

หลักการทำงานของเซ็นเซอร์

วิธีการต่อขา MAX30100 กับบอร์ด Esp32(Pinout)

             VIN ต่อเข้าที่ขา 3V3

             SCL ต่อเข้าที่ขา SCL

             SDA ต่อเข้าที่ขา SDA

             GND ต่อเข้าที่ขา GND

อุปกรณ์การวัดค่าอัตราการเต้นของหัวใจและออกซิเจนในเลือด - มทร.ศรีวิชัย (RMUTSV)

การทำงาน Sensor Max30100

อุปกรณ์การวัดค่าอัตราการเต้นของหัวใจและออกซิเจนในเลือด - มทร.ศรีวิชัย (RMUTSV)

เป็นเครื่องวัดความอิ่มตัวของออกซิเจนในเลือด และอัตราการเต้นของหัวใจ ประกอบด้วยไฟ LED สองดวง, เครื่องตรวจจับแสง, เลนส์ปรับแสงและตัวประมวลผลสัญญาณ Analog ที่มีสัญญาณรบกวนต่ำเพื่อตรวจจับออกซิเจนในเลือดและอัตราการเต้นของหัวใจ

เป็นระบบเซ็นเซอร์ที่สามารถตรวจสอบทั้งอัตราการเต้นของหัวใจและ oximetry ชีพจรในเวลาเดียวกัน [8]เพื่อตรวจจับสัญญาณออกซิเจนในเลือดและอัตราการเต้นของหัวใจ จะใช้ไฟ LED สองดวง เครื่องตรวจจับแสง เลนส์ที่ได้รับการปรับปรุง และการประมวลผลสัญญาณอะนาล็อกที่มีสัญญาณรบกวนต่ำ MAX30100 มีการตั้งค่าการลงทะเบียนซอฟต์แวร์เต็มรูปแบบ และ FIFO ลึก 16 ภายในของอุปกรณ์ (เข้าก่อนออกก่อน) จะจัดเก็บข้อมูลเอาต์พุตดิจิทัล คุณสมบัติทั้งสองนี้รวมอยู่ด้วย ด้วยการใช้ FIFO (เข้าก่อนออกก่อน) MAX30100 สามารถเชื่อมต่อกับไมโครคอนโทรลเลอร์หรือหน่วยประมวลผลกลาง (CPU) ที่มีบัสที่ใช้ร่วมกัน ซึ่งช่วยลดความจำเป็นในการอ่านข้อมูลจากรีจิสเตอร์ของอุปกรณ์อย่างต่อเนื่อง ภายในยี่สิบวินาที สามารถกำหนดทั้ง Sp02 และ BPM ได้อย่างง่ายดายโดยการวางปลายนิ้วในเซ็นเซอร์ของโมดูลนี้

ตัวอย่างการทำงานของโค๊ด

#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#define REPORTING_PERIOD_MS     1000
PulseOximeter pox;
uint32_t tsLastReport = 0;
// Callback (registered below) fired when a pulse is detected
void onBeatDetected()
{
    Serial.println("Beat!");
}
void setup()
{
    Serial.begin(115200);
    Serial.print("Initializing pulse oximeter..");
    if (!pox.begin()) {
        Serial.println("FAILED");
        for(;;);
    } else {
        Serial.println("SUCCESS");
    }
    pox.setOnBeatDetectedCallback(onBeatDetected);
}
void loop()
{
    pox.update();
    if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
        Serial.print("Heart rate:");
        Serial.print(pox.getHeartRate());
        Serial.print("bpm / SpO2:");
        Serial.print(pox.getSpO2());
        Serial.println("%");
        tsLastReport = millis();
    }
}

การทำงานใน vioce loop

void loop()
{
    pox.update();
    if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
        Serial.print("Heart rate:");
        Serial.print(pox.getHeartRate());
        Serial.print("bpm / SpO2:");
        Serial.print(pox.getSpO2());
        Serial.println("%");
        tsLastReport = millis();
    }
}

โค้ดนี้ทำงานโดยทำการอัปเดตข้อมูลจากเซ็นเซอร์ Pulse Oximeter ทุกครั้งๆ ที่ดำเนินการเรียกฟังก์ชัน pox.update() ในลูป loop() ของโปรแกรม Arduino นั้นๆ จากนั้นก็ตรวจสอบว่าได้ผ่านระยะเวลาที่กำหนดไว้หรือไม่ ถ้าได้ผ่านแล้ว โปรแกรมจะพิมพ์ค่า heart rate และ SpO2 ลงใน Serial Monitor ของ Arduino ทุกๆ วินาทีที่ผ่านไป โดยมีค่าที่กำหนดไว้ใน REPORTING_PERIOD_MS ที่เป็นค่าคงที่ที่กำหนดให้เป็น 1000 มิลลิวินาที (1 วินาที) ในสรุป, โค้ดนี้เริ่มต้นการทำงานของเซ็นเซอร์ Pulse Oximeter รุ่น MAX30100, ตั้งค่าการเรียกฟังก์ชันสำหรับตรวจจับการเต้นของหัวใจ (beat detection callback), และทำการอ่านและรายงานค่า heart rate และ SpO2 ไปยัง Serial Monitor ทุกๆ วินาที โดยที่ฟังก์ชัน onBeatDetected() จะถูกเรียกเมื่อเซ็นเซอร์ตรวจพบการเต้นของหัวใจ

การทำงานของ Buzzer

อุปกรณ์การวัดค่าอัตราการเต้นของหัวใจและออกซิเจนในเลือด - มทร.ศรีวิชัย (RMUTSV)

ออดไฟฟ้า (Buzzer) หรือลำโพงบัซเซอร์ เป็นอุปกรณ์ไฟฟ้าที่ให้สัญญาณเตือนด้วยเสียง ซึ่งนิยมนำมาใช่ในงานอุตสาหกรรมและอาคารทั่วไป โดยหลักการทำงานของออดไฟฟ้าเมื่อกดสั่งทำงานก็จะมีเสียงออกมาได้ เมื่อหยุดจ่ายไฟเสียงก็จะหยุดลงทันที ออดไฟฟ้าจะมีให้เลือกใช้งานหลายรูปแบบทั้งทรงกลม ทรงเหลี่ยม มีลำโพงและไฟ LED ในตัว

โค๊ดตัวอย่าง

#define BUZZER_PIN 23
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, HIGH);
            delay(500);
            digitalWrite(BUZZER_PIN, LOW);
            delay(500);
        } else {
            // Deactivate the buzzer
            digitalWrite(BUZZER_PIN, HIGH);
            delay(500);
        }

        tsLastReport = millis();
    }
}

Buzzer ที่ต่อมายังขาที่ระบุด้วย BUZZER_PIN (ตั้งค่าเป็น 23) เพื่อสร้างเสียงเอียงขึ้น-ลง (buzz) โดยการส่งสัญญาณ HIGH และ LOW ตามลำดับ โดยใช้ฟังก์ชัน digitalWrite() และ delay() เพื่อควบคุมระยะเวลาที่เสียง buzz มีการเปลี่ยนแปลง แต่ละครั้ง.

นอกจากนี้, โค้ดยังมีการตรวจสอบเงื่อนไขด้วย if โดยดูค่าที่ได้จากการอ่านข้อมูลจากเซ็นเซอร์หรือไมโครคอนโทรลเลอร์อื่นๆ. ถ้าเงื่อนไขนั้นเป็นจริง (true), ก็จะทำการเปิด Buzzer โดยการตั้งค่า digitalWrite(BUZZER_PIN, LOW) เพื่อส่งสัญญาณ LOW ไปที่ขาที่เชื่อมต่อกับ Buzzer นั้น. จากนั้น, มีการรอคำสั่ง delay(500) เพื่อให้ Buzzer ทำงาน (buzz) ในระยะเวลา 500 มิลลิวินาที (ครึ่งวินาที). หลังจากนั้น, โค้ดทำการปิด Buzzer โดยการตั้งค่า digitalWrite(BUZZER_PIN, HIGH) เพื่อส่งสัญญาณ HIGH ไปที่ขาที่เชื่อมต่อกับ Buzzer. ต่อมา, มีการรอคำสั่ง delay(500) อีกครั้ง เพื่อรอระยะเวลา 500 มิลลิวินาที (ครึ่งวินาที).

ถ้าเงื่อนไขในคำสั่ง if เป็นเท็จ (false), โค้ดจะทำการปิด Buzzer โดยใช้คำสั่ง digitalWrite(BUZZER_PIN, HIGH) และรอระยะเวลา 500 มิลลิวินาที (ครึ่งวินาที). สุดท้าย, tsLastReport ถูกอัปเดตเป็นเวลาปัจจุบันโดยใช้ millis() เพื่อเตรียมพร้อมสำหรับการตรวจสอบเงื่อนไขของระยะเวลาในการรายงานค่าอีกครั้งในลูปถัดไป.

โค๊ดโดยภาพรวมทั้งหมด

อุปกรณ์การวัดค่าอัตราการเต้นของหัวใจและออกซิเจนในเลือด - มทร.ศรีวิชัย (RMUTSV)
#include <WiFi.h>
#include <TridentTD_LineNotify.h>
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#define BUZZER_PIN 23
#include <LiquidCrystal_I2C.h>

const char* ssid = "JJJ";
const char* password = "0948022341";
const char* lineToken = "H0jle8XrJ7HxMC3XD4MHHEt8fEMGdMjDn4w6tF0VFN6";

#define REPORTING_PERIOD_MS 1000

PulseOximeter pox;
LiquidCrystal_I2C lcd(0x27, 16, 2);  // Replace these pin numbers with your actual LCD pin connections
uint32_t tsLastReport = 0;

void onBeatDetected()
{
    Serial.println("Beat!");
    LINE.notify("Heartbeat detected");
}

void setup()
{
    Serial.begin(115200);
    pinMode(BUZZER_PIN, OUTPUT);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("Connecting to WiFi...");
    }
    Serial.println("Connected to WiFi");

    LINE.setToken(lineToken);

    lcd.begin(16, 2);  // Initialize the LCD with 16 columns and 2 rows

    if (!pox.begin()) {
        Serial.println("FAILED");
        for (;;) ;
    } else {
        Serial.println("SUCCESS");
    }

    pox.setOnBeatDetectedCallback(onBeatDetected);
}

void loop()
{
    pox.update();

    if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
        int heartRate = pox.getHeartRate();
        int spO2 = pox.getSpO2();

        // Create a formatted string to send to LINE
        String lineMessage = "Heart rate: " + String(heartRate) + " bpm / SpO2: " + String(spO2) + "%";

        // Print to Serial monitor
        Serial.println(lineMessage);

        // Send the message to LINE
        LINE.notify(lineMessage);

        lcd.clear();
        lcd.setCursor(1, 0);
        lcd.print("Heart rate: ");
        lcd.print(heartRate);
        lcd.print(" bpm");
        lcd.setCursor(2, 1);
        lcd.print("SpO2: ");
        lcd.print(spO2);
        lcd.print("%");
// Check if Heart rate is 10 and SpO2 is 0%
        if (heartRate >= 10 && spO2 >= 0) {
            // Activate the buzzer (Assuming you have a buzzer connected to a specific pin)
            digitalWrite(BUZZER_PIN, HIGH);
            delay(500);
            digitalWrite(BUZZER_PIN, LOW);
            delay(500);
        } else {
            // Deactivate the buzzer
            digitalWrite(BUZZER_PIN, HIGH);
            delay(500);
        }

        tsLastReport = millis();
    }
}

โค้ดนี้ผสานการทำงานของ Pulse Oximeter, Wi-Fi, LINE Notify, LCD, และ Buzzer เพื่อตรวจสอบและรายงานข้อมูลการวัด heart rate และ SpO2 ที่ได้จาก Pulse Oximeter ผ่าน LINE Notify และแสดงผลบน LCD พร้อมกับการเปิด/ปิด Buzzer ตามเงื่อนไขที่กำหนด.

6.ผลการดำเนินการ

อุปกรณ์การวัดค่าอัตราการเต้นของหัวใจและออกซิเจนในเลือด - มทร.ศรีวิชัย (RMUTSV)

Diagramของระบบ เป็นภาพรวมการทำงานของระบบ เพื่อทำให้เข้าใจการทำงานของระบบมากขึ้น

อุปกรณ์การวัดค่าอัตราการเต้นของหัวใจและออกซิเจนในเลือด - มทร.ศรีวิชัย (RMUTSV)

การประมวลค่าจาก  Node ESP32  ส่งข้อมูลการรับค่าที่ได้จากการวัดไปประมวลผล เพื่อที่จะส่งงผ่าน Line

อุปกรณ์การวัดค่าอัตราการเต้นของหัวใจและออกซิเจนในเลือด - มทร.ศรีวิชัย (RMUTSV)

เมื่อค่าที่วัดได้เกินกว่าค่าที่เซ็ตทั้งไว้ Node Esp32 จะทำการส่งค่าออกไปยังตัวออ๊อด Buzzer เพื่อให้มีเสียงแจ้งเตือน

การทดลอง

อุปกรณ์การวัดค่าอัตราการเต้นของหัวใจและออกซิเจนในเลือด - มทร.ศรีวิชัย (RMUTSV)

เมื่อเสียบปลั๊กแล้ว มีการเชื่อมต่อ connect wifi

อุปกรณ์การวัดค่าอัตราการเต้นของหัวใจและออกซิเจนในเลือด - มทร.ศรีวิชัย (RMUTSV)

ทำการเอานิ้วมือไปทาบลงบนตัวเซ็นเซอร์ จะขึ้นค่าจากการวัดและมีเสียงแจ้งเตือนของ Buzzer เมื่อค่าเกินกว่าที่กำหนด ซึ่งจะสอคล้องกันกับโค๊ดดังตัวอย่าง

 if (heartRate >= 10 && spO2 >= 0) {
            // Activate the buzzer (Assuming you have a buzzer connected to a specific pin)
            digitalWrite(BUZZER_PIN, HIGH);
            delay(500);
            digitalWrite(BUZZER_PIN, LOW);
            delay(500);
        } else {
            // Deactivate the buzzer
            digitalWrite(BUZZER_PIN, HIGH);
            delay(500);
        }

        tsLastReport = millis();
    }
}

ซึ่งโค๊ดในส่วนนี้ได้ทำการเซ็ทค่าการเปิดปิดของ Buzzer โดยการใช้คำสั่ง IF เมื่อค่าของ heartRate และ spO2 ในที่นี้ได้ตั้งค่าไว้ให้  heartRate >= 10 && spO2 >= 0 จะทำงานวนซ้ำไปในลูปที่กำหนไว้เมื่อค่าที่วัดได้ตรงตามที่กำหนดไว้ ส่วน else เมื่อค่าที่วัดได้ไม่ได้ตรงตามที่กำหนดค่าไว้ ก็จะสั่งให้การทำงานของ Buzzer ปิด 
 

การแสดงผลค่าออกผ่านไปยังแอพลิเคชันไลน์แบบเรียลไทม์
อุปกรณ์การวัดค่าอัตราการเต้นของหัวใจและออกซิเจนในเลือด - มทร.ศรีวิชัย (RMUTSV)

การแสดงผลค่าผ่านไปยังแอพลิเคชันไลน์ เมื่อมีการเชื่อมต่อกับไวไฟ และทำการคอนเน็คเรียบร้อย ค่าที่วัดได้จากตัว sensor จะถูกส่งไปยัง Esp32 เพื่อประมวลผลและส่งค่าที่วัดได้ไปยัง Line notifly

7.สรุปผลและข้อเสนอแนะ

สรุปผล

การใช้งานตัวเซ็นเซอร์มีความขัดข้องเล็กน้อย แต่ยังสามรถวัดค่าได้ปกติ และส่งค่าไปยังแอพลิเคชัน Line ได้อย่างรวดเร็ว ตามเงื่อนไขที่ได้ทดลองไว้

ได้แก่

1)เมื่อทาบนิ้วลงบนเซนเซอร์ค่าแสดงได้ตามปกติ

2)เสียงBuzzer ดังแจ้งเตือนปกติดังที่ได้ตั้งค่าไว้

3)การส่งข้อมูลได้ตามปกติแบบเรียลไทม์ผ่าน Line

ข้อเสนอแนะ

1.สามารถนำตัวโปรเจคตัวนี้ไปพัฒนาต่อยอด โดยการเพิ่มฟังชันเพิ่มเติมในส่วนของการเข้าถึงข้อมูลของผู้ป่วย

2.สามารถทำให้ มีการประสานกับหน่วยการแพทย์ได้อย่างมีปะสิทธิภาพ ในการเพิ่ม GPs สำหรับพื้นที่ของผู้ป่วย เมื่อมีอาการที่ถึงขีดอันตราย

8.ข้อมูลอ้างอิง

1.คาซี อาติเก้ มูลา นาบิล ; นพ. อาริฟูล อิสลาม ; อับดุลลาห์ อัล โนมาน ; โมฮัมหมัด โมนิรุจจามาน ข่าน

วันที่เพิ่มใน IEEE Xplore : 18 เมษายน 2023

2. gravitech https://www.gravitechthai.com/

3. CyberTice, 25 กรกฎาคม 2565, สอนใช้งาน ESP32 โมดูล

สัญญาณเสียง Active Buzzer Module 3.3 – 5V -ขาย Arduino

อุปกรณ์ Arduino คุณภาพดี ราคาถูก ส่งไว ส่งฟรี (cybertice.com)

วิดิโอนำเสนอการทำงานของการวัดค่าอัตราการเต้นของหัวใจและค่าออกซิเจนในเลือดโดยส่งข้อมูลผ่านไปยังแอพ Line

You may also like...