코로나19 긴급용 휴대용 펄스 옥시미터 제작
부품 및 소모품
| 아두이노 나노 R3 |
1개 |
| 맥심 인터그레이티드 MAX30100 펄스 옥시미터 센서 |
1개 |
| SSD1306 128x32 I2C OLED 디스플레이 |
1개 |
| 프로토타입 브레드보드 |
1개 |
| 피터 스미스 제작 손가락 클립 |
1개 |
필수 도구 및 기계
- 3D 프린터 (일반)
- 납땜 인두 (일반)
- 납 와이어, 무연
- 4x0.25 와이어
프로젝트 소개
이 간단한 프로젝트는 이번 긴급 상황에서 사람들과 기관을 돕고자 합니다. 표준 상황에서는 병원의 기초인 필수 장치들의 구하기 어려움과 개인 보호 장비 부족이 큰 문제입니다.
빠른 복제와 확산을 위한 오픈소스 기반
이 첫 릴리스의 "베이스 팩"은 기능적인 장치 제작에 필요한 모든 파트를 포함합니다:
1 - 하드웨어
필요한 모든 부품 간단 리스트, 일반적이고 저렴한 하드웨어지만 엄청난 잠재력: 아두이노 나노 (차세대 마이크로 등), MAX30100 펄스 옥시미터 센서, OLED 화면 128x32, "비상 보드".
2 - 3D 프린트 가능한 인클로저
하드웨어와 연결부를 보호하는 심플한 3D 프린트 케이스.
3 - 3D 프린트 가능한 손가락 클립
이미 공개된 오픈소스 "손가락 센서 인클로저"가 프로젝트 공유의 빠른 길입니다. 씽기버스 저장소에서 찾으세요. MAX30100 보드용 "펄스 옥시미터 클립"으로 Peter_Smith가 설계.
4 - 심플 비상 보드
모든 부품을 전기적으로 연결하고 지지하기 위한 심플 "베이스보드"를 프로토타입 회로 기판으로 제작 (다음 단계는 프린트 회로 기판). 이렇게 하면 아두이노 보드, 센서, OLED 화면 연결이 빠릅니다.
5 - 코드
이 예비 릴리스에서는 심박수와 산소포화도를 실시간 모니터링하며 명확하게 볼 수 있는 기본 구성을 만들었습니다. 기본 설정과 파라미터는 일반용으로 설정됐으며 특정 상황에 따라 간단한 변경이 필요할 수 있습니다.
6 - 지침
간단한 도면, 단계별 조립 및 디버깅 지침, 기본 정보. 라이브러리 다운로드 링크와 씽기버스 저장소. 이 단계에서 더 필요한 건 없습니다.
면책 조항
이 애플리케이션, 센서, 기능 장치는 의료 목적으로 테스트되지 않았으며 개별 부품은 보정되지 않았고 인증되지 않았습니다. 다른 의료 기기와 펄스 옥시미터가 없는 긴급 상황에서만 예방적 범위와 환자 모니터링 용도로 사용하세요. 이 범위 외 사용은 전적으로 본인 책임이며, 수정이나 변경도 본인 책임입니다.
이 프로그램은 자유 소프트웨어입니다: GNU 일반 공중 라이선스 버전 3 또는 이후 버전 조건에 따라 재배포 및 수정 가능. 유용하길 바라지만 어떠한 보증도 없이 배포됩니다. 상세 내용은 GNU GPL 참조. Copyright © 2020, CEREBRUM™ srl
이 작업과 관련된 단일 파일을 다운로드하거나 어떤 콘텐츠나 지침을 사용하는 것은 이 면책 조항과 "코로나19 질병" 긴급 상황 하에 공개된 이 프로젝트의 의도를 수용하는 것을 의미합니다.
코드
CE_Pulse-Oxi_dev2.4.ino
아두이노 나노 vR3 기본 코드
MAX30100과 OLED 디스플레이용 I2C
/* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program.
* If not, see .
* Copyright 2020, CEREBRUM srl
*
* More details by CEREBRUM Srl
* www.cerebrum.it
* ITALY
*
* Please consider that this application, sensors and functional device are NOT tested for
* medical purpose and the single parts aren't calibrated and aren't certified.
* Please use this simple device for preventive scope and to monitorate patients only under
* emergency situation when no other medical deviced and Pulse-oximeters are available.
*
* CEREBRUM-oximeter dev. 2.4 - version 1.1 // April, 6 2020
*
* Arduino NANO - 3.3V | I2C A4 (SDA), A5 (SCL)
* Arduino NANO Every - 3.3V | I2C A4 (SDA), A5 (SCL)
* Arduino MICRO - 3.3V | I2C 2 (SDA), 3 (SCL)
*
* MAX30100 - PulseOximeter board (+3.3V | GND | SCA/SCL)
* OLED SSD1306 128x32 (+3.3V | GND | SCA/SCL)
*/
#include
#include "MAX30100_PulseOximeter.h"
#include "MAX30100.h"
#include
#define REPORTING_PERIOD_MS 1000
#define PULSE_WIDTH MAX30100_SPC_PW_1600US_16BITS
#define IR_LED_CURRENT MAX30100_LED_CURR_40MA
#define LED_CURRENT MAX30100_LED_CURR_20_8MA
#define SAMPLING_RATE MAX30100_SAMPRATE_100HZ
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0);
PulseOximeter pox;
MAX30100 sensor;
uint32_t tsLastReport = 0;
uint32_t last_beat = 0;
bool initialized = false;
int HRclean;
int SpO2;
void onBeatDetected() {
show_beat();
last_beat = millis();
}
void show_beat() {
u8g2.setFont(u8g2_font_cursor_tr);
u8g2.setCursor(118, 10);
u8g2.print("_");
u8g2.sendBuffer();
}
void initial_display() {
if (!initialized) {
u8g2.clearBuffer();
u8g2.setCursor(15, 12);
u8g2.setFont(u8g2_font_crox2hb_tr);
u8g2.print("CEREBRUM.it");
u8g2.setFont(u8g2_font_crox2h_tr);
u8g2.setCursor(30, 29);
u8g2.print("Initializing...");
u8g2.sendBuffer();
delay(4000);
initialized = true;
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_crox2hb_tr);
if (!pox.begin()) {
u8g2.setCursor(40, 12);
u8g2.print("FAILED");
u8g2.setCursor(15, 29);
u8g2.print("Check Sensor!");
u8g2.sendBuffer();
for(;;);
} else {
u8g2.setCursor(20, 12);
u8g2.print("INITIALIZED");
u8g2.setCursor(0, 29);
u8g2.print("Wear the Sensor...");
u8g2.sendBuffer();
}
delay(2000);
}
}
void setup() {
u8g2.begin();
initial_display();
pox.begin();
pox.setOnBeatDetectedCallback(onBeatDetected);
pox.setIRLedCurrent(LED_CURRENT);
sensor.setMode(MAX30100_MODE_SPO2_HR);
sensor.setLedsPulseWidth(PULSE_WIDTH);
sensor.setSamplingRate(SAMPLING_RATE);
}
void loop() {
pox.update();
HRclean = pox.getHeartRate();
SpO2 = pox.getSpO2();
if ((millis() - tsLastReport > REPORTING_PERIOD_MS) && (HRclean > 30 && HRclean < 220 && SpO2 > 30 && SpO2 < 100)) {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_crox2h_tr);
u8g2.setCursor(0, 12);
u8g2.print("HR");
u8g2.setCursor(75, 12);
u8g2.print("Bpm");
u8g2.setCursor(0, 30);
u8g2.print("SpO2 ");
u8g2.setCursor(75, 30);
u8g2.print("%");
u8g2.setFont(u8g2_font_fub11_tf);
u8g2.setCursor(45, 12);
u8g2.print(HRclean);
u8g2.setCursor(45, 30);
u8g2.print(SpO2);
u8g2.setFont(u8g2_font_cursor_tr);
u8g2.setCursor(118, 10);
u8g2.print("^");
u8g2.sendBuffer();
tsLastReport = millis();
}
}
커스텀 파트 및 인클로저
- 전자 부품 및 OLED 디스플레이용 메인 인클로저
- 전자 부품 및 OLED 디스플레이용 인클로저 상단 커버
- 팀 기여자 피터 스미스 개발 2파트 손가락 클립 (참조: 팀 기여자)
회로도
- 메인 연결
- 디스플레이, 센서, 아두이노 코어를 연결하는 심플 보드