- MAX30100 센서
- 필수 구성 요소
- MAX30100 Oximeter와 ESP32 인터페이스
- 심박수 모니터링을위한 ESP32가 포함 된 Adafruit IO
- 코드 설명
- IoT 기반 맥박 산소 측정기 데모
맥박 산소 측정기는 널리 사용되는 의료용 측정기이며 우리 혈액의 산소 포화도 를 측정 하는 비 침습적이고 통증이없는 검사로 작은 산소 변화를 쉽게 감지 할 수 있습니다. 현재의 Covid-19 상황에서는 환자와 접촉하지 않고 원격으로 동시에 여러 환자의 산소 수준을 추적하는 것이 중요해졌습니다.
따라서이 프로젝트에서는 혈액 산소 수준을 추적하고 Wi-Fi 네트워크에 연결하여 인터넷 을 통해 데이터를 전송하는 MAX30100 맥박 산소 측정기 및 ESP32를 사용하여 맥박 산소 측정기를 구축 합니다. 이렇게 하면 환자와 사회적 거리를 유지하여 여러 환자를 원격으로 모니터링 할 수 있습니다. 획득 한 데이터는 환자의 상태를 쉽게 추적하고 분석 할 수 있도록 그래프로 표시됩니다. 이전에는 맥박 센서를 사용하여 다른 심박수 모니터도 구축했습니다. 다른 Covid-19 관련 프로젝트에 관심이 있으시면 인체 온도계, 발열 모니터링을위한 Smart IR Thermometer, 이전에 구축 한 벽걸이 형 온도 스캐너 를 확인해보십시오.
Covid-19 적용 외에도이 프로젝트는 만성 폐쇄성 폐 질환 (COPD), 천식, 폐렴, 폐암, 빈혈, 심장 마비 또는 심부전 또는 선천성 심장 결함에도 널리 사용될 수 있습니다.
이 프로젝트에 사용 된 센서는 의학적으로 등급이 지정되지 않았으며 프로젝트는 고장 방지 애플리케이션에 대해 테스트되지 않았습니다. 항상 의학적으로 평가 된 맥박 산소 측정기를 사용하여 환자의 맥박과 산소 수준을 결정하고 의사와상의하십시오. 여기에서 설명하는 프로젝트는 교육 목적으로 만 사용됩니다.
MAX30100 센서
MAX30100 센서는 맥박 산소 측정 및 심박수 모니터 모듈 이 통합되어 있습니다. I2C 데이터 라인과 통신하고 SpO2 및 Pulse 정보 를 호스트 마이크로 컨트롤러 장치에 제공합니다. 적색, 녹색 IR LED가 LED 펄스를 변조하는 광학 요소 인 광 검출기를 사용합니다. LED 전류는 0 ~ 50mA로 구성 할 수 있습니다. 아래 이미지는 MAX30100 센서를 보여줍니다.
위의 센서 모듈은 1.8V ~ 5.5V 범위에서 작동합니다. I2C 핀용 풀업 저항은 모듈에 포함되어 있습니다.
필수 구성 요소
- WiFi 연결
- ESP32
- MAX30100 센서
- Adafruit IO 사용자 ID 및 사용자 정의 생성 대시 보드 (추가로 만들 예정)
- 정격 전류가 1A 이상인 5V 적절한 전원 공급 장치
- USB 케이블 Micro USB to USBA
- ESP32 프로그래밍 환경이있는 Arduino IDE가있는 PC.
MAX30100 Oximeter와 ESP32 인터페이스
ESP32 가 있는 MAX30100 의 전체 회로 다이어그램 은 다음과 같습니다.
이것은 매우 간단한 회로도입니다. ESP32 devkit C의 핀 21 및 22는 SDA 및 SCL 핀이있는 맥박 산소 측정기 센서 MAX30100에 연결됩니다. Oximeter는 ESP32 개발 보드의 5V 핀에 의해 전원이 공급됩니다. 브레드 보드와 연결 와이어를 사용하여 연결했고 테스트 설정은 다음과 같습니다.
심박수 모니터링을위한 ESP32가 포함 된 Adafruit IO
우리는 이전에 다양한 IoT 애플리케이션을 위해 많은 Adafruit IO 프로젝트를 구축했습니다. Adafruit IO는 맞춤형 대시 보드를 생성 할 수있는 탁월한 플랫폼입니다. IoT 기반 Pulse-Oximeter 센서 용 사용자 지정 대시 보드를 만들려면 아래 단계를 사용하세요.
1 단계: 먼저 Fist 이름, 성, 이메일 주소, 사용자 이름 및 비밀번호를 제공 한 후 adafruit IO에 등록합니다.
2 단계: 로그인 프로세스가 완료되면 빈 대시 보드 창이 열립니다. 이 세그먼트에서는 다양한 방식으로 데이터를 표시하는 대시 보드를 만들어야합니다. 따라서 새 대시 보드를 만들고 대시 보드의 이름과 설명을 제공해야합니다.
3 단계: 위의 양식을 작성한 후 센서에 대한 그래프 및 제어 섹션을 만들 차례입니다.
스위치 블록을 선택합니다. 맥박 산소 측정기 센서를 켜거나 끄는 데 필요합니다.
4 단계: 블록 이름을 적습니다. 위 이미지에서 볼 수 있듯이 토글 기능은 ON과 OFF의 두 가지 상태를 제공합니다. 같은 과정에서 그래프 블록을 선택합니다.
이 그래프 섹션은 하트 비트와 SpO2라는 두 개의 그래프가 표시되므로 두 번 선택해야합니다. 두 섹션이 모두 생성됩니다. 보시다시피 모든 입력 및 출력 기능을 선택했습니다.
5 단계: 다음과 마지막 단계는 adafruit 키를 갖는 것입니다. 보시다시피, 우리는 adafruit 키를 얻었고 이것은 코드에 추가되어야합니다.
이제 Adafruit IO가 구성되었습니다. 이제 하드웨어를 준비하고이 프로젝트를위한 펌웨어를 만들 차례입니다.
코드 설명
이 코드는 많은 라이브러리를 사용하며 모두 중요합니다. 라이브러리는 MAX30100 맥박 산소 측정기 센서 라이브러리입니다 Wire.h 는 I2C를 들어, WiFi.h ESP32에있는 와이파이 관련 지원 그리고 Adafruit MQTT 와 MQTT 클라이언트 라이브러리입니다. 전체 프로그램은이 페이지 하단에서 찾을 수 있습니다.
위에서 언급 한 라이브러리는 코드 시작 부분에 포함되어 있습니다.
#포함
다음 두 정의는 WLAN SSID 및 WLAN 암호입니다. 이것은 정확해야하며 ESP32에서 WiFi 네트워크에 연결하는 데 사용됩니다.
#define WLAN_SSID "xxxxxxxxx"#define WLAN_PASS "2581xxxxx2"
다음으로 Adafruit io 정의를 정의했습니다.
#define AIO_UPDATE_RATE_SEC 5 #define AIO_SERVER "io.adafruit.com"#define AIO_SERVERPORT 1883 #define AIO_USERNAME "xxxxxxxxxxxxx"#define AIO_KEY "abcdefgh"
5 초마다의 데이터를 업데이트합니다 업데이트 속도는 서버가 될 것입니다 io.adafruit.com를 사용자 이름과 암호가 그리고 Adafruit IO 대시 보드에서 생성 된 사용자 이름과 암호 될 것입니다 1883의 서버 포트와 함께. 모두 다르며 adafruit 설정 섹션에 설명 된대로 생성해야합니다.
I2C 포트는 회로도에 표시된대로 나중에 정의됩니다.
#define I2C_SDA 21 #define I2C_SCL 22
다음으로 세 가지 변수를 사용하여 마지막 보고서와 bpm 및 spo2 값을 저장합니다.
uint32_t tsLastReport = 0; float bpm_dt = 0; float spo2_dt = 0;
MQTT는 게시-구독 모델 (게시 및 구독)과 함께 작동합니다. 이 작업 모델에서 Adafruit 서버에 데이터를 제출하는 장치는 Adafruit IO 서버가 동일한 데이터 포인트를 구독하는 게시 모드로 유지됩니다. 이러한 효과로 장치가 새 데이터를 게시 할 때마다 서버는 동일한 데이터를 구독 한 상태로 데이터를 수신하고 필요한 조치를 제공합니다.
서버가 데이터를 게시하고 장치가 데이터를 구독 할 때도 같은 일이 발생합니다. 우리의 응용 프로그램에서 장치는 SPO2 및 BPM의 데이터를 서버로 전송하므로 동일한 내용을 게시하고 서버에서 ON-OFF 상태를 수신하여이 데이터를 구독합니다. 이 것은 아래에 설명 된 코드 스 니펫에서 구성됩니다.
WiFiClient 클라이언트; Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / switch"); // AIO의 MQTT 경로는 다음 형식을 따릅니다.
에서 설정 기능, 우리는 I2C 개시 미리 SSID 및 암호와 무선 접속하고, 스위치 상태합니다 (그리고 Adafruit IO 대시 보드에서 생성 된 스위치 버튼)에 MQTT 등록 프로세스를 시작한다.
void setup () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.print ("."); } Serial.println (); Serial.println ("WiFi 연결됨"); Serial.println ("IP 주소:"); Serial.println (WiFi.localIP ()); mqtt.subscribe (& sw_sub); Serial.print ("맥박 산소 측정기 초기화 중.."); // PulseOximeter 인스턴스를 초기화합니다. // 오류는 일반적으로 부적절한 I2C 배선, 전원 공급 장치 누락 // 또는 잘못된 대상 칩으로 인해 발생합니다. if (! pox.begin ()) {Serial.println ("FAILED"); 에 대한(;;); } else {Serial.println ("성공"); } // IR LED의 기본 전류는 50mA이며 // 다음 줄의 주석 처리를 제거하여 변경할 수 있습니다. 사용 가능한 모든 옵션은 MAX30100_Registers.h를 // 확인하십시오. 수두.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // 비트 감지를위한 콜백 등록 pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
이 모든 작업이 끝나면 max30100은 LED 전류 설정으로 시작됩니다. 구성에 따라 MAX30100 헤더 파일에서 다양한 전류 설정을 사용할 수도 있습니다. 하트 비트 감지 콜백 기능 도 시작됩니다. 이러한 모든 설정이 끝나면 산소 농도계 센서가 중지됩니다.
에서 루프 기능의 MQTT 연결이 시작되고 구독 모델에 체크 마다 5000 밀리 초. 이 상황에서 스위치가 켜져 있으면 산소 농도계 센서를 읽고 Heartbeat 및 SPO2 값 의 데이터를 게시하기 시작 합니다. 스위치가 꺼져 있으면 맥박 산소 측정기 센서와 관련된 모든 작업이 중단됩니다.
무효 루프 () {MQTT_connect (); Adafruit_MQTT_Subscribe * 구독; while ((subscription = mqtt.readSubscription (5000))) {if (subscription == & sw_sub) {Serial.print (F ("Got:")); Serial.println ((char *) sw_sub.lastread); if (! strcmp ((char *) sw_sub.lastread, "ON")) {Serial.print (("Starting POX…")); startReadPOX (); BaseType_t xReturned; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * 작업을 구현하는 함수. * / "pox_read", / * 작업의 텍스트 이름. * / 1024 * 3, / * 스택 크기 (단어) 바이트 * / NULL, / * 태스크에 전달 된 매개 변수 * / 2, / * 태스크가 생성되는 우선 순위 * / & poxReadTaskHld); / * 생성 된 작업의 핸들을 전달하는 데 사용됩니다. * /} delay (100); if (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * 작업을 구현하는 기능. * / "mqttPub", / * 태스크의 텍스트 이름. * / 1024 * 3, / * 바이트가 아닌 단어 단위의 스택 크기. * / NULL, / * 태스크에 전달 된 매개 변수. * / 2, / * 작업이 생성되는 우선 순위. * / & mqttPubTaskHld); / * 생성 된 작업의 핸들을 전달하는 데 사용됩니다. * /}} else {Serial.print (("POX 중지…")); // POX 읽기 작업 삭제 if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // MQTT Pub Task 삭제 if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * 생성 된 작업의 핸들을 전달하는 데 사용됩니다. * /}} else {Serial.print (("POX 중지…")); // POX 읽기 작업 삭제 if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // MQTT Pub Task 삭제 if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * 생성 된 작업의 핸들을 전달하는 데 사용됩니다. * /}} else {Serial.print (("POX 중지…")); // POX 읽기 작업 삭제 if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // MQTT Pub Task 삭제 if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
IoT 기반 맥박 산소 측정기 데모
회로가 브레드 보드에 제대로 연결되고 아래에 제공된 프로그램이 ESP32에 업로드됩니다. 코드에서 Wi-Fi 및 Adafruit 자격 증명을 적절하게 변경하여 작동하도록하십시오.
WiFi 및 Adafruit IO 서버와 연결 한 후 예상대로 작동하기 시작했습니다.
보시다시피 SPO2 수준은 96 %이고 하트 비트는 분당 78 ~ 81 비트입니다. 또한 데이터가 캡처되는 시간을 제공합니다.
위의 이미지에서 볼 수 있듯이 스위치가 꺼지고 데이터가 0입니다. 프로젝트의 전체 작업 비디오는이 페이지 하단에서도 찾을 수 있습니다.
기사를 즐겁게 읽고 유용한 것을 배우 셨기를 바랍니다. 질문이 있으시면 아래 댓글 섹션에 남겨 주시거나 포럼 에 게시 해주세요.