Датчик содержания кислорода в крови MAX30102
Правила форума
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
- НиколаМастер
- Сержант
- Сообщения: 113
- Зарегистрирован: 10 янв 2018, 12:36
- Благодарил (а): 3 раза
- Контактная информация:
Датчик содержания кислорода в крови MAX30102
Друзья, в свете последних событий, прикупил датчик MAX30102 и собрал схемку по образцу:
кислород и пульс
Данные читаются только в ком порту, экран не заводится, видимо нужна другая библиотека. Прошу помощи.
Можете изменить скетч с правильной библиотекой? Я не знаю как ее прописать дальше в теле...
И хорошо бы написать блок для такого датчика, всем бы пригодился.
Огромное спасибо тем кто откликнется!
Добра всем!
кислород и пульс
Данные читаются только в ком порту, экран не заводится, видимо нужна другая библиотека. Прошу помощи.
Можете изменить скетч с правильной библиотекой? Я не знаю как ее прописать дальше в теле...
И хорошо бы написать блок для такого датчика, всем бы пригодился.
Огромное спасибо тем кто откликнется!
Добра всем!
Brevis esse laboro, obscurus fiо - если я стараюсь быть кратким, я становлюсь непонятным
Датчик содержания кислорода в крови MAX30102
во первых не та ветка - тут готовые библиотеки
во вторых - где не рабочий проект и блоки?
а если измените мне скетч то наверное то это в другую ветку
во вторых - где не рабочий проект и блоки?
а если измените мне скетч то наверное то это в другую ветку
- НиколаМастер
- Сержант
- Сообщения: 113
- Зарегистрирован: 10 янв 2018, 12:36
- Благодарил (а): 3 раза
- Контактная информация:
Датчик содержания кислорода в крови MAX30102
Перенесите пожалуйста в другую ветку. Скетч:
[spoiler]/*
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"));
}
}[/spoiler]
[spoiler]/*
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"));
}
}[/spoiler]
Brevis esse laboro, obscurus fiо - если я стараюсь быть кратким, я становлюсь непонятным
-
- Полковник
- Сообщения: 3358
- Зарегистрирован: 24 дек 2016, 16:55
- Откуда: Уфа
- Имя: Айдар
- Благодарил (а): 13 раз
- Поблагодарили: 100 раз
- Контактная информация:
- НиколаМастер
- Сержант
- Сообщения: 113
- Зарегистрирован: 10 янв 2018, 12:36
- Благодарил (а): 3 раза
- Контактная информация:
Датчик содержания кислорода в крови MAX30102
Точно, не подумал, можно же просканировать ...
Еще вопрос, почему не прошивается на Нано? Получается Уно отличается чем то, хоть и контроллер один.
Еще вопрос, почему не прошивается на Нано? Получается Уно отличается чем то, хоть и контроллер один.
Brevis esse laboro, obscurus fiо - если я стараюсь быть кратким, я становлюсь непонятным
-
- Лейтенант
- Сообщения: 450
- Зарегистрирован: 26 фев 2018, 21:27
- Откуда: Haifa
- Имя: Alex
- Благодарил (а): 2 раза
- Поблагодарили: 5 раз
Датчик содержания кислорода в крови MAX30102
[ref]НиколаМастер[/ref], посмотрите,может у Вас OLD BUTLOADER ,измените в настройках
- НиколаМастер
- Сержант
- Сообщения: 113
- Зарегистрирован: 10 янв 2018, 12:36
- Благодарил (а): 3 раза
- Контактная информация:
Датчик содержания кислорода в крови MAX30102
Попробуйте, у вас на Нану прошьется?
Brevis esse laboro, obscurus fiо - если я стараюсь быть кратким, я становлюсь непонятным
-
- Лейтенант
- Сообщения: 450
- Зарегистрирован: 26 фев 2018, 21:27
- Откуда: Haifa
- Имя: Alex
- Благодарил (а): 2 раза
- Поблагодарили: 5 раз
Датчик содержания кислорода в крови MAX30102
[ref]НиколаМастер[/ref], попробовал, при компиляции выдает ошибку:
94:33: error: incompatible types in assignment of 'uint32_t {aka long unsigned int}' to 'uint16_t [50]
наверное в скетче что то не так.
94:33: error: incompatible types in assignment of 'uint32_t {aka long unsigned int}' to 'uint16_t [50]
наверное в скетче что то не так.
-
- Капитан
- Сообщения: 908
- Зарегистрирован: 04 окт 2015, 19:10
- Откуда: Новосибирск
- Имя: Павел
- Благодарил (а): 20 раз
- Поблагодарили: 22 раза
Датчик содержания кислорода в крови MAX30102
Конечно не так, Вы же скетч с поста скопировали, а при помещении текста скетча в пост часть знаков (не помню какие именно) теряются, соответственно скетч становится неработоспособным. Надо текст скетча брать из исходника. Если интересно - проверяйте.
У меня все компилируется но ругается на "мало памяти". Прошивать не пробовал.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Naladchik 02 авг 2020, 04:54, всего редактировалось 1 раз.
-
- Лейтенант
- Сообщения: 450
- Зарегистрирован: 26 фев 2018, 21:27
- Откуда: Haifa
- Имя: Alex
- Благодарил (а): 2 раза
- Поблагодарили: 5 раз
Датчик содержания кислорода в крови MAX30102
[ref]Naladchik[/ref], да,у меня тоже ругается что мало памяти остается,но все загрузилось нормально.
Я как то тоже пробовал с таким датчиком работать из примеров библиотеки,не понравилось,нет стабильности,результат скачет в зависимости от положения датчика.Бросил эту затею.
Во всех более менее серьезных пульсоксиметрах используется дачик на просвет(палец,ухо),с одной стороны IRed и Red светодиоды,а с другой фототранзистор.
Я как то тоже пробовал с таким датчиком работать из примеров библиотеки,не понравилось,нет стабильности,результат скачет в зависимости от положения датчика.Бросил эту затею.
Во всех более менее серьезных пульсоксиметрах используется дачик на просвет(палец,ухо),с одной стороны IRed и Red светодиоды,а с другой фототранзистор.
-
- Лейтенант
- Сообщения: 418
- Зарегистрирован: 13 апр 2020, 18:22
- Имя: Антон
- Поблагодарили: 3 раза
Датчик содержания кислорода в крови MAX30102
Скетч использует 9098 байт (29%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1647 байт (80%) динамической памяти, оставляя 401 байт для локальных переменных. Максимум: 2048 байт.
Недостаточно памяти, программа может работать нестабильно.
-
- Лейтенант
- Сообщения: 418
- Зарегистрирован: 13 апр 2020, 18:22
- Имя: Антон
- Поблагодарили: 3 раза
Датчик содержания кислорода в крови MAX30102
[ref]НиколаМастер[/ref], какие результаты? работает или как?
-
- Полковник
- Сообщения: 4005
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 153 раза
Датчик содержания кислорода в крови MAX30102
На Nano использовать OLED почти нельзя - много оперативной памяти забирает. Только если небольшой тест.Ardudue писал(а): 03 авг 2020, 14:40 Скетч использует 9098 байт (29%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1647 байт (80%) динамической памяти, оставляя 401 байт для локальных переменных. Максимум: 2048 байт.
Недостаточно памяти, программа может работать нестабильно.
-
- Лейтенант
- Сообщения: 418
- Зарегистрирован: 13 апр 2020, 18:22
- Имя: Антон
- Поблагодарили: 3 раза
Датчик содержания кислорода в крови MAX30102
про какую нано речь? у китайца видел два варианта на ATmega168 и ATmega328.
у меня на ATmega328.
-
- Полковник
- Сообщения: 4005
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 153 раза
-
- Лейтенант
- Сообщения: 418
- Зарегистрирован: 13 апр 2020, 18:22
- Имя: Антон
- Поблагодарили: 3 раза
Датчик содержания кислорода в крови MAX30102
значит надо на STM32 делать. Но интересно у автора скетча то работает на ATMega328 -вот в чем вопрос.
-
- Полковник
- Сообщения: 1928
- Зарегистрирован: 28 окт 2015, 22:47
- Откуда: Ленобласть
- Имя: Игорь
- Поблагодарили: 2 раза
Датчик содержания кислорода в крови MAX30102
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
-
- Лейтенант
- Сообщения: 418
- Зарегистрирован: 13 апр 2020, 18:22
- Имя: Антон
- Поблагодарили: 3 раза
Датчик содержания кислорода в крови MAX30102
хм, на али продают Arduino Nano Atmega4808 за 380р.
[spoiler]
https://youtu.be/ad6xMoyppb4
[/spoiler]
-
- Полковник
- Сообщения: 1928
- Зарегистрирован: 28 окт 2015, 22:47
- Откуда: Ленобласть
- Имя: Игорь
- Поблагодарили: 2 раза
Датчик содержания кислорода в крови MAX30102
Сегодня приехалиIngwar писал(а): 18 сен 2020, 15:18 Заказал таких. Поддержка вроде есть и даже с интересными "плюшками". Как придут - потестю.
[spoiler] [/spoiler]
Успел проверить только основные интерфейсы. Но однозначно сразу можно сказать - лучше чем 328 ))
На 328 пример Adafruit_SSD1306 занимает
[spoiler] [/spoiler]
На 4808 соответственно
[spoiler] [/spoiler]
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
-
- Лейтенант
- Сообщения: 418
- Зарегистрирован: 13 апр 2020, 18:22
- Имя: Антон
- Поблагодарили: 3 раза
Датчик содержания кислорода в крови MAX30102
[ref]Ingwar[/ref], скетч для MAX30102 вдез в Atmega4808 -работает?
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя