Community project
Necesito Hacer Un Circuito De Un Oxiometro Con
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

Gather all the parts
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"
2. Connections between "red_led_660" and "Arduino"
3. Connections between "r_ir_220" and "Arduino"
4. Connections between "ir_led_940" and "Arduino"
5. Connections between "c_input_4u7" and "Arduino"
6. Connections between "r_bias_100k" and "Arduino"
7. Connections between "r_ref_top_10k" and "Arduino"
8. Connections between "r_ref_bottom_10k" and "Arduino"
9. Connections between "c_ref_10u" and "Arduino"
10. Connections between "lm358" and "Arduino"
11. Connections between "r_feedback_100k" and "Arduino"
12. Connections between "r_gain_10k" and "Arduino"
13. Connections between "c_filter_100n" and "Arduino"
14. Connections between "c_supply_100n" and "Arduino"
15. Connections between "phototransistor" and "Arduino"
16. Connections between "r_sensor_47k" and "Arduino"
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.




