¿Qué es un optoacoplador? PC817 y 4N35 con Arduino, paso a paso
Qué es un optoacoplador y cómo funciona: pines del PC817 y 4N35, CTR y cálculo de resistencias, leer señales de 12/24 V, detectar 230 V (H11AA1) y relés.
Un optoacoplador (también llamado optoaislador) es un pequeño integrado que transmite una señal entre dos circuitos usando solo luz, sin conexión eléctrica entre ellos. Dentro hay un LED infrarrojo y un fototransistor frente a él: cuando el circuito de un lado enciende el LED, el transistor del otro lado conduce. Como no hay ni un solo cable entre los dos lados, los picos de tensión y el ruido no pueden llegar a tu microcontrolador cuando conectas a tu Arduino un sensor industrial de 24 V, la línea de 12 V de un coche o un driver de motor.
En este artículo aprenderás paso a paso qué hay dentro de un optoacoplador, por qué importa el aislamiento galvánico, los pines y valores de los dos modelos más comunes, el PC817 y el 4N35, el concepto de CTR y el cálculo de resistencias. Después verás cómo aislar una salida de Arduino, leer señales de 12/24 V con seguridad, usarlo con el ESP32 y la Raspberry Pi Pico, las normas de seguridad para detectar la tensión de red (H11AA1), el optoacoplador de los módulos de relé y cómo disparar un triac con el MOC3021.
¿Qué es un optoacoplador y cómo funciona?
Dentro de la cápsula del optoacoplador hay dos chips enfrentados. En el lado de entrada hay un LED infrarrojo que funciona con corriente igual que un LED normal. En el lado de salida hay un fototransistor cuya base es sensible a la luz; en lugar de inyectar corriente en la base, se le hace llegar luz. Entre los dos chips hay una capa de plástico transparente pero aislante eléctricamente. Esta capa está diseñada para soportar miles de voltios.
- El circuito del lado de entrada hace pasar unos pocos miliamperios por el LED a través de una resistencia.
- El LED emite luz infrarroja; esa luz atraviesa la capa aislante y cae sobre el fototransistor.
- La luz actúa como la corriente de base del fototransistor y deja pasar corriente entre colector y emisor; el transistor se cierra como un interruptor.
- Cuando el LED se apaga, la luz desaparece, el transistor vuelve a bloquear y el circuito de salida se abre. La señal ha cruzado al otro lado sin cables, solo con luz.
Según lo que haya en el lado de salida, existen distintos tipos de optoacopladores. En proyectos de aficionado se usan sobre todo los de fototransistor, pero para detectar señales de alterna, disparar un triac o aislar una línea de datos rápida hacen falta tipos especiales:
| Tipo | Modelos de ejemplo | Salida | Uso típico |
|---|---|---|---|
| De fototransistor | PC817, EL817, 4N35, 4N25 | Fototransistor NPN | Aislamiento de señales digitales, lectura de entradas de 12/24 V, módulos de relé |
| Salida Darlington | 4N33, H11B1 | Transistor Darlington | Mucha corriente de salida con muy poca corriente de LED (pero más lento) |
| Entrada de alterna | H11AA1, PC814 | Dos LED en antiparalelo + fototransistor | Detección de tensión de red, detección de paso por cero |
| Salida de triac | MOC3021, MOC3041, MOC3063 | Fototriac | Disparo de triac, control de cargas de alterna, SSR |
| Lógica de alta velocidad | 6N137, 6N138 | Fotodiodo + puerta lógica o transistor | Aislamiento de MIDI, UART y líneas digitales rápidas |
¿Por qué hace falta el aislamiento galvánico?
Aislamiento galvánico significa que no hay un camino conductor directo entre dos circuitos: no hay GND común ni cables compartidos, y la energía y la información viajan por otra vía (luz, campo magnético). Los pines de Arduino aguantan como máximo 5 V (3,3 V en el ESP32 y la Pico). Los 24 V de un sensor industrial, los picos breves de cientos de voltios que genera un motor al conmutar o el ruido inducido en cables largos pueden llegar directamente al microcontrolador a través de un GND compartido. El optoacoplador corta ese camino físicamente.
- Protección: aunque falle algo en el lado de alta tensión, el daño se queda en el optoacoplador; el Arduino, el puerto USB de tu ordenador y tú estáis a salvo.
- Ruido y bucles de masa: motores, relés y cables largos generan ruido en la línea de GND. Si las masas están separadas, ese ruido no entra en la línea de señal; explicamos la masa común en detalle en el artículo GND y masa común.
- Distintos niveles de tensión: como el transistor de salida se alimenta desde fuera, una señal de 24 V se convierte fácilmente en 3,3 V y una de 5 V en 12 V. El optoacoplador es además un conversor de nivel lento pero robusto.
- Normas de seguridad: en los aparatos conectados a la red, el lado del usuario debe estar aislado de la red; piezas como el PC817 superan una prueba de aislamiento de 5000 V rms.
Pines y características del PC817 y el 4N35
| Pin | PC817 (DIP-4) | 4N35 (DIP-6) |
|---|---|---|
| 1 | Ánodo (LED +) | Ánodo (LED +) |
| 2 | Cátodo (LED −) | Cátodo (LED −) |
| 3 | Emisor | Sin conexión |
| 4 | Colector | Emisor |
| 5 | No existe | Colector |
| 6 | No existe | Base (normalmente al aire) |
| Característica | PC817 | 4N35 |
|---|---|---|
| Tensión directa del LED (VF) | Típ. 1,2 V, máx. 1,4 V (a 20 mA) | Unos 1,2–1,3 V |
| Corriente máxima del LED | 50 mA | 60 mA |
| Tensión inversa del LED | Máx. 6 V | Máx. 6 V |
| CTR | 50–600 % (a 5 mA, 5 V; según la clase) | Al menos 100 % (a 10 mA, 10 V) |
| Tensión colector-emisor (VCEO) | 35 V | 70 V |
| Corriente de colector | Máx. 50 mA | Máx. 50 mA |
| Tiempo de conmutación | Típ. 3–4 µs (con resistencia de carga baja) | Unos 10 µs |
| Tensión de aislamiento | 5000 V rms | 5000 V rms |
En el PC817 el pin 1 está marcado con un punto; la letra A, B, C o D que sigue a "PC817" en la cápsula indica la clase de CTR. Piezas como el EL817, el LTV817 y el KP1010 son equivalentes compatibles pin a pin con el PC817. El 4N35 tiene seis patas, así que su base sale al exterior; normalmente se deja al aire, y en entornos con mucho ruido una resistencia de valor alto (p. ej. 1 MΩ) entre base y emisor acelera el apagado.
¿Qué es el CTR y cómo se calculan las resistencias?
El CTR (Current Transfer Ratio, relación de transferencia de corriente) es la relación entre la corriente de colector que puede pasar por el transistor de salida y la corriente del LED: CTR = IC / IF × 100 %. Por ejemplo, en un optoacoplador con un CTR del 100 %, si haces pasar 5 mA por el LED puedes sacar como máximo unos 5 mA por la salida. El CTR cambia con la temperatura, baja con los años a medida que envejece el LED y varía mucho incluso entre piezas del mismo modelo. Por eso siempre se diseña con el valor más bajo de la hoja de datos.
| Clase del PC817 | Rango de CTR (IF = 5 mA) | Corriente de salida con 5 mA en el LED |
|---|---|---|
| PC817A | 80–160 % | 4–8 mA |
| PC817B | 130–260 % | 6,5–13 mA |
| PC817C | 200–400 % | 10–20 mA |
| PC817D | 300–600 % | 15–30 mA |
| Sin letra | 50–600 % | 2,5–30 mA (supón el peor caso) |
Resistencia del LED: el lado de entrada se calcula exactamente como un LED: R = (Vfuente − VF) / IF. Para pasar 10 mA desde el pin de 5 V de un Arduino Uno sale (5 − 1,2) / 0,010 = 380 Ω; una resistencia estándar de 330 Ω da unos 11,5 mA y una de 390 Ω unos 9,7 mA. En el ESP32, (3,3 − 1,2) / 0,010 = 210 Ω, así que usas 220 Ω. Los pines de la Raspberry Pi Pico vienen configurados por defecto con 4 mA de capacidad de salida; aquí bastan unos 4,5 mA con 470 Ω. Si no quieres hacer la cuenta a mano, usa la herramienta Resistencia para LED.
Resistencia de salida (pull-up): para que el transistor conduzca a fondo (se sature), la corriente que pide la pull-up debe ser menor que la que permite el CTR. Una pull-up de 10 kΩ a 5 V solo necesita 0,5 mA. En un PC817 sin letra el peor CTR es del 50 %, así que para 0,5 mA bastaría con 1 mA en el LED; dándole 5–10 mA dejas al menos cinco veces de margen. La pull-up interna del Arduino (unos 20–50 kΩ) también es ideal para esto. Una pull-up más pequeña hace la señal más rápida pero exige más corriente; una más grande necesita menos corriente pero hace que el transistor tarde más en apagarse.
| Caso | Tensión de alimentación | Corriente de LED objetivo | Resistencia recomendada | Potencia de la resistencia |
|---|---|---|---|---|
| Excitación desde un pin de Arduino Uno | 5 V | ~10 mA | 330 Ω | 1/4 W es suficiente |
| Excitación desde un pin de ESP32 | 3,3 V | ~10 mA | 220 Ω | 1/4 W es suficiente |
| Excitación desde un pin de Raspberry Pi Pico | 3,3 V | ~4,5 mA | 470 Ω | 1/4 W es suficiente |
| Lectura de una señal de 12 V | 12 V | ~5 mA | 2,2 kΩ | 1/4 W (disipa 0,05 W) |
| Lectura de una señal de 24 V | 24 V | ~5 mA | 4,7 kΩ | 1/4 W (disipa 0,11 W) |
Tabla de conexiones: Arduino Uno, ESP32 y Raspberry Pi Pico
| Pin del PC817 | Función | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|---|
| 1 (Ánodo), salida aislada | La placa excita el LED | D9 → 330 Ω → pin 1 | GPIO 25 → 220 Ω → pin 1 | GP15 → 470 Ω → pin 1 |
| 2 (Cátodo), salida aislada | Retorno del LED | GND | GND | GND |
| 4 (Colector), lectura de entrada | La placa lee la señal | D2 (INPUT_PULLUP) | GPIO 27 (INPUT_PULLUP) | GP14 (PULL_UP) |
| 3 (Emisor), lectura de entrada | GND del lado de lectura | GND | GND | GND |
| 1 y 2, lectura de entrada | Señal externa (12/24 V) | Van a la fuente externa, no a la placa | Van a la fuente externa, no a la placa | Van a la fuente externa, no a la placa |
Aislar una salida de Arduino
En este uso, el Arduino enciende el LED del optoacoplador y el transistor de salida cortocircuita la entrada de otro circuito como un interruptor. Así puedes manejar con seguridad, por ejemplo, la entrada de disparo de un aparato de 12 V, la entrada de disparador remoto de una cámara, una entrada de PLC u otro microcontrolador que funcione a otra tensión. Como el transistor de salida está limitado a 35 V y 50 mA, no puede mover directamente la bobina de un relé, un motor o una tira de LED; para esas cargas se usa un transistor o un MOSFET en el otro lado.
1// PC817 ile yalıtılmış çıkış / Isolated output with a PC817
2// D9 -> 330 ohm -> PC817 pin 1 (anot / anode), pin 2 (katot / cathode) -> Arduino GND
3// Pin 4 ve 3 diğer devrenin girişini kısa devre eder (kuru kontak gibi)
4// Pins 4 and 3 short the other circuit's input (like a dry contact)
5const int OPTO_LED_PIN = 9;
6const unsigned long ON_MS = 2000;
7const unsigned long OFF_MS = 3000;
8
9bool isOn = false;
10unsigned long lastSwitch = 0;
11
12void setup() {
13 pinMode(OPTO_LED_PIN, OUTPUT);
14 digitalWrite(OPTO_LED_PIN, LOW);
15}
16
17void loop() {
18 unsigned long waitTime = isOn ? ON_MS : OFF_MS;
19 if (millis() - lastSwitch >= waitTime) {
20 lastSwitch = millis();
21 isOn = !isOn;
22 digitalWrite(OPTO_LED_PIN, isOn ? HIGH : LOW); // HIGH: optokuplör iletir / HIGH: optocoupler conducts
23 }
24}En el lado de salida conectas el colector (pin 4) al lado positivo o a la entrada del otro circuito y el emisor (pin 3) al GND de ese circuito; si inviertes la polaridad, el transistor no conduce. Como un PC817 tarda desde unos pocos hasta unas decenas de microsegundos en encenderse y apagarse, una señal PWM que pase por él empieza a deformarse por encima de unos pocos kHz. Para señales rápidas (UART, MIDI, PWM de alta frecuencia) se prefieren optoacopladores rápidos como el 6N137 o integrados aisladores digitales.
Leer señales de 12/24 V con seguridad
No puedes conectar directamente a un pin de Arduino las señales de sensores inductivos industriales, salidas de PLC, contactos de puerta, la llave de contacto de un coche o el pulsador de un timbre de 12 V. La solución es hacer pasar la señal por el LED del optoacoplador: pones una resistencia de 4,7 kΩ en serie con el LED para 24 V y de 2,2 kΩ para 12 V, y el transistor de salida trabaja con la pull-up interna del Arduino. Cuando hay tensión, el LED se enciende, el transistor conduce y el pin del Arduino lee LOW. Es decir, la lógica está invertida y lo tienes en cuenta en el código.
- Conecta el positivo de la fuente de 24 V a través de una resistencia de 4,7 kΩ al pin 1 (ánodo) del PC817.
- Conecta el negativo de la fuente de señal (GND de 24 V) al pin 2 (cátodo). No conectes este GND al Arduino.
- Si quieres, añade un diodo 1N4148 en inversa entre los pines 1 y 2 (cátodo al pin 1); protege contra la conexión invertida.
- Conecta el pin 4 (colector) del PC817 al pin D2 del Arduino y el pin 3 (emisor) al GND del Arduino.
- Sube el código de abajo y abre el Monitor Serie a 9600 baudios. Al aplicar 24 V deberías ver "24V VAR / present".
1// PC817 ile 12/24 V sinyal okuma / Reading a 12/24 V signal with a PC817
2// PC817 pin 4 (kolektör / collector) -> D2, pin 3 (emetör / emitter) -> Arduino GND
3const int OPTO_PIN = 2;
4const unsigned long DEBOUNCE_MS = 20; // kontak sıçramasına karşı / against contact bounce
5
6int lastReading = HIGH;
7int stableState = HIGH;
8unsigned long lastChange = 0;
9unsigned long pulseCount = 0;
10
11void setup() {
12 Serial.begin(9600);
13 pinMode(OPTO_PIN, INPUT_PULLUP); // dahili pull-up yeterli / internal pull-up is enough
14}
15
16void loop() {
17 int reading = digitalRead(OPTO_PIN);
18 if (reading != lastReading) { // değişim var, zamanı başlat / change seen, start the timer
19 lastChange = millis();
20 lastReading = reading;
21 }
22 if (millis() - lastChange > DEBOUNCE_MS && reading != stableState) {
23 stableState = reading;
24 // Mantık ters: 24 V varsa LED yanar, transistör iletir, pin LOW olur
25 // Inverted logic: with 24 V present the LED is on, the transistor conducts, the pin reads LOW
26 if (stableState == LOW) {
27 pulseCount++;
28 Serial.print("24V VAR / present, sayac / count: ");
29 Serial.println(pulseCount);
30 } else {
31 Serial.println("24V YOK / absent");
32 }
33 }
34}El código incluye un antirrebote sencillo que solo acepta lecturas que se mantienen sin cambios durante 20 ms; con señales de contactos mecánicos o relés es imprescindible. Como leemos con millis() en lugar de delay(), el Arduino puede hacer otras cosas mientras tanto. En la instalación eléctrica de un coche, la línea de 12 V sube a 14,4 V con el motor en marcha y aparecen picos altos y breves; aquí es una buena precaución subir la resistencia a 3,3 kΩ y añadir un diodo TVS en la entrada.
Optoacoplador con ESP32 y Raspberry Pi Pico
Como el ESP32 y la Pico funcionan a 3,3 V, no deben conectarse directamente ni siquiera a señales de 5 V. Lo bueno del optoacoplador es que el transistor de salida es de colector abierto, así que la tensión de salida la fija solo la tensión a la que va la pull-up. Con la pull-up interna, la salida se queda automáticamente en 3,3 V; aunque haya 24 V en el lado de entrada, al ESP32 le llegan como mucho 3,3 V. El siguiente código para ESP32 cuenta con una interrupción los pulsos de un sensor inductivo o un caudalímetro de 24 V:
1// ESP32: 24 V endüstriyel sensörden darbe sayma / counting pulses from a 24 V industrial sensor
2// PC817 pin 4 -> GPIO 27, pin 3 -> ESP32 GND
3const int OPTO_PIN = 27;
4
5volatile unsigned long pulseCount = 0;
6volatile unsigned long lastPulseUs = 0;
7
8void IRAM_ATTR onPulse() {
9 unsigned long now = micros();
10 if (now - lastPulseUs > 2000) { // 2 ms'den kısa parazitleri yok say / ignore glitches shorter than 2 ms
11 pulseCount++;
12 lastPulseUs = now;
13 }
14}
15
16void setup() {
17 Serial.begin(115200);
18 pinMode(OPTO_PIN, INPUT_PULLUP);
19 attachInterrupt(digitalPinToInterrupt(OPTO_PIN), onPulse, FALLING); // 24 V gelince pin düşer / pin falls when 24 V arrives
20}
21
22void loop() {
23 static unsigned long lastPrint = 0;
24 if (millis() - lastPrint >= 1000) {
25 lastPrint = millis();
26 noInterrupts();
27 unsigned long count = pulseCount;
28 pulseCount = 0;
29 interrupts();
30 Serial.printf("Saniyedeki darbe / Pulses per second: %lu\n", count);
31 }
32}El IRAM_ATTR delante de la función de interrupción coloca el código en la memoria rápida; en el ESP32 se recomienda en las funciones de interrupción. El filtro de 2 ms elimina los pulsos falsos causados por el apagado lento del optoacoplador o por el ruido del cable. Para saber más sobre interrupciones, echa un vistazo al artículo Interrupciones en Arduino. En la Raspberry Pi Pico haces lo mismo con MicroPython así; este ejemplo, mientras lee la entrada, envía también una señal aislada al otro lado con un segundo PC817:
1# Raspberry Pi Pico: PC817 ile yalıtılmış giriş / isolated input with a PC817
2# PC817 pin 4 -> GP14, pin 3 -> Pico GND, LED sürme / LED drive: GP15 -> 470 ohm -> pin 1
3from machine import Pin
4import time
5
6opto_in = Pin(14, Pin.IN, Pin.PULL_UP) # dahili pull-up / internal pull-up
7opto_out = Pin(15, Pin.OUT) # ikinci PC817'nin LED'i / LED of a second PC817
8
9last_state = opto_in.value()
10while True:
11 state = opto_in.value()
12 if state != last_state:
13 time.sleep_ms(20) # sıçramayı bekle / wait out the bounce
14 state = opto_in.value()
15 if state != last_state:
16 last_state = state
17 if state == 0: # ters mantık: 0 = gerilim var / inverted: 0 = voltage present
18 print("24V VAR / present")
19 opto_out.value(1) # karşı tarafa yalıtılmış sinyal / isolated signal to the other side
20 else:
21 print("24V YOK / absent")
22 opto_out.value(0)
23 time.sleep_ms(5)Detectar 230 V: el H11AA1 y la seguridad
Para saber si un enchufe o la línea de una lámpara tiene tensión, o para detectar los pasos por cero de la red, se usan optoacopladores con entrada de alterna como el H11AA1. Dentro lleva dos LED conectados en antiparalelo, así que produce luz en los dos semiciclos de la corriente alterna y no tiene problemas de tensión inversa. Para 230 V rms se colocan dos resistencias de 47 kΩ en serie con la entrada: por los 94 kΩ totales circulan unos 2,4 mA rms (3,5 mA de pico) y cada resistencia disipa unos 0,28 W. Por eso se eligen resistencias de al menos 0,5 W, mejor de 1 W; usar dos resistencias además reparte a la mitad la tensión que soporta cada una. En el lado de salida, con una pull-up de 10 kΩ a 5 V, el transistor conduce casi todo el tiempo mientras hay tensión; solo cerca de los pasos por cero, cuando los LED se apagan, aparece un breve pulso HIGH. En una red de 50 Hz verás unos 100 pulsos por segundo.
1// H11AA1 ile şebeke gerilimi var mı? / Is mains voltage present? (H11AA1)
2// H11AA1 pin 5 (kolektör / collector) -> D2, pin 4 (emetör / emitter) -> GND, 10k pull-up -> 5V
3const int AC_PIN = 2;
4const unsigned long TIMEOUT_MS = 40; // 50 Hz'de 2 tam periyot / 2 full cycles at 50 Hz
5
6volatile unsigned long pulses = 0;
7unsigned long lastLowSeen = 0;
8unsigned long lastReport = 0;
9
10void onZeroCross() {
11 pulses++; // her sıfır geçişinde bir darbe / one pulse per zero crossing
12}
13
14void setup() {
15 Serial.begin(9600);
16 pinMode(AC_PIN, INPUT); // harici 10k pull-up kullanılıyor / external 10k pull-up in use
17 attachInterrupt(digitalPinToInterrupt(AC_PIN), onZeroCross, RISING);
18}
19
20void loop() {
21 if (digitalRead(AC_PIN) == LOW) {
22 lastLowSeen = millis(); // gerilim varken çıkış çoğunlukla LOW / output is mostly LOW while voltage is present
23 }
24 bool mainsOn = (millis() - lastLowSeen) < TIMEOUT_MS;
25
26 if (millis() - lastReport >= 1000) { // saniyede bir rapor / report once per second
27 lastReport = millis();
28 noInterrupts();
29 unsigned long count = pulses;
30 pulses = 0;
31 interrupts();
32 Serial.print(mainsOn ? "Sebeke VAR / Mains ON" : "Sebeke YOK / Mains OFF");
33 Serial.print(" sifir gecisi / zero crossings: ");
34 Serial.print(count); // 50 Hz'de yaklaşık 100 / about 100 at 50 Hz
35 Serial.print(" frekans / frequency: ");
36 Serial.print(count / 2);
37 Serial.println(" Hz");
38 }
39}El código da dos datos: si la salida se ha puesto en LOW al menos una vez en los últimos 40 ms, hay red; y la mitad de los pulsos contados por la interrupción da la frecuencia de la red. Lo que debes vigilar en los módulos ya hechos y en tu propia placa: deja al menos 6–8 mm de separación (distancia de fuga) entre las pistas de red y el lado de baja tensión, pon un fusible en la entrada de red, no pases nunca una pista entre los dos lados del optoacoplador y usa el circuito dentro de una caja cerrada.
El optoacoplador de los módulos de relé y el jumper JD-VCC

La mayoría de los módulos de relé de 1, 2, 4 y 8 canales del mercado llevan un PC817 en la entrada de cada canal. La corriente del pin VCC pasa por una resistencia y un LED indicador hasta el LED del optoacoplador; cuando el pin IN se pone en LOW, el circuito se cierra y el relé se activa. Por eso estos módulos suelen funcionar activos a nivel bajo. Sin embargo, tal como vienen de fábrica llevan puesto el jumper JD-VCC y la bobina del relé se alimenta del mismo VCC y GND: el optoacoplador está ahí, pero no hay aislamiento. Tienes lo básico de los módulos de relé en el artículo ¿Qué es un módulo de relé?.
| Configuración | Conexión | Aislamiento |
|---|---|---|
| Jumper JD-VCC puesto | Arduino 5V → VCC, GND → GND, pin → IN | Ninguno; el ruido de la bobina del relé llega a la alimentación del Arduino |
| Jumper quitado | Arduino 5V → VCC, pin → IN; el GND del Arduino no se conecta. Fuente de 5 V aparte → JD-VCC y GND | Completo; lo único que comparten los dos lados es la luz dentro del optoacoplador |
Nota sobre cómo disparar un triac con el MOC3021
Si en lugar de un relé quieres un interruptor de alterna silencioso y sin chispas, se usa un triac (p. ej. BT136) y un optoacoplador con salida de triac para dispararlo. El MOC3021 es de fase aleatoria: dispara el triac en el momento en que se enciende el LED, por eso, junto con un detector de paso por cero, sirve para construir un regulador (dimmer). El MOC3041 y el MOC3063 son modelos con circuito de paso por cero; solo disparan cuando la tensión pasa por cero, generan menos interferencias en aplicaciones de encendido y apagado, pero no sirven para regular. El LED del MOC3021 puede necesitar hasta 15 mA para disparar; a 5 V, 220 Ω (unos 17 mA) es un valor adecuado, y 330 Ω puede quedarse corto en algunas piezas. Como en las hojas de datos, entre la puerta del triac y el MOC3021 se pone una resistencia de unos 360 Ω, y con cargas inductivas como motores se añade un amortiguador RC (snubber) entre los terminales del triac. Los módulos SSR (relés de estado sólido) ya hechos llevan dentro exactamente esta estructura.
Ideas de proyectos con optoacopladores
- Lector de sensores industriales: cuenta productos en una cinta transportadora con un sensor de proximidad inductivo de 24 V y muestra la cuenta en una pantalla LCD.
- Detector de contacto del coche: despierta el ESP32 al dar el contacto y pon en marcha la cámara del coche o un registrador.
- Alarma de corte de luz: con un módulo de detección de alterna ya hecho, haz sonar un zumbador o envía un aviso al móvil cuando se corte la red.
- Detector de timbre: lee la línea de 12 V del timbre existente de forma aislada y envía un aviso cuando suene.
- Placa de relés aislada: controla una lámpara de 230 V con un módulo de relé al que hayas quitado el jumper JD-VCC y que alimentes con una fuente aparte.
- Entrada MIDI: lee en el Arduino las notas MIDI de un instrumento electrónico con un 6N138.
Errores frecuentes y soluciones
| Síntoma | Causa probable | Solución |
|---|---|---|
| La salida nunca cambia | LED conectado al revés o conectado sin resistencia y quemado | Comprueba que el pin 1 es el marcado con un punto; prueba el LED con el multímetro en modo diodo |
| La lógica funciona al revés | Cuando hay tensión, el pin pasa a LOW; es normal | Interpreta LOW como "hay tensión" en el código |
| La salida no baja del todo a LOW (se queda en 1–2 V) | Corriente de LED baja, CTR insuficiente o pull-up demasiado pequeña | Reduce la resistencia del LED o aumenta la pull-up (p. ej. 10 kΩ) |
| La señal PWM se deforma | El PC817 se queda lento por encima de unos pocos kHz | Reduce la pull-up o usa un optoacoplador rápido como el 6N137 |
| El Arduino se reinicia a pesar del aislamiento | Se han unido los GND de los dos lados | Separa el GND del lado de entrada del Arduino; en el módulo de relé quita el jumper JD-VCC |
| Disparos falsos aleatorios | Cable largo, ruido, rebote de contactos | Aplica antirrebote por software, acorta el cable, añade un condensador de 100 nF en paralelo con el LED |
El optoacoplador es la forma más barata de sacar un proyecto con Arduino de la mesa y hacer que hable con seguridad con las señales de 12 V, 24 V y 230 V del mundo real: una pieza de unos céntimos separa tu placa y tu ordenador de la alta tensión. En la app BlueGrays encontrarás los proyectos de control de una bombilla de 230 V con relé, iluminación inteligente y riego, paso a paso con esquemas de circuito y código.
Preguntas frecuentes
¿Para qué sirve un optoacoplador?
Un optoacoplador transmite una señal entre dos circuitos mediante luz, sin conexión eléctrica. Así aísla un circuito de alta tensión o con ruido de un microcontrolador sensible como el Arduino. Se usa para leer sensores industriales, en módulos de relé y en circuitos de detección de la tensión de red.
¿Cuáles son los pines del PC817?
El PC817 tiene cuatro patas: el pin 1, en la esquina con el punto, es el ánodo del LED y el pin 2 es el cátodo. En el lado opuesto, el pin 3 es el emisor del fototransistor y el pin 4 es el colector.
¿Qué resistencia se pone a un optoacoplador?
La resistencia se calcula con R = (tensión de alimentación − 1,2 V) / corriente del LED. Buenos valores de partida son 330 Ω para un pin de 5 V de Arduino, 220 Ω para un ESP32, 2,2 kΩ para una señal de 12 V y 4,7 kΩ para una señal de 24 V.
¿Qué es el CTR de un optoacoplador?
El CTR (relación de transferencia de corriente) es la relación entre la corriente que puede pasar por el transistor de salida y la corriente del LED. En un optoacoplador con un CTR del 100 %, con 5 mA en el LED puedes sacar como máximo unos 5 mA por la salida. Diseña siempre con el CTR mínimo de la hoja de datos.
¿Qué diferencia hay entre el PC817 y el 4N35?
Los dos son optoacopladores con salida de fototransistor. El PC817 tiene cuatro patas, es barato y su CTR va del 50 al 600 % según la clase. El 4N35 tiene seis patas, saca la base al exterior y soporta tensiones de colector de hasta 70 V.
¿Se puede detectar 230 V con un optoacoplador?
Sí, con optoacopladores de entrada de alterna como el H11AA1 y resistencias en serie de potencia adecuada se pueden detectar la tensión de red y los pasos por cero. Pero la tensión de red puede matar; si no tienes experiencia, usa módulos de detección de alterna ya hechos y encapsulados.
Proyectos para hacer después de leer esto
Ver todos los proyectos
Bombilla 220V con Pulsador (Push)
Mientras mantienes pulsado el botón, una bombilla real de 220 voltios se queda encendida, y se apaga en cuanto lo sueltas. La pequeña señal del Arduino no puede encender la bombilla directamente, así

Encender y apagar una bombilla de 220 V con un botón
¿Quieres encender y apagar una bombilla de verdad de casa con un pequeño botón? Cada vez que lo pulsas, el Arduino acciona un relé y la bombilla se enciende; si vuelves a pulsar, se apaga. El relé es

Encender una bombilla de 220 V con mando a distancia
Enciende y apaga una bombilla de verdad de tu casa con un mando a distancia, sin levantarte del sofá. El Arduino lee la señal de luz invisible del mando; el botón de encendido activa el relé y enciend

Iluminación inteligente de escaleras y pasillos
Pisas la escalera o entras en el pasillo y las luces se encienden escalón a escalón en la dirección en la que caminas. Hay un sensor de distancia en cada extremo; pases por el que pases, los ocho LED

Iluminación Inteligente ESP32 (PIR + LDR + Relé + OLED)
¡Convierte tu pasillo, baño o despensa en iluminación inteligente con ESP32! Utilizando un sensor de movimiento PIR, un sensor de luz LDR y un módulo de relé, construimos el escenario clásico "la luz se enciende cuando se detecta movimiento en la oscuridad" — si el ambiente ya está iluminado, el movimiento NO activa la luz, ahorrando energía durante el día. La luz permanece encendida durante 30 segundos; si el movimiento continúa, el temporizador se reinicia y la luz permanece encendida más tiem

Estación de riego inteligente
Un jardinero que riega solo tus plantas para que no se sequen mientras estás de vacaciones. Un sensor de humedad mide lo mojada que está la tierra; cuando se seca, el Arduino enciende la bomba de agua

Iluminación automática con el sensor de movimiento PIR del ESP32
En este proyecto, utilizaremos el sensor de movimiento PIR HC-SR501 para detectar a las personas que entren en la habitación y encender el LED automáticamente. Controlaremos el tiempo de encendido del LED con millis(); cada lectura HIGH del sensor actualizará el instante del último movimiento, y el LED se apagará cuando hayan transcurrido al menos 10 segundos desde la última lectura HIGH. El código actual también espera 50 ms en cada iteración mediante delay(50), por lo que el bucle de la ap
Más artículos
App BlueGrays
Monta este circuito paso a paso en tu teléfono
Esquema, código y lista de piezas en una sola pantalla. Más de 200 proyectos de Arduino, ESP32 y Pico listos para montar.
Escanea con tu teléfono
Apunta la cámara al código y se abrirá la tienda de apps de tu teléfono.
o ábrela en la tienda

