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

Пользовательские блоки расширяющие базовый функуионал программы по работе с различными датчиками и энкодерами
Правила форума
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
Аватара пользователя
НиколаМастер
Рядовой
Сообщения: 99
Зарегистрирован: 10.01.2018{, 12:36}
Репутация: 8
Контактная информация:

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

#1

Сообщение НиколаМастер » 01.08.2020{, 09:06}

Друзья, в свете последних событий, прикупил датчик MAX30102 и собрал схемку по образцу:
кислород и пульс
Данные читаются только в ком порту, экран не заводится, видимо нужна другая библиотека. Прошу помощи.
Можете изменить скетч с правильной библиотекой? Я не знаю как ее прописать дальше в теле...
И хорошо бы написать блок для такого датчика, всем бы пригодился.
Огромное спасибо тем кто откликнется!
Добра всем!
Brevis esse laboro, obscurus fiо - если я стараюсь быть кратким, я становлюсь непонятным

Аватара пользователя
dizzyy
Капитан
Сообщения: 752
Зарегистрирован: 24.11.2017{, 16:25}
Репутация: 37
Откуда: Червоноград
Имя: Марьян

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

#2

Сообщение dizzyy » 01.08.2020{, 09:58}

во первых не та ветка - тут готовые библиотеки
во вторых - где не рабочий проект и блоки?
а если измените мне скетч то наверное то это в другую ветку

Аватара пользователя
НиколаМастер
Рядовой
Сообщения: 99
Зарегистрирован: 10.01.2018{, 12:36}
Репутация: 8
Контактная информация:

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

#3

Сообщение НиколаМастер » 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"));
}
}
Brevis esse laboro, obscurus fiо - если я стараюсь быть кратким, я становлюсь непонятным

aidar_i
Полковник
Сообщения: 3120
Зарегистрирован: 24.12.2016{, 16:55}
Репутация: 674
Откуда: Уфа
Имя: Айдар
Контактная информация:

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

#4

Сообщение aidar_i » 01.08.2020{, 12:13}

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

Аватара пользователя
НиколаМастер
Рядовой
Сообщения: 99
Зарегистрирован: 10.01.2018{, 12:36}
Репутация: 8
Контактная информация:

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

#5

Сообщение НиколаМастер » 01.08.2020{, 17:41}

Точно, не подумал, можно же просканировать ...
Еще вопрос, почему не прошивается на Нано? Получается Уно отличается чем то, хоть и контроллер один.
Brevis esse laboro, obscurus fiо - если я стараюсь быть кратким, я становлюсь непонятным

Brand2
Лейтенант
Сообщения: 413
Зарегистрирован: 26.02.2018{, 21:27}
Репутация: 41
Откуда: Haifa
Имя: Alex

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

#6

Сообщение Brand2 » 01.08.2020{, 17:47}

НиколаМастер, посмотрите,может у Вас OLD BUTLOADER ,измените в настройках

Аватара пользователя
НиколаМастер
Рядовой
Сообщения: 99
Зарегистрирован: 10.01.2018{, 12:36}
Репутация: 8
Контактная информация:

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

#7

Сообщение НиколаМастер » 01.08.2020{, 18:46}

Попробуйте, у вас на Нану прошьется?
Brevis esse laboro, obscurus fiо - если я стараюсь быть кратким, я становлюсь непонятным

Brand2
Лейтенант
Сообщения: 413
Зарегистрирован: 26.02.2018{, 21:27}
Репутация: 41
Откуда: Haifa
Имя: Alex

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

#8

Сообщение Brand2 » 01.08.2020{, 19:14}

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

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

Naladchik
Капитан
Сообщения: 822
Зарегистрирован: 04.10.2015{, 19:10}
Репутация: 151
Откуда: Новосибирск
Имя: Павел

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

#9

Сообщение Naladchik » 01.08.2020{, 21:20}

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

Brand2
Лейтенант
Сообщения: 413
Зарегистрирован: 26.02.2018{, 21:27}
Репутация: 41
Откуда: Haifa
Имя: Alex

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

#10

Сообщение Brand2 » 01.08.2020{, 21:57}

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

Ardudue
Лейтенант
Сообщения: 423
Зарегистрирован: 13.04.2020{, 18:22}
Репутация: 24
Имя: Антон

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

#11

Сообщение Ardudue » 03.08.2020{, 14:40}

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

Ardudue
Лейтенант
Сообщения: 423
Зарегистрирован: 13.04.2020{, 18:22}
Репутация: 24
Имя: Антон

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

#12

Сообщение Ardudue » 16.09.2020{, 07:49}

НиколаМастер, какие результаты? работает или как?

ecoins
Полковник
Сообщения: 2921
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 453
Откуда: Шатура
Имя: Энвер

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

#13

Сообщение ecoins » 16.09.2020{, 17:47}

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

Ardudue
Лейтенант
Сообщения: 423
Зарегистрирован: 13.04.2020{, 18:22}
Репутация: 24
Имя: Антон

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

#14

Сообщение Ardudue » 16.09.2020{, 18:56}

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

ecoins
Полковник
Сообщения: 2921
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 453
Откуда: Шатура
Имя: Энвер

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

#15

Сообщение ecoins » 17.09.2020{, 12:18}

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

Ardudue
Лейтенант
Сообщения: 423
Зарегистрирован: 13.04.2020{, 18:22}
Репутация: 24
Имя: Антон

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

#16

Сообщение Ardudue » 18.09.2020{, 11:39}

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

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

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

#17

Сообщение Ingwar » 18.09.2020{, 15:18}

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

Ardudue
Лейтенант
Сообщения: 423
Зарегистрирован: 13.04.2020{, 18:22}
Репутация: 24
Имя: Антон

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

#18

Сообщение Ardudue » 18.09.2020{, 17:08}

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

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

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

#19

Сообщение Ingwar » 12.10.2020{, 23:01}

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

Ardudue
Лейтенант
Сообщения: 423
Зарегистрирован: 13.04.2020{, 18:22}
Репутация: 24
Имя: Антон

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

#20

Сообщение Ardudue » 29.10.2020{, 11:28}

Ingwar, скетч для MAX30102 вдез в Atmega4808 -работает?

Ответить

Вернуться в «Датчики и энкодеры»