Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Surveillance Précise Fréquence Cardiaque & SpO₂ avec MAX30102 sur Arduino

Composants et Fournitures

ComposantQuantitéRemarques
Arduino UNO1Contrôleur
Écran OLED 128x32 (Adafruit)1Affichage BPM + animation
Buzzer1Bip synchrone battements
MAX30102 (Maxim Integrated) – Oxymètre Pouls Haute Sensibilité1Capteur fréquence cardiaque + SpO₂

À Propos du Projet

Introduction

Tutoriel : interface MAX30102 (oxymétrie pouls + fréquence cardiaque) avec Arduino UNO, puis projet mesure BPM avec écran OLED et buzzer.

Module MAX30102 existe en plusieurs versions (ex: WAVGAT) – fonctionne tant que le CI est un MAX30102 authentique.

Composants Utilisés

Surveillance Précise Fréquence Cardiaque & SpO₂ avec MAX30102 sur Arduino
Surveillance Précise Fréquence Cardiaque & SpO₂ avec MAX30102 sur Arduino
Surveillance Précise Fréquence Cardiaque & SpO₂ avec MAX30102 sur Arduino
Surveillance Précise Fréquence Cardiaque & SpO₂ avec MAX30102 sur Arduino

Tests & Code

Codes basés sur exemples bibliothèque SparkFun_MAX3010x. Projet OLED+Buzzer = version modifiée exemple « HeartRate » : invite à placer doigt sur capteur.

Surveillance Précise Fréquence Cardiaque & SpO₂ avec MAX30102 sur Arduino

Garder doigt immobile jusqu'à bip buzzer synchronisé ou animation OLED synchronisée → lecture BPM moyenne (moyenne 4 valeurs) plus précise.

Surveillance Précise Fréquence Cardiaque & SpO₂ avec MAX30102 sur Arduino

Créer Bitmaps pour OLED

Deux bitmaps cœur (petit / grand) alternés à chaque battement détecté + bip buzzer.

Surveillance Précise Fréquence Cardiaque & SpO₂ avec MAX30102 sur Arduino

Procédure (LCD Assistant)

  1. Image noir/blanc (fond blanc) taille ≤ écran (128x32). Mes bitmaps : 32x32 et 24x21 px.
  2. Télécharger LCD Assistant.
  3. Ouvrir image → paramètres : Orientation horizontal, 8 bits, Little Endian, etc. (voir captures).
  4. Enregistrer sortie → tableau bytes C.
Surveillance Précise Fréquence Cardiaque & SpO₂ avec MAX30102 sur Arduino
Surveillance Précise Fréquence Cardiaque & SpO₂ avec MAX30102 sur Arduino
Surveillance Précise Fréquence Cardiaque & SpO₂ avec MAX30102 sur Arduino
Surveillance Précise Fréquence Cardiaque & SpO₂ avec MAX30102 sur Arduino
Surveillance Précise Fréquence Cardiaque & SpO₂ avec MAX30102 sur Arduino
Surveillance Précise Fréquence Cardiaque & SpO₂ avec MAX30102 sur Arduino

Utilisation dans Code

display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE);
// display.drawBitmap(x, y, bitmap_name, width, height, color);

logo2_bmp (petit cœur) affiché quand doigt détecté. logo3_bmp (grand cœur) affiché quand battement détecté.

Code Complet (MAX_BPM_OLED_Buzzer.ino)

/* MAX30102 + OLED 128x32 I2C + Buzzer + Arduino UNO
 * Affiche BPM moyen, animation cœur, bip buzzer à chaque pouls
 * Basé sur exemple HeartRate bibliothèque SparkFun MAX3010x
 * Réf: www.surtrtech.com / chaîne YouTube SurtrTech
 */
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"

MAX30105 particleSensor;
const byte RATE_SIZE = 4;
byte rates[RATE_SIZE];
byte rateSpot = 0;
long lastBeat = 0;
float beatsPerMinute;
int beatAvg;

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Bitmap petit cœur (24x21)
static const unsigned char PROGMEM logo2_bmp[] = {
  0x03, 0xC0, 0xF0, 0x06, 0x71, 0x8C, 0x0C, 0x1B, 0x06, 0x18, 0x0E, 0x02,
  0x10, 0x0C, 0x03, 0x10, 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
};

// Bitmap grand cœur (32x32)
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, 0x14, 0x00, 0x40, 0x10, 0x12, 0x00,
  0x40, 0x10, 0x12, 0x00, 0x7E, 0x1F, 0x23, 0xFE, 0x03, 0x31, 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
};

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();
  delay(3000);
  particleSensor.begin(Wire, I2C_SPEED_FAST);
  particleSensor.setup();
  particleSensor.setPulseAmplitudeRed(0x0A); // LED rouge faible = capteur actif
}

void loop() {
  long irValue = particleSensor.getIR();
  if (irValue > 7000) { // Doigt détecté
    display.clearDisplay();
    display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE);
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(50, 0); display.println("BPM");
    display.setCursor(50, 18); display.println(beatAvg);
    display.display();

    if (checkForBeat(irValue)) { // Battement détecté
      display.clearDisplay();
      display.drawBitmap(0, 0, logo3_bmp, 32, 32, WHITE);
      display.setTextSize(2);
      display.setTextColor(WHITE);
      display.setCursor(50, 0); display.println("BPM");
      display.setCursor(50, 18); display.println(beatAvg);
      display.display();
      tone(3, 1000); delay(100); noTone(3); // Bip 100 ms

      long delta = millis() - lastBeat;
      lastBeat = millis();
      beatsPerMinute = 60 / (delta / 1000.0);
      if (beatsPerMinute < 255 && beatsPerMinute > 20) {
        rates[rateSpot++] = (byte)beatsPerMinute;
        rateSpot %= RATE_SIZE;
        beatAvg = 0;
        for (byte x = 0; x < RATE_SIZE; x++) beatAvg += rates[x];
        beatAvg /= RATE_SIZE;
      }
    }
  } else { // Pas de doigt
    beatAvg = 0;
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(30, 5); display.println("Please Place");
    display.setCursor(30, 15); display.println("your finger");
    display.display();
    noTone(3);
  }
}

Bibliothèques Requises

Schéma de Câblage

Les deux modules (MAX30102, OLED) en I²C (bus commun). Buzzer 2 broches : (-) → GND, (+) → résistance → D3.

Surveillance Précise Fréquence Cardiaque & SpO₂ avec MAX30102 sur Arduino

Processus de fabrication

  1. Système de contrôle d'accès intégré QR, RFID et vérification de température
  2. Connecter plusieurs capteurs DS18B20 1-Wire à un Raspberry Pi pour une surveillance température précise
  3. Construire un système aéroponique automatisé avec Raspberry Pi et capteur d'humidité
  4. Système de surveillance cardiaque à distance avec alertes AWS IoT
  5. Construire un robot avec Raspberry Pi et Python : Guide complet
  6. Intégration d'un capteur thermocouple avec l'Arduino Portenta H7 via le MAX6675
  7. Construire un jeu gyroscopique temps réel avec Arduino Nano et capteur MPU-6050
  8. Moniteur de Fréquence Cardiaque IoT en Temps Réel avec Arduino et MAX30100
  9. Optimiser l'espace d'atelier avec Visual Components, Matterport & Automatisation ProFeeder X