Skip to content

Technik Blog

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

Menu
  • About me
  • Contact
  • Deutsch
  • English
Menu

How To Build an Arduino Pulse Oximeter

Posted on 1. April 20251. April 2025 by Stefan Draeger

A pulse oximeter takes advantage of the blood’s changing properties when carrying oxygen or carbon dioxide around the body. Oxygenated hemoglobin in the red blood cells absorbs more infrared light while letting red light pass through, giving blood its red color. But when carrying carbon dioxide, hemoglobin becomes dark red, so it absorbs more red light while allowing infrared to pass through.

With these properties, it is possible to build a pulse oximeter using an Arduino board and a MAX30100 sensor, which has a red light, infrared LED, and a photodetector. Here’s how to set up the project.

How To Setup the Arduino Pulse Oximeter Project

We’ll use an Arduino UNO board with the MAX30100 sensor to set up the pulse oximeter. Make the following connections between the two using jumper wires.

Arduino UNOMAX30100
A5SCL
A4SDA
GNDGND
5VVin/Vcc

Circuit Diagram

Circuit MAX30100 at Arduino UNO R3
Circuit MAX30100 at Arduino UNO R3

How The Arduino Pulse Oximeter Works

To understand this system, let’s first look at the internal operations of this sensor. It turns on the red and infrared LEDs one at a time, then checks the light that reflects from the patient’s finger using its photodetector. This detection determines the blood oxygen level and heart rate.

For heart rate measuring, the MAX30100 uses these same LEDs and photodetector but in a slightly different way. As the heart pumps oxygenated blood through the arteries and capillaries, it creates bursts of high and low-pressure blood movement where infrared light passes through at different intensities, which can be mapped on a graph. So turning on the infrared LED continuously and detecting its reflection from the finger will create a map where the detected light dips and rises to correspond with the patient’s heart rate.

MAX30100 Technical Specifications

The MAX30100 is a compact and efficient heart rate and pulse oximeter sensor that combines two LEDs, a photodetector, optical elements, and low-noise electronics with ambient light rejection. To better understand how to integrate this sensor into your project, here’s a quick overview of its key technical specifications.

FeatureSpecification
Operating Voltage (Chip)1.8 V
LED Voltage3.3 V (each LED)
Power Supply OptionsCan be powered via 3.3 V or 5 V from Arduino UNO
Voltage Regulators Needed1.8 V and 3.3 V regulators
Temperature Sensor Accuracy±1 °C
On-Chip Temperature SensorYes, used for calibration
FIFO BufferYes, stores up to 16 samples to reduce power usage
Interrupt FeaturesPower ready, Heart rate ready, FIFO almost full, Temperature ready, SpO2 ready
INT Pin UsageSignals data readiness or status via interrupt

These features make the MAX30100 a powerful choice for health monitoring projects, especially when low power consumption and precise measurements are required. As your project evolves, you can make full use of its advanced capabilities such as interrupts and onboard data buffering.

Arduino Code

With the circuit ready, connect the Arduino UNO to your computer, download and install this MAX30100 library to your Arduino IDE, then paste the following code.

How the Code Works

The reporting period refers to the update frequency for collecting the data samples, which is set to one second. Next is the declaration of the pulse meter pox object, which we’ll use in the setup and loop sections, and then the variable for holding the last detected heartbeat. This variable is followed by the “on beat detected function”, which simply displays the word beat when the sensor detects a beat.

In the void setup function, the code prints the initialization message on the screen and then initializes the sensor to detect any errors beforehand. By default, the sensor powers the infrared LEDs using 50mA but this is too high and can cause issues during initialization. So we set the current draw to 7.6mA using the pox object, then register the call back function (on beat detected), which we defined earlier.

The loop function handles the reading because it runs repetitively. It begins by reading the sensor value using the update function call, while the if function prints the heart rate and oxygen level every second. After that, the last report variable is set to the current time to ensure the loop function runs the if statement again after one second to display the heart rate and oxygen levels as a percentage in real-time.

Some Minor Improvements

The setup above is all good, but the readings only show or print on the Arduino IDE. What if you want a separate, independent display to view the output? You can introduce an LCD module by connecting it in this setup.

Arduino UNOLCD Module (16×2)
A5SCL
A4SDA
5VVcc
GNDGND

Download and install this liquid crystal library to the IDE, then make these modifications to the code.

How The Code Works

Since the liquid crystal library contains wire.h, there’s no need to include it. So the first modification is to type the LCD object with its address, columns, and rows. The setup function initializes the display (LCD object), turns on its backlight, and shows the text “initializing” for three seconds.

In the loop function, the LCD object clears the screen and then sets the cursor to the top row to print the heart rate from left to right. After that, the cursor moves to the bottom row and prints the oxygen level in the same direction. This happens every second, displaying real-time data from the sensor.

What Next?

Once this prototype is fully functional, the next step is to get a PCB made specifically for this task in a compact form factor. I recommend a medical PCB for this project to ensure maximum reliability in a tiny package. You can check out this PCB manufacturing and assembly service from OurPCB to learn more about the process and benefits you’ll get, plus request a free quote to get an estimate of what you’ll spend.

Final Thoughts

Building an Arduino pulse oximeter is a simple project that you can easily prototype to get to the final product. But to stand out when launching the final product, I recommend making it tiny, which means taking advantage of OurPCB’s medical PCB fabrication and assembly service. Contact them for more details.

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

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

Categories

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

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Cookies, um unsere Website und unseren Service zu optimieren.
Funktional Always active
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.
Manage options Manage services Manage {vendor_count} vendors Read more about these purposes
Einstellungen anzeigen
{title} {title} {title}