DIY Pulse Oximeter Circuit Design with Sensor and Signal Processing Guide

For reliable SpO2 readings, use a MAX30100 or MAX30102 sensor IC as the core component–these chips integrate red and infrared LEDs with photodetectors, eliminating the need for discrete op-amps. Pair the sensor with a microcontroller like STM32F103 or Arduino Nano for signal processing, ensuring 1.8V power supply regulation to avoid noise distortion in detection.
Implement a four-wire SPI interface for communication instead of I2C if real-time data throughput is critical. Add a 220μF tantalum capacitor close to the sensor’s power pin to filter sudden current spikes from LED pulses (typically 50–400Hz). For analog signal conditioning, use a TL072 op-amp in transimpedance configuration to convert photodetector current into a usable voltage range (0–3.3V).
Avoid parasitic oscillations by keeping PCB traces under 10mm for high-frequency switching components. Use ground planes beneath the sensor and analog circuitry to shield against EMI. For calibration, expose the sensor to known SpO2 levels (e.g., 98% room air, 85% simulated hypoxia) and adjust LED current via firmware (typical values: 50mA for IR, 20mA for red).
Critical failure modes include motion artifacts and ambient light interference. Counter these by mounting the sensor in a rigid, opaque housing and implementing DC removal filters in software (high-pass cutoff ~0.1Hz). For power efficiency, disable LEDs between measurements–idle current should not exceed 1mA. Test signal integrity with an oscilloscope before final assembly.
Designing a Pulse Oxygen Measurement Schematic

Begin by selecting a red LED (660 nm) and an infrared LED (940 nm) as primary light sources. These wavelengths ensure accurate differentiation between oxygenated and deoxygenated hemoglobin. Position LEDs at a 10–15 mm distance from the photodiode to optimize signal detection on fingertip applications. Ensure the photodiode has a spectral response matching the LED outputs–common models include BPW34 or TEMD5000. Use a current-limiting resistor for each LED (e.g., 220 Ω for 5V supply) to prevent overheating and maintain consistent emission.
The signal conditioning stage requires a transimpedance amplifier to convert the photodiode’s current into a measurable voltage. Configure the amplifier with a feedback resistor (e.g., 1 MΩ) and capacitor (e.g., 10 pF) to filter noise. A dual-op-amp like TL072 works well here–one amplifier for red, another for infrared. Follow this with a bandpass filter (0.5–4 Hz) to isolate pulse-related signals from ambient noise and motion artifacts. Use RC components (R=10 kΩ, C=1 μF) for a simple passive filter, or active filtering with an LM358 for sharper roll-off.
For analog-to-digital conversion, employ a microcontroller with at least 10-bit resolution. The Arduino Nano or STM32F103 are practical choices, offering sufficient sampling rates (50–100 Hz) to capture pulse waveforms. Allocate two ADC channels–one for each wavelength–and calibrate offsets by measuring ambient light before enabling LEDs. Implement software-based timing control (e.g., PWM at 1 kHz) to alternate LED pulses, minimizing crosstalk and power consumption.
| Component | Model/Spec | Key Parameters |
|---|---|---|
| Red LED | LTL-307EE | 660 nm, 20 mA forward current |
| Infrared LED | VSMB2000X01 | 940 nm, 100 mW/sr radiant intensity |
| Photodiode | TEMD5000 | 800–1050 nm spectral range, 50 nA/μW sensitivity |
| Op-Amp | TL072 | Low noise, 1 mV offset voltage |
| MCU | STM32F103C8T6 | 12-bit ADC, 72 MHz clock |
Calibrate the system by collecting baseline data from both wavelengths under controlled conditions (e.g., fully oxygenated blood mimic). Store ratios of red/infrared signals for known SpO₂ values (e.g., 98% and 85%) to derive a linear approximation formula. Adjust for ambient light by subtracting idle readings (LEDs off) from active measurements. To enhance accuracy, average 5–10 samples per reading and discard outliers exceeding 10% variance. For display, integrate a 0.96″ OLED (SSD1306) with SPI/I2C interface, refreshing at 1 Hz to conserve power.
Power the entire setup with a regulated 3.3V or 5V source, ensuring stable output for LEDs and analog components. Use AP2112K for 3.3V or AMS1117 for 5V regulation. Isolate digital and analog grounds to prevent interference–connect grounds at a single point near the power source. For portable designs, a LiPo battery (500 mAh) with a TP4056 charging module provides 6–8 hours of operation. Test under varying conditions (e.g., low perfusion, motion) to validate robustness.
Core Elements for Assembling a Pulse Rate Sensor System
Select a microcontroller with analog-to-digital conversion (ADC) capabilities and a sampling rate of at least 100 Hz. The ATmega328P or STM32F103C8T6 offer sufficient processing power for real-time signal analysis while maintaining low power consumption. Ensure the chosen unit includes at least two 12-bit ADC channels to capture both red and infrared light signals simultaneously. Pair it with a 16 MHz crystal oscillator for stable timing–deviations above 0.5% will distort readings.
Critical Light-Emitting and Detection Components
- Opt for high-output LEDs with peak wavelengths of 660 nm (red) and 940 nm (infrared). Kingbright KPH-0603SRC-D or Osram SFH 4259 provide the necessary intensity with nominal forward currents of 20–50 mA.
- Use a photodiode with a large active area (≥7 mm²) and high responsivity at target wavelengths. The BPW34 or TEFD4300 are optimized for medical-grade signal detection, offering 0.6 A/W sensitivity at 940 nm.
- Position emitters and detector at a fixed 10–15 mm distance, angled to avoid direct light leakage. Add a black silicone sleeve to block ambient interference.
Implement a low-noise amplification stage using a transimpedance amplifier with a feedback resistor between 1–10 MΩ. The OPA333 or LTC1050 offer ultra-low input bias current (≤10 pA) and 0.1–10 Hz noise levels below 1.5 µV PP. Add a 0.1 Hz high-pass filter to eliminate DC drift from tissue absorption, followed by a 10 Hz low-pass filter to reject motion artifacts. For power, use a 3.3V LDO regulator with ≤30 µV RMS noise (e.g., TPS7A47) and separate digital/analog ground planes to minimize cross-talk.
Calculating LED Current and Photodetector Responsiveness
Set the forward current for red LEDs at 8–12 mA and infrared LEDs at 10–15 mA to ensure sufficient light output without overheating. Use a series resistor calculated via R = (Vsupply – VLED) / ILED; for a 5 V supply and red LED with Vf = 1.8 V, R = (5 – 1.8) / 0.01 = 320 Ω. Select 1% tolerance resistors to maintain consistency across multiple measurements.
Photodetector sensitivity peaks between 0.4–0.6 A/W for silicon PIN diodes under red (660 nm) and near-infrared (940 nm) wavelengths. Verify datasheet spectral response curves–cheaper models often drop below 0.3 A/W at 940 nm. Amplify output via transimpedance topology: Vout = Iphoto × Rf, where Rf spans 100 kΩ to 1 MΩ. Use low-noise op-amps (e.g., OPA333) to mitigate drift; input bias current should stay below 100 pA.
Match LED drive pulses to detector sampling windows–mismatches above 10 µs degrade signal-to-noise ratio. Validate photodetector dark current ( 10 nA) corrupt low-level readings. Calibrate by exposing the assembly to known optical densities (e.g., neutral density filters OD 0.3–1.0); log detector output voltage against LED current to confirm linearity within ±2%.
Step-by-Step Wiring of Red and Infrared LEDs for Pulse Detection
Begin by selecting LEDs with precise wavelengths: 660 nm for red and 940 nm for infrared. These values optimize absorption differences between oxygenated and deoxygenated hemoglobin. Verify LED specifications against supplier datasheets to avoid spectral overlap, which distorts signal accuracy.
Use a current-limiting resistor for each LED. Calculate resistance using Ohm’s law:
- Red LED: For a 3.3V supply and 20 mA forward current,
R = (3.3V - 2.1V) / 0.02A = 60Ω. Round up to the nearest standard value (68Ω). - Infrared LED: With a 1.5V forward voltage,
R = (3.3V - 1.5V) / 0.02A = 90Ω. Use 100Ω.
Exceeding the rated current degrades LED performance and reduces lifespan.
Wire the LEDs in antiparallel configuration. Connect the red LED anode to the infrared LED cathode and vice versa. This alternation ensures only one LED emits light at a time, preventing signal crosstalk. Use a microcontroller to toggle them at 500 Hz–sufficient for detecting pulsatile signals without aliasing.
Position a photodiode opposite the LEDs with minimal separation (1–2 mm). Choose a photodiode with high responsivity at 660 nm and 940 nm, such as the BPW34 or SFH2201. Shield the assembly with an opaque enclosure to block ambient light, which can introduce noise. Verify shielding effectiveness by measuring photodiode output in a dark room; it should read near zero.
Secure the LEDs and photodiode to a rigid substrate–acrylic works well–to maintain alignment. Misalignment by even 0.5 mm reduces signal strength by 30–40%. Use non-conductive adhesive (e.g., UV-cured epoxy) to avoid short circuits. Test stability by tapping the setup; output fluctuations indicate loose components.
Connect the photodiode to a transimpedance amplifier (TIA). For a 100 kΩ feedback resistor, the TIA converts photodiode current (
Validate the setup by placing a finger between the LEDs and photodiode. A healthy pulse should produce distinct AC signals superimposed on DC levels:
- Baseline DC: ~200 mV (red), ~150 mV (infrared)–varies by skin tone and thickness.
- AC amplitude: 1–10 mV, corresponding to arterial pulsations.
If AC signals are absent or