- Датчик MAX30100
- Необходимые компоненты
- Подключение оксиметра MAX30100 к ESP32
- Adafruit IO с ESP32 для мониторинга сердечного ритма
- Код Пояснение
- Демонстрация пульсоксиметра на основе Интернета вещей
Пульсоксиметрия - широко используемый медицинский измерительный прибор, это неинвазивный и безболезненный тест, который измеряет уровень насыщения крови кислородом, что позволяет легко обнаружить небольшие изменения кислорода. В текущей ситуации с Covid-19 стало важно отслеживать уровень кислорода у нескольких пациентов одновременно удаленно, не контактируя с пациентом.
Итак, в этом проекте мы создаем пульсоксиметр с использованием пульсоксиметра MAX30100 и ESP32, который будет отслеживать уровень кислорода в крови и отправлять данные через Интернет, подключившись к сети Wi-Fi. Таким образом, мы можем удаленно контролировать нескольких пациентов, сохраняя социальную дистанцию с ними. Полученные данные будут представлены в виде графика, что облегчит отслеживание и анализ состояния пациента. Раньше мы также создавали другие пульсометры с датчиками пульса. А если вас интересуют другие проекты, связанные с Covid-19, вы можете проверить термометр человеческого тела, интеллектуальный ИК-термометр для мониторинга температуры и настенный сканер температуры, которые мы создали ранее.
Помимо приложения Covid-19, этот проект также может широко использоваться при хронической обструктивной болезни легких (ХОБЛ), астме, пневмонии, раке легких, анемии, сердечном приступе или сердечной недостаточности или при врожденных пороках сердца.
Обратите внимание, что датчик, используемый в этом проекте, не имеет медицинской оценки, и проект не тестируется на отказоустойчивые приложения. Всегда используйте медицинский пульсоксиметр для определения пульса и уровня кислорода у пациента и обсудите это с практикующим врачом. Обсуждаемый здесь проект предназначен только для образовательных целей.
Датчик MAX30100
Датчик MAX30100 - это интегрированный модуль пульсоксиметрии и пульсометра. Он связывается с линией данных I2C и передает информацию SpO2 и Pulse на главный блок микроконтроллера. Он использует фотодетекторы, оптические элементы, в которых красный, зеленый ИК-светодиод модулирует импульсы светодиода. Ток светодиода настраивается от 0 до 50 мА. На изображении ниже показан датчик MAX30100.
Вышеупомянутый сенсорный модуль работает в диапазоне от 1,8 до 5,5 В. Подтягивающие резисторы для выводов I2C включены в модуль.
Необходимые компоненты
- Wi-Fi соединение
- ESP32
- Датчик MAX30100
- Идентификатор пользователя Adafruit IO и настраиваемая панель управления (сделает это дальше)
- Соответствующий блок питания 5 В с номинальным током не менее 1 А
- Кабель USB Micro USB - USBA
- ПК с Arduino IDE и средой программирования ESP32.
Подключение оксиметра MAX30100 к ESP32
Полная принципиальная схема MAX30100 с ESP32 приведена ниже.
Это очень простая схема. Выводы 21 и 22 комплекта ESP32 devkit C соединены с датчиком пульсоксиметра MAX30100 с выводами SDA и SCL. Оксиметр также питается от вывода 5V на плате разработки ESP32. Я подключился с помощью макета и соединительных проводов, и моя тестовая установка выглядит так:
Adafruit IO с ESP32 для мониторинга сердечного ритма
Ранее мы создали множество проектов ввода-вывода Adafruit для различных приложений Интернета вещей. Adafruit IO - отличная платформа, где можно создать настраиваемую панель управления. Чтобы создать настраиваемую приборную панель для датчика пульсоксиметра на основе Интернета вещей, выполните следующие действия:
Шаг 1: Сначала зарегистрируйтесь в Adafruit IO, указав имя, фамилию, адрес электронной почты, имя пользователя и пароль.
Шаг 2. Пустое окно панели инструментов откроется после завершения процесса входа. В этом сегменте нам нужно будет создать информационную панель, чтобы отображать данные различными способами. Таким образом, пришло время создать новую панель мониторинга и указать имя панели мониторинга и описание.
Шаг 3: После заполнения вышеуказанной формы пора создать график и контрольную секцию для датчика.
Выберите блок переключателей. Это потребуется для включения или выключения датчика пульсоксиметра.
Шаг 4: Запишите название блока. Как видно на изображении выше, функция переключения обеспечивает два состояния: ВКЛ и ВЫКЛ. В том же процессе выберите блок графика.
Этот раздел графика необходимо выбрать дважды, так как будут отображаться два графика: Heart bit и SpO2. Оба раздела созданы. Как видим, мы выбрали все функции ввода и вывода.
Шаг 5: Следующий и последний шаг - получить ключ adafruit. Как мы видим, мы получили ключ adafruit, который нужно добавить в код.
Теперь Adafruit IO настроен. Пора подготовить оборудование и создать прошивку для этого проекта.
Код Пояснение
В этом коде используется множество библиотек, и все они важны. Это библиотека датчиков пульсоксиметра MAX30100 , Wire.h для I2C, WiFi.h для поддержки, связанной с WiFi, в ESP32, Adafruit MQTT и клиентская библиотека MQTT . Полную программу можно найти внизу этой страницы.
Упомянутые выше библиотеки включены в начало кода.
#включают
Следующие два определения - это SSID WLAN и пароль WLAN. Он должен быть точным, и он будет использоваться ESP32 для подключения к сети Wi-Fi.
#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 с серверным портом 1883. Имя пользователя и пароль будут сгенерированы именем пользователя и паролем с панели управления adafruit IO. Он будет отличаться для всех и должен быть сгенерирован, как описано в разделе настройки 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 работает с моделью pub-sub (публикация и подписка). В этой модели работы устройство, которое отправляет данные на сервер Adafruit, остается в режиме публикации, где сервер ввода-вывода Adafruit подписывается на те же точки данных. Таким образом, всякий раз, когда устройство публикует какие-либо новые данные, сервер, поскольку он подписан на них, получает данные и выполняет необходимые действия.
То же самое происходит, когда сервер публикует данные, а устройство подписывается на них. В нашем приложении устройство отправляет данные SPO2 и BPM на сервер, поэтому оно публикует их и получает от сервера состояние ВКЛ-ВЫКЛ, тем самым подписываясь на это. Это настраивается во фрагменте кода, описанном ниже:
Клиент WiFiClient; Adafruit_MQTT_Client mqtt (& клиент, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY); Adafruit_MQTT_Subscribe sw_sub = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / switch"); // Обратите внимание, что пути MQTT для AIO имеют следующую форму:
В функции настройки мы запускаем I2C, подключаем Wi-Fi с предопределенными SSID и паролем и запускаем процесс подписки MQTT для состояния переключения (кнопка переключения, созданная на панели управления Adafruit IO).
void setup () {Serial.begin (115200); Wire.begin (I2C_SDA, I2C_SCL); WiFi.begin (WLAN_SSID, WLAN_PASS); в то время как (WiFi.status ()! = WL_CONNECTED) {задержка (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 ("УСПЕХ"); } // Ток по умолчанию для ИК-светодиода составляет 50 мА, и его можно // изменить, раскомментировав следующую строку. Проверьте MAX30100_Registers.h на предмет всех // доступных опций. оспа.setIRLedCurrent (MAX30100_LED_CURR_7_6MA); // Регистрируем обратный вызов для обнаружения биений pox.setOnBeatDetectedCallback (onBeatDetected); stopReadPOX (); }
После всего этого max30100 запускается с настройкой тока светодиода. Различные текущие настройки также доступны в файлах заголовков MAX30100 для различных конфигураций. Также запускается функция обратного вызова при обнаружении пульса. После всех этих настроек датчик оксиметра останавливается.
В функции цикла запускается соединение MQTT, а модель подписки проверяется каждые 5000 миллисекунд. В этой ситуации, если переключатель включен, он начинает считывать данные датчика оксиметра и публиковать данные сердцебиения и значения SPO2. Если переключатель выключен, он приостанавливает выполнение всех задач, связанных с датчиком пульсоксиметра.
недействительный цикл () {MQTT_connect (); Adafruit_MQTT_Subscribe * подписка; while ((подписка = mqtt.readSubscription (5000))) {если (подписка == & sw_sub) {Serial.print (F ("Получил:")); Serial.println ((char *) sw_sub.lastread); if (! strcmp ((char *) sw_sub.lastread, "ON")) {Serial.print (("Запуск POX…")); startReadPOX (); BaseType_t xReturned; if (poxReadTaskHld == NULL) {xReturned = xTaskCreate (poxReadTask, / * Функция, реализующая задачу. * / "pox_read", / * Текстовое имя задачи. * / 1024 * 3, / * Размер стека прописью, а не байтов. * / NULL, / * Параметр, переданный в задачу. * / 2, / * Приоритет, при котором задача создается. * / & poxReadTaskHld); / * Используется для передачи дескриптора созданной задачи. * /} задержка (100); если (mqttPubTaskHld == NULL) {xReturned = xTaskCreate (mqttPubTask,/ * Функция, реализующая задачу. * / "mqttPub", / * Текстовое название задачи. * / 1024 * 3, / * Размер стека прописью, а не байтами. * / NULL, / * Параметр передан в задачу. * / 2, / * Приоритет, при котором создается задача. * / & mqttPubTaskHld); / * Используется для передачи дескриптора созданной задачи. * /}} else {Serial.print (("Остановка POX…")); // Обнаружить задачу чтения POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Удаляем задачу публикации MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Используется для передачи дескриптора созданной задачи. * /}} else {Serial.print (("Остановка POX…")); // Обнаружить задачу чтения POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Удаляем задачу публикации MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}/ * Используется для передачи дескриптора созданной задачи. * /}} else {Serial.print (("Остановка POX…")); // Определить задачу чтения POX if (poxReadTaskHld! = NULL) vTaskDelete (poxReadTaskHld); poxReadTaskHld = NULL; } // Удаляем задачу публикации MQTT if (mqttPubTaskHld! = NULL) {vTaskDelete (mqttPubTaskHld); mqttPubTaskHld = NULL; } stopReadPOX (); }}}}
Демонстрация пульсоксиметра на основе Интернета вещей
Схема правильно подключена к макетной плате, и приведенная ниже программа загружена в ESP32. Убедитесь, что вы соответствующим образом изменили учетные данные Wi-Fi и Adafruit в своем коде, чтобы он работал на вас.
После подключения к WiFi и IO-серверу Adafruit он заработал как положено.
Как мы видим, уровень SPO2 показывает 96%, а сердцебиение показывает 78-81 бит в минуту. Он также показывает время сбора данных.
Как мы видим на изображении выше, переключатель выключен, и данные равны 0. Полное рабочее видео проекта также можно найти внизу этой страницы.
Надеюсь, вам понравилась статья и вы узнали что-то полезное. Если у вас есть какие-либо вопросы, оставьте их в разделе комментариев ниже или разместите на нашем форуме.