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.
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.
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
- 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
- Anzeigen der Vital-Werte auf einem LC-Display am Arduino
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:
Eigenschaft | Wert / Beschreibung |
---|---|
Versorgungsspannung | 3,3 V |
Kommunikation | I²C (Adresse: 0x57) |
Messfunktionen | Herzfrequenz und Blutsauerstoffsättigung (SpO₂) |
LED-Typen | Rote LED und Infrarot-LED |
Abtastrate | Programmierbar |
LED-Strom | Programmierbar für Energieeinsparung |
Standby-Strom | Sehr niedrig (ultra-low current) |
Abmessungen | ca. 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!
Ü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:
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
MAX30100 Pin | Funktion | Arduino UNO R3 Pin | Kabel-Farbe |
---|---|---|---|
VIN | Versorgung 3,3 V | 3.3V | Rot |
GND | Masse | GND | Schwarz |
SDA | I²C Datenleitung | A4 (SDA) | Gelb |
SCL | I²C Taktleitung | A5 (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.
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*
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) + "%"); } } }