Пульсоксиметр на базе ESP32

Пульсоксиметр на базе ESP32В наши дни вирус COVID19 заставляет людей уделять больше внимания своему здоровью. Одним из наиболее важных параметров, на которые влияет вирус, является уровень кислорода в крови. Пульсоксиметр измеряющий этот показатель можно приобрести, благо он стоит не дорого, а можно сделать самостоятельно.
Инструменты и материалы:
-ESP32 или любой другой MCU, который работает с Arduino IDE, такой как платы ESP8266 или Ардуино;
-Модуль пульсоксиметра MAX30100;-OLED-дисплей SSD1306;-Макетная плата;-Перемычки;
Пульсоксиметр на базе ESP32Пульсоксиметр на базе ESP32Пульсоксиметр на базе ESP32Пульсоксиметр на базе ESP32Шаг первый: подготовка модуля MAX30100
Принцип работы модуля следующий: он посылает красный и инфракрасный свет через кончик пальца пользователя, затем измеряет отраженный свет и выполняет некоторую обработку сигналов. Чем больше кислорода содержится в крови, тем больше инфракрасного излучения она поглощает, а также большее количество кислорода в крови пропустит через нее больше красного света.
Этот модуль отправляет данные на микроконтроллер через соединение I2C.
В продаже есть две версии MAX30100: зеленый и фиолетовый.
Фиолетовый уже готов к использованию, зеленый необходимо доработать.
Вкратце, I2C этого модуля имеет ВЫСОКИЙ уровень 1,8 В, в то время как Arduino рассматривает как минимум 2 В как ВЫСОКИЙ. Следовательно, они не могут правильно обмениваться данными.
На схеме MAX30100 можно увидеть, что SDA и SCL подтянуты до 1,8 В резистором. Поэтому, если отключить резисторы от 1,8 В и подключить их к бортовому стабилизатору 3,3 В, проблема будет решена.
Для этого разрываем дорожку отмеченную красной линией. Далее перемыкаем два контакта отмеченные синим цветом.
Если эти два шага выполнены правильно, то модуль готов к использованию.
Пульсоксиметр на базе ESP32Пульсоксиметр на базе ESP32Пульсоксиметр на базе ESP32Пульсоксиметр на базе ESP32Пульсоксиметр на базе ESP32Шаг второй: схема и сборка
Схема устройства несложная.
ESP32 D22 —-> MAX30100 SCL
ESP32 D21 —-> MAX30100 SDA
ESP32 GND —-> MAX30100 GND
ESP32 3,3 В ——> MAX30100 VIN
OLED VDD ——> ESP32 3,3 В
OLED GND ——> ESP32 GND
OLED SCL ——> ESP32 D22
OLED SDA —-> ESP D21
Собирает устройство мастер на макетной плате. В принципе этого достаточно для его полноценной работы, но при желании можно поместить пульсоксиметра в подходящий корпус.
Пульсоксиметр на базе ESP32Пульсоксиметр на базе ESP32Пульсоксиметр на базе ESP32Пульсоксиметр на базе ESP32Шаг третий: подготовка Arduino IDE и добавление необходимых библиотек
Чтобы запрограммировать ESP32 с помощью Arduino IDE, сначала нужно добавить в приложение платы esp32. Для этого нужно выполнить следующие действия:
1) Откройте Arduino IDE, перейдите в меню Файл> Настройки> Дополнительные URL-адреса диспетчера плат и вставьте эту ссылку: https://dl.espressif.com/dl/package_esp32_index.json
Подтвердите действие «ОК».
2) В IDE перейдите в Инструменты> Доска> Менеджер доски.
Введите ESP32 в поле поиска и выберите установку для ESP32 от Espressif Systems.
3) Теперь ESP32 добавлен в среду IDE, и можно выбрать плату в качестве целевого устройства для загрузки программы.
Для этого:
Перейдите в Инструменты> Плата> ESP32 Arduino> Модуль ESP32 Dev
Если все сделано правильно, в правом нижнем углу будет написан тип платы (ESP32 Dev Module) как на картинке.
Пульсоксиметр на базе ESP32Пульсоксиметр на базе ESP32Пульсоксиметр на базе ESP32Теперь нужно добавить необходимые библиотеки в Arduino IDE.
Чтобы использовать модуль MAX30100, добавляем MAX30100_PulseOximeter.h, а для OLED-дисплея добавляем Adafruit_SSD1306.h и Adafruit_GFX.h
Для этого нужно перейти в Инструменты> Управление библиотеками, найти там эти библиотеки и установить.
Пульсоксиметр на базе ESP32Пульсоксиметр на базе ESP32Пульсоксиметр на базе ESP32С помощью библиотеки Adafruit_SSD1306.h и библиотеки Adafruit_GFX.h вместе можно управлять экраном.
Чтобы создать момент ssd1306, который определен в библиотеке (имя «OLED» может быть любым, но оно будет использоваться в остальной части кода), он должен быть вне раздела настройки или раздела цикла:

Лазерный проектор рождество купить по выгодной цене...
6 часов назад
Быстрая прохлада с Мини USB кондиционер AICOK
9 часов назад

Adafruit_SSD1306 OLED = Adafruit_SSD1306(128, 64, &Wire);

128 и 64 — это ширина и длина дисплея
Чтобы инициализировать экран он должен быть в разделе настройки:

OLED.begin (SSD1306_SWITCHCAPVCC, 0x3C);

0x3c — это I2C-адрес дисплея по умолчанию.
Чтобы поместить курсор в нужное место:

OLED.setCursor(row pixel,column pixel);

Например, чтобы поставить курсор в среднее положение:

OLED.setCursor (32,64);

Чтобы распечатать что-нибудь на экране:

OLED.print ();

Чтобы изменить размер шрифта:

OLED.setTextSize(2);     it can be 1 or 2

Чтобы очистить буфер:

OLED.clearDisplay ();

(Все, что вы хотите напечатать на экране, сначала помещается в буфер)
Чтобы обновить экран:

OLED.display ();

Теперь рассмотрим библиотеку MAX30100.
Создать объект пульсоксиметра для использования в коде с желаемым именем (например, max_sensor):

PulseOximeter max_sensor;

Чтобы дать команду модулю на измерение:

Магнитная щетка для мытья окон: что это...
10 часов назад
Средство способное обновить любую деревянную поверхность
6 часов назад

max_sensor.update ();

Чтобы получить данные пульса:

max_sensor.getHeartRate ();

Чтобы узнать уровень кислорода в крови:

max_sensor.getSpO2 ();

Шаг четвертый: код
В этом шаге мастер разъясняет код и какие в него необходимо внести изменения при необходимости.
Прежде всего, нужно включить библиотеки:

#include                                  //     Arduino I2C library  #include                          //     needed for OLED display  #include                      //     needed for OLED display  #include "MAX30100_PulseOximeter.h"               //     MAX30100 library

Отчетный период max30100 может быть определен в коде. Например, 100 означает, что каждые 100 мс частота пульса и уровень кислорода будут обновляться.

#define REPORTING_PERIOD_MS    100

Создаем переменную для записи времени между чтениями MAX30100:

uint32_t lastReportTime = 0;

Определяем функцию onBeatDetected:

void onBeatDetected()  {     Serial.println("Beat!");  }

Согласно предыдущему шагу настройки следующие:

 OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C);   Serial.begin(115200);   OLED.display();   OLED.clearDisplay();   OLED.setTextSize(2);   OLED.setTextColor(SSD1306_WHITE);   OLED.setCursor(0,0);   OLED.display();   delay(1000);  

Весь код можно скачать ниже.

#include   #include   #include   #include "MAX30100_PulseOximeter.h"  #define REPORTING_PERIOD_MS    100  PulseOximeter max_sensor;  uint32_t lastReportTime = 0;  Adafruit_SSD1306 OLED = Adafruit_SSD1306(128, 32, &Wire);    void onBeatDetected()  {     Serial.println("Beat!");  }        void setup() {   // put your setup code here, to run once:   OLED.begin(SSD1306_SWITCHCAPVCC, 0x3C);   Serial.begin(115200);   OLED.display();   OLED.clearDisplay();   OLED.setTextSize(2);   OLED.setTextColor(SSD1306_WHITE);   OLED.setCursor(0,0);   OLED.display();   delay(1000);         Serial.print("Initializing pulse oximeter..");       // Initialize the PulseOximeter instance     // Failures are generally due to an improper I2C wiring, missing power supply     // or wrong target chip     if (!max_sensor.begin()) {         Serial.println("FAILED");         for(;;);     } else {         Serial.println("SUCCESS");     }         max_sensor.setOnBeatDetectedCallback(onBeatDetected);  }    void loop() {   // put your main code here, to run repeatedly:    max_sensor.update();         if (millis() - lastReportTime > REPORTING_PERIOD_MS) {           OLED.clearDisplay();         OLED.setCursor(0,0);         OLED.print("H:");         OLED.print(max_sensor.getHeartRate());         OLED.println("bpm");         OLED.print("SpO2:");         OLED.print(max_sensor.getSpO2());         OLED.println("%");         lastReportTime = millis();     }     OLED.display();  }

После программирования можно пользоваться прибором.

Магнитная щетка для мытья окон: что это...
6 часов назад
Умные часы Smart Watch V8 + Power Bank и наушники в подарок
9 часов назад

Читайте также