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 смайлов.

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

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

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

Загрузка...

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

    • Гость 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 или в личку.
       


    • Гость CTPAHNK
      Автор: Гость CTPAHNK
      Приветствую дорогое сообщество, прошу помощи в реализации проекта- дрифт трайка для детворы, а именно в создании контроллера для мотор-колеса управляемого с ардуино. Сам трайк я построил еще летом, и тогда использовал дешевый китайский контроллер для запуска двигателя, вот пробный заезд
      как видно из видео, мне необходимо отталкиваться чтобы стартануть, это происходит из за отсутствия датчиков холла, и мой вес ему трудно сдернуть с места чтобы потом понимать куда крутиться колесо и уже его дальше крутить. С того времени было решено построить свой контроллер для управления, а также был сделан апгрейд колеса и встроены датчики холла. Так как времени было всегда в обрез, занимался мало этим делом, но вот, праздники и можно малость поработать. Для начала подключил датчики холла к ардуине, убедился что прилетают все данные и написал простую программу по вращению колеса. Данная программа работает без проблем с моторчиком от сдрома - проверенно, прилагаю...
      //throttle const int analogInPin1 = 22; //hall input int hall_sensor_a = 7; int hall_sensor_b = 2; int hall_sensor_c = 4; //Motor setup const int a_motor_lout = 3; const int a_motor_pwm_hout = 9; const int b_motor_lout = 6; const int b_motor_pwm_hout = 11; const int c_motor_lout = 10; const int c_motor_pwm_hout = 5; void setup(){ // Serial.begin(9600); pinMode(a_motor_lout, OUTPUT); pinMode(a_motor_pwm_hout, OUTPUT); pinMode(b_motor_lout, OUTPUT); pinMode(b_motor_pwm_hout, OUTPUT); pinMode(c_motor_lout, OUTPUT); pinMode(c_motor_pwm_hout, OUTPUT); pinMode(hall_sensor_a, INPUT); pinMode(hall_sensor_b, INPUT); pinMode(hall_sensor_c, INPUT); } void loop(){ /* int A; A = 11111; Serial.println(digitalRead(7)); Serial.println(digitalRead(2)); Serial.println(digitalRead(4)); Serial.println(A); */ while(1){ int val = analogRead(analogInPin1); val = constrain(val, 211, 830); int thLevel = map(val, 211, 830, 50, 0); if ( thLevel <= 45){ // int thLevel = 0; delay(thLevel); if (digitalRead(hall_sensor_a)==1 && digitalRead(hall_sensor_b)==0 && digitalRead(hall_sensor_c)==1){ digitalWrite(a_motor_pwm_hout,1);digitalWrite(a_motor_lout,0);digitalWrite(c_motor_lout,0); digitalWrite(b_motor_pwm_hout,0);digitalWrite(b_motor_lout,1);digitalWrite(c_motor_pwm_hout,0); delay(thLevel);} else { if (digitalRead(hall_sensor_a)==0 && digitalRead(hall_sensor_b)==0 && digitalRead(hall_sensor_c)==1){ digitalWrite(a_motor_lout,0);digitalWrite(c_motor_pwm_hout,0);digitalWrite(c_motor_lout,1); digitalWrite(b_motor_pwm_hout,0);digitalWrite(b_motor_lout,0);digitalWrite(a_motor_pwm_hout,1); delay(thLevel);} else { if (digitalRead(hall_sensor_a)==0 && digitalRead(hall_sensor_b)==1 && digitalRead(hall_sensor_c)==1){ digitalWrite(c_motor_pwm_hout,0);digitalWrite(b_motor_lout,0);digitalWrite(a_motor_lout,0); digitalWrite(b_motor_pwm_hout,1);digitalWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_lout,1); delay(thLevel);} else { if (digitalRead(hall_sensor_a)==0 && digitalRead(hall_sensor_b)==1 && digitalRead(hall_sensor_c)==0){ digitalWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_pwm_hout,0);digitalWrite(a_motor_lout,1); digitalWrite(b_motor_lout,0);digitalWrite(c_motor_lout,0);digitalWrite(b_motor_pwm_hout,1); delay(thLevel);} else { if (digitalRead(hall_sensor_a)==1 && digitalRead(hall_sensor_b)==1 && digitalRead(hall_sensor_c)==0){ digitalWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_pwm_hout,1);digitalWrite(c_motor_lout,0); digitalWrite(b_motor_lout,0);digitalWrite(a_motor_lout,1);digitalWrite(b_motor_pwm_hout,0); delay(thLevel);} else { if (digitalRead(hall_sensor_a)==1 && digitalRead(hall_sensor_b)==0 && digitalRead(hall_sensor_c)==0){ digitalWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_lout,0);digitalWrite(b_motor_pwm_hout,0); digitalWrite(b_motor_lout,1);digitalWrite(a_motor_lout,0);digitalWrite(c_motor_pwm_hout,1); delay(thLevel);} }}}}} } else{ digitalWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_lout,0);digitalWrite(b_motor_pwm_hout,0); digitalWrite(b_motor_lout,0);digitalWrite(a_motor_lout,0);digitalWrite(c_motor_pwm_hout,0); }}}
       
      далее имеются в руках только N-channel мосфеты STP75NF75 которые решил завести с помощью драйвера HIP4086 нарисовал схему, вытравил плату, так как не очень удобно было к его ногам прицепиться(хотя пытался), пытаюсь запустить, а он не подает жизни :(. На двух выходах драйвера к мосфетам всегда высокий уровень(+12), и что бы я не подавал на входы, все молчит. Ранее когда пытался завести похожее но на базе транзисторов, то хоть мотор ногами дергал, но не крутился, а сейчас вообще тишина. Ни мосфеты, ни другие элементы на плате не греются. Не могу ума приложить что не так тут и как проверить еще...

      Буду признателен за любые комментарии.