Holm

Пульсоксиметр

3 сообщения в этой теме

Holm    0

Приветствую радиолюбители!Проблема такая,решил собрать пульсоксиметр,но т.к это моя первая работа на Arduino Nano,возникли трудности.
Собираю по этой  статье

Единственное отличие у них стоит oled display 0.91 у меня 0.96.
Не могу разобраться,с какой библиотекой работать u8g2lib или u8glib.Какой дисплей мне выбрать и тд.

Ссылка на библиотеку MAX30100 клик

#include <CircularBuffer.h>
#include <MAX30100.h>
#include <MAX30100_BeatDetector.h>
#include <MAX30100_Filters.h>
#include <MAX30100_PulseOximeter.h>
#include <MAX30100_Registers.h>
#include <MAX30100_SpO2Calculator.h>
#include <U8g2lib.h>
#include "MAX30100_PulseOximeter.h"
#include <Wire.h>


#define REPORTING_PERIOD_MS     500
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0);

// PulseOximeter is the higher level interface to the sensor
// it offers:
//  * beat detection reporting
//  * heart rate calculation
//  * SpO2 (oxidation level) calculation
PulseOximeter pox;

const int numReadings=10;
float filterweight=0.5;
uint32_t tsLastReport = 0;
uint32_t last_beat=0;
int readIndex=0;
int average_beat=0;
int average_SpO2=0;
bool calculation_complete=false;
bool calculating=false;
bool initialized=false;
byte beat=0;

// Callback (registered below) fired when a pulse is detected
void onBeatDetected()
{
  show_beat();
  last_beat=millis();
}

void show_beat() 
{
  u8g2.setFont(u8g2_font_cursor_tf);
  u8g2.setCursor(8,10);
  if (beat==0) {
    u8g2.print("_");
    beat=1;
  } 
  else
  {
    u8g2.print("^");
    beat=0;
  }
  u8g2.sendBuffer();
}

void initial_display() 
{
  if (not initialized) 
  {
    u8g2.clearBuffer();
    show_beat();
    u8g2.setCursor(24,12);
    u8g2.setFont(u8g2_font_smart_patrol_nbp_tf);
    u8g2.print("Place finger");  
    u8g2.setCursor(0,30);
    u8g2.print("on the sensor");
    u8g2.sendBuffer(); 
    initialized=true;
  }
}

void display_calculating(int j)
{
  if (not calculating) {
    u8g2.clearBuffer();
    calculating=true;
    initialized=false;
  }
  show_beat();
  u8g2.setCursor(24,12);
  u8g2.setFont(u8g2_font_smart_patrol_nbp_tf);
  u8g2.print("Measuring"); 
  u8g2.setCursor(0,30);
  for (int i=0;i<=j;i++) {
    u8g2.print(". ");
  }
  u8g2.sendBuffer();
}
void display_values()
{
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_smart_patrol_nbp_tf);
 
  u8g2.setCursor(65,12);  
  u8g2.print(average_beat);
  u8g2.print(" Bpm");
  u8g2.setCursor(0,30);
  u8g2.print("SpO2 ");
  u8g2.setCursor(65,30);  
  u8g2.print(average_SpO2);
  u8g2.print("%"); 
  u8g2.sendBuffer();
}

void calculate_average(int beat, int SpO2) 
{
  if (readIndex==numReadings) {
    calculation_complete=true;
    calculating=false;
    initialized=false;
    readIndex=0;
    display_values();
  }
  
  if (not calculation_complete and beat>30 and beat<220 and SpO2>50) {
    average_beat = filterweight * (beat) + (1 - filterweight ) * average_beat;
    average_SpO2 = filterweight * (SpO2) + (1 - filterweight ) * average_SpO2;
    readIndex++;
    display_calculating(readIndex);
  }
}

void setup()
{
    Serial.begin(115200);
    u8g2.begin();
    pox.begin();
    pox.setOnBeatDetectedCallback(onBeatDetected);
    initial_display();
}

void loop()
{
    // Make sure to call update as fast as possible
    pox.update();
    if ((millis() - tsLastReport > REPORTING_PERIOD_MS) and (not calculation_complete)) {
        calculate_average(pox.getHeartRate(),pox.getSpO2());
        tsLastReport = millis();
    }
    if ((millis()-last_beat>10000)) {
      calculation_complete=false;
      average_beat=0;
      average_SpO2=0;
      initial_display();
    }
}

 

Изменено пользователем Holm

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Holm    0

Просто может кто-нибудь поможет,элементарно не могу проверить датчик MAX30100 в "Монитор порта" ничего нет

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А ты скорость порта одинаковую поставил и на компе и в ардуине? Скорость поставь максимум 38400, и на компе тоже, при 115200, ничего не будет, или ошибки будут

В добавь в display_values()

Serial.print(average_beat); Serial.println(" Bpm");

Serial.print("SpO2 "); Serial.print(average_SpO2); Serial.println("%"); 

 

в void loop(), поменяй initial_display();

на 

display_values(); 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Похожие публикации

    • Автор: silentland
      Arduino NANO (CH380). Схема питается от 4-х АА элементов через такой преобразователь http://roboparts.ru/products/dc-step-up-2v-5v-2a Соответственно, если АА - это новые батарейки, то напряжение может быть около 6,5В. Можно ли их подать на порт +5В? Что будет? А в качестве USB-питания можно?
    • Гость Dinovasya
      Автор: Гость Dinovasya
      Хочу собрать умный сетевой фильтр на 5 розеток (1-постоянно включена, 1 регулируемая по времени, 3 регулируются датчиком AM2320).
      Всё это будет внутри корпуса сетевого фильтра.
      Помощь Ваша мне нужна на всём этапе сборки и программирования.
       
      1 с чего начну: 
      Tiny RTC  1307 подключил по I2C, на эти же пины А4,А5 посадил AM2320 также по I2C.
      Это правильный подход?
      I2C: 4 (SDA) and 5 (SCL). Support I2C (TWI) communication using the Wire library.
      Есть ли у кого набор готовых скетчей по данной конфигурации?
       

    • Автор: Мессинг
      Кто может сделать или переделать скетч часов с индикацией светодиодными матрицами 8х8 с драйверами max7219 (число матриц, переключаемое при прошивке в контроллер, 4х1 или 4х2) ?
      Основа- arduino nano + rtc-ds3231+4 кнопки управления. Должны индицировать статично Часы-Минуты-Секунды, и динамично- бегущей строкой Число-Месяц-Год-День недели, плюс 4 служебных сообщения(по одному, с циклом 4 в дня). Настройка-установка времени, содержимого сообщений, яркости индикации, скорости вывода бегущей строки...
      Наличие будильников приветствуется, но не обязательно.
    • Автор: Инженер!Туленков
      Всем Привет! С Праздниками!
      Прошу помощи с Arduino Nano. Возникла острая необходимость изменить VIP и PID. Подскажите, натолкните на верный путь пожалуйста.
      Были закуплены 10 nano из китая, спаяны, а оказалось они все с одинаковыми VID и PID, но присутствует необходимость их различать именно по данным номерам.
      На сколько я понял необходимо бутлоадер перезаливать, с помошью cp2102 c DTR сигналом - судя по информации из гугл не удастся. Необходим FTDI. Так ли это? 
      Или это возможно сделать прямо из Arduino IDE изменив какие то файлы?
    • Автор: smacorp
      Комплекты плат для аппарата точечной сварки на основе Arduino Nano.
      Делал сам.

      Размер каждой платы - 50 х 60 мм., с металлизацией, с зелёной паяльной маской, с шелкографией, с лужением.
      Стоимость - 950 руб. - включая доставку почтой по России. С доплатой можно доставить и за пределы.

      Пишите на pcbsmac@gmail.com или в личку.