Пульсоксиметр на базе 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» может быть любым, но оно будет использоваться в остальной части кода), он должен быть вне раздела настройки или раздела цикла:
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;
Чтобы дать команду модулю на измерение:
max_sensor.update ();
Чтобы получить данные пульса:
max_sensor.getHeartRate ();
Чтобы узнать уровень кислорода в крови:
max_sensor.getSpO2 ();

Шаг четвертый: код
В этом шаге мастер разъясняет код и какие в него необходимо внести изменения при необходимости.
Прежде всего, нужно включить библиотеки:
#include <Wire.h> // Arduino I2C library
#include <Adafruit_GFX.h> // needed for OLED display
#include <Adafruit_SSD1306.h> // 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);

Весь код можно скачать ниже.
Пульсоксиметр на базе ESP32 Показать / Скрыть текст#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#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();
}
После программирования можно пользоваться прибором.

SitesReady

Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного. - Альберт Эйнштейн

Follow us

Don't be shy, get in touch. We love meeting interesting people and making new friends.