Community project

Necesito Hacer Un Circuito De Un Oxiometro Con

Arduino
Photo of Necesito Hacer Un Circuito De Un Oxiometro Con
Generated with AI

MARIA PAULA LAMBOGLIA VARGAS

Last updated September 25, 2026

This guide builds a photoplethysmography (PPG) sensor using red and infrared LEDs to detect light absorption changes in tissue. The circuit uses an LM358 operational amplifier to condition the weak photodiode signal before sending it to an Arduino Uno for processing and analysis.

Readers will receive a complete wiring diagram, parts list, step-by-step assembly instructions for the optical sensor head, and Arduino firmware that captures red and infrared signals via CSV output. The project demonstrates how PPG sensors work and provides a foundation for exploring optical sensing, though it is not calibrated for clinical pulse oximetry measurements.

Wiring diagram

Wiring diagram for Necesito Hacer Un Circuito De Un Oxiometro Con

Gather all the parts

QtyComponent
1

LED rojo de 660 nm

660 nm, 5 mm

El LED rojo que atraviesa el dedo para producir la señal óptica roja.

1

LED infrarrojo de 940 nm

940 nm, 5 mm

El LED infrarrojo invisible que atraviesa el dedo para producir la señal óptica infrarroja.

1

Fotodiodo receptor infrarrojo de 5 mm

receptor infrarrojo, 5 mm

El pequeño receptor de 5 mm que convierte la luz roja e infrarroja que atraviesa el dedo en una señal eléctrica.

1

LM358 Dual Operational Amplifier

LM358P, DIP-8

Dual op-amp in 8-pin DIP (or breakout module exposing the same pinout via headers). Operates from a 3–32 V single supply (or ±1.5 V to ±16 V dual supply); output swings near GND on the low side and to about VCC−1.5 V on the high side. The breakout-module form factor shares the same pinout as the bare LM358 DIP-8.

1

Resistor

220 Ω, 1/4 W

Through-hole resistor (current-limiting in series with an LED)

1

Resistor

220 Ω, 1/4 W

Through-hole resistor (current-limiting in series with an LED)

1

Resistor

330 kΩ, 1/4 W

La resistencia que convierte la corriente muy pequeña del fotodiodo en una señal de voltaje para el amplificador.

1

Condensador de acoplo de entrada

4.7 µF electrolítico, ≥10 V

El condensador que bloquea el nivel fijo del fotodiodo y deja pasar los cambios pequeños de luz hacia el amplificador.

1

Resistor

100 kΩ, 1/4 W

Through-hole resistor (current-limiting in series with an LED)

1

Resistor

10 kΩ, 1/4 W

Through-hole resistor (current-limiting in series with an LED)

1

Resistor

10 kΩ, 1/4 W

Through-hole resistor (current-limiting in series with an LED)

1

Condensador de referencia

10 µF electrolítico, ≥10 V

Hace estable y silenciosa la referencia de 2.5 V.

1

Resistor

100 kΩ, 1/4 W

Through-hole resistor (current-limiting in series with an LED)

1

Resistor

10 kΩ, 1/4 W

Through-hole resistor (current-limiting in series with an LED)

1

Condensador de filtro pasa-bajos

100 nF cerámico

Reduce cambios rápidos y ruido en la salida del amplificador.

1

Condensador de desacoplo del LM358

100 nF cerámico

Evita que los pulsos de los LED metan ruido en la alimentación del amplificador.

Assemble it in 6 steps

1. Coloca las piezas y bloquea la luz exterior

Con el Arduino desconectado, coloca el LED rojo red_led_660 y el LED infrarrojo ir_led_940 juntos a un lado de la yema del dedo. Coloca el fotodiodo receptor de 5 mm phototransistor enfrente, al otro lado del dedo. Rodéalos con cartulina, espuma o tubo negro para que la luz de la habitación no llegue al receptor.

  • El LED infrarrojo no se ve a simple vista; una cámara de móvil suele mostrarlo como un brillo violeta tenue.
  • El receptor de 5 mm también detecta luz ambiente, por eso tapar el conjunto mejora mucho la curva.
  • No mires de cerca al LED infrarrojo encendido durante mucho tiempo; aunque no se vea, emite luz.
  • Esto es un demostrador de señal óptica; no sirve para tomar decisiones médicas.

2. Conecta los dos LED

Conecta D5 a una pata de r_red_220 de 220 Ω y la otra pata al ánodo, la pata larga, de red_led_660. Conecta su cátodo, la pata corta o lado plano, a GND. Conecta D6 a r_ir_220 de 220 Ω y el otro extremo al ánodo de ir_led_940; conecta el cátodo infrarrojo a GND.

  • D5 → 220 Ω → ánodo rojo (control de luz).
  • D6 → 220 Ω → ánodo infrarrojo (control de luz); ambos cátodos → GND (retorno).
  • No conectes los LED directamente a D5 o D6: las resistencias de 220 Ω evitan dañar el LED y el Arduino.
  • Un LED invertido no encenderá.

3. Conecta el fotodiodo receptor de 5 mm

Busca en la bolsa, ficha del vendedor o serigrafía cuál pata está marcada como K y cuál como A del fotodiodo receptor de 5 mm phototransistor; el orden de patas no es universal. Conecta K a 5V. Conecta A al extremo P1 de r_sensor_47k de 330 kΩ; conecta P2 de esa resistencia a GND. Desde la misma fila de A conecta el terminal negativo, marcado con una franja, de c_input_4u7 de 4.7 µF. El terminal positivo del condensador va al pin 3 del LM358.

  • K → 5V (alimentación del receptor), A → 330 kΩ → GND (convierte luz en voltaje), A → lado negativo de 4.7 µF → pin 3 (señal).
  • Si el receptor sólo tiene dos patas pero no dice A/K, no lo conectes al azar: confirma el dibujo del vendedor antes de alimentar el montaje.
  • No adivines las patas del fotodiodo: si A y K se intercambian, la señal puede quedar casi plana.
  • No inviertas el condensador de 4.7 µF: la pata con franja va al ánodo A del fotodiodo; invertirlo puede estropearlo.

4. Crea la referencia y conecta la ganancia

Crea la fila REF: 5V → r_ref_top_10k de 10 kΩ → REF; REF → r_ref_bottom_10k de 10 kΩ → GND. Conecta el positivo de c_ref_10u de 10 µF a REF y su negativo a GND. Conecta r_bias_100k de 100 kΩ entre REF y el pin 3 del LM358. Conecta r_feedback_100k entre pin 1 y pin 2 del LM358; conecta r_gain_10k entre pin 2 y REF. Coloca c_filter_100n en paralelo con r_feedback_100k, entre pin 1 y pin 2.

  • REF queda cerca de 2.5 V; marca esa fila para no confundirla con 5V.
  • Pin 1 → 100 kΩ y 100 nF → pin 2 (amplificación y filtrado); pin 2 → 10 kΩ → REF (ganancia).
  • No unas REF directamente a 5V ni a GND; la señal quedaría pegada a un extremo.
  • Con la muesca del LM358 hacia arriba, el pin 1 está arriba a la izquierda y el pin 8 arriba a la derecha.

5. Alimenta el amplificador y lleva la señal al Arduino

Conecta el pin 8 del LM358 a 5V y el pin 4 a GND. Coloca c_supply_100n entre esos dos pines, lo más cerca posible del chip. Conecta el pin 1, salida A del LM358, a A0 del Arduino.

  • Pin 8 → 5V (alimentación), pin 4 → GND (tierra), pin 1 → A0 (señal).
  • Todas las conexiones GND deben estar unidas para que A0 tenga la misma referencia que el amplificador.
  • No conectes A0 directamente a 5V: A0 sólo recibe la salida del LM358.
  • Si A0 se queda siempre cerca de 0 o 5 V, desconecta el USB y revisa la orientación del LM358, REF y el fotodiodo.

6. Mide la onda óptica

Conecta el Arduino al ordenador por USB. Coloca la yema del dedo entre los LED y el fotodiodo receptor de 5 mm, sin apretarla hasta ponerla blanca, y cubre el conjunto contra la luz exterior. Pulsa Deploy en Schematik y abre el trazador serie para ver rojo, infrarrojo y pulso_rojo.

  • Una onda pequeña que sube y baja al ritmo del pulso indica que la parte óptica funciona.
  • Si no aparece onda, prueba otro dedo, mejora el bloqueo de luz exterior y confirma A/K del fotodiodo.
  • No aprietes el dedo hasta que duela o cambie de color: reduce la circulación y elimina la señal.
  • El Arduino por USB es la alimentación prevista; no añadas otra fuente mientras está conectado al ordenador.

Review all connections

1. Connections between "r_red_220" and "Arduino"

Functionr_red_220Arduino
digitalP1GPIO 5
digitalP2 → LED rojo de 660 nm ANODEEXT

2. Connections between "red_led_660" and "Arduino"

Functionred_led_660Arduino
groundCATHODEGND

3. Connections between "r_ir_220" and "Arduino"

Functionr_ir_220Arduino
digitalP1GPIO 6
digitalP2 → LED infrarrojo de 940 nm ANODEEXT

4. Connections between "ir_led_940" and "Arduino"

Functionir_led_940Arduino
groundCATHODEGND

5. Connections between "c_input_4u7" and "Arduino"

Functionc_input_4u7Arduino
analogP2 → LM358 Dual Operational Amplifier IN+_AEXT
analogP1 → Fotodiodo receptor infrarrojo de 5 mm ANODEEXT

6. Connections between "r_bias_100k" and "Arduino"

Functionr_bias_100kArduino
digitalP1 → LM358 Dual Operational Amplifier IN+_AEXT
digitalP2 → Resistor P1EXT

7. Connections between "r_ref_top_10k" and "Arduino"

Functionr_ref_top_10kArduino
powerP15V
digitalP2 → Resistor P1EXT

8. Connections between "r_ref_bottom_10k" and "Arduino"

Functionr_ref_bottom_10kArduino
groundP2GND

9. Connections between "c_ref_10u" and "Arduino"

Functionc_ref_10uArduino
analogP1 → Resistor P1EXT
groundP2GND

10. Connections between "lm358" and "Arduino"

Functionlm358Arduino
powerVCC5V
groundGNDGND
analogOUT_AGPIO 14

11. Connections between "r_feedback_100k" and "Arduino"

Functionr_feedback_100kArduino
digitalP1 → LM358 Dual Operational Amplifier OUT_AEXT
digitalP2 → LM358 Dual Operational Amplifier IN-_AEXT

12. Connections between "r_gain_10k" and "Arduino"

Functionr_gain_10kArduino
digitalP1 → LM358 Dual Operational Amplifier IN-_AEXT
digitalP2 → Resistor P1EXT

13. Connections between "c_filter_100n" and "Arduino"

Functionc_filter_100nArduino
analogP1 → LM358 Dual Operational Amplifier OUT_AEXT
analogP2 → LM358 Dual Operational Amplifier IN-_AEXT

14. Connections between "c_supply_100n" and "Arduino"

Functionc_supply_100nArduino
powerP15V
groundP2GND

15. Connections between "phototransistor" and "Arduino"

FunctionphototransistorArduino
powerCATHODE5V
analogANODE → Resistor P1EXT

16. Connections between "r_sensor_47k" and "Arduino"

Functionr_sensor_47kArduino
groundP2GND

Deploy the firmware

#include <Arduino.h>
// Demostrador óptico PPG rojo/infrarrojo para Arduino Uno con fotodiodo BPW34.
// Salida CSV para Serial Plotter: rojo, infrarrojo, pulso_rojo.
// No es un instrumento médico ni calcula una SpO2 clínica.


// Forward declarations
int readAveragedADC();
int measureWithLed(uint8_t ledPin);

const uint8_t RED_LED_PIN = 5;
const uint8_t IR_LED_PIN = 6;
const uint8_t PPG_PIN = A0;

const uint16_t SETTLE_US = 900;
const uint16_t SAMPLES_PER_VALUE = 4;
const unsigned long OUTPUT_PERIOD_MS = 20;

int readAveragedADC() {
  long total = 0;
  for (uint8_t i = 0; i < SAMPLES_PER_VALUE; i++) {
    total += analogRead(PPG_PIN);
  }
  return total / SAMPLES_PER_VALUE;
}

int measureWithLed(uint8_t ledPin) {
  digitalWrite(RED_LED_PIN, LOW);
  digitalWrite(IR_LED_PIN, LOW);
  delayMicroseconds(SETTLE_US);
  int ambient = readAveragedADC();

  digitalWrite(ledPin, HIGH);
  delayMicroseconds(SETTLE_US);
  int illuminated = readAveragedADC();
  digitalWrite(ledPin, LOW);
  return illuminated - ambient;
}

void setup() {
  pinMode(RED_LED_PIN, OUTPUT);
  pinMode(IR_LED_PIN, OUTPUT);
  digitalWrite(RED_LED_PIN, LOW);
  digitalWrite(IR_LED_PIN, LOW);
  Serial.begin(115200);
  delay(300);
  Serial.println(F("rojo,infrarrojo,pulso_rojo"));
}

void loop() {
  static unsigned long lastOutputMs = 0;
  static float redBaseline = 0.0f;

  unsigned long now = millis();
  if (now - lastOutputMs < OUTPUT_PERIOD_MS) return;
  lastOutputMs = now;

  int redSignal = measureWithLed(RED_LED_PIN);
  int irSignal = measureWithLed(IR_LED_PIN);

  if (redBaseline == 0.0f) redBaseline = redSignal;
  redBaseline = 0.97f * redBaseline + 0.03f * redSignal;
  int redPulse = redSignal - (int)redBaseline;

  Serial.print(redSignal);
  Serial.print(',');
  Serial.print(irSignal);
  Serial.print(',');
  Serial.println(redPulse);
}

Remix this project

Make it yours in one click

Open a full copy of this project in your own Schematik workspace — diagram, code, parts, and assembly steps included. Swap the sensor, add features, or redesign the whole thing with AI. The author's original stays untouched.

Open in Schematik