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

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

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

Cảm biến MAX30102 là phiên bản tối ưu hóa hơn nữa của cảm biến MAX30100; được sử dụng như một máy đo nhịp tim và một máy đo oxy xung. Các tính năng này được kích hoạt bằng cách 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, ESP8266 NodeMCU, v.v. để xây dựng một thiết bị bão hòa nhịp tim và oxy hiệu quả.

Dưới đây bạn có thể xem sơ đồ của Mô-đun MAX30102:

Tổng quan về mô-đun MAX30102 Mặt trước

Như bạn có thể nhận thấy IC MAX30102 nằm ở trung tâm của mô-đun. Mô-đun bao gồm hai loại đèn LED khác nhau (Đỏ và IR) và 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 chỉ số 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 MAX30102 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.

Hơn nữa, nếu bạn xem mô-đun từ phía sau, bạn có thể xem một jumper hàn để chọn mức logic điện áp. Theo mặc định, nó được đặt thành 3.3V nhưng bạn cũng có thể thay đổi nó thành 1.8V theo yêu cầu logic của vi điều khiển.

MAX30102 Tổng quan về mô-đun Trở lại

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

  • Mô-đun cảm biến MAX30102 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 MAX30102 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 32 mẫu để lưu trữ dữ liệu so với MAX30100 chỉ có 16 bộ đệm FIFO mẫ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 ba mươi hai giá trị nhịp tim và SPO2.

  • MAX30102 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 cấp nguồn, sẵn sàng dữ liệu mới, khử ánh sáng xung quanh, 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:

Tiêu thụ tối đa hiện tại

6 mA

Điện áp

3.3-5V 

Tỷ lệ mẫu

50Hz – 3200Hz

Phạm vi nhiệt độ

-40 °C đến + 85 °C

Độ chính xác nhiệt độ

±1°C

Độ phân giải ADC

18 bit

Bước sóng cực đại IR LED

880nm

Bước sóng đỉnh LED đỏ

660nm

Cảm biến đo oxy xung MAX30102 hoạt động

Trong phần này, chúng ta hãy thảo luận về cách máy đo nhịp tim MAX30102 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 MAX30102 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, ~ 660nm cho đèn led đỏ và ~ 880nm 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 MAX30102 đọ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."

MAX30102 Pinout cảm biến oxy xung

Mô-đun MAX30102 bao gồm tám chân.

Sơ đồ chân mô-đun MAX30102

 

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.

Giao diện cảm biến MAX30102 với ESP32

Trong phần này, chúng ta sẽ tìm hiểu cách giao diện mô-đun cảm biến MAX30102 với ESP32. Chúng tôi sẽ chỉ sử dụng bốn chân của mô-đun cảm biến để kết nối với vi điều khiển của chúng tôi.

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

Mô-đun MAX30102

ESP32 ·

VCC

3.3V

SCL

GPIO22 ·

SDA

GPIO21 ·

GND ·

GND ·

Kết nối các chân I2C mặc định của ESP32 với các chân SCL và SDA của mô-đun. Ngoài ra, cảm biến được cung cấp bởi 3.3V từ ESP32 và cả hai mặt đất đều có điểm chung.

MAX30102 với sơ đồ kết nối ESP32

Installing MAX30102 Library in Arduio IDE

Chúng tôi sẽ sử dụng Arduino IDE để lập trình 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 'MAX3010x' vào thanh tìm kiếm và nhấn enter. Cài đặt phiên bản mới nhất của SparkFun MAX3010x Pulse and Proximity Sensor Library.

Cài đặt Thư viện MAX30102

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

ESP32 MAX30102 Bản phác thảo ví dụ

Trong phần này, chúng tôi sẽ hướng dẫn bạn cách sử dụng một số bản phác thảo ví dụ có sẵn trong Arduino IDE cho thư viện Cảm biến xung và tiệm cận SparkFun MAX3010x mà chúng tôi vừa cài đặt. Chúng tôi sẽ xem xét các ví dụ khác nhau để tìm hiểu hiệu quả cách sử dụng cảm biến với ESP32 của chúng tôi.

Nhịp tim ESP32 và máy đo oxy xung với MAX30102 (SpO2 và BPM)

Đo nhịp tim (BPM) với ESP32 và MAX30102

Mở Arduino IDE của bạn và đi tới File > Ví dụ > SparkFun MAX3010x Pulse and Proximity Sensor Library > Example5_HeartRate.

Mã chương trình sau sẽ mở ra. Bản phác thảo ví dụ này sẽ hiển thị các giá trị BPM trong màn hình nối tiếp khi bạn giữ cảm biến ở giữa các ngón tay.

/*

  Optical Heart Rate Detection (PBA Algorithm) using the MAX30105 Breakout

  By: Nathan Seidle @ SparkFun Electronics

  Date: October 2nd, 2016

  https://github.com/sparkfun/MAX30105_Breakout

 

  This is a demo to show the reading of heart rate or beats per minute (BPM) using

  a Penpheral Beat Amplitude (PBA) algorithm.

 

  It is best to attach the sensor to your finger using a rubber band or other tightening

  device. Humans are generally bad at applying constant pressure to a thing. When you

  press your finger against the sensor it varies enough to cause the blood in your

  finger to flow differently which causes the sensor readings to go wonky.

 

  Hardware Connections (Breakoutboard to Arduino):

  -5V = 5V (3.3V is allowed)

  -GND = GND

  -SDA = A4 (or SDA)

  -SCL = A5 (or SCL)

  -INT = Not connected

 

  The MAX30105 Breakout can handle 5V or 3.3V I2C logic. We recommend powering the board with 5V

  but it will also run at 3.3V.

*/

 

#include <Wire.h>

#include "MAX30105.h"

 

#include "heartRate.h"

 

MAX30105 particleSensor;

 

const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.

byte rates[RATE_SIZE]; //Array of heart rates

byte rateSpot = 0;

long lastBeat = 0; //Time at which the last beat occurred

 

float beatsPerMinute;

int beatAvg;

 

void setup()

{

  Serial.begin(115200);

  Serial.println("Initializing...");

 

  // Initialize sensor

  if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed

  {

    Serial.println("MAX30102 was not found. Please check wiring/power. ");

    while (1);

  }

  Serial.println("Place your index finger on the sensor with steady pressure.");

 

  particleSensor.setup(); //Configure sensor with default settings

  particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running

  particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED

}

 

void loop()

{

  long irValue = particleSensor.getIR();

 

  if (checkForBeat(irValue) == true)

  {

    //We sensed a beat!

    long delta = millis() - lastBeat;

    lastBeat = millis();

 

    beatsPerMinute = 60 / (delta / 1000.0);

 

    if (beatsPerMinute < 255 && beatsPerMinute > 20)

    {

      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;

    }

  }

 

  Serial.print("IR=");

  Serial.print(irValue);

  Serial.print(", BPM=");

  Serial.print(beatsPerMinute);

  Serial.print(", Avg BPM=");

  Serial.print(beatAvg);

 

  if (irValue < 50000)

    Serial.print(" No finger?");

 

  Serial.println();

}

 

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

Các bài đọc BPM sẽ liên tục cập nhật lên những bài mới.

MAX30102 với ESP32 đo BPM

Đo nồng độ oxy trong máu (SpO2) bằng máy đo oxy xung MAX30102

Mở Arduino IDE của bạn và đi tới File > Ví dụ > SparkFun MAX3010x Pulse and Proximity Sensor Library > Example8_SPO2. Mã chương trình sau sẽ mở ra. Bản phác thảo ví dụ này sẽ hiển thị các giá trị 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.

/*

  Optical SP02 Detection (SPK Algorithm) using the MAX30105 Breakout

  By: Nathan Seidle @ SparkFun Electronics

  Date: October 19th, 2016

  https://github.com/sparkfun/MAX30105_Breakout

 

  This demo shows heart rate and SPO2 levels.

 

  It is best to attach the sensor to your finger using a rubber band or other tightening 

  device. Humans are generally bad at applying constant pressure to a thing. When you 

  press your finger against the sensor it varies enough to cause the blood in your 

  finger to flow differently which causes the sensor readings to go wonky.

 

  This example is based on MAXREFDES117 and RD117_LILYPAD.ino from Maxim. Their example

  was modified to work with the SparkFun MAX30105 library and to compile under Arduino 1.6.11

  Please see license file for more info.

 

  Hardware Connections (Breakoutboard to Arduino):

  -5V = 5V (3.3V is allowed)

  -GND = GND

  -SDA = A4 (or SDA)

  -SCL = A5 (or SCL)

  -INT = Not connected

 

  The MAX30105 Breakout can handle 5V or 3.3V I2C logic. We recommend powering the board with 5V

  but it will also run at 3.3V.

*/

 

#include <Wire.h>

#include "MAX30105.h"

#include "spo2_algorithm.h"

 

MAX30105 particleSensor;

 

#define MAX_BRIGHTNESS 255

 

#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)

//Arduino Uno doesn't have enough SRAM to store 100 samples of IR led data and red led data in 32-bit format

//To solve this problem, 16-bit MSB of the sampled data will be truncated. Samples become 16-bit data.

uint16_t irBuffer[100]; //infrared LED sensor data

uint16_t redBuffer[100];  //red LED sensor data

#else

uint32_t irBuffer[100]; //infrared LED sensor data

uint32_t redBuffer[100];  //red LED sensor data

#endif

 

int32_t bufferLength; //data length

int32_t spo2; //SPO2 value

int8_t validSPO2; //indicator to show if the SPO2 calculation is valid

int32_t heartRate; //heart rate value

int8_t validHeartRate; //indicator to show if the heart rate calculation is valid

 

byte pulseLED = 11; //Must be on PWM pin

byte readLED = 13; //Blinks with each data read

 

void setup()

{

  Serial.begin(115200); // initialize serial communication at 115200 bits per second:

 

  pinMode(pulseLED, OUTPUT);

  pinMode(readLED, OUTPUT);

 

  // Initialize sensor

  if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed

  {

    Serial.println(F("MAX30102 was not found. Please check wiring/power."));

    while (1);

  }

 

  Serial.println(F("Attach sensor to finger with rubber band. Press any key to start conversion"));

  while (Serial.available() == 0) ; //wait until user presses a key

  Serial.read();

 

  byte ledBrightness = 60; //Options: 0=Off to 255=50mA

  byte sampleAverage = 4; //Options: 1, 2, 4, 8, 16, 32

  byte ledMode = 2; //Options: 1 = Red only, 2 = Red + IR, 3 = Red + IR + Green

  byte sampleRate = 100; //Options: 50, 100, 200, 400, 800, 1000, 1600, 3200

  int pulseWidth = 411; //Options: 69, 118, 215, 411

  int adcRange = 4096; //Options: 2048, 4096, 8192, 16384

 

  particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange); //Configure sensor with these settings

}

 

void loop()

{

  bufferLength = 100; //buffer length of 100 stores 4 seconds of samples running at 25sps

 

  //read the first 100 samples, and determine the signal range

  for (byte i = 0 ; i < bufferLength ; i++)

  {

    while (particleSensor.available() == false) //do we have new data?

      particleSensor.check(); //Check the sensor for new data

 

    redBuffer[i] = particleSensor.getRed();

    irBuffer[i] = particleSensor.getIR();

    particleSensor.nextSample(); //We're finished with this sample so move to next sample

 

    Serial.print(F("red="));

    Serial.print(redBuffer[i], DEC);

    Serial.print(F(", ir="));

    Serial.println(irBuffer[i], DEC);

  }

 

  //calculate heart rate and SpO2 after first 100 samples (first 4 seconds of samples)

  maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);

 

  //Continuously taking samples from MAX30102.  Heart rate and SpO2 are calculated every 1 second

  while (1)

  {

    //dumping the first 25 sets of samples in the memory and shift the last 75 sets of samples to the top

    for (byte i = 25; i < 100; i++)

    {

      redBuffer[i - 25] = redBuffer[i];

      irBuffer[i - 25] = irBuffer[i];

    }

 

    //take 25 sets of samples before calculating the heart rate.

    for (byte i = 75; i < 100; i++)

    {

      while (particleSensor.available() == false) //do we have new data?

        particleSensor.check(); //Check the sensor for new data

 

      digitalWrite(readLED, !digitalRead(readLED)); //Blink onboard LED with every data read

 

      redBuffer[i] = particleSensor.getRed();

      irBuffer[i] = particleSensor.getIR();

      particleSensor.nextSample(); //We're finished with this sample so move to next sample

 

      //send samples and calculation result to terminal program through UART

      Serial.print(F("red="));

      Serial.print(redBuffer[i], DEC);

      Serial.print(F(", ir="));

      Serial.print(irBuffer[i], DEC);

 

      Serial.print(F(", HR="));

      Serial.print(heartRate, DEC);

 

      Serial.print(F(", HRvalid="));

      Serial.print(validHeartRate, DEC);

 

      Serial.print(F(", SPO2="));

      Serial.print(spo2, DEC);

 

      Serial.print(F(", SPO2Valid="));

      Serial.println(validSPO2, DEC);

    }

 

    //After gathering 25 new samples recalculate HR and SP02

    maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);

  }

}

Cuộc biểu tình

Để xem trình diễn đoạn mã trên, hãy tải mã lên ESP32. Tuy nhiên, trước khi tải mã lên, hãy đảm bảo chọn bảng ESP32 từ Bảng > Công cụ và cũng chọn đúng cổng COM mà bo mạch ESP32 được kết nối từ Công cụ > Cổng.

Sau khi mã được tải lên ESP32, 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ố SpO2 sẽ liên tục cập nhật.

MAX30102 với máy đo Arduino SpO2

Vẽ các giá trị dữ liệu thô MAX30102 (đèn LED đỏ và hồng ngoại) với ESP32 và MAX30102

Mở Arduino IDE của bạn và đi tới File > Ví dụ > SparkFun MAX3010x Pulse and Proximity Sensor Library > Example1_Basic_Readings. Mã chương trình sau sẽ mở ra. Bản phác thảo ví dụ này sẽ thu được các giá trị IR LED và Red LED thô và hiển thị chúng trong màn hình nối tiếp. Ngoài ra, chúng tôi cũng sẽ chỉ cho bạn cách xem các bài đọc ở định dạng đồ họa bằng cách sử dụng trình vẽ nối tiếp.

/*

  MAX30105 Breakout: Output all the raw Red/IR/Green readings

  By: Nathan Seidle @ SparkFun Electronics

  Date: October 2nd, 2016

  https://github.com/sparkfun/MAX30105_Breakout

 

  Outputs all Red/IR/Green values.

 

  Hardware Connections (Breakoutboard to Arduino):

  -5V = 5V (3.3V is allowed)

  -GND = GND

  -SDA = A4 (or SDA)

  -SCL = A5 (or SCL)

  -INT = Not connected

 

  The MAX30105 Breakout can handle 5V or 3.3V I2C logic. We recommend powering the board with 5V

  but it will also run at 3.3V.

 

  This code is released under the [MIT License](http://opensource.org/licenses/MIT).

*/

 

#include <Wire.h>

#include "MAX30105.h"

 

MAX30105 particleSensor;

 

#define debug Serial //Uncomment this line if you're using an Uno or ESP

//#define debug SerialUSB //Uncomment this line if you're using a SAMD21

 

void setup()

{

  debug.begin(9600);

  debug.println("MAX30102 Basic Readings Example");

 

  // Initialize sensor

  if (particleSensor.begin() == false)

  {

    debug.println("MAX30102 was not found. Please check wiring/power. ");

    while (1);

  }

 

  particleSensor.setup(); //Configure sensor. Use 6.4mA for LED drive

}

 

void loop()

{

  debug.print(" R[");

  debug.print(particleSensor.getRed());

  debug.print("] IR[");

  debug.print(particleSensor.getIR());

  debug.print("]");

  debug.println(); 

 

 

}

Sau khi mã được tải lên ESP32, hãy chuyển đến Công cụ > Màn hình nối tiếp và đặt tốc độ truyền của nó thành 9600. 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.

MAX30102 với ESP32 đo dữ liệu thô

Các giá trị thay đổi nhanh đến mức rất khó để phân tích chúng. Vì vậy, chúng tôi sẽ vẽ chúng thay thế.

Trong code chương trình đã cho ở trên, hãy thay thế hàm loop() bằng hàm dưới đây:

void loop()

{

  Serial.print(particleSensor.getRed());

  Serial.print(", ");

  Serial.println(particleSensor.getIR());

 

}

Bây giờ hãy lưu mã và tải nó lên ESP32. Đi tới Tools > Serial Plotter và đặt tốc độ truyền của nó thành 9600. 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.

MAX30102 với dữ liệu thô lô ESP32

MAX30102 làm cảm biến hiện diện với ESP32

Mở Arduino IDE của bạn và đi tới Ví dụ về tệp > > Thư viện cảm biến xung và tiệm cận SparkFun MAX3010x > Example2_Presence_Sensing. Mã chương trình sau sẽ mở ra. Bản phác thảo ví dụ này sẽ chỉ cho bạn cách sử dụng MAX30102 làm cảm biến hiện diện. Đầu tiên, một số bài đọc sẽ được thực hiện với cảm biến này. Sau đó, 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 một sự thay đổi rõ ràng từ cách đọc này.

/*

  MAX30105 Breakout: Take IR reading to sense presence

  By: Nathan Seidle @ SparkFun Electronics

  Date: October 2nd, 2016

  https://github.com/sparkfun/MAX30105_Breakout

 

  This takes an average reading at power up and if the reading changes more than 100

  then print 'Something is there!'.

 

  Hardware Connections (Breakoutboard to Arduino):

  -5V = 5V (3.3V is allowed)

  -GND = GND

  -SDA = A4 (or SDA)

  -SCL = A5 (or SCL)

  -INT = Not connected

 

  The MAX30105 Breakout can handle 5V or 3.3V I2C logic. We recommend powering the board with 5V

  but it will also run at 3.3V.

 

*/

 

#include <Wire.h>

#include "MAX30105.h"

 

MAX30105 particleSensor;

 

long samplesTaken = 0; //Counter for calculating the Hz or read rate

long unblockedValue; //Average IR at power up

long startTime; //Used to calculate measurement rate

 

void setup()

{

  Serial.begin(9600);

  Serial.println("MAX30102 Presence Sensing Example");

 

  // Initialize sensor

  if (particleSensor.begin(Wire, I2C_SPEED_FAST) == false) //Use default I2C port, 400kHz speed

  {

    Serial.println("MAX30102 was not found. Please check wiring/power. ");

    while (1);

  }

 

  //Setup to sense up to 18 inches, max LED brightness

  byte ledBrightness = 0xFF; //Options: 0=Off to 255=50mA

  byte sampleAverage = 4; //Options: 1, 2, 4, 8, 16, 32

  byte ledMode = 2; //Options: 1 = Red only, 2 = Red + IR, 3 = Red + IR + Green

  int sampleRate = 400; //Options: 50, 100, 200, 400, 800, 1000, 1600, 3200

  int pulseWidth = 411; //Options: 69, 118, 215, 411

  int adcRange = 2048; //Options: 2048, 4096, 8192, 16384

 

  particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange); //Configure sensor with these settings

 

  particleSensor.setPulseAmplitudeRed(0); //Turn off Red LED

  particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED

 

  //Take an average of IR readings at power up

  unblockedValue = 0;

  for (byte x = 0 ; x < 32 ; x++)

  {

    unblockedValue += particleSensor.getIR(); //Read the IR value

  }

  unblockedValue /= 32;

 

  startTime = millis();

}

 

void loop()

{

  samplesTaken++;

 

  Serial.print("IR[");

  Serial.print(particleSensor.getIR());

  Serial.print("] Hz[");

  Serial.print((float)samplesTaken / ((millis() - startTime) / 1000.0), 2);

  Serial.print("]");

 

  long currentDelta = particleSensor.getIR() - unblockedValue;

 

  Serial.print(" delta[");

  Serial.print(currentDelta);

  Serial.print("]");

 

  if (currentDelta > (long)100)

  {

    Serial.print(" Something is there!");

  }

 

  Serial.println();

}

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

Nhận chỉ số nhiệt độ với ESP32 và MAX30102

Mở Arduino IDE của bạn và đi tới Ví dụ về tệp > > Thư viện cảm biến xung và tiệm cận SparkFun MAX3010x > Example3_Temperature_Sense. Mã chương trình sau sẽ mở ra. Bản phác thảo ví dụ này sẽ sử dụng cảm biến MAX30102 để có được chỉ số nhiệt độ ở cả độ C và độ F.

/*

  MAX3010 Breakout: Read the onboard temperature sensor

  By: Nathan Seidle @ SparkFun Electronics

  Date: October 20th, 2016

  https://github.com/sparkfun/MAX30105_Breakout

 

  This demo outputs the onboard temperature sensor. The temp sensor is accurate to +/-1 C but

  has an astonishing precision of 0.0625 C.

 

  Hardware Connections (Breakoutboard to Arduino):

  -5V = 5V (3.3V is allowed)

  -GND = GND

  -SDA = A4 (or SDA)

  -SCL = A5 (or SCL)

  -INT = Not connected

 

  The MAX30105 Breakout can handle 5V or 3.3V I2C logic. We recommend powering the board with 5V

  but it will also run at 3.3V.

*/

 

#include <Wire.h>

 

#include "MAX30105.h"  //Get it here: http://librarymanager/All#SparkFun_MAX30105

MAX30105 particleSensor;

 

void setup()

{

  Serial.begin(9600);

  Serial.println("Initializing...");

 

  // Initialize sensor

  if (particleSensor.begin(Wire, I2C_SPEED_FAST) == false) //Use default I2C port, 400kHz speed

  {

    Serial.println("MAX30102 was not found. Please check wiring/power. ");

    while (1);

  }

 

  //The LEDs are very low power and won't affect the temp reading much but

  //you may want to turn off the LEDs to avoid any local heating

  particleSensor.setup(0); //Configure sensor. Turn off LEDs

  //particleSensor.setup(); //Configure sensor. Use 25mA for LED drive

 

  particleSensor.enableDIETEMPRDY(); //Enable the temp ready interrupt. This is required.

}

 

void loop()

{

  float temperature = particleSensor.readTemperature();

 

  Serial.print("temperatureC=");

  Serial.print(temperature, 4);

 

  float temperatureF = particleSensor.readTemperatureF(); //Because I am a bad global citizen

 

  Serial.print(" temperatureF=");

  Serial.print(temperatureF, 4);

 

  Serial.println();

 

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