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

코로나19 대응 오픈소스 맥박 산소 측정기 DIY: 아두이노 나노 + MAX30102

부품 및 소모품

부품 수량 비고
아두이노 나노 R3 1
맥심 MAX30102 맥박/심박 센서 1 I2C 인터페이스, 적외선/적색 LED 내장
DFRobot Gravity I2C OLED 128x64 디스플레이 1 심박수(HR) 및 산소포화도(SpO2) 표시

필요 도구

앱 및 온라인 서비스

프로젝트 소개

코로나19의 도전

COVID-19는 호흡기계를 주로 공격합니다. 경증은 발열, 오한 정도지만 폐렴으로 진행하면 호흡곤란이 옵니다. 병원이 포화 상태일 때 환자 스스로 산소포화도를 모니터링해 입원 시기를 판단할 수 있도록 저비용 오픈소스 맥박 산소 측정기를 개발했습니다.

⚠️ 중요 면책 조항

이 장치는 의료용 진단 기기가 아닙니다! 참고용으로만 사용하세요. 정확한 진단은 전문 의료 기기와 의료진 상담이 필요합니다.

전자 부품 상세

MAX30102 센서

반사형 맥박 산소 측정 원리: 적색(660nm)과 적외선(880nm) LED를 손가락에 조사하고, 혈액 산소포화도에 따른 흡수율 차이로 SpO2 계산. 심박수도 동시에 측정.

코로나19 대응 오픈소스 맥박 산소 측정기 DIY: 아두이노 나노 + MAX30102

128x64 OLED 디스플레이

I2C 인터페이스, 선명한 텍스트 표시. HR과 SpO2 수치 실시간 출력.

코로나19 대응 오픈소스 맥박 산소 측정기 DIY: 아두이노 나노 + MAX30102

아두이노 나노

소형 폼팩터, I2C 핀(A4=SDA, A5=SCL) 기본 제공. 5V/3.3V 모두 호환.

코로나19 대응 오픈소스 맥박 산소 측정기 DIY: 아두이노 나노 + MAX30102

제작 단계별 가이드

1. 3D 프린팅 및 후가공

코로나19 대응 오픈소스 맥박 산소 측정기 DIY: 아두이노 나노 + MAX30102

2. 전자 회로 납땜

코로나19 대응 오픈소스 맥박 산소 측정기 DIY: 아두이노 나노 + MAX30102

3. 기계적 조립

코로나19 대응 오픈소스 맥박 산소 측정기 DIY: 아두이노 나노 + MAX30102

4. 스케치 업로드

5. 사용법

  1. 손가락 끝을 센서 위에 올리고 뚜껑을 살며시 닫아 밀착시킴
  2. 전원 연결 (USB 또는 배터리)
  3. 초기 보정(약 4초) 후 심박수(HR)와 산소포화도(SpO2) 표시됨
  4. 측정 중 손가락 움직임 최소화

코로나19 대응 오픈소스 맥박 산소 측정기 DIY: 아두이노 나노 + MAX30102

소스 코드

/* 하드웨어 연결:
 * -5V = 5V (3.3V도 가능) -GND = GND
 * -SDA = A4 (또는 SDA) -SCL = A5 (또는 SCL)
 * -INT = 미연결
 * MAX30105는 5V 또는 3.3V I2C 로직 모두 지원. 5V 권장.
 */
#include 
#include "MAX30105.h"
#include "spo2_algorithm.h"
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"

MAX30105 particleSensor;
SSD1306AsciiWire oled;

#define MAX_BRIGHTNESS 255

#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
// 우노/나노는 SRAM 부족으로 32비트 대신 16비트 버퍼 사용
uint16_t irBuffer[50];
uint16_t redBuffer[50];
#else
uint32_t irBuffer[50];
uint32_t redBuffer[50];
#endif

int32_t spo2; int8_t validSPO2;
int32_t heartRate; int8_t validHeartRate;

void setup() {
  Serial.begin(115200);
  oled.begin(&Adafruit128x64, 0x3C);
  oled.setFont(Arial14);
  
  if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) {
    Serial.println(F("MAX30105 not found. Check wiring/power."));
    while (1);
  }
  // 설정: ledBrightness=55, sampleAverage=4, ledMode=2, sampleRate=200, pulseWidth=411, adcRange=4096
  particleSensor.setup(55, 4, 2, 200, 411, 4096);
}

void loop() {
  // 최초 50샘플 수집으로 신호 범위 결정
  for (byte i = 0; i < 50; i++) {
    while (!particleSensor.available()) particleSensor.check();
    redBuffer[i] = particleSensor.getRed();
    irBuffer[i] = particleSensor.getIR();
    particleSensor.nextSample();
    Serial.print("red="); Serial.print(redBuffer[i]);
    Serial.print(", ir="); Serial.println(irBuffer[i]);
  }
  
  // 최초 HR/SpO2 계산
  maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
  
  // 지속적 측정 루프 (1초마다 갱신)
  while (1) {
    // 오래된 25샘플 버림, 최신 25샘플을 앞쪽으로 시프트
    for (byte i = 25; i < 50; i++) {
      redBuffer[i - 25] = redBuffer[i];
      irBuffer[i - 25] = irBuffer[i];
    }
    // 새 25샘플 수집
    for (byte i = 25; i < 50; i++) {
      while (!particleSensor.available()) particleSensor.check();
      redBuffer[i] = particleSensor.getRed();
      irBuffer[i] = particleSensor.getIR();
      particleSensor.nextSample();
      // 시리얼 디버그 출력
      Serial.print("red="); Serial.print(redBuffer[i]);
      Serial.print(", ir="); Serial.print(irBuffer[i]);
      Serial.print(", HR="); Serial.print(heartRate);
      Serial.print(", HRvalid="); Serial.print(validHeartRate);
      Serial.print(", SPO2="); Serial.print(spo2);
      Serial.print(", SPO2Valid="); Serial.println(validSPO2);
    }
    // 이동 평균으로 HR/SpO2 재계산
    maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
    printToScreen();
  }
}

void printToScreen() {
  oled.clear();
  oled.setCursor(0, 0);
  if (validSPO2 && validHeartRate) {
    oled.print(F("HR: ")); oled.println(heartRate, DEC);
    oled.print(F("SPO2: ")); oled.println(spo2, DEC);
  } else {
    oled.print(F("Not valid"));
  }
}

회로도

코로나19 대응 오픈소스 맥박 산소 측정기 DIY: 아두이노 나노 + MAX30102

커스텀 파트 및 인클로저

3D 프린터용 STL 파일은 프로젝트 페이지 첨부 파일에서 다운로드 가능. PLA 권장, 서포트 포함 출력.

제조공정

  1. FirePick Delta 프로젝트 로그: OpenPnP로 오픈소스 마이크로팩토리 구축
  2. 아두이노 디지털 주사위: LCD 기반 랜덤 넘버 제너레이터 만들기
  3. 아두이노 아이언맨 제작: 부품, 센서, 단계별 가이드
  4. 아두이노와 블루투스로 만드는 스마트 물건 찾기 'Find Me'
  5. 아두이노 구동 3D 프린팅 로봇 팔 만들기: 단계별 가이드
  6. 코로나19 긴급용 휴대용 펄스 옥시미터 제작
  7. 아두이노 릴레이 제어 가습기 자동화 – 고전압 안전 설계
  8. 아두이노 나노와 네오픽셀 매트릭스로 만드는 네온 퐁 게임
  9. 헬스 밴드: 노인을 위한 신뢰할 수 있는 스마트 웨어러블 어시스턴트
  10. 오픈소스가 엣지 혁신을 주도하는 이유 - 필독 전자책