Hướng dẫn MAX30102 Arduino đo nhịp tim và SpO2

MAX30102 Arduino có thể được ứng dụng vào các dự án đo nhịp tim và SpO2, để theo dõi sức khỏe của con người. Trong bài hướng dẫn này, mình sẽ hướng dẫn bạn cách đo và hiển thị nhịp tim, chỉ số BPM lên màn hình OLED, kèm theo đó là loa Buzzer để phát ra âm thanh nhịp tim nhé!

Cách dùng MAX30102 Arduino đo nhịp tim và SpO2

Chuẩn bị

  • Mạch Arduino UNO
  • Màn hình OLED
  • Loa Buzzer
  • Cảm biến đo nhịp tim MAX30102, có độ nhạy cao phù hợp cho các vòng đeo tay điện tử

Kết nối phần cứng

Bạn kết nối buzzer, cảm biến MAX30102 và màn hình OLED vào mạch Arduino UNO theo sơ đồ sau:

Sơ đồ kết nối MAX30102 Arduino OLED
Sơ đồ kết nối MAX30102 Arduino OLED

Cách tạo hình ảnh Bitmap cho màn hình OLED

Hình trái tim trên màn hình OLED mà mình đã tạo trong hình ảnh minh họa ở đầu bài viết là một hình ảnh bitmap. Mỗi khi cảm biến MAX30102 Arduino phát hiện nhịp tim thì:

  • Màn hình OLED sẽ hiển thị một trái tim lớn trong một thời gian nhất định
  • Buzzer phát ra âm thanh mô phỏng tiếng tim đập (thông qua tiếng bip)

Dưới đây là 2 đoạn bitmap mà mình sử dụng trong MAX30102 code Arduino:

Bitmap dùng trong code MAX30102 Arduino

Bạn có thể tìm hiểu về bitmap là gì, và cách lấy bitmap để hiển thị hình ảnh thông qua bài viết sau: Hướng dẫn màn hình OLED Arduino – Vẽ hình ảnh, đường thẳng

Và bạn đừng quên chọn kích thước sao cho phù hợp với màn hình bạn đang dùng. Và khi lưu ảnh, bạn nhớ lưu ảnh ở dạng bitmap monochrome (bitmap đơn sắc) nhé!

Để gọi Bitmap trong code, chúng ta dùng câu lệnh sau:

display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE);

Ý nghĩa của câu lệnh này có thể viết như sau:

  • 5: Starting x pos (tọa độ điểm x bắt đầu hiển thị hình ảnh)
  • 5: Starting y pos (tọa độ điểm y bắt đầu hiển thị hình ảnh)
  • logo2_bmp: Tên của bitmap
  • 24: Chiều rộng
  • 21: Chiều cao
  • White: Màu sắc

Trong đoạn code MAX30102 Arduino mình viết, mình cho hiển thị 2 hình ảnh bitmap khác nhau: 1 hình hiển thị khi phát hiện có tay người chạm vào cảm biến, 1 hình hiển thị khi cảm biến đo được nhịp tim.

Tuy nhiên, bạn có thể thay đổi hình ảnh này thành bất kỳ hình gì bạn thích, với số lượng như thế nào cũng được tùy bạn nhé!

Cài thư viện cần thiết

Để MAX30102 code Arduino mẫu bên dưới hoạt động, bạn cần cài sẵn một số thư viện sau:

1. Thư viện SparkFun MAX3010x

2. Thư viện Adafbean_SSD1306

3. Thư viện Adafruit-GFX-Library

Nạp code

Bạn hãy nạp đoạn MAX30102 code Arduino bên dưới vào mạch và chạy, sau đó quan sát hiện tượng nhé:

#include <Adafruit_GFX.h>        //Khai báo thư viện OLED
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#include "MAX30105.h"           //Khai báo thư viện MAX3010x
#include "heartRate.h"          //Thuật toán tính toán nhịp tim

MAX30105 particleSensor;

const byte RATE_SIZE = 4; //Tăng số này lớn hơn 4 là được
byte rates[RATE_SIZE]; 
byte rateSpot = 0;
long lastBeat = 0; 
float beatsPerMinute;
int beatAvg;

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET    -1 // Reset pin # (or -1 if sharing Arduino reset pin)

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Declaring the display name (display)

static const unsigned char PROGMEM logo2_bmp[] =
{ 0x03, 0xC0, 0xF0, 0x06, 0x71, 0x8C, 0x0C, 0x1B, 0x06, 0x18, 0x0E, 0x02, 0x10, 0x0C, 0x03, 0x10,              //Logo2 and Logo3 are two bmp pictures that display on the OLED if called
0x04, 0x01, 0x10, 0x04, 0x01, 0x10, 0x40, 0x01, 0x10, 0x40, 0x01, 0x10, 0xC0, 0x03, 0x08, 0x88,
0x02, 0x08, 0xB8, 0x04, 0xFF, 0x37, 0x08, 0x01, 0x30, 0x18, 0x01, 0x90, 0x30, 0x00, 0xC0, 0x60,
0x00, 0x60, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x1B, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x04, 0x00,  };

static const unsigned char PROGMEM logo3_bmp[] =
{ 0x01, 0xF0, 0x0F, 0x80, 0x06, 0x1C, 0x38, 0x60, 0x18, 0x06, 0x60, 0x18, 0x10, 0x01, 0x80, 0x08,
0x20, 0x01, 0x80, 0x04, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x08, 0x03,
0x80, 0x00, 0x08, 0x01, 0x80, 0x00, 0x18, 0x01, 0x80, 0x00, 0x1C, 0x01, 0x80, 0x00, 0x14, 0x00,
0x80, 0x00, 0x14, 0x00, 0x80, 0x00, 0x14, 0x00, 0x40, 0x10, 0x12, 0x00, 0x40, 0x10, 0x12, 0x00,
0x7E, 0x1F, 0x23, 0xFE, 0x03, 0x31, 0xA0, 0x04, 0x01, 0xA0, 0xA0, 0x0C, 0x00, 0xA0, 0xA0, 0x08,
0x00, 0x60, 0xE0, 0x10, 0x00, 0x20, 0x60, 0x20, 0x06, 0x00, 0x40, 0x60, 0x03, 0x00, 0x40, 0xC0,
0x01, 0x80, 0x01, 0x80, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x30, 0x0C, 0x00,
0x00, 0x08, 0x10, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x01, 0x80, 0x00  };


void setup() {  
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Start the OLED display
  display.display();
  delay(3000);
  // Initialize sensor
  particleSensor.begin(Wire, I2C_SPEED_FAST); //Use default I2C port, 400kHz speed
  particleSensor.setup(); //Configure sensor with default settings
  particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running

}

void loop() {
 long irValue = particleSensor.getIR();    //Reading the IR value it will permit us to know if there's a finger on the sensor or not
                                           //Also detecting a heartbeat
if(irValue > 7000){                                           //If a finger is detected
    display.clearDisplay();                                   //Clear the display
    display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE);       //Draw the first bmp picture (little heart)
    display.setTextSize(2);                                   //Near it display the average BPM you can display the BPM if you want
    display.setTextColor(WHITE); 
    display.setCursor(50,0);                
    display.println("BPM");             
    display.setCursor(50,18);                
    display.println(beatAvg); 
    display.display();
    
  if (checkForBeat(irValue) == true)                        //If a heart beat is detected
  {
    display.clearDisplay();                                //Clear the display
    display.drawBitmap(0, 0, logo3_bmp, 32, 32, WHITE);    //Draw the second picture (bigger heart)
    display.setTextSize(2);                                //And still displays the average BPM
    display.setTextColor(WHITE);             
    display.setCursor(50,0);                
    display.println("BPM");             
    display.setCursor(50,18);                
    display.println(beatAvg); 
    display.display();
    tone(3,1000);                                        //And tone the buzzer for a 100ms you can reduce it it will be better
    delay(100);
    noTone(3);                                          //Deactivate the buzzer to have the effect of a "bip"
    //We sensed a beat!
    long delta = millis() - lastBeat;                   //Measure duration between two beats
    lastBeat = millis();

    beatsPerMinute = 60 / (delta / 1000.0);           //Calculating the BPM

    if (beatsPerMinute < 255 && beatsPerMinute > 20)               //To calculate the average we strore some values (4) then do some math to calculate the average
    {
      rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
      rateSpot %= RATE_SIZE; //Wrap variable

      //Take average of readings
      beatAvg = 0;
      for (byte x = 0 ; x < RATE_SIZE ; x++)
        beatAvg += rates[x];
      beatAvg /= RATE_SIZE;
    }
  }

}
  if (irValue < 7000){       //If no finger is detected it inform the user and put the average BPM to 0 or it will be stored for the next measure
     beatAvg=0;
     display.clearDisplay();
     display.setTextSize(1);                    
     display.setTextColor(WHITE);             
     display.setCursor(30,5);                
     display.println("Please Place "); 
     display.setCursor(30,15);
     display.println("your finger ");  
     display.display();
     noTone(3);
     }

}

Sau khi nạp code, bạn hãy đặt ngón tay lên cảm biến. Nếu không đặt ngón tay lên thì màn hình OLED sẽ hiển thị dòng chữ thông báo như bên dưới:

Đặt ngón tay lên cảm biến MAX30102 Arduino
Đặt ngón tay lên cảm biến MAX30102 Arduino

Sau khi đặt ngón tay lên, bạn hãy giữ một lúc cho đến khi Buzzer phát ra âm thanh “Bíp”. Âm thanh này sẽ phát ra đồng bộ cùng lúc với nhịp tim của bạn, theo số BMP. BMP chính là đơn vị nhịp/phút, thường dùng trong đo nhịp tim.

Người bình thường sẽ có mức BMP khoảng 65 – 75 trong trạng thái nghỉ ngơi, còn với các vận động viên điền kinh thì mức BMP có thể sẽ thấp hơn.

Kết quả đo nhịp tim bằng MAX30102 Arduino sẽ hiển thị như hình bên dưới:

Đo nhịp tìm thông qua MAX30102 Arduino

Lời kết

Trên đây, mình đã hướng dẫn chi tiết cách làm dự án đo nhịp tim thông qua cảm biến MAX30102 Arduino. Mình đã đính kèm sẵn đoạn MAX30102 code Arduino mẫu, bạn chỉ cần nạp vào và chạy là được. Chúc các bạn thành công!

IoTZone – Chuyên cung cấp thiết bị điện tử & tài liệu cho Makers

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *