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

COVID-19용 오픈 소스 맥박 산소 농도계

구성품 및 소모품

Arduino Nano R3
× 1
Maxim 통합 MAX30102 맥박 및 심박수 센서
× 1
DFRobot Gravity I2C OLED-2864 디스플레이
× 1

필요한 도구 및 기계

3D 프린터(일반)
납땜 인두(일반)

앱 및 온라인 서비스

Arduino IDE
오토데스크 퓨전 360

이 프로젝트 정보

COVID-19의 도전

COVID-19는 주로 사람의 호흡기를 공격하는 SARS-CoV-2 바이러스에 의해 유발되는 질병입니다. 일부 가벼운 증상에는 발열, 통증 및 오한이 포함될 수 있지만 폐렴과 같은 더 심각한 상태로 이어질 수도 있습니다. 폐렴이 있거나 약간의 숨가쁨이 있는 사람은 특히 더 압도되기 시작하면서 언제 병원에 가야 할지 모를 수 있습니다. 이것이 바로 사람들이 필요한 도움을 받고 현재 상태에 대한 정확한 정보를 얻는 데 도움이 될 수 있는 이 오픈 소스 맥박 산소 측정기를 만든 이유입니다.

약간의 면책 조항

이 기기/프로젝트는 정확한 의료 진단 도구로 사용되어서는 안 됩니다!

전자 제품

MAX30102

128x64 픽셀 OLED

아두이노 나노

단계별 장치 구축

다음은 이 프로젝트를 구축하는 방법에 대한 단계별 안내입니다.

1. 인쇄 및 부품 청소

이 프로젝트의 첨부 파일 섹션에서 각 조각을 다운로드하고 선택한 슬라이서에 로드하여 시작합니다. 나는 PLA로 약 70-80%의 인필과 중간 지지대를 사용했습니다. 인쇄가 끝나면 지지대를 제거하고 모두 잘 맞도록 약간 샌딩했습니다.

2. 전자 부품 납땜

전체 장치는 44mm x 30mm perfboard 조각에 장착된 Arduino Nano를 중심으로 설계되었습니다. 먼저 와이어를 센서의 VIN, GND, SDA 및 SCL 핀에 납땜한 다음 베드 피스 아래에서 Arduino Nano에 연결합니다.

다음으로 OLED용 커넥터를 Nano에 부착한 다음 디스플레이 자체까지 연결합니다.

그리고 마지막으로 전체 전자 부품을 하우징에 밀어 넣고 3mm 나사 몇 개를 사용하여 고정합니다.

3. 장치 조립

전자 장치를 삽입한 후 OLED 스크린을 상단 부분에 부착하고 3mm 나사 두 개를 사용하여 섀시의 나머지 부분에 고정하기만 하면 됩니다. 뚜껑을 위아래로 부드럽게 움직여 움직임을 테스트할 수 있습니다.

4. 스케치 업로드

포함된 스케치는 사용자의 현재 심박수와 산소 포화도를 표시하기 위해 몇 가지 작업을 수행합니다. 업로드하려면 필요한 라이브러리를 설치하고 도구 메뉴의 보드 목록에서 Arduino Nano를 선택한 다음 업로드를 클릭하기만 하면 됩니다.

스케치 자체는 먼저 OLED와 MAX30102를 초기화하고 발생할 수 있는 오류를 보고합니다. 그런 다음 센서를 보정하기 위해 100개의 값을 읽고 표시하기 시작합니다. 그런 다음 장치는 25개의 새 값을 읽고 이 값으로 이동 평균을 계산하는 루프에 들어갑니다. 마지막으로 값이 유효한지 확인하고 유효하면 화면에 출력합니다.

5. 사용

맥박 산소 측정기를 사용하려면 손가락 끝을 센서 위에 놓고 상단 덮개를 부드럽게 닫습니다. 그런 다음 전원을 연결하고 데이터가 표시될 때까지 기다리면 됩니다.

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

코드

<울>
  • 맥박 산소 농도계 코드
  • 맥박 산소 농도계 코드C/C++
    /* 하드웨어 연결(Arduino에 대한 Breakoutboard):-5V =5V(3.3V 허용) -GND =GND -SDA =A4(또는 SDA) -SCL =A5(또는 SCL) -INT =연결되지 않음 MAX30105 브레이크아웃은 5V 또는 3.3V I2C 로직을 처리할 수 있습니다. 5V로 보드에 전원을 공급하는 것이 좋지만 3.3V에서도 실행됩니다.*/#include #include "MAX30105.h#include "spo2_algorithm.h#include "SSD1306Ascii.h#include "SSD1306AsciiWire .h"MAX30105 입자 센서;SSD1306AsciiWire oled;#define MAX_BRIGHTNESS 255#정의된 경우(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)//Arduino Uno에는 50개의 IR led 데이터 및 빨간색 led 데이터 샘플을 32비트 형식으로 저장하기에 충분한 SRAM이 없습니다.//이 문제를 해결하기 위해 샘플링된 데이터의 16비트 MSB가 잘립니다. 샘플은 16비트 data.uint16_t irBuffer[50]이 됩니다. //적외선 LED 센서 datauint16_t redBuffer[50]; //적색 LED 센서 데이터#elseuint32_t irBuffer[50]; //적외선 LED 센서 datauint32_t redBuffer[50]; //적색 LED 센서 데이터#endifint32_t spo2; //SPO2 값int8_t validSPO2; // SPO2 계산이 validint32_t heartRate인지 표시하는 표시기; //심박수 값int8_t validHeartRate; //심박수 계산이 유효한지 표시하는 표시기void setup(){ Serial.begin(115200); // 초당 115200비트로 직렬 통신 초기화:oled.begin(&Adafruit128x64, 0x3C); oled.setFont(Arial14); // 센서 초기화 if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //기본 I2C 포트 사용, 400kHz 속도 { Serial.println(F("MAX30105가 없습니다. 배선/전원을 확인하세요.")); 동안 (1); } 입자센서.설정(55, 4, 2, 200, 411, 4096); //이 설정으로 센서 구성}void loop(){ //처음 50개 샘플을 읽고 (byte i =0; i <50; i++) { while (particleSensor.available() ==false에 대한 신호 범위를 결정합니다. ) // 새로운 데이터가 있습니까? 입자센서.check(); //센서에 새로운 데이터가 있는지 확인 redBuffer[i] =particleSensor.getRed(); irBuffer[i] =입자센서.getIR(); 입자센서.nextSample(); //이 샘플은 끝났으므로 다음 샘플로 이동합니다. Serial.print(F("red=")); Serial.print(redBuffer[i], DEC); Serial.print(F(", ir=")); Serial.println(irBuffer[i], DEC); } //처음 50개 샘플(샘플의 처음 4초) 후 심박수 및 SpO2 계산 maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate); //MAX30102에서 지속적으로 샘플을 가져옵니다. 심박수와 SpO2는 1초마다 계산되는 반면 (1) { //메모리의 처음 25개 샘플 세트를 덤프하고 (byte i =25; i <50; i++) 동안 샘플의 마지막 25개 세트를 맨 위로 이동합니다. { redBuffer[i - 25] =redBuffer[i]; irBuffer[i - 25] =irBuffer[i]; } //심박수를 계산하기 전에 25세트의 샘플을 취합니다. for (byte i =25; i <50; i++) { while (particleSensor.available() ==false) // 새로운 데이터가 있습니까? 입자센서.check(); //센서에 새로운 데이터가 있는지 확인 redBuffer[i] =particleSensor.getRed(); irBuffer[i] =입자센서.getIR(); 입자센서.nextSample(); //이 샘플은 끝났으므로 다음 샘플로 이동합니다. 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); } //25개의 새로운 샘플을 수집한 후 HR 및 SP02를 다시 계산합니다. maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate); 인쇄 화면(); }} 무효 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("유효하지 않음")); }}

    맞춤형 부품 및 인클로저

    회로도


    제조공정

    1. FirePick Delta, 오픈 소스 MicroFactory를 위한 프로젝트 로그
    2. Arduino 디지털 주사위
    3. 아이언맨
    4. 나를 찾기
    5. Arduino 3D 인쇄 로봇 팔
    6. CORONAVIRUS DISEASE 동안 비상용 펄스 산소 농도계 사용
    7. Arduino 가습기 제어
    8. NeoMatrix Arduino Pong
    9. Health Band - 노인을 위한 스마트 도우미
    10. 엣지에서 오픈 소스의 필요성(eBook)