Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Gartenautomation
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Deutsch
  • English
Menu

MAX30100 am Arduino: Blutsauerstoff und Herzfrequenz messen leicht gemacht

Posted on 6. April 20256. April 2025 by Stefan Draeger

Mit dem MAX30100 steht ein kompakter Sensor zur Verfügung, der sowohl die Herzfrequenz als auch den Blutsauerstoffgehalt (SpO₂) messen kann – ideal für einfache Gesundheits- und Fitnessprojekte mit dem Arduino. Ob die Werte dabei wirklich zuverlässig sind, schauen wir uns in diesem Beitrag genauer an. Ich zeige dir, wie du das MAX30100 Breakout Board anschließt, die Messwerte ausliest und sie im seriellen Monitor anzeigst. Die Kommunikation erfolgt über I²C, und dank der integrierten Energiesparfunktionen eignet sich der Sensor auch für batteriebetriebene Projekte.

MAX30100 Herfrequenz und Blutsauerstoff Sensor am Arduino
MAX30100 Herfrequenz und Blutsauerstoff Sensor am Arduino

Einen ähnlichen Sensor habe ich bereits im Beitrag „Arduino Lektion 79: Herzschlag-Pulssensor“ vorgestellt. Damals ging es um einen einfachen Herzschlagsensor, der per Infrarotlicht den Puls erkennen konnte. Der MAX30100 geht jedoch einen Schritt weiter: Er kombiniert Puls- und SpO₂-Messung in einem einzigen Modul und bietet damit deutlich mehr Möglichkeiten für eigene Projekte.

Vorderseite MAX30100 Herzfrequenz & Blutsauerstoff Sensor
Vorderseite MAX30100 Herzfrequenz & Blutsauerstoff Sensor
Rückseite des MAX30100 Sensors
Rückseite des MAX30100 Sensors

Hinweis: Der MAX30100 ist ein Sensor für den Hobby- und DIY-Bereich und nicht für den medizinischen Einsatz geeignet. Die gemessenen Werte können Anhaltspunkte liefern, ersetzen jedoch keinesfalls eine ärztliche Untersuchung oder professionelle Überwachung. Medizinisch zugelassene Geräte aus der Apotheke oder dem Sanitätshaus unterliegen strengen Normen und regelmäßigen technischen Prüfungen – etwas, das wir im Hobbybereich nicht leisten können. Nutze den Sensor daher ausschließlich für experimentelle oder edukative Zwecke.

Inhaltsverzeichnis

  • Vielseitige Einsatzmöglichkeiten des MAX30100
  • Technische Daten des MAX30100 Sensors
  • Bezug und Lieferumfang des MAX30100
  • Überblick über den MAX30100 – Aufbau und Pinbelegung
  • Schaltung: MAX30100 am Arduino UNO R3 anschließen
      • Benötigte Komponenten
      • Verdrahtung
  • Vorbereitung: Leeres Programm zur Rücksetzung der Pins hochladen
  • Bibliothek für den MAX30100 installieren
  • Auslesen der Werte für Herzfrequenz und Blutsauerstoff in der Arduino IDE
    • Hinweise:
  • Anzeigen der Vital-Werte auf einem LC-Display am Arduino
    • Benötigte Bibliothek

Vielseitige Einsatzmöglichkeiten des MAX30100

Der MAX30100 eignet sich hervorragend für Projekte rund um die Überwachung von Vitalwerten, etwa in DIY-Fitness-Trackern, Schlafüberwachungen oder einfachen medizinischen Anwendungen im Hobbybereich. Durch seine kompakte Bauweise lässt sich der Sensor gut in tragbare Geräte integrieren. Neben dem Arduino ist der MAX30100 auch kompatibel mit Mikrocontrollern wie dem ESP32 oder ESP8266 sowie mit dem Raspberry Pi.

Dank der standardisierten I²C-Schnittstelle ist die Anbindung an unterschiedliche Plattformen unkompliziert – ganz gleich, ob du mit der Arduino IDE, MicroPython oder Python arbeitest. Damit ist der Sensor eine ausgezeichnete Wahl für eine Vielzahl von Elektronikprojekten, bei denen es auf Puls- und Sauerstoffsättigungsmessung ankommt.

Technische Daten des MAX30100 Sensors

Bevor wir den Sensor in Betrieb nehmen, lohnt sich ein kurzer Blick auf die technischen Eckdaten. Der MAX30100 kombiniert einen Pulssensor und einen SpO₂-Sensor in einem kompakten Modul und ist für den Betrieb an Mikrocontrollern wie dem Arduino bestens geeignet. Die folgende Tabelle gibt einen Überblick über die wichtigsten Spezifikationen:

EigenschaftWert / Beschreibung
Versorgungsspannung3,3 V
KommunikationI²C (Adresse: 0x57)
MessfunktionenHerzfrequenz und Blutsauerstoffsättigung (SpO₂)
LED-TypenRote LED und Infrarot-LED
AbtastrateProgrammierbar
LED-StromProgrammierbar für Energieeinsparung
Standby-StromSehr niedrig (ultra-low current)
Abmessungenca. 14 × 14 × 3,9 mm

Der Sensor ist ideal für tragbare Projekte geeignet und lässt sich durch die I²C-Schnittstelle unkompliziert integrieren – auch in bestehende Schaltungen.

Bezug und Lieferumfang des MAX30100

Den Sensor bekommst du recht günstig auf Aliexpress.com und ebay.de. In meinem Fall habe ich mir diesen bei ebay.de für 5,92 € inkl. Versandkosten* geholt.

Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!

Lieferumfang des MAX30100 Sensors
Lieferumfang des MAX30100 Sensors

Überblick über den MAX30100 – Aufbau und Pinbelegung

Damit du den MAX30100 korrekt anschließen und in deine Schaltung integrieren kannst, werfen wir einen genaueren Blick auf den Aufbau des Breakout-Boards. Auf dem folgenden Bild habe ich die wichtigsten Komponenten und Pins für dich beschriftet:

Aufbau & Pinout des MAX30100 Sensors
Aufbau & Pinout des MAX30100 Sensors

Beschreibung der markierten Elemente:

  • VIN – Versorgungsspannung (3,3 V)
  • GND – Masse
  • SCL – I²C-Taktleitung
  • SDA – I²C-Datenleitung
  • INT – Interrupt-Ausgang (optional, wird in einfachen Projekten oft nicht verwendet)
  • MAX30100 Chip – Der eigentliche Sensor, der rote und IR-LEDs sowie den Fotodetektor enthält
  • Status-LED – Zeigt an, ob der Sensor aktiv ist (je nach Board vorhanden)

Achte darauf, dass du den Sensor nicht direkt mit 5 V versorgst, da er nur mit 3,3 V betrieben werden darf. Manche Breakout-Boards haben zwar einen Spannungsregler integriert – überprüfe das aber unbedingt vorher im Datenblatt deines Moduls.

Schaltung: MAX30100 am Arduino UNO R3 anschließen

Für den ersten Test schließen wir den MAX30100 Sensor an einen Arduino UNO R3 an. Die gemessenen Werte – Puls und Blutsauerstoff – lassen sich bequem über den seriellen Monitor der Arduino IDE ausgeben oder alternativ mit dem seriellen Plotter grafisch als Liniendiagramm darstellen.

Benötigte Komponenten

  • 1 × Arduino UNO R3*
  • 1 × MAX30100*
  • 1 × 170-Pin Mini-Breadboard*
  • 4 × Breadboardkabel* männlich–männlich, 10 cm (Farben: Rot, Schwarz, Gelb, Grün)

Verdrahtung

Schaltung - Arduino UNO R3 mit MAX30100 Sensor
Schaltung – Arduino UNO R3 mit MAX30100 Sensor
MAX30100 PinFunktionArduino UNO R3 PinKabel-Farbe
VINVersorgung 3,3 V3.3VRot
GNDMasseGNDSchwarz
SDAI²C DatenleitungA4 (SDA)Gelb
SCLI²C TaktleitungA5 (SCL)Grün

Vorbereitung: Leeres Programm zur Rücksetzung der Pins hochladen

Bevor wir den MAX30100 anschließen und mit der eigentlichen Programmierung beginnen, empfehle ich einen kleinen, aber hilfreichen Zwischenschritt: Lade zunächst ein leeres Programm auf deinen Arduino, um sicherzustellen, dass alle Pins wieder auf ihren Standardzustand (Input) zurückgesetzt werden.

Gerade wenn zuvor ein anderes Sketch geladen war, in dem Pins als Ausgänge oder mit bestimmten Pegeln konfiguriert wurden, kann das bei sensiblen Sensoren wie dem MAX30100 zu unerwünschtem Verhalten oder sogar Schäden führen.

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

Bibliothek für den MAX30100 installieren

Für die Programmierung des MAX30100-Sensors findest du im Bibliotheksverwalter der Arduino IDE zahlreiche Bibliotheken. Ich verwende in diesem Beitrag die einfach gehaltene Bibliothek aus dem GitHub-Repository oxullo/Arduino-MAX30100.

Diese Bibliothek ist schlank, verständlich aufgebaut und bringt zudem einige Beispielsketches mit, die wir fast direkt verwenden können – ideal für den Einstieg in die Arbeit mit dem Sensor.

Auslesen der Werte für Herzfrequenz und Blutsauerstoff in der Arduino IDE

Starten wir zunächst mit einem einfachen Beispiel aus der Bibliothek von oxullo für den MAX30100 Sensor. Hier wird auf dem seriellen Monitor die Daten ausgegeben. Jedoch möchte ich diese im seriellen Plotter ausgeben.

Ausgabe der Herzfrequenz & Blutsauerstoff des MAX30100 Sensors in der Arduino IDE
Ausgabe der Herzfrequenz & Blutsauerstoff des MAX30100 Sensors in der Arduino IDE
Beispiel Programm für den MAX30100 Sensor am Arduino
// Inkludiere die benötigten Bibliotheken für I²C-Kommunikation und den MAX30100-Sensor
#include <Wire.h>
#include "MAX30100_PulseOximeter.h"

// Intervall für die Ausgabe der Messwerte (in Millisekunden)
#define REPORTING_PERIOD_MS 1000

// Erzeuge ein Objekt für den Sensor
PulseOximeter pox;

// Variable, um den Zeitpunkt der letzten Ausgabe zu speichern
uint32_t tsLastReport = 0;

// Diese Funktion wird aufgerufen, wenn ein Herzschlag erkannt wird
void onBeatDetected() {
  Serial.println("Beat!");  // Ausgabe im seriellen Monitor
}

void setup() {
  // Initialisiere die I²C-Schnittstelle
  Wire.begin();
  
  // Starte die serielle Kommunikation mit 9600 Baud
  Serial.begin(9600);
  Serial.print("Initialisierung des Sensors MAX30100");

  // Versuche, den Sensor zu starten
  if (!pox.begin()) {
    Serial.println("Sensor wurde nicht gefunden!");
    Serial.println("Überprüfe die Verkabelung!");
    
    // Endlosschleife, wenn der Sensor nicht erkannt wurde
    while (true) {
    }
  }

  // Setze den LED-Strom der Infrarot-LED (mögliche Werte siehe Bibliothek)
  pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);

  // Optional: Reaktion auf Herzschlag registrieren
  // pox.setOnBeatDetectedCallback(onBeatDetected);
}

void loop() {
  // Aktualisiere die Sensorwerte intern (wichtig für die kontinuierliche Messung)
  pox.update();

  // Aktuelle Zeit in Millisekunden
  long currentMillis = millis();

  // Überprüfe, ob das Intervall seit der letzten Ausgabe erreicht ist
  if ((currentMillis - tsLastReport) > REPORTING_PERIOD_MS) {
    tsLastReport = currentMillis;

    // Ausgabe der gemessenen Herzfrequenz und Sauerstoffsättigung
    Serial.print("Herzfrequenz:");
    Serial.print(pox.getHeartRate());
    Serial.print(",");
    Serial.print("Blutsauerstoff:");
    Serial.print(pox.getSpO2());
    Serial.println("%");
  }
}

Hinweise:

  • Die Funktion pox.update(); muss regelmäßig im Loop aufgerufen werden, da dort die Messung verarbeitet wird.
  • Die Ausgabe erfolgt einmal pro Sekunde durch die REPORTING_PERIOD_MS Definition.
  • Die onBeatDetected()-Callback-Funktion ist derzeit auskommentiert, kann aber bei Bedarf aktiviert werden, um Herzschläge zusätzlich zu signalisieren.

Beim ausführen des Codes sind zwei Fehler aufgetreten zum einen ist der Blutsauerstoff öfters auf 0 gesunken und auch mal > 100% beides sind fälle welche man durch eine If-Bedingung entfernen kann da dieses nicht eintreffen kann.

// Lese aktuelle Messwerte vom Sensor aus
float herzfrequenz = pox.getHeartRate();     // Herzfrequenz in bpm (beats per minute)
int blutsauerstoff = pox.getSpO2();          // Sauerstoffsättigung in Prozent

// Überprüfe, ob der Wert für Blutsauerstoff realistisch ist
// Gültige Werte liegen typischerweise zwischen 70 und 100 %
// Werte <= 0 oder > 100 treten bei fehlerhafter Messung auf und sollen ignoriert werden
if (blutsauerstoff > 0 && blutsauerstoff <= 100) {
  Serial.print("Herzfrequenz: ");
  Serial.print(herzfrequenz);
  Serial.print(", ");
  Serial.print("Blutsauerstoff: ");
  Serial.print(blutsauerstoff);
  Serial.println("%");
}

Anzeigen der Vital-Werte auf einem LC-Display am Arduino

Statt die Messwerte nur über die serielle Schnittstelle anzuzeigen, können wir sie auch direkt auf einem LC-Display ausgeben. Das ist besonders praktisch, wenn du das Projekt ohne PC betreiben möchtest – zum Beispiel mobil oder in einem Gehäuse.

Für diese Anwendung reicht ein einfaches 20×2-Zeichen-Display völlig aus, da wir lediglich zwei Werte darstellen: die Herzfrequenz (HF) und die Blutsauerstoffsättigung (SpO₂). Solche LCDs gibt es in verschiedenen Größen und Varianten – oft schon mit I²C-Modul, was die Verdrahtung deutlich vereinfacht.

Für die Schaltung benötigen wir:

  • einen Arduino UNO R3*
  • einen MAX30100 Sensor*
  • ein LC-Display mit I2C Schnittstelle*
  • vier Breadboardkabel*, männlich-männlich, 10cm
  • vier Breadboardkabel*, männlich-weiblich, 10cm
  • ein 170 Pin Breadboard*
Schaltung - Arduino UNO R3 mit MAX30100 Sensor und LC-Display
Schaltung – Arduino UNO R3 mit MAX30100 Sensor und LC-Display

Wie du ein LC-Display am Arduino programmierst, habe ich dir bereits in mehreren Beiträgen auf meinem Blog für verschiedene Mikrocontroller gezeigt. An dieses Wissen möchte ich hier anknüpfen und dir zeigen, wie du die Vitalwerte des MAX30100 direkt auf dem Display ausgeben kannst.

Da der Sensor bereits über die serielle Schnittstelle kommuniziert, nutzen wir für das LCD die I²C-Verbindung, um Pins zu sparen und die Verdrahtung zu vereinfachen.

Benötigte Bibliothek

Die Arduino IDE bringt bereits eine LiquidCrystal-Bibliothek mit – jedoch nur für den parallelen Anschluss. Für die Verwendung über I²C benötigen wir eine spezielle Version:

Diese findest du im GitHub-Repository johnrickman/LiquidCrystal_I2C.
Lade die ZIP-Datei herunter und installiere sie in der Arduino IDE über:
„Sketch → Bibliothek einbinden → .ZIP-Bibliothek hinzufügen …“

Nach der Installation steht dir der gewohnte Befehl lcd.print() auch für I²C-Displays zur Verfügung – ideal für kompakte Projekte mit wenigen Leitungen.

#include <Wire.h>                           // Bibliothek für I²C-Kommunikation
#include "MAX30100_PulseOximeter.h"         // Bibliothek für den MAX30100 Sensor
#include <LiquidCrystal_I2C.h>              // Bibliothek für I²C-LCD Displays

#define REPORTING_PERIOD_MS 1000            // Aktualisierungsintervall für die Anzeige (1 Sekunde)

// Erzeuge ein Objekt für den MAX30100-Sensor
PulseOximeter pox;

// Zeitpunkt der letzten Anzeige
uint32_t tsLastReport = 0;

// Initialisiere das I²C-LCD (Adresse 0x27, 20 Zeichen, 2 Zeilen)
LiquidCrystal_I2C lcd(0x27, 20, 2);

void setup() {
  Wire.begin();                             // Starte die I²C-Kommunikation
  Serial.begin(9600);                       // Serielle Schnittstelle starten
  Serial.print("Initialisierung des Sensors MAX30100");

  lcd.init();                               // Initialisiere das LCD
  lcd.backlight();                          // Hintergrundbeleuchtung einschalten

  // Initialisiere den MAX30100 Sensor
  if (!pox.begin()) {
    Serial.println("Sensor wurde nicht gefunden!");
    Serial.println("Überprüfe die Verkabelung!");
    while (true) {
      // Endlosschleife bei Fehler
    }
  }

  // Setze den Strom der Infrarot-LED (niedrig, um Energie zu sparen)
  pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA);
}

void loop() {
  pox.update();                             // Sensorwerte intern aktualisieren

  long currentMillis = millis();
  if ((currentMillis - tsLastReport) > REPORTING_PERIOD_MS) {
    tsLastReport = currentMillis;

    // Werte vom Sensor abfragen
    int herzfrequenz = round(pox.getHeartRate());  // Herzfrequenz auf ganze Zahl runden
    int blutsauerstoff = pox.getSpO2();            // SpO₂-Wert als Integer

    // Nur gültige Werte anzeigen (SpO₂ muss im Bereich 1–100% liegen)
    if (blutsauerstoff > 0 && blutsauerstoff <= 100) {
      
      // Serielle Ausgabe für Debugging oder Plotter
      Serial.print("Herzfrequenz:");
      Serial.print(herzfrequenz);
      Serial.print(",");
      Serial.print("Blutsauerstoff:");
      Serial.print(blutsauerstoff);
      Serial.println("%");
      
      // Leeren der LCD Anzeige
      lcd.clear();
      // Ausgabe auf dem LCD
      lcd.setCursor(0, 0);                         // Erste Zeile, erste Spalte
      lcd.print("HF: " + String(herzfrequenz) + " bpm");
      
      lcd.setCursor(0, 1);                         // Zweite Zeile, erste Spalte
      lcd.print("SpO2: " + String(blutsauerstoff) + "%");
    }
  }
}

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen
Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

link zu Fabook
link zu LinkedIn
link zu YouTube
link zu TikTok
link zu Pinterest
link zu Instagram
  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}