Cảm biến MAX30100 được sử dụng làm máy đo nhịp tim và máy đo oxy xung. Các tính năng này được kích hoạt bởi việc xây dựng cảm biến này bao gồm hai đèn LED, một bộ tách sóng quang, quang học được tối ưu hóa và các thành phần xử lý tín hiệu nhiễu thấp. Nó dễ dàng được sử dụng với các vi điều khiển như Arduino, ESP32, NodeMCU, v.v. để xây dựng một thiết bị bão hòa nhịp tim và oxy hiệu quả.
Cảm biến này chủ yếu có sẵn trong hai phiên bản khác nhau: GY-MAX30100 và RCWL-0530.
·
Trong hướng dẫn này, chúng tôi sẽ tập trung vào RCWL-0530 vì nó hơi khó để làm việc do sự cố thiết kế mà sau này chúng ta sẽ xem cách giải quyết. Mặt khác, cảm biến GY-MAX30100 là cảm biến Arduino rất dễ sử dụng mà không gặp vấn đề gì thêm.
Hãy để chúng tôi xem xét tổng quan về cảm biến này.
Dưới đây bạn có thể xem sơ đồ của RCWL-0530.
Như bạn có thể nhận thấy IC MAX30100 nằm ở trung tâm của mô-đun. Nó bao gồm hai loại đèn LED khác nhau ở phía bên tay phải. Có một đèn LED đỏ và một đèn LED hồng ngoại. Ở phía bên tay trái, bạn có thể xem bộ tách sóng quang. Độ bão hòa oxy trong máu và nhịp tim được tìm thấy bằng cách sử dụng hai tính năng chính này. Sau này chúng ta sẽ tìm hiểu cách cảm biến thực sự hoạt động để có được BPM và SPO2.
Một tính năng quan trọng khác mà bạn có thể nhận thấy là mô-đun cảm biến MAX30100 bao gồm hai bộ điều chỉnh LDO. Điều này là do IC MAX30100 yêu cầu 1.8V và đèn LED yêu cầu 3.3V để hoạt động bình thường. Với việc bổ sung các bộ điều chỉnh điện áp, chúng ta có thể sử dụng một cách an toàn các bộ vi điều khiển sử dụng đầu vào / đầu ra mức 5 / 3.3 / 1.8V.
Mô-đun cảm biến MAX30100 có hoạt động công suất cực thấp, sử dụng 600μA (chế độ đo và 0,7μA (chế độ chờ). Do đó, một lựa chọn tuyệt vời để sử dụng trong các thiết bị đeo được như đồng hồ thông minh, v.v.
Nó có khả năng tốc độ lấy mẫu cao cùng với khả năng xuất dữ liệu nhanh.
Ngoài ra, các tính năng cảm biến cũng tích hợp tính năng khử ánh sáng xung quanh.
Một tính năng bổ sung mà mô-đun cảm biến MAX30100 sở hữu là bao gồm cảm biến nhiệt độ trên chip. Điều này cung cấp cho chúng tôi nhiệt độ khuôn (-40 ° C đến + 85 ° C) chính xác ± 1 ° C.
Để giao tiếp với vi điều khiển, cảm biến sử dụng chân I2C SCL và SDA.
Một tính năng khác của cảm biến này là nó sử dụng bộ đệm FIFO 16 mẫu để lưu trữ dữ liệu. Nói cách khác, nó tiếp tục làm giảm mức tiêu thụ điện năng vì nó đã giữ tối đa mười sáu giá trị nhịp tim và SPO2.
MAX30100 cũng có thể được sử dụng với các ngắt có thể được bật cho một số nguồn như sẵn sàng nguồn, sẵn sàng dữ liệu SPO2, sẵn sàng dữ liệu nhịp tim, sẵn sàng nhiệt độ và FIFO gần đầy. Với việc tạo ra ngắt, vi điều khiển có thể thực hiện các sự kiện khác không xảy ra trong quá trình thực thi tuần tự chương trình trong khi cảm biến liên tục lấy các mẫu dữ liệu mới.
Bảng dưới đây cho thấy các thông số kỹ thuật của cảm biến này:
Điện áp hoạt động |
1.8V đến 3.3V |
Đầu vào hiện tại |
20mA |
Phạm vi nhiệt độ |
-40 °C đến + 85 °C |
Độ chính xác nhiệt độ |
±1°C |
Độ phân giải ADC |
14 bit |
Bước sóng cực đại IR LED |
870-900nm |
Bước sóng đỉnh LED đỏ |
650-670nm |
Trong phần này, chúng ta hãy thảo luận về cách máy đo nhịp tim MAX30100 và máy đo oxy xung thực sự hoạt động.
Để tìm nồng độ oxy trong máu (%), điều quan trọng đầu tiên cần biết là bên trong huyết sắc tố của chúng ta chịu trách nhiệm mang oxy. Khi một người cầm máy đo oxy xung, ánh sáng từ thiết bị sẽ đi qua máu trong ngón tay. Điều này được sử dụng để phát hiện lượng oxy bằng cách đo những thay đổi trong sự hấp thụ ánh sáng trong cả máu oxy và khử oxy.
Như chúng tôi đã đề cập trước đây, cảm biến MAX30100 bao gồm hai đèn LED (Đỏ và IR) và một điốt quang. Cả hai đèn LED này đều được sử dụng để đo SPO2. Hai đèn LED này phát ra ánh sáng ở các bước sóng khác nhau, ~ 640nm cho đèn led đỏ và ~ 940nm cho đèn LED hồng ngoại. Ở những bước sóng đặc biệt này, hemoglobin oxy hóa và khử oxy có đặc tính hấp thụ rất khác nhau.
Sơ đồ dưới đây được lấy từ bảng dữ liệu của MAX30100 IC. Bạn có thể nhận thấy sự khác biệt được thể hiện trong biểu đồ giữa HbO2 là hemoglobin oxy hóa và Hb là hemoglobin khử oxy ở hai bước sóng khác nhau.
Hemoglobin oxy hóa hấp thụ nhiều ánh sáng hồng ngoại hơn và phản xạ lại ánh sáng đỏ trong khi hemoglobin khử oxy hấp thụ nhiều ánh sáng đỏ hơn và phản xạ lại ánh sáng hồng ngoại. Ánh sáng phản xạ được đo bằng bộ tách sóng quang. Cảm biến MAX30100 đọc các mức hấp thụ khác nhau này để tìm nồng độ oxy trong máu (SPO2). Tỷ lệ IR và ánh sáng ĐỎ mà bộ tách sóng quang nhận được cho chúng ta nồng độ oxy trong máu.
Để đo nhịp tim, chúng tôi không yêu cầu đèn LED Đỏ, chỉ cần đèn LED hồng ngoại. Điều này là do huyết sắc tố oxy hấp thụ nhiều ánh sáng hồng ngoại hơn.
Nhịp tim là tỷ lệ thời gian giữa hai nhịp tim liên tiếp. Tương tự, khi máu người được lưu thông trong cơ thể con người thì máu này bị ép trong các mô mao mạch. Do đó, thể tích của các mô mao mạch được tăng lên nhưng thể tích này giảm sau mỗi nhịp tim. Sự thay đổi thể tích của các mô mao mạch này ảnh hưởng đến ánh sáng hồng ngoại của cảm biến, truyền ánh sáng sau mỗi nhịp tim.
Hoạt động của cảm biến này có thể được kiểm tra bằng cách đặt một ngón tay người ở phía trước cảm biến này. Khi một ngón tay được đặt trước cảm biến xung này thì sự phản xạ của ánh sáng hồng ngoại được thay đổi dựa trên thể tích thay đổi máu bên trong các mạch mao mạch. Điều này có nghĩa là trong nhịp tim, thể tích máu trong các mạch mao mạch sẽ cao và sau đó sẽ thấp sau mỗi nhịp tim. Vì vậy, bằng cách thay đổi âm lượng này, đèn LED được thay đổi. Sự thay đổi này của đèn LED đo nhịp tim của ngón tay. Hiện tượng này được gọi là "Photoplethysmogram."
Mô-đun MAX30100 (RCWL-0530) bao gồm bảy chân.
Ghim |
Mô tả:__________ |
---|---|
VIN |
Chân này được sử dụng để cung cấp năng lượng cho cảm biến. Cảm biến này được bật ở 3.3-5V. |
SCL |
Đây là chân đồng hồ nối tiếp I2C. |
SDA |
Đây là chân dữ liệu nối tiếp I2C. |
INT |
Đây là chân ngắt thấp hoạt động. Nó được kéo CAO bởi điện trở trên bo mạch nhưng khi xảy ra ngắt, nó sẽ xuống THẤP cho đến khi ngắt xóa. |
IRD |
IR LED Cathode và LED Driver Điểm kết nối |
RD |
Cathode LED màu đỏ và điểm kết nối trình điều khiển LED |
GND · |
Điều này được sử dụng để cung cấp đất cho cảm biến này và nó được kết nối với chân nối đất nguồn. |
Trong phần này, chúng ta sẽ tìm hiểu cách giao diện mô-đun cảm biến MAX30100 với Arduino Uno.
Trước khi chúng tôi tiếp tục, bạn có thể nhớ rằng chúng tôi đã đề cập trước đó rằng phiên bản RCWL-0530 có vấn đề nghiêm trọng về thiết kế. Hãy để chúng tôi xem làm thế nào để giải quyết vấn đề đó đầu tiên.
Bạn có thể xem sơ đồ sơ đồ của mô-đun bên dưới:
Mô-đun cảm biến MAX30100 bao gồm hai bộ điều chỉnh LDO. Điều này là do IC MAX30100 yêu cầu 1.8V và đèn LED yêu cầu 3.3V để hoạt động bình thường. Bây giờ hãy tham khảo sơ đồ của mô-đun và lưu ý rằng các đường SDA, SCL và INT được kết nối với 1.8V thông qua các điện trở kéo lên 4.7k ohm. Đây là một vấn đề thiết kế nghiêm trọng vì bây giờ cảm biến sẽ không hoạt động đúng cách với các vi điều khiển có mức logic cao hơn, ví dụ như Arduino trong trường hợp của chúng tôi. Thiết bị I2C sẽ không được nhận dạng.
Có hai cách để giải quyết vấn đề này.
Một cách để giải quyết vấn đề đã nêu ở trên là loại bỏ ba điện trở kéo lên được hiển thị trong sơ đồ bên dưới và thay vào đó sử dụng các điện trở bên ngoài.
Bạn có thể dễ dàng loại bỏ chúng bằng cách sử dụng bàn ủi hàn. Sau khi bạn đã loại bỏ các điện trở, bạn đã sẵn sàng để đi và có thể kết nối mô-đun của mình với Arduino như hình dưới đây:
Ở đây chúng tôi đang kết nối các chân SDA, SCL và INT với 3.3V từ Arduino thông qua các điện trở 4.7k ohm bên ngoài. Phần còn lại của các kết nối được hiển thị trong bảng dưới đây:
Mô-đun MAX30100 |
Arduino UNO |
---|---|
VCC |
3.3V |
SCL |
A5 · |
SDA |
A4 · |
INT |
Chân 2 |
GND · |
GND · |
Giải pháp thứ hai là ngắt kết nối các điện trở kéo lên 4.7k ohm khỏi 1.8V bằng cách cắt đường dẫn đó và tạo một đường dẫn sao cho các điện trở kéo lên kết nối với 3.3V thay thế.
Cắt đường dẫn giữa điện trở 4.7k ohm và bộ điều chỉnh LDO 1.8V. Sau đó kết nối dây nhảy hoặc hàn một đường dẫn giữa bộ điều chỉnh LDO 3.3V và điện trở ohm 4.7k như trong hình trên.
Sau khi bạn đã thực hiện các thay đổi, bạn có thể kết nối mô-đun của mình với Arduino như hình dưới đây:
Các kết nối giữa mô-đun cảm biến và Arduino UNO như sau:
Mô-đun MAX30100 |
Arduino UNO |
---|---|
VCC |
3.3V |
SCL |
A5 · |
SDA |
A4 · |
INT |
Chân 2 |
GND · |
GND · |
Chúng tôi sẽ sử dụng Arduino IDE để lập trình UNO Arduino của chúng tôi. Vì vậy, bạn nên có phiên bản Arduino IDE mới nhất. Mở Arduino IDE và nhấp vào Sketch > Library > Manage Libraries
Cửa sổ sau sẽ mở ra.
Nhập 'max30100' vào thanh tìm kiếm và nhấn enter. Cài đặt phiên bản mới nhất của thư viện: MAX30100lib Library by OXullo Intersecans.
Sau khi cài đặt thư viện, hãy khởi động lại IDE của bạn.
Trong phần này, chúng tôi sẽ hướng dẫn bạn cách sử dụng các bản phác thảo khác nhau trong Arduino IDE bằng thư viện MAX30100lib mà chúng tôi vừa cài đặt. Chúng tôi sẽ xem xét các bản phác thảo khác nhau để tìm hiểu hiệu quả cách sử dụng cảm biến MAX30100 với UNO Arduino của chúng tôi.
Mở Arduino IDE của bạn và đi tới Tệp > Mới để mở tệp mới. Sao chép mã được cung cấp bên dưới và lưu nó.
Bản phác thảo này sẽ hiển thị các giá trị BPM và SPO2 trong màn hình nối tiếp khi bạn giữ cảm biến ở giữa các ngón tay.
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#define REPORTING_PERIOD_MS 1000
// Create a PulseOximeter object
PulseOximeter pox;
// Time at which the last beat occurred
uint32_t tsLastReport = 0;
// Callback routine is executed when a pulse is detected
void onBeatDetected() {
Serial.println("♥ Beat!");
}
void setup() {
Serial.begin(9600);
Serial.print("Initializing pulse oximeter..");
// Initialize sensor
if (!pox.begin()) {
Serial.println("FAILED");
for(;;);
} else {
Serial.println("SUCCESS");
}
// Configure sensor to use 7.6mA for LED drive
pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
// Register a callback routine
pox.setOnBeatDetectedCallback(onBeatDetected);
}
void loop() {
// Read from the sensor
pox.update();
// Grab the updated heart rate and SpO2 levels
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();
}
}
Bây giờ chúng ta hãy hiểu code đang hoạt động như thế nào.
Thứ nhất, chúng tôi bao gồm các thư viện cần thiết cho dự án này:
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
Tiếp theo chúng ta xác định thời gian báo cáo tính bằng ms giữa các mẫu.
#define REPORTING_PERIOD_MS 1000
Ở đây chúng ta đang tạo một đối tượng 'thủy đậu' của PulseOximeter.
PulseOximeter pox;
Biến sau đây giữ thời gian khi nhịp cuối cùng xảy ra.
uint32_t tsLastReport = 0;
Chức năng gọi lại sau đây sẽ hiển thị "♥ Beat!" trong màn hình nối tiếp khi nhịp tim xảy ra.
void onBeatDetected() {
Serial.println("♥ Beat!");
}
Bên trong hàm setup(), trước tiên chúng ta mở giao tiếp nối tiếp với tốc độ truyền 9600. Sau đó, chúng tôi khởi tạo mô-đun cảm biến MAX30100. Một thông báo có liên quan sẽ được hiển thị trong màn hình nối tiếp.
Serial.begin(9600);
Serial.print("Initializing pulse oximeter..");
// Initialize sensor
if (!pox.begin()) {
Serial.println("FAILED");
for(;;);
} else {
Serial.println("SUCCESS");
}
Sau đó, chúng tôi đặt giá trị hiện tại cho ổ đĩa LED bằng cách sử dụng đối tượng PulseOximeter trên phương thức setIRLedCurrent(). Ở đây chúng tôi đã cấu hình cảm biến để sử dụng 7.6mA cho đèn LED hồng ngoại.
pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
Theo mặc định, dòng điện được đặt thành 50mA, điều này có thể gây ra sự cố trong quá trình khởi tạo, vì vậy chúng tôi đặt giá trị thấp hơn để thay thế.
Bạn có thể dùng các giá trị sau bên trong hàm:
MAX30100_LED_CURR_0MA
MAX30100_LED_CURR_4_4MA
MAX30100_LED_CURR_7_6MA
MAX30100_LED_CURR_11MA
MAX30100_LED_CURR_14_2MA
MAX30100_LED_CURR_17_4MA
MAX30100_LED_CURR_20_8MA
MAX30100_LED_CURR_24MA
MAX30100_LED_CURR_27_1MA
MAX30100_LED_CURR_30_6MA
MAX30100_LED_CURR_33_8MA
MAX30100_LED_CURR_37MA
MAX30100_LED_CURR_40_2MA
MAX30100_LED_CURR_43_6MA
MAX30100_LED_CURR_46_8MA
MAX30100_LED_CURR_50MA
Cuối cùng, chúng ta cũng đăng ký hàm callback của mình onBeatDetected thông qua dòng code sau:
pox.setOnBeatDetectedCallback(onBeatDetected);
Bên trong hàm loop(), trước tiên chúng ta sẽ đọc từ cảm biến bằng cách sử dụng pox.update(). Sau đó, chúng tôi sẽ lấy số đọc cho nhịp tim và nồng độ oxy trong máu và in chúng trong màn hình nối tiếp sau mỗi giây. Để có được chỉ số nhịp tim, hãy sử dụng đối tượng PulseOximeter trên phương thức getHeartRate(). Tương tự, để có được nồng độ oxy trong máu, hãy sử dụng đối tượng PulseOximeter trên phương pháp getSpO2().
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();
}
}
Để xem trình diễn đoạn mã trên, hãy tải mã lên Arduino. Tuy nhiên, trước khi tải mã lên, hãy đảm bảo chọn bảng Arduino từ Bảng > Công cụ và cũng chọn cổng COM chính xác mà bảng Arduino được kết nối từ Công cụ > Cổng.
Sau khi mã được tải lên Arduino, hãy giữ cảm biến ở giữa các ngón tay của bạn. Đừng giữ nó thật chặt hoặc rất nhẹ. Đảm bảo rằng bạn áp dụng áp suất bình thường trong khi giữ cảm biến. Điều này sẽ dẫn đến một tín hiệu sạch sẽ tốt hơn.
Các chỉ số BPM và SpO2 sẽ cập nhật sau mỗi giây. Ngoài ra, bạn cũng có thể xem khi nào phát hiện nhịp tim.
Trong bản phác thảo tiếp theo, chúng ta sẽ thu được các giá trị LED IR và Red LED thô và vẽ chúng trong máy vẽ nối tiếp.
Mở Arduino IDE của bạn và đi tới Tệp > Mới để mở tệp mới. Sao chép mã được cung cấp bên dưới và lưu nó.
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
// Create a MAX30100 object
MAX30100 sensor;
void setup() {
Serial.begin(115200);
Serial.print("Initializing MAX30100..");
// Initialize sensor
if (!sensor.begin()) {
Serial.println("FAILED");
for(;;);
} else {
Serial.println("SUCCESS");
}
sensor.setMode(MAX30100_MODE_SPO2_HR);
sensor.setLedsCurrent(MAX30100_LED_CURR_50MA, MAX30100_LED_CURR_27_1MA);
sensor.setLedsPulseWidth(MAX30100_SPC_PW_1600US_16BITS);
sensor.setSamplingRate(MAX30100_SAMPRATE_100HZ);
sensor.setHighresModeEnabled(true);
}
void loop() {
uint16_t ir, red;
sensor.update();
while (sensor.getRawValues(&ir, &red)) {
Serial.print(red);
Serial.print(", ");
Serial.println(ir);
}
}
Thứ nhất, chúng tôi bao gồm các thư viện cần thiết cho dự án này.
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
Tiếp theo, tạo một đối tượng của MAX30100.
MAX30100 sensor;
Bên trong hàm setup(), trước tiên chúng ta mở giao tiếp nối tiếp với tốc độ truyền 115200. Sau đó, chúng tôi khởi tạo mô-đun cảm biến MAX30100. Một thông báo có liên quan sẽ được hiển thị trong màn hình nối tiếp.
Serial.begin(115200);
Serial.print("Initializing MAX30100..");
// Initialize sensor
if (!sensor.begin()) {
Serial.println("FAILED");
for(;;);
} else {
Serial.println("SUCCESS");
}
Sau đó, chúng tôi sẽ cấu hình cảm biến MAX30100 được hiển thị trong các dòng mã bên dưới. Ở đây chúng tôi đã đặt chế độ, dòng điện Led, độ rộng xung Led, tốc độ lấy mẫu, v.v.
sensor.setMode(MAX30100_MODE_SPO2_HR);
sensor.setLedsCurrent(MAX30100_LED_CURR_50MA, MAX30100_LED_CURR_27_1M
sensor.setLedsPulseWidth(MAX30100_SPC_PW_1600US_16BITS);
sensor.setSamplingRate(MAX30100_SAMPRATE_100HZ);
sensor.setHighresModeEnabled(true);
Bên trong hàm loop(), trước tiên chúng ta sẽ đọc từ cảm biến bằng sensor.update(). Sau đó, sử dụng vòng lặp một lúc, chúng ta sẽ nhận được các giá trị thô của cả IR Led và Red Led.
void loop() {
uint16_t ir, red;
sensor.update();
while (sensor.getRawValues(&ir, &red)) {
Serial.print(red);
Serial.print(", ");
Serial.println(ir);
}
}
Sau khi mã được tải lên Arduino, hãy chuyển đến Tools > Serial Plotter và đặt tốc độ truyền của nó thành 115200. Trên máy vẽ nối tiếp, bạn sẽ có thể thấy các giá trị thô của IR và Red LED khi bạn vuốt tay qua cảm biến.
Trong bản phác thảo tiếp theo của chúng tôi, chúng tôi sẽ chỉ cho bạn cách sử dụng MAX30100 làm cảm biến hiện diện. Chúng tôi sẽ thực hiện một số bài đọc với cảm biến này. Các bài đọc này sẽ được tính trung bình và được sử dụng như một điểm tham chiếu để phát hiện sự thay đổi rõ ràng từ cách đọc này.
Mở Arduino IDE của bạn và đi tới Tệp > Mới để mở tệp mới. Sao chép mã được cung cấp bên dưới và lưu nó.
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#define REPORTING_PERIOD_MS 1000
int last_detected = LOW;
MAX30100 sensor;
uint16_t ir, red;
uint16_t avg_ir = 0, avg_red = 0;
void setup() {
Serial.begin(115200);
Serial.print("Initializing MAX30100..");
if (!sensor.begin()) {
Serial.println("FAILED");
for (;;);
} else {
Serial.println("SUCCESS");
}
sensor.setMode(MAX30100_MODE_SPO2_HR);
sensor.setLedsCurrent(MAX30100_LED_CURR_50MA, MAX30100_LED_CURR_27_1MA);
sensor.setLedsPulseWidth(MAX30100_SPC_PW_1600US_16BITS);
sensor.setSamplingRate(MAX30100_SAMPRATE_100HZ);
sensor.setHighresModeEnabled(true);
getReadings();
}
void loop() {
sensor.update();
while (sensor.getRawValues(&ir, &red)) {
if (ir > 10 * avg_ir && red > 10 * avg_red) {
if (last_detected == LOW) {
Serial.println("Presence Detected!");
last_detected = HIGH;
}
}
else {
last_detected = LOW;
}
}
}
void getReadings() {
delay(50);
for (int i = 0; i <= 9; i++) {
sensor.update();
sensor.getRawValues(&ir, &red);
avg_ir += ir;
avg_red += red;
delay(50);
}
avg_ir /= 10;
avg_red /= 10;
}
Thứ nhất, chúng tôi bao gồm các thư viện cần thiết cho dự án này.
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
Tiếp theo, chúng tôi xác định thời gian báo cáo tính bằng mili giây giữa các mẫu. Nó được đặt thành 1000ms tức là 1 giây.
#define REPORTING_PERIOD_MS 1000
Ban đầu, đặt biến int 'last_detected' thành THẤP. Điều này sẽ được sử dụng sau này trong mã để theo dõi các thay đổi trong bài đọc.
int last_detected = LOW;
Tiếp theo, tạo một đối tượng của MAX30100 được gọi là 'cảm biến'.
MAX30100 sensor;
Tạo một số biến để giữ các giá trị của IR LED, Red LED, giá trị trung bình của IR LED và giá trị trung bình của Red LED. Ban đầu, các giá trị trung bình được đặt thành 0.
uint16_t ir, red;
uint16_t avg_ir = 0, avg_red = 0;
Bên trong hàm setup(), trước tiên chúng ta mở giao tiếp nối tiếp với tốc độ truyền 115200. Sau đó, chúng tôi khởi tạo mô-đun cảm biến MAX30100. Một thông báo có liên quan sẽ được hiển thị trong màn hình nối tiếp.
Sau đó, chúng tôi sẽ định cấu hình cảm biến MAX30100 bao gồm cài đặt chế độ, dòng điện Led, độ rộng xung Led, tốc độ lấy mẫu, v.v.
Cuối cùng, chúng ta sẽ gọi hàm getReadings() sẽ chịu trách nhiệm thu thập các mẫu dữ liệu LED và tính trung bình chúng.
void setup() {
Serial.begin(115200);
Serial.print("Initializing MAX30100..");
if (!sensor.begin()) {
Serial.println("FAILED");
for (;;);
} else {
Serial.println("SUCCESS");
}
sensor.setMode(MAX30100_MODE_SPO2_HR);
sensor.setLedsCurrent(MAX30100_LED_CURR_50MA, MAX30100_LED_CURR_27_1MA);
sensor.setLedsPulseWidth(MAX30100_SPC_PW_1600US_16BITS);
sensor.setSamplingRate(MAX30100_SAMPRATE_100HZ);
sensor.setHighresModeEnabled(true);
getReadings();
}
Bên trong hàm loop(), trước tiên chúng ta sẽ đọc từ cảm biến bằng sensor.update(). Sau đó, bên trong một vòng lặp trong đó chúng tôi đang nhận được số đọc thô, chúng tôi thêm các câu lệnh nếu để kiểm tra xem giá trị thô có lớn hơn 10 lần giá trị trung bình hay không. Nếu có, thì điều đó có nghĩa là một thay đổi đáng kể đã xảy ra và chúng tôi đặt biến 'last_detected' thành CAO. Hơn nữa, màn hình nối tiếp in "Đã phát hiện sự hiện diện!" Nếu không, biến 'last_detected' vẫn THẤP.
void loop() {
sensor.update();
while (sensor.getRawValues(&ir, &red)) {
if (ir > 10 * avg_ir && red > 10 * avg_red) {
if (last_detected == LOW) {
Serial.println("Presence Detected!");
last_detected = HIGH;
}
}
else {
last_detected = LOW;
}
}
}
getReadings()
Hàm getReadings() lấy mười số đọc thô của cả IR Led và Red Led và sau đó tính giá trị trung bình bằng cách thêm các mẫu và chia cho 10.
void getReadings() {
delay(50);
for (int i = 0; i <= 9; i++) {
sensor.update();
sensor.getRawValues(&ir, &red);
avg_ir += ir;
avg_red += red;
delay(50);
}
avg_ir /= 10;
avg_red /= 10;
}
Để xem trình diễn đoạn mã trên, hãy tải mã lên Arduino. Tuy nhiên, trước khi tải mã lên, hãy đảm bảo chọn bảng Arduino từ Bảng > Công cụ và cũng chọn cổng COM chính xác mà bảng Arduino được kết nối từ Công cụ > Cổng.
Sau khi mã được tải lên Arduino, hãy mở màn hình nối tiếp và đặt tốc độ truyền thành 115200. Bây giờ hãy vuốt cảm biến bằng ngón tay của bạn và bạn sẽ nhận được thông báo rằng sự hiện diện đã được phát hiện. MAX30100 cũng có thể phát hiện các chuyển động rất nhỏ.
Trong ví dụ cuối cùng này, chúng tôi sẽ sử dụng cảm biến MAX30100 để có được nhiệt độ khuôn ở cả độ C và độ F.
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
#define REPORTING_PERIOD_MS 1000
// Create a MAX30100 object
MAX30100 sensor;
// Time when the last reading was taken
uint32_t tsLastReading = 0;
void setup() {
Serial.begin(115200);
Serial.print("Initializing MAX30100..");
// Initialize sensor
if (!sensor.begin()) {
Serial.println("FAILED");
for (;;);
} else {
Serial.println("SUCCESS");
}
sensor.setMode(MAX30100_MODE_SPO2_HR);
sensor.setLedsCurrent(MAX30100_LED_CURR_50MA, MAX30100_LED_CURR_27_1MA);
sensor.setLedsPulseWidth(MAX30100_SPC_PW_1600US_16BITS);
sensor.setSamplingRate(MAX30100_SAMPRATE_100HZ);
sensor.setHighresModeEnabled(true);
}
void loop() {
sensor.update();
if (millis() - tsLastReading > REPORTING_PERIOD_MS) {
sensor.startTemperatureSampling();
if (sensor.isTemperatureReady()) {
float temp = sensor.retrieveTemperature();
Serial.print("Temperature = ");
Serial.print(temp);
Serial.print("*C | ");
Serial.print((temp * 9.0) / 5.0 + 32.0);
Serial.println("*F");
}
tsLastReading = millis();
}
}
Thứ nhất, chúng tôi bao gồm các thư viện cần thiết cho dự án này.
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"
Tiếp theo, chúng tôi xác định thời gian báo cáo tính bằng mili giây giữa các mẫu. Nó được đặt thành 1000ms tức là 1 giây.
#define REPORTING_PERIOD_MS 1000
Tiếp theo, tạo một đối tượng của MAX30100 được gọi là 'cảm biến'.
MAX30100 sensor;
Biến sau đây giữ thời gian khi lần đọc cuối cùng được thực hiện. Ban đầu, nó được đặt thành 0.
uint32_t tsLastReading = 0;
Bên trong hàm setup(), trước tiên chúng ta mở giao tiếp nối tiếp với tốc độ truyền 115200. Sau đó, chúng tôi khởi tạo mô-đun cảm biến MAX30100. Một thông báo có liên quan sẽ được hiển thị trong màn hình nối tiếp.
Sau đó, chúng tôi sẽ định cấu hình cảm biến MAX30100 bao gồm cài đặt chế độ, dòng điện Led, độ rộng xung Led, tốc độ lấy mẫu, v.v.
void setup() {
Serial.begin(115200);
Serial.print("Initializing MAX30100..");
// Initialize sensor
if (!sensor.begin()) {
Serial.println("FAILED");
for (;;);
} else {
Serial.println("SUCCESS");
}
sensor.setMode(MAX30100_MODE_SPO2_HR);
sensor.setLedsCurrent(MAX30100_LED_CURR_50MA, MAX30100_LED_CURR_27_1MA);
sensor.setLedsPulseWidth(MAX30100_SPC_PW_1600US_16BITS);
sensor.setSamplingRate(MAX30100_SAMPRATE_100HZ);
sensor.setHighresModeEnabled(true);
}
Bên trong hàm loop(), trước tiên chúng ta sẽ đọc từ cảm biến bằng sensor.update(). Sau đó, sau mỗi 1 giây, chúng ta sẽ truy cập số đọc nhiệt độ theo độ C bằng cách sử dụng sensor.retrieveTemperature() và lưu số đọc trong một biến phao gọi là 'temp.' Bài đọc này sẽ được in trong màn hình nối tiếp. Ngoài ra, chúng tôi cũng sẽ in số đọc nhiệt độ Fahrenheit bằng cách sử dụng các phép tính thích hợp trước tiên để chuyển đổi số đọc.
void loop() {
sensor.update();
if (millis() - tsLastReading > REPORTING_PERIOD_MS) {
sensor.startTemperatureSampling();
if (sensor.isTemperatureReady()) {
float temp = sensor.retrieveTemperature();
Serial.print("Temperature = ");
Serial.print(temp);
Serial.print("*C | ");
Serial.print((temp * 9.0) / 5.0 + 32.0);
Serial.println("*F");
}
tsLastReading = millis();
}
}
Để xem trình diễn đoạn mã trên, hãy tải mã lên Arduino. Tuy nhiên, trước khi tải mã lên, hãy đảm bảo chọn bảng Arduino từ Bảng > Công cụ và cũng chọn cổng COM chính xác mà bảng Arduino được kết nối từ Công cụ > Cổng.
Sau khi mã được tải lên Arduino, hãy giữ cảm biến ở giữa các ngón tay của bạn. Mở màn hình nối tiếp và đặt tốc độ truyền thành 115200. Các bài đọc nhiệt độ sẽ bắt đầu xuất hiện.