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é!
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:
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:
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:
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:
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:
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
- Website: https://www.iotzone.vn/
- Fanpage: https://www.facebook.com/Iotzonemaker
- SDT: 0364174499
- Zalo: https://zalo.me/0364174499