Máy đo oxy xung MAX30100 và cảm biến nhịp tim với ESP32

Máy đo oxy xung MAX30100 và cảm biến nhịp tim với ESP32

Giới thiệu cảm biến oxy xung MAX30100

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.

·Cảm biến 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 vấn đề 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à một cảm biến rất dễ sử dụng mà không có 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.

Tổng quan về mô-đun MAX30100

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.

Các tính năng chính

  • 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

Máy đo oxy xung MAX30100 hoạt động

Trong phần này, chúng ta hãy thảo luận về cách máy theo dõi nhịp tim MAX30100 và máy đo oxy xung thực sự hoạt động.

Máy đo oxy xung

Để 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.

Sơ đồ khối hệ thống MAX30100

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

Để đ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."

MAX30100 Pinout máy đo oxy xung

Mô-đun MAX30100 (RCWL-0530) bao gồm bảy chân.

Sơ đồ chân MAX30100

Ghim

Mô tả:__________

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.

Máy đo oxy xung MAX30100 giao tiếp với ESP32

Trong phần này, chúng ta sẽ tìm hiểu cách giao tiếp mô-đun cảm biến MAX30100 với bảng ESP32.

Vấn đề thiết kế với RCWL-0530

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:

Sơ đồ mô-đun MAX30100

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ơ đồ 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 đ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ư ESP32 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.

Giải pháp 1: Tháo điện trở kéo lên 4.7k khỏi mô-đun và thay vào đó kết nối các điện trở bên ngoài

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.

Mô-đun MAX30100 loại bỏ điện trở

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 đã tháo 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 ESP32 như hình dưới đây:

MAX30100 với sơ đồ kết nối ESP32 (điện trở ngoài)

Ở đây chúng tôi đang kết nối chân SDA và SCL với 3.3V từ ESP32 thông qua đ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

ESP32 ·

VCC

3.3V

SCL

GPIO22 ·

SDA

GPIO21 ·

GND ·

GND ·

Giải pháp 2: Cắt đường và tạo đường dẫn mới

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ế.

Max30100 đường cắt mô-đunĐường dẫn kết nối mô-đun Max30100

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 ESP32 như hình dưới đây:

MAX30100 với sơ đồ kết nối ESP32 (cắt và kết nối)

Các kết nối giữa mô-đun cảm biến và ESP32 như sau:

Mô-đun MAX30100

ESP32 ·

VCC

3.3V

SCL

GPIO22 ·

SDA

GPIO21 ·

GND ·

GND ·

Cài đặt Thư viện MAX3100 Arduino

Chúng tôi sẽ sử dụng Arduino IDE để lập trình bảng phát triển ESP32 của chúng tôi. Vì vậy, bạn nên có phiên bản Arduino IDE mới nhất. Ngoài ra, bạn cũng cần cài đặt plugin ESP32.

Mở Arduino IDE và nhấp vào Sketch > Library > Manage Libraries

MPU-6050 Cài đặt thư viện

Cửa sổ sau sẽ mở ra.

thư viện tìm kiếm Arduino IDE

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.

Cài đặt thư viện Max30100lib

Sau khi cài đặt thư viện, hãy khởi động lại IDE của bạn.

Bản phác thảo cảm biến MAX30100 cho ESP32

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 bảng ESP32 của chúng tôi.

Đo nhịp tim (BPM) và nồng độ oxy trong máu (SPO2) bằng MAX30100

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(115200);

 

    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();

    }

}

Mã hoạt động như thế nào?

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!");

}

thiết lập()

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 là 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 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);

vòng lặp()

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();

    }

}

Demonstration

Chọn đúng bảng và cổng COM trước khi tải mã của bạn lên bảng.
Đi tới Bảng > Công cụ và chọn Mô-đun Nhà phát triển ESP32.

Chọn bảng ESP32

Tiếp theo, đi tới Công cụ > Cổng và chọn cổng thích hợp mà qua đó bảng của bạn được kết nối.

Chọn COM PORT ESP32

Nhấp vào nút tải lên để tải mã lên bảng phát triển ESP32. Sau khi bạn đã tải mã của mình lên bảng phát triển ESP32, hãy nhấn nút ENABLE của nó.

Nút đặt lại bật ESP32

Bây giờ 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.

MAX30100 với ESP32 đo BPM và SpO2

Biểu đồ MAX30100 Giá trị dữ liệu thô

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);

  }

}

Mã 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, tạo một đối tượng của MAX30100.

MAX30100 sensor;

thiết lập()

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 là 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);

vòng lặp()

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.

MAX30100 với ESP32 đo giá trị thô

MAX30100 như một cảm biến hiện diệ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;

}

Mã 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 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'.

Tìm hiểu thêm

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;

thiết lập()

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 là 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();

}

vòng lặp()

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;

}

Demonstration

Chọn đúng bảng và cổng COM trước khi tải mã của bạn lên bảng.
Đi tới Bảng > Công cụ và chọn Mô-đun Nhà phát triển ESP32.

Chọn bảng ESP32

Tiếp theo, đi tới Công cụ > Cổng và chọn cổng thích hợp mà qua đó bảng của bạn được kết nối.

Chọn COM PORT ESP32

Nhấp vào nút tải lên để tải mã lên bảng phát triển ESP32. Sau khi bạn đã tải mã của mình lên bảng phát triển ESP32, hãy nhấn nút ENABLE của nó.

Nút đặt lại bật ESP32

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ỏ.

MAX30100 với máy dò sự hiện diện ESP32

Nhận biết nhiệt độ khuôn

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();

  }

}

Mã 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 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;

thiết lập()

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 là 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);

}

vòng lặp()

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();

  }

}

Cuộc biểu tình

Chọn đúng bảng và cổng COM trước khi tải mã của bạn lên bảng.
Đi tới Bảng > Công cụ và chọn Mô-đun Nhà phát triển ESP32.

Chọn bảng ESP32

Tiếp theo, đi tới Công cụ > Cổng và chọn cổng thích hợp mà qua đó bảng của bạn được kết nối.

Chọn COM PORT ESP32

Nhấp vào nút tải lên để tải mã lên bảng phát triển ESP32. Sau khi bạn đã tải mã của mình lên bảng phát triển ESP32, hãy nhấn nút ENABLE của nó.

Nút đặt lại bật ESP32

Bây giờ 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.

MAX30100 với nhiệt độ đo ESP32

>>> 100+ Mã Sản Phẩm Dây Rút: https://mecsu.vn/san-pham/day-rut-nhua.5op

>>> 1000+ Mã Sản Phẩm Đầu Cosse: https://mecsu.vn/san-pham/dau-cosse.Q1j

Bài viết cùng chuyên mục

NHANH

NHANH

Vì Đổi mới liên tục nên Nhanh hơn

ĐÚNG

ĐÚNG

Coi trọng và ưu tiên việc làm Đúng

ĐỦ

ĐỦ

Tìm và mua Đủ Đơn hàng hơn

KỊP THỜI

KỊP THỜI

Hiệu suất tối ưu bởi Kịp Thời hơn