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

수제 산소 농도계 센서

구성품 및 소모품

적외선 방출기, 18°
805nm에서 1000nm 사이의 파장
× 1
포토다이오드 LPT80A
필요한 포토다이오드는 넓은 범위의 다이오드이며 두 개의 빨간색 신호(600nm)를 모두 수신할 수 있어야 합니다. 및 적외선 신호(940nm).
× 1
5mm LED:빨간색
600nm 부근의 파장
× 1
저항 10k 옴
× 1
저항 330옴
× 2
DFRobot I2C 16x2 Arduino LCD 디스플레이 모듈
또는 값을 표시하는 다른 LCD 디스플레이
× 1
Arduino UNO
× 1
점퍼 와이어(일반)
× 1
고휘도 LED, 흰색
선택적 세 번째 led, 프로젝트의 개선 섹션 참조
× 1

필요한 도구 및 기계

납땜 인두 팁, 갈매기 날개

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

이 격리 기간 동안 나는 이미 집에 있는 부품으로 산소 농도계를 만들었습니다. 산소 측정기는 결국 두 개의 LED와 포토다이오드로 만들어집니다.

나는 의학적 지식의 전문가가 아니며 프로젝트의 현 단계에서 이 연구가 진단적 가치가 있는지 확신할 수 없지만 작동 방식을 연구하기 위한 좋은 교육 프로젝트이며 아마도 몇 가지 팁이 있을 것입니다. 집에서 만든 의료 도구가 될 수 있습니다.

산소 포화도 및 COVID-19

우리 인생의 이 놀라운 시기에 우리는 바이러스, 폐, 수술용 마스크, 비누 및 손 씻기에 대해 많은 것을 배웠습니다. 기침, 발열 및 호흡 곤란과 같은 증상에 대해 읽는 사람은 누구나 있습니다. 우리는 또한 호흡 곤란을 측정하는 한 가지 방법이 혈액 내 산소량을 읽는다는 것을 알고 있습니다.

이 측정값은 산소 측정기라는 의료 기기로 간접적으로 읽을 수 있습니다. . 당신은 아마 이미 그것을 보았을 것입니다. 그것은 작업을 수행하는 일부 맥동 조명과 함께 손가락에 배치되는 비침습적 장치입니다. 다음과 같이:

일반적으로 정상 상태일 때 산소 포화도(SpO2) 비율은 95%에 가깝거나 그 이상입니다. 포화도가 90% 이하로 내려가서 기침과 발열이 있으면 문제입니다.

어떤 제조업체가 산소 농도계를 만들 수 있다면 감염이 더 쉬울 것이라는 사실을 발견하고 사람들이 공황 발작이 아니라 문제가 실제로 존재할 때 병원에 가기로 결정하는 데 도움이 될 수 있습니다.

먼저 심장 박동 센서의 작동 방식 이해

나는 우리 중 많은 사람들이 집에 있는 키트 센서에서 발견한 KY-039 심장 박동 센서로 이 프로젝트를 시작했습니다. 아래 회로에서 볼 수 있듯이 포토다이오드를 비추는 것은 적외선 LED일 뿐입니다. LED를 보호하고 센서의 작은 신호를 읽는 두 개의 저항도 있습니다.

따라서 KY-039 센서가 없는 경우 몇 가지 구성 요소로 자체 센서를 구축할 수 있습니다.

이 사진과 같이 센서와 포토다이오드 사이에 손가락이 놓입니다(원래 이 사이트에서 가져오고 수정함):

적외선 led에서 방출되는 빛은 손톱, 피부 및 손가락의 다른 모든 부분에 부분적으로 흡수되지만 정맥에 흐르는 혈액의 변화에 ​​따라 변하기 때문에 일정하지 않습니다. 심장이 뛰면 혈액이 정맥으로 밀려들어가 빛의 흡수가 바뀝니다. 도달하는 적외선에 의해 광다이오드에 의해 생성된 전류를 측정할 수 있습니다.

KY-039 센서에는 S가 있습니다. (시그널) 핀은 그 변화하는 값을 읽는다.

신호의 피크를 계산하여 심장 박동수를 측정할 수 있습니다.

센서의 가변 신호에서 값을 읽는 것은 그리 쉬운 일이 아닙니다. 왜냐하면 노이즈가 많고 신호가 정말 낮기 때문입니다. 그리고 플로팅할 좋은 값을 찾기 위해 약간의 수학을 해야 합니다.

신호의 평균을 계산하는 방법과 가정용 램프에서 발생하는 소음을 제거하는 방법을 설명하는 Johan Ha의 이 유용한 게시물에 감사드립니다.

트릭은 값을 푸시하고 값을 삭제하여 센서에서 읽은 마지막 X 값의 평균을 만드는 배열을 만드는 것입니다. 그는 또한 N개의 증가하는 값을 계산하여 신호의 상승을 찾는 방법을 설명했습니다. 값이 이전 값보다 N배 크면 피크입니다.

Arduino 직렬 플롯 도구 또는 다른 직렬 도구를 사용하여 COM 포트(예:SerialPlot)에 인쇄된 값을 분석하고 다른 값을 시도하면 올바른 숫자 N(rise_threshold)을 정의할 수 있습니다. 상수 n 코드). 숫자를 너무 크거나 너무 작게 정의하면 비트를 놓치거나 이중 노치를 셀 수 있습니다. 비트로.

피크를 미세하게 조정하는 방법을 이해했다면 피크를 세거나 일련의 작은 비트 사이의 시간을 계산하여 BPM을 결정하십시오. 속도(분당 비트 수 ).

산소 포화도를 찾기 위해 산소 농도계 구축(KY-039 센서 해킹)

우리의 혈액은 빛의 파장의 변화에 ​​따라 다른 방식으로 빛을 흡수합니다. 빨간불(~600nm )는 더 많은 산소를 함유한 혈액에 더 잘 흡수되므로 적외선 led(~950nm)로 측정한 값을 비교할 수 있습니다. ) 빨간색으로 만든 것으로 우리 혈액의 산소 비율을 찾으십시오. 이 값을 Sp02%라고 합니다. (말초 모세관 산소 포화도 ).

KY-039 센서가 있으므로 수정하기로 결정했습니다. 적외선 LED만 있으므로 RED를 추가했습니다. led, IR 연결 해제 Vcc 330ohm으로 연결 두 개의 저항은 Arduino의 두 개의 다른 핀으로 연결됩니다.

(수정할 KY-039 센서가 없는 경우 구축할 수 있습니다. LED 2개, 포토다이오드 및 저항 3개뿐이며 회로도는 정말 간단합니다!)

수정된 센서의 개략도는 다음과 같습니다.

이런 식으로 IR을 켤 수 있습니다. 주도하고 KY-039 S 에서 값을 읽습니다. 핀을 누르면 IR을 끌 수 있습니다. LED를 켜고 RED를 켭니다. led 및 KY-039 S 에서 값을 읽습니다. 핀.

여기 내 것입니다:

두 신호를 플로팅하면 IR 값이 항상 빨간색 값보다 낮다는 것을 알 수 있습니다.

좋은 신호를 찾으려면 포토다이오드에 손가락 끝을 올바르게 놓고 LED가 못에 닿아야 합니다. 플롯에서 읽기 좋은 편안한 위치를 찾았을 때 변경하지 마십시오.

신호가 낮고 잡음이 매우 문제가 되기 때문에 유용한 조치를 취하려면 항상 좋은 주변 조명이 필요하다는 것을 알았습니다. 따라서 측정하는 동안 손가락을 움직이지 말고 빛을 바꾸지 마십시오. 센서의 그림자만 모든 것을 바꿀 수 있습니다.

포화 SpO2% 측정 방법

산소 포화도(SpO2)는 총 헤모글로빈에 대한 산소 포화 헤모글로빈의 비율이며 R이라는 매개변수의 함수입니다. (나는 밀라노의 Politecnico의 학술 논문에서 이 정보를 찾았습니다), 두 신호의 최소값과 최대값을 사용하여 계산됩니다.

R =( (REDmax-REDmin) / REDmin ) / ((IRmax-IRmin) / IRmin)

각 악기에는 고유한 R 이 있습니다. 그리고 R과 SpO2%를 연결하는 곡선(함수)을 찾기 위해 보정이 필요합니다.

피크 수를 계산했지만 이제 최대 개를 찾아야 합니다. 및 두 곡선의 값(RED 주도 및 IR 주도).

이 작업을 수행하기 위해 우리는 하트비트의 "주기"(즉, 비트가 몇 밀리초가 지속되는지)를 평가하고 이를 샘플링 속도로 나누어 주기를 만드는 샘플 수를 결정합니다. 샘플링 속도는 20밀리초 동안 IR led를 읽은 다음 또 다른 20밀리초 동안 RED led를 읽기 때문에 40밀리초입니다.

비트의 주기는 신호의 두 상승 곡선 사이를 통과하는 시간입니다.

마지막 L REDmax를 찾기 위해 배열에 저장한 샘플(여기서 L =마침표 / 40) , REDmin , IRmax IRmin 가치.

최대값과 최소값으로 R을 계산할 수 있습니다. .

R, L 및 마침표는 모든 비트에 대해 계산되므로 R의 미적분도 모든 비트에 대해 수행됩니다.

R에서 SpO2%로:산소 농도계를 보정하는 방법은 무엇입니까?

R을 연결하는 기능 SpO2 사용 직선으로 단순화할 수 있습니다.

SpO2 =K * R + M

따라서 K와 M을 결정하기 위해 두 개의 포인트(SpO2와 R 값의 두 쌍)가 필요합니다. 이 두 포인트를 찾는 유일한 방법은 다른 산소 농도계를 사용하고 디스플레이에서 값을 읽는 것입니다.

새로운 옥시미터가 기준이 될 것이며, 집에서 만든 옥시미터에서 R 값을 측정하는 동안 SpO2 값을 읽습니다.

정상적으로 첫 호흡을 하고 SpO2와 R의 값을 읽고 기록합니다.

그런 다음 호흡을 유지하려고 시도하고 10-20초 후에 새 산소 농도계의 SpO2가 감소하는 것을 읽을 것이며, 산소 농도계의 R 매개변수도 증가하는 것을 볼 것입니다. 기절하기 전에 도달한 SpO2 값과 R 매개변수 값을 기록하십시오.

2차 방정식을 풀고 산소 농도계에 대한 K와 M을 찾았습니다.

이제 bpm을 모두 계산할 수 있습니다. 및 SpO2 R의 모든 측정값에 대한 값 .

또한 모든 숫자를 표시하는 디스플레이를 추가했습니다. 너무 많이 변경되지 않는 기간의 측정값을 5개 이상 찾은 경우에만 값을 표시합니다(±10% 기간 길이). 이런 식으로 열악한 구성 요소나 주변 조명 또는 손가락 움직임의 변화에 ​​따라 너무 많이 변경되는 값을 제거합니다.

값은 표시된 값이 c 로 계산되었음을 나타냅니다. 안정적인 조치입니다.

프로젝트 개선:주변광 변동성 제거

며칠간 내 프로젝트를 가지고 놀다가 개선할 방법을 찾았습니다.

나는 이러한 저비용 구성 요소(우리는 LED와 포토 다이오드만 사용하고 있습니다!)를 사용하여 측정이 주변광에 너무 많이 의존하며 실제 데이터를 제대로 읽으려는 경우 좋은 일이 아님을 알았습니다. 근무 환경. 흐린 날이나 저녁에 전기 램프를 사용할 때보다 맑은 날에 결과가 더 좋다는 것을 알았기 때문에 항상 켜져 있고 손가락에 빛만 제공하는 세 번째 LED를 추가하기로 결정했습니다. .

이 3개의 LED 센서를 사용하면 항상 변할 수 있는 주변광을 차단하기 위해 검은 천 아래에서도 조치를 취합니다.

이제 결과가 더 좋아지고 더 이상 주변 조명에 의존하지 않습니다.

또한 몇 초 후에 동영상에서 알 수 있듯이 bpm을 올바르게 찾습니다. SpO2% :


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

코드

<울>
  • 산소 측정기-diy-ver-0.92.ino
  • oximeter-diy-ver-0.92.inoArduino
    메이커가 집에 있을 수 있는 몇 가지 구성 요소로 만든 Oximeter DIY의 소스 코드입니다.
    /* * an oximeter diy. v.0.92(사소한 수정) * ky-039 심장 박동 센서를 해킹하거나 적외선 led * 빨간색 led 및 포토다이오드를 사용하여. * https://hackaday.io/project/170752-oximeter-do-it-yourself */#include  #include #define maxperiod_siz 80 // 기간의 최대 샘플 수# 측정값 정의 10 // 저장된 기간 수#define samp_siz 4 // 평균에 대한 샘플 수#define rise_threshold 3 // 피크를 결정하기 위한 상승 측정값 수 // 액정이 표시하는 BPM LiquidCrystal_I2C lcd(0x3F, 16, 2);int T =20; // sensorint sensorPin =A1에서 값을 읽는 슬롯 밀리초; B0 빨간색 =3; int IRLed =4;byte sym[3][8] ={ { B00000, B01010, B11111, B11111, B01110, B00100, B00000, B00000, B01, B00000, B00 , B10000, B11100},{ B00000, B00100, B01010, B00010, B00100, B00100, B00000, B00100}}; 무효 설정() { Serial.begin(9600); Serial.flush(); 핀모드(센서핀, 입력); 핀모드(빨간색, 출력); 핀모드(IRLed, 출력); // LCD 초기화 lcd.init(); lcd.backlight(); // LED를 끕니다. digitalWrite(REDLed,LOW); 디지털 쓰기(IRLed, LOW); for(int i=0;i<8;i++) lcd.createChar(i, sym[i]);} 무효 루프(){ bool finger_status =true; float readsIR[samp_siz], sumIR,lastIR, 리더, 시작; float readsRED[samp_siz], sumRED, lastRED; 정수 기간, 샘플; 기간=0; 샘플=0; 정수 샘플 카운터 =0; float readsIRMM[maxperiod_siz], readsREDMM[maxperiod_siz]; 정수 ptrMM =0; for (int i =0; i =samples){ samplesCounter =0; IRmax =0; IRmin=1023; 레드맥스 =0; 레드민=1023; for(int i=0;i IRmax) IRmax =readsIRMM[i]; if( readsIRMM[i]>0 &&readsIRMM[i] REDmax) REDmax =readsREDMM[i]; if( readsREDMM[i]>0 &&readsREDMM[i] 4) { // // SATURTION IS A FUNCTION OF R (calibration) // Y =k*x + m // k와 m은 다음과 같이 계산됩니다. 다른 산소 농도계 int SpO2 =-19 * R + 112; lcd.setCursor(4,0); if(avBPM> 40 &&avBPM <220) lcd.print(문자열(avBPM)+" "); // 그렇지 않으면 lcd.print("---"); lcd.setCursor(4,1); if(SpO2> 70 &&SpO2 <150) lcd.print( " " + 문자열(SpO2) +"% "); // 그렇지 않으면 lcd.print("--% "); } else { if(c <3) { // 2개 미만이면 추가 ? lcd.setCursor(3,0); LCD.쓰기(2); //bpm ? lcd.setCursor(4,1); LCD.쓰기(2); //SpO2 ? } } } } else { // 좋습니다. 곡선은 떨어지고 있습니다. rises =false; 상승 횟수 =0; lcd.setCursor(3,0);lcd.print(" "); } // 새 값과 비교하고 피크를 찾기 beforeIR =lastIR; } // 손가락이 안에 있음 // 모든 것을 플로팅합니다. Serial.print(lastIR); Serial.print(","); Serial.print(lastRED); /* * Serial.print(","); Serial.print(R); Serial.print(","); Serial.print(IRmax); Serial.print(","); Serial.print(IRmin); Serial.print(","); Serial.print(REDmax); Serial.print(","); Serial.print(REDmin); Serial.print(","); Serial.print(avR); Serial.print(","); Serial.print(avBPM); */ 직렬.println(); // 배열 처리 ptr++; 포인트 %=samp_siz; } // 루프 동안 1}

    회로도

    내 프로젝트에서 KY-039를 수정했지만 해당 센서는 fritzing 라이브러리에서 사용할 수 없으므로 몇 가지 구성 요소로 구성했지만 fritzing 라이브러리에서 적절한 포토다이오드를 찾지 못했습니다. oximeter-diy_oW9ZI5zQtJ.fzzKY-039 센서를 해킹하거나 처음부터 센서를 구축하여 혈액의 산소를 읽는 간단한 옥시미터를 만들 수 있습니다.

    제조공정

    1. 적외선 센서 기반 절전 회로 및 작동
    2. LiDAR 시스템의 파장 선택 이해
    3. 라즈베리 파이용 DIY 적외선 모션 센서 시스템
    4. Raspberry Pi를 사용한 모션 센서
    5. 라즈베리 파이 토양 수분 센서
    6. DS18B20 센서 테스트
    7. 라즈베리 파이 온도 센서
    8. 센서 텔레메트리 2.0.1
    9. 감정 센서 / EEG
    10. 적외선 센서 온도 측정