산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

MAX30102로 심박수 및 SpO2 측정

구성품 및 소모품

Arduino UNO
× 1
Adafruit OLED 128x32
× 1
부저
× 1
Maxim 통합 MAX30102 고감도 맥박 산소 측정기 및 심박수 센서 웨어러블 건강을 위한
× 1

이 프로젝트 정보

소개

안녕하세요, 이 튜토리얼에서는 MAX30102:맥박 산소 측정기 및 심박수 모니터 모듈을 Arduino UNO 보드와 인터페이스한 다음 이 모듈 + OLED 디스플레이 및 부저를 사용하여 BPM을 측정하는 프로젝트를 만듭니다.

BPM은 "분당 비트"이며 정상인의 경우 휴식 시 약 65-75이며 육상은 그보다 낮을 수 있으며 SpO2는 산소 포화도 수준이며 정상인의 경우 95% 이상입니다.

MAX30102는 다른 모듈에서 찾을 수 있습니다. 저는 WAVGAT 버전을 가지고 있습니다. IC가 MAX30102인 한 문제가 되지 않습니다.

구성 요소

내가 사용할 물건은 다음과 같습니다.

테스트:

튜토리얼에서 사용한 코드는 매우 명확하며 Sparkfun_MAX3010x 라이브러리의 예일 뿐입니다.

OLED와 Buzzer용으로 만든 코드의 경우 "HeartRate" 예제의 수정된 버전이며 센서에 손가락을 대라고 합니다.

손가락을 대면 부저의 "삐" 소리가 심장 박동과 동기화되거나 OLED 애니메이션이 동기화될 때까지 잠시 침착한 다음 올바른 BPM을 읽을 수 있습니다.

주의:코드에서 실제로 Average BPM을 인쇄합니다. 평균 4BPM을 수행하므로 시간을 주면 더 정확합니다.

OLED용 비트맵 만들기

당신이 보는 심장(작은)은 비트맵 사진이고 센서가 심장 박동을 감지할 때마다 잠시 동안 다른 심장(큰) 비트맵 그림으로 전환하고 부저에서 삐 소리와 함께 심장이 뛰는 느낌을 줍니다.

다음은 코드에서 나중에 호출하는 두 개의 비트맵입니다.

이것을 만들려면 화면에서 보고 싶은 모든 것을 위한 사진(흰색 배경의 검정색)을 찾으세요. 크기를 잊지 마세요. 제가 사용하는 것은 128x32픽셀이고 사진은 그보다 작습니다(32x32 픽셀) 및 (24x21픽셀)

LCD Assistant를 다운로드하고 여십시오(아래 몇 단계).

다음은 "숫자"입니다.

코드에서 호출한 방법은 다음과 같습니다.

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

 display.drawBitmap(시작 x 위치, 시작 y 위치, 비트맵 이름, 너비, 높이, 색상); 

그리고 코드에서 볼 수 있듯이 하나는 손가락이 감지되면 호출되고 다른 하나는 심장 박동이 감지되면 호출됩니다.

여기에서 원하는 것을 만들 수 있습니다.

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • MAX_BPM_OLED_Buzzer.ino
  • MAX_BPM_OLED_Buzzer.ino아두이노
    SparkFun MAX3010x 라이브러리에서 수정
    /* 이 코드는 MAX30102 + 128x32 OLED i2c + Buzzer 및 Arduino UNO에서 작동합니다. * 화면에 평균 BPM을 표시하고 애니메이션과 부저 소리와 함께 * 심장 박동이 감지될 때마다 * HeartRate 라이브러리 예제의 수정된 버전입니다 * 자세한 내용은 www.surtrtech.com 또는 SurtrTech YouTube 채널 참조 */#include  //OLED 라이브러리#include #include #include "MAX30105.h" //MAX3010x library#include "heartRate.h" //심박수 계산 알고리즘MAX30105 particleSensor;const byte RATE_SIZE =4; // 평균을 더 높이려면 이 값을 늘립니다. 4는 좋은 바이트 비율[RATE_SIZE]입니다. //심박수 배열byte rateSpot =0;long lastBeat =0; // 마지막 비트가 발생한 시간float beatsPerMinute;int beatAvg;#define SCREEN_WIDTH 128 // OLED 디스플레이 너비(픽셀)#define SCREEN_HEIGHT 32 // OLED 디스플레이 높이(픽셀)#define OLED_RESET -1 // 핀 # 재설정 (또는 Arduino 리셋 핀을 공유하는 경우 -1) Adafruit_SSD1306 디스플레이(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //표시명 선언(디스플레이)static const unsigned char PROGMEM logo2_bmp[] ={ 0x03, 0xC0, 0xF0, 0x06, 0x71, 0x8C, 0x0C, 0x1B, 0x06, 0x18, 0x00E, , //Logo2 및 Logo3은 0x04, 0x01, 0x10, 0x04, 0x01, 0x10, 0x40, 0x01, 0x10, 0x40, 0x01, 0x40, 0x01, 0x10, 0x080, 0x03, 0x080 호출 시 OLED에 표시되는 두 개의 bmp 사진입니다. 0x08, 0xB8, 0x04, 0xFF, 0x37, 0x08, 0x01, 0x30, 0x18, 0x01, 0x90, 0x01, 0x90, 0x30, 0x00, 0x00, 0x60,0x00, 0x0x 0x0E, 0x00, 0x00, 0x04, 0x00, }; 정적 const unsigned char PROGMEM logo3_bmp[] ={ 0x01, 0xF0, 0x0F, 0x80, 0x06, 0x1C, 0x808, 0x1C 0x80, 0x08,0x20, 0x01, 0x80, 0x04, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0x, 0x00, 0x02, 0xC0, 0x080, 0x 하는 0x01, 0x80으로, 0 × 00,가 0x1c, 0x01로, 0x80으로, 0 × 00,하는 0x14, 0x00,0x80, 0 × 00,하는 0x14, 0x00으로, 0x80으로, 0 × 00,하는 0x14, 0x00으로,는 0x40, 0x10, 명령 0x12를, 0 × 00, 0 × 40,은 0x10, 0x12를, 0 × 00, 0x7E, 0x1F, 0x23, 0xFE, 0x03, 0 x31, 0xA0, 0x04, 0x01, 0xA0, 0xA0, 0x0C, 0x00, 0xA0, 0xA0, 0x08,0x00, 0x60, 0x60, 0x00, 0x10, 0x00, 00x2 0x40, 0xC0,0x01, 0x80, 0x01, 0x80, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x60, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x01, 0x80, 0x00 }; 무효 설정() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //OLED 디스플레이 시작 display.display(); 지연(3000); // 센서 초기화 particleSensor.begin(Wire, I2C_SPEED_FAST); //기본 I2C 포트, 400kHz 속도 사용 particleSensor.setup(); //기본 설정으로 센서 구성 particleSensor.setPulseAmplitudeRed(0x0A); //센서가 실행 중임을 나타내기 위해 빨간색 LED를 로우로 설정합니다.}void loop() { long irValue =particleSensor.getIR(); //IR 값을 읽으면 센서에 손가락이 있는지 여부를 알 수 있습니다. //심장박동도 감지합니다.if(irValue> 7000){ //손가락이 감지되면 display.clearDisplay(); //디스플레이 지우기 display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE); //첫 번째 bmp 그림(작은 하트)을 그립니다. display.setTextSize(2); //평균 BPM을 표시하는 위치 근처에 원하는 경우 BPM을 표시할 수 있습니다. display.setTextColor(WHITE); display.setCursor(50,0); display.println("BPM"); display.setCursor(50,18); display.println(beatAvg); 디스플레이.디스플레이(); if (checkForBeat(irValue) ==true) //심장이 감지되면 { display.clearDisplay(); //디스플레이 지우기 display.drawBitmap(0, 0, logo3_bmp, 32, 32, WHITE); //두 번째 그림(더 큰 하트)을 그립니다. display.setTextSize(2); //그리고 여전히 평균 BPM을 표시합니다. display.setTextColor(WHITE); display.setCursor(50,0); display.println("BPM"); display.setCursor(50,18); display.println(beatAvg); 디스플레이.디스플레이(); 톤(3,1000); //그리고 100ms 동안 부저를 울리면 줄일 수 있습니다. 더 나은 delay(100); 노톤(3); //"빕" 효과를 내기 위해 버저를 비활성화합니다. //박자를 감지했습니다! 긴 델타 =millis() - lastBeat; //두 비트 사이의 지속 시간 측정 lastBeat =millis(); beatsPerMinute =60 / (델타 / 1000.0); //BPM 계산 if (beatsPerMinute <255 &&beatsPerMinute> 20) //평균을 계산하기 위해 일부 값(4)을 저장한 다음 평균을 계산하기 위해 수학을 수행합니다. { Rates[rateSpot++] =(byte)beatsPerMinute; //이 판독값을 배열에 저장합니다. rateSpot %=RATE_SIZE; //Wrap 변수 //판독값의 평균을 구합니다. beatAvg =0; for (byte x =0; x  
    SparkFun MAX3010x 라이브러리
    https://github.com/sparkfun/SparkFun_MAX3010x_Sensor_Library
    아다프루트 SSD1306
    https://github.com/adafruit/Adafruit_SSD1306
    Adafruit GFX 라이브러리
    https://github.com/adafruit/Adafruit-GFX-Library

    회로도

    두 모듈 모두 i²c 인터페이스를 가지고 있습니다. GND와 함께 2핀 버저(-)를 사용하고 저항과 함께 (+)를 사용하는 경우 D3

    제조공정

    1. QR, RFID 및 온도 확인을 통한 출입 통제
    2. 1선 DS18B20 센서와 Raspberry Pi로 온도 측정
    3. Raspberry Pi 및 습도 센서를 사용한 수경재배
    4. 원격 심박수 모니터
    5. Raspberry Pi 및 Python으로 로봇 구축
    6. Portenta 및 열전쌍 센서(MAX6675 포함)
    7. MPU-6050을 사용한 Arduino 자이로스코프 게임
    8. IoT를 사용한 심박수 모니터
    9. 감광기로 심박수 감지
    10. 시각적 구성 요소 및 Matterport – ProFeeder X의 새로운 자동화 가능성