Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Meça a freqüência cardíaca e SpO2 com MAX30102

Componentes e suprimentos

Arduino UNO
× 1
Adafruit OLED 128x32
× 1
Buzzer
× 1
Maxim Integrated MAX30102 Oxímetro de pulso de alta sensibilidade e sensor de frequência cardíaca para a saúde vestível
× 1

Sobre este projeto







Introdução


Olá, neste tutorial faremos a interface do MAX30102:módulo de oximetria de pulso e monitor de freqüência cardíaca com a placa Arduino UNO, e então faremos um projeto para medir BPM usando este módulo + display OLED e um Buzzer.

BPM são os "batimentos por minuto" e ficam em torno de 65-75 em repouso para uma pessoa normal, o atletismo pode ter menos que isso, e a SpO2 é o nível de saturação de oxigênio, e para uma pessoa normal está acima de 95%.

O MAX30102 pode ser encontrado em diferentes módulos, tenho uma versão WAVGAT, não é problema desde que o IC seja MAX30102.





Componentes


Aqui estão as coisas que vou usar





Testes:


Os códigos que usei no tutorial são bastante claros e são apenas exemplos da biblioteca Sparkfun_MAX3010x.

Para o código que fiz para o OLED e o Buzzer, é uma versão modificada do exemplo "HeartRate", ele pede que você coloque o dedo no sensor.

Depois de colocar o dedo, mantenha a calma por um tempo, até começar a ouvir os "Bipes" da campainha sincronizados com seus batimentos cardíacos ou a animação OLED sincronizada com ele, e então você pode ler um BPM correto.

N.B:No código eu realmente imprimo o BPM médio, uma vez que ele faz a média de 4 BPMs, é mais preciso dar um tempo.





Faça bitmaps para o OLED


O coração (pequeno) que você vê é uma imagem de bitmap, e toda vez que o sensor detecta uma batida cardíaca, nós mudamos para outra imagem de bitmap de coração (grande) por um tempo e dá a impressão de um coração batendo junto com um bipe da campainha.

Aqui estão os dois bitmaps no código que chamamos mais tarde no código

Para fazer isso, procure uma imagem (preto com fundo branco) para o que você quiser ver na tela só não se esqueça do tamanho, o que estou usando é 128x32 px e as fotos são menores que isso (32x32 px) e (24x21 px)

Baixe o LCD Assistant e abra-o (alguns passos abaixo)

E aqui estão seus "números"

E aqui está como chamei no código
  display.drawBitmap (5, 5, logo2_bmp, 24, 21, WHITE);  

Que significa
  display.drawBitmap (Iniciando x pos, Iniciando y pos, Nome do bitmap, Largura, Altura, Cor);  

E como você pode ver no código, um é chamado quando um dedo é detectado e o outro quando um batimento cardíaco é detectado.

E aqui você vai fazer o que quiser.

Código

  • MAX_BPM_OLED_Buzzer.ino
MAX_BPM_OLED_Buzzer.ino Arduino
Modificado da biblioteca SparkFun MAX3010x
 / * Este código funciona com MAX30102 + 128x32 OLED i2c + Buzzer e Arduino UNO * Ele exibe o BPM médio na tela, com uma animação e um som de campainha * toda vez que um pulso do coração é detectado * É uma versão modificada do exemplo da biblioteca HeartRate * Consulte www.surtrtech.com para obter mais detalhes ou o canal SurtrTech no YouTube * / # include  // Bibliotecas OLED # include  #include  #include "MAX30105.h" // Biblioteca MAX3010x # include "heartRate.h" // Algoritmo de cálculo da freqüência cardíacaMAX30105 particleSensor; const byte RATE_SIZE =4; // Aumente para obter mais média. 4 é good.byte rates [RATE_SIZE]; // Matriz de taxas de coração byte rateSpot =0; long lastBeat =0; // Hora em que ocorreu a última batidafloat beatsPerMinute; int beatAvg; #define SCREEN_WIDTH 128 // Largura do display OLED, em pixels # define SCREEN_HEIGHT 32 // Altura do display OLED, em pixels # define OLED_RESET -1 // Redefina o pino # (ou -1 se estiver compartilhando o pino de redefinição do Arduino) Tela Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // Declarando o nome de exibição (display) static const unsigned char PROGMEM logo2_bmp [] ={0x03, 0xC0, 0xF0, 0x06, 0x71, 0x8C, 0x0C, 0x1B, 0x06, 0x18, 0x0E, 0x02, 0x10, 0x0C, 0x03, 0x10 , // Logo2 e Logo3 são duas imagens bmp exibidas no OLED se chamadas 0x04, 0x01, 0x10, 0x04, 0x01, 0x10, 0x40, 0x01, 0x10, 0x40, 0x01, 0x10, 0xC0, 0x03, 0x08, 0x88,0x02, 0x08, 0xB8, 0x04, 0xFF, 0x37, 0x08, 0x01, 0x30, 0x18, 0x01, 0x90, 0x30, 0x00, 0xC0, 0x60,0x00, 0x60, 0xC0, 0x00, 0x31, 0x80, 0x00, 0x1B, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x04, 0x00,}; static const unsigned char PROGMEM logo3_bmp [] ={0x01, 0xF0, 0x0F, 0x80, 0x06, 0x1C, 0x38, 0x60, 0x18, 0x06, 0x60, 0x18, 0x10, 0x01, 0x80, 0x08,0x20, 0x01, 0x80, 0x04, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x08, 0x03,0x80, 0x00, 0x08, 0x01, 0x80, 0x00, 0x18, 0x01, 0x80, 0x00, 0x1C, 0x01, 0x80, 0x00, 0x14, 0x00,0x80, 0x00, 0x14, 0x00, 0x80, 0x00, 0x00, 0x14, 0x00, 0x40, 0x10, 0x12, 0x00, 0x40, 0x10, 0x12, 0x00, 0x7E, 0x1F, 0x23, 0xFE, 0x03, 0 x31, 0xA0, 0x04, 0x01, 0xA0, 0xA0, 0x0C, 0x00, 0xA0, 0xA0, 0x08,0x00, 0x60, 0xE0, 0x10, 0x00, 0x20, 0x60, 0x20, 0x06, 0x00, 0x40, 0x60, 0x03, 0x00, 0x40, 0xC0,0x01, 0x80, 0x01, 0x80, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x30, 0x0C, 0x00,0x00, 0x08, 0x10, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x01, 0x80, 0x00}; configuração vazia () {display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // Iniciar o display OLED display.display (); atraso (3000); // Inicializa o sensor particleSensor.begin (Wire, I2C_SPEED_FAST); // Use a porta I2C padrão, velocidade de 400 kHz particleSensor.setup (); // Configure o sensor com as configurações padrão particleSensor.setPulseAmplitudeRed (0x0A); // Gire o LED vermelho para baixo para indicar que o sensor está em execução} void loop () {long irValue =particleSensor.getIR (); // A leitura do valor de IV nos permitirá saber se há um dedo no sensor ou não // Também detectando uma pulsaçãoif (irValue> 7000) {// Se um dedo for detectado display.clearDisplay (); // Limpa a exibição display.drawBitmap (5, 5, logo2_bmp, 24, 21, WHITE); // Desenhe a primeira imagem bmp (pequeno coração) display.setTextSize (2); // Próximo a exibir o BPM médio, você pode exibir o BPM se quiser display.setTextColor (WHITE); display.setCursor (50,0); display.println ("BPM"); display.setCursor (50,18); display.println (beatAvg); display.display (); if (checkForBeat (irValue) ==true) // Se um batimento cardíaco for detectado {display.clearDisplay (); // Limpa a exibição display.drawBitmap (0, 0, logo3_bmp, 32, 32, WHITE); // Desenhe a segunda imagem (coração maior) display.setTextSize (2); // E ainda exibe o BPM médio display.setTextColor (WHITE); display.setCursor (50,0); display.println ("BPM"); display.setCursor (50,18); display.println (beatAvg); display.display (); tom (3.100); // E soar o buzzer por 100ms você pode reduzir fica melhor delay (100); noTone (3); // Desative a campainha para ter o efeito de um "bip" // Sentimos uma batida! delta longo =milis () - lastBeat; // Mede a duração entre dois batimentos lastBeat =millis (); beatsPerMinute =60 / (delta / 1000,0); // Calculando o BPM if (beatsPerMinute <255 &&beatsPerMinute> 20) // Para calcular a média, testamos alguns valores (4) e então fazemos alguns cálculos para calcular a média {rates [rateSpot ++] =(byte) beatsPerMinute; // Armazena esta leitura no array rateSpot% =RATE_SIZE; // Wrap variável // Faz a média das leituras beatAvg =0; para (byte x =0; x  
Biblioteca SparkFun MAX3010x
https://github.com/sparkfun/SparkFun_MAX3010x_Sensor_Library
Adafruit SSD1306
https://github.com/adafruit/Adafruit_SSD1306
Biblioteca Adafruit GFX
https://github.com/adafruit/Adafruit-GFX-Library

Esquemas

Ambos os módulos têm interface i²c, se você estiver usando uma campainha de 2 pinos (-) com GND e (+) com um resistor, então D3

Processo de manufatura

  1. Controlador de jogo Arduino
  2. Transforme seu Raspberry Pi em um Hamster Fitness Tracker
  3. Navalha de segurança
  4. O que é passivação de aço inoxidável?
  5. Roda de medição simples DIY com codificador rotativo
  6. Guia de design UX para idosos