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

บทความโดย จิรสิน จุ้ยเอี่ยม #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

การทำงาน Sensor Max30100

เป็นเครื่องวัดความอิ่มตัวของออกซิเจนในเลือด และอัตราการเต้นของหัวใจ ประกอบด้วยไฟ 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

ออดไฟฟ้า (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() เพื่อเตรียมพร้อมสำหรับการตรวจสอบเงื่อนไขของระยะเวลาในการรายงานค่าอีกครั้งในลูปถัดไป.

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

#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.ผลการดำเนินการ

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

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

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

การทดลอง

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

ทำการเอานิ้วมือไปทาบลงบนตัวเซ็นเซอร์ จะขึ้นค่าจากการวัดและมีเสียงแจ้งเตือนของ 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 ปิด 
 

การแสดงผลค่าออกผ่านไปยังแอพลิเคชันไลน์แบบเรียลไทม์

การแสดงผลค่าผ่านไปยังแอพลิเคชันไลน์ เมื่อมีการเชื่อมต่อกับไวไฟ และทำการคอนเน็คเรียบร้อย ค่าที่วัดได้จากตัว 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...

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *