Страница 1 из 2

Датчик содержания кислорода в крови MAX30102

Добавлено: 01.08.2020{, 09:06}
НиколаМастер
Друзья, в свете последних событий, прикупил датчик MAX30102 и собрал схемку по образцу:
кислород и пульс
Данные читаются только в ком порту, экран не заводится, видимо нужна другая библиотека. Прошу помощи.
Можете изменить скетч с правильной библиотекой? Я не знаю как ее прописать дальше в теле...
И хорошо бы написать блок для такого датчика, всем бы пригодился.
Огромное спасибо тем кто откликнется!
Добра всем!

Датчик содержания кислорода в крови MAX30102

Добавлено: 01.08.2020{, 09:58}
dizzyy
во первых не та ветка - тут готовые библиотеки
во вторых - где не рабочий проект и блоки?
а если измените мне скетч то наверное то это в другую ветку

Датчик содержания кислорода в крови MAX30102

Добавлено: 01.08.2020{, 10:01}
НиколаМастер
Перенесите пожалуйста в другую ветку. Скетч:

СпойлерПоказать
/*
Hardware Connections (Breakoutboard to Arduino):
-5V = 5V (3.3V is allowed)
-GND = GND
-SDA = A4 (or SDA)
-SCL = A5 (or SCL)
-INT = Not connected

The MAX30105 Breakout can handle 5V or 3.3V I2C logic. We recommend powering the board with 5V
but it will also run at 3.3V.
*/

#include <Wire.h>
#include "MAX30105.h"
#include "spo2_algorithm.h"
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"

MAX30105 particleSensor;
SSD1306AsciiWire oled;

#define MAX_BRIGHTNESS 255

#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
//Arduino Uno doesn't have enough SRAM to store 50 samples of IR led data and red led data in 32-bit format
//To solve this problem, 16-bit MSB of the sampled data will be truncated. Samples become 16-bit data.
uint16_t irBuffer[50]; //infrared LED sensor data
uint16_t redBuffer[50]; //red LED sensor data
#else
uint32_t irBuffer[50]; //infrared LED sensor data
uint32_t redBuffer[50]; //red LED sensor data
#endif

int32_t spo2; //SPO2 value
int8_t validSPO2; //indicator to show if the SPO2 calculation is valid
int32_t heartRate; //heart rate value
int8_t validHeartRate; //indicator to show if the heart rate calculation is valid

void setup()
{
Serial.begin(115200); // initialize serial communication at 115200 bits per second:

oled.begin(&Adafruit128x64, 0x3C);
oled.setFont(Arial14);

// Initialize sensor
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
{
Serial.println(F("MAX30105 was not found. Please check wiring/power."));
while (1);
}

particleSensor.setup(55, 4, 2, 200, 411, 4096); //Configure sensor with these settings
}

void loop()
{

//read the first 50 samples, and determine the signal range
for (byte i = 0 ; i < 50 ; i++)
{
while (particleSensor.available() == false) //do we have new data?
particleSensor.check(); //Check the sensor for new data

redBuffer = particleSensor.getRed();
irBuffer = particleSensor.getIR();
particleSensor.nextSample(); //We're finished with this sample so move to next sample
Serial.print(F("red="));
Serial.print(redBuffer, DEC);
Serial.print(F(", ir="));
Serial.println(irBuffer, DEC);
}

//calculate heart rate and SpO2 after first 50 samples (first 4 seconds of samples)
maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);

//Continuously taking samples from MAX30102. Heart rate and SpO2 are calculated every 1 second
while (1)
{
//dumping the first 25 sets of samples in the memory and shift the last 25 sets of samples to the top
for (byte i = 25; i < 50; i++)
{
redBuffer = redBuffer;
irBuffer = irBuffer;
}

//take 25 sets of samples before calculating the heart rate.
for (byte i = 25; i < 50; i++)
{
while (particleSensor.available() == false) //do we have new data?
particleSensor.check(); //Check the sensor for new data

redBuffer = particleSensor.getRed();
irBuffer = particleSensor.getIR();
particleSensor.nextSample(); //We're finished with this sample so move to next sample
Serial.print(F("red="));
Serial.print(redBuffer[i], DEC);
Serial.print(F(", ir="));
Serial.print(irBuffer[i], DEC);

Serial.print(F(", HR="));
Serial.print(heartRate, DEC);

Serial.print(F(", HRvalid="));
Serial.print(validHeartRate, DEC);

Serial.print(F(", SPO2="));
Serial.print(spo2, DEC);

Serial.print(F(", SPO2Valid="));
Serial.println(validSPO2, DEC);

}

//After gathering 25 new samples recalculate HR and SP02
maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
printToScreen();
}
}

void printToScreen() {
oled.clear();
oled.setCursor(0,0);
if(validSPO2 && validHeartRate) {
oled.print(F("HR: ")); oled.println(heartRate, DEC);
oled.print(F("SPO2: ")); oled.println(spo2, DEC);
} else {
oled.print(F("Not valid"));
}
}

Датчик содержания кислорода в крови MAX30102

Добавлено: 01.08.2020{, 12:13}
aidar_i
НиколаМастер писал(а):
01.08.2020{, 10:02}
oled.begin(&Adafruit128x64, 0x3C);
Может у Вас адрес дисплея 0x27

Датчик содержания кислорода в крови MAX30102

Добавлено: 01.08.2020{, 17:41}
НиколаМастер
Точно, не подумал, можно же просканировать ...
Еще вопрос, почему не прошивается на Нано? Получается Уно отличается чем то, хоть и контроллер один.

Датчик содержания кислорода в крови MAX30102

Добавлено: 01.08.2020{, 17:47}
Brand2
НиколаМастер, посмотрите,может у Вас OLD BUTLOADER ,измените в настройках

Датчик содержания кислорода в крови MAX30102

Добавлено: 01.08.2020{, 18:46}
НиколаМастер
Попробуйте, у вас на Нану прошьется?

Датчик содержания кислорода в крови MAX30102

Добавлено: 01.08.2020{, 19:14}
Brand2
НиколаМастер, попробовал, при компиляции выдает ошибку:
94:33: error: incompatible types in assignment of 'uint32_t {aka long unsigned int}' to 'uint16_t [50]

наверное в скетче что то не так.

Датчик содержания кислорода в крови MAX30102

Добавлено: 01.08.2020{, 21:20}
Naladchik
Brand2 писал(а):
01.08.2020{, 19:14}
наверное в скетче что то не так.
Конечно не так, Вы же скетч с поста скопировали, а при помещении текста скетча в пост часть знаков (не помню какие именно) теряются, соответственно скетч становится неработоспособным. Надо текст скетча брать из исходника.
pulse_oximeter_code.c
(4.15 КБ) 86 скачиваний
Если интересно - проверяйте.
У меня все компилируется но ругается на "мало памяти". Прошивать не пробовал.

Датчик содержания кислорода в крови MAX30102

Добавлено: 01.08.2020{, 21:57}
Brand2
Naladchik, да,у меня тоже ругается что мало памяти остается,но все загрузилось нормально.
Я как то тоже пробовал с таким датчиком работать из примеров библиотеки,не понравилось,нет стабильности,результат скачет в зависимости от положения датчика.Бросил эту затею.
Во всех более менее серьезных пульсоксиметрах используется дачик на просвет(палец,ухо),с одной стороны IRed и Red светодиоды,а с другой фототранзистор.

Датчик содержания кислорода в крови MAX30102

Добавлено: 03.08.2020{, 14:40}
Ardudue
НиколаМастер писал(а):
01.08.2020{, 18:46}
Попробуйте, у вас на Нану прошьется?
Скетч использует 9098 байт (29%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1647 байт (80%) динамической памяти, оставляя 401 байт для локальных переменных. Максимум: 2048 байт.
Недостаточно памяти, программа может работать нестабильно.

Датчик содержания кислорода в крови MAX30102

Добавлено: 16.09.2020{, 07:49}
Ardudue
НиколаМастер, какие результаты? работает или как?

Датчик содержания кислорода в крови MAX30102

Добавлено: 16.09.2020{, 17:47}
ecoins
Ardudue писал(а):
03.08.2020{, 14:40}
Скетч использует 9098 байт (29%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1647 байт (80%) динамической памяти, оставляя 401 байт для локальных переменных. Максимум: 2048 байт.
Недостаточно памяти, программа может работать нестабильно.
На Nano использовать OLED почти нельзя - много оперативной памяти забирает. Только если небольшой тест.

Датчик содержания кислорода в крови MAX30102

Добавлено: 16.09.2020{, 18:56}
Ardudue
ecoins писал(а):
16.09.2020{, 17:47}
На Nano использовать OLED почти нельзя
про какую нано речь? у китайца видел два варианта на ATmega168 и ATmega328.
у меня на ATmega328.

Датчик содержания кислорода в крови MAX30102

Добавлено: 17.09.2020{, 12:18}
ecoins
Ardudue писал(а):
16.09.2020{, 18:56}
у меня на ATmega328.
ATMega328 - 2 кБ RAM, это мало.

Датчик содержания кислорода в крови MAX30102

Добавлено: 18.09.2020{, 11:39}
Ardudue
ecoins писал(а):
17.09.2020{, 12:18}
ATMega328 - 2 кБ RAM, это мало.
значит надо на STM32 делать. Но интересно у автора скетча то работает на ATMega328 -вот в чем вопрос.

Датчик содержания кислорода в крови MAX30102

Добавлено: 18.09.2020{, 15:18}
Ingwar
ecoins писал(а):
17.09.2020{, 12:18}
ATMega328 - 2 кБ RAM, это мало.
Заказал таких. Поддержка вроде есть и даже с интересными "плюшками". Как придут - потестю.

Датчик содержания кислорода в крови MAX30102

Добавлено: 18.09.2020{, 17:08}
Ardudue
Ingwar писал(а):
18.09.2020{, 15:18}
Заказал таких.
хм, на али продают Arduino Nano Atmega4808 за 380р.
СпойлерПоказать

Датчик содержания кислорода в крови MAX30102

Добавлено: 12.10.2020{, 23:01}
Ingwar
Ingwar писал(а):
18.09.2020{, 15:18}
Заказал таких. Поддержка вроде есть и даже с интересными "плюшками". Как придут - потестю.
Сегодня приехали
СпойлерПоказать
Clipboard01.jpg
Успел проверить только основные интерфейсы. Но однозначно сразу можно сказать - лучше чем 328 ))
На 328 пример Adafruit_SSD1306 занимает
СпойлерПоказать
Безымянный2.png
Безымянный2.png (7.44 КБ) 1313 просмотров
На 4808 соответственно
СпойлерПоказать
Безымянный.png
Безымянный.png (7.41 КБ) 1313 просмотров

Датчик содержания кислорода в крови MAX30102

Добавлено: 29.10.2020{, 11:28}
Ardudue
Ingwar, скетч для MAX30102 вдез в Atmega4808 -работает?