Componentes · 15 min de leitura

O que é um optoacoplador? Isolação com PC817 e 4N35 no Arduino

O que é um optoacoplador e como ele funciona? Pinagem do PC817 e do 4N35, CTR e cálculo de resistores, leitura de sinais de 12/24 V, detecção da rede elétrica (H11AA1), relés e MOC3021.

Um optoacoplador (também chamado de optoisolador ou fotoacoplador) é um pequeno chip que leva um sinal de um circuito a outro usando apenas luz, sem nenhuma conexão elétrica entre eles. Dentro dele há um LED infravermelho e um fototransistor de frente para ele: quando o circuito de um lado acende o LED, o transistor do outro lado conduz. Como não existe um único fio entre os dois lados, picos de tensão e ruídos não chegam ao seu microcontrolador quando você liga ao Arduino um sensor industrial de 24 V, a linha de 12 V de um carro ou um driver de motor.

Neste post você vai aprender passo a passo o que há dentro de um optoacoplador, por que a isolação galvânica é importante, os pinos e as especificações dos dois modelos mais comuns, o PC817 e o 4N35, o conceito de CTR e como calcular os resistores. Depois, vai ver como isolar uma saída do Arduino, ler sinais de 12/24 V com segurança, usar o componente com ESP32 e Raspberry Pi Pico, as regras de segurança para detectar a rede elétrica (H11AA1), o optoacoplador dos módulos relé e como acionar um triac com o MOC3021.

O que é um optoacoplador e como ele funciona?

Dentro do encapsulamento do optoacoplador há dois chips, um de frente para o outro. No lado da entrada fica um LED infravermelho, que funciona com corrente como qualquer LED comum. No lado da saída fica um fototransistor cuja base é sensível à luz; em vez de injetar corrente na base, você joga luz sobre ela. Entre os dois chips há uma camada de plástico transparente, mas isolante do ponto de vista elétrico. Essa camada é projetada para suportar milhares de volts.

  1. O circuito do lado da entrada faz passar alguns miliampères pelo LED através de um resistor.
  2. O LED emite luz infravermelha; essa luz atravessa a camada isolante e chega ao fototransistor.
  3. A luz age como a corrente de base do fototransistor e permite que a corrente circule entre coletor e emissor; o transistor fecha como uma chave.
  4. Quando o LED apaga, a luz some, o transistor volta a bloquear e o circuito de saída abre. O sinal atravessou sem fios, usando apenas luz.

Existem tipos diferentes de optoacopladores, conforme o que fica no lado da saída. Projetos de hobby usam principalmente os modelos com fototransistor, mas detectar sinais AC, disparar um triac ou isolar uma linha de dados rápida exige tipos especiais:

TipoModelos de exemploSaídaUso típico
Com fototransistorPC817, EL817, 4N35, 4N25Fototransistor NPNIsolação de sinais digitais, leitura de entradas de 12/24 V, módulos relé
Saída Darlington4N33, H11B1Transistor DarlingtonCorrente de saída alta com corrente de LED muito baixa (porém mais lento)
Entrada ACH11AA1, PC814Dois LEDs em antiparalelo + fototransistorDetecção da rede elétrica, detecção de passagem por zero
Saída triacMOC3021, MOC3041, MOC3063FototriacDisparo de triac, controle de cargas AC, SSRs
Lógica de alta velocidade6N137, 6N138Fotodiodo + porta lógica ou transistorIsolação de MIDI, UART e linhas digitais rápidas

Por que a isolação galvânica é necessária?

Isolação galvânica significa que não existe um caminho condutor direto entre dois circuitos: não há GND comum, não há fio em comum, e a energia e a informação são transmitidas de outra forma (luz, campo magnético). Os pinos do Arduino suportam no máximo 5 V (3,3 V no ESP32 e no Pico). Os 24 V de um sensor industrial, os picos curtos de centenas de volts que um motor gera ao chavear ou o ruído induzido em cabos longos podem chegar direto ao microcontrolador por um GND comum. O optoacoplador corta esse caminho fisicamente.

  • Proteção: mesmo que algo falhe no lado de alta tensão, o estrago fica no optoacoplador; o Arduino, a porta USB do computador e você continuam seguros.
  • Ruído e loops de terra: motores, relés e cabos longos geram ruído na linha de GND. Quando os terras são separados, esse ruído não entra na linha de sinal; falamos em detalhes sobre GND comum no post O que é GND?.
  • Níveis de tensão diferentes: como o transistor de saída é alimentado por fora, um sinal de 24 V vira facilmente 3,3 V, e um de 5 V vira 12 V. O optoacoplador também é um conversor de nível lento, mas robusto.
  • Normas de segurança: em aparelhos ligados à rede elétrica, o lado do usuário precisa ser isolado da rede; componentes como o PC817 passam em um teste de isolação de 5000 V rms.
A isolação só funciona quando os GNDs dos dois lados ficam separados. Se você ligar o negativo do lado de 24 V ao GND do Arduino “por garantia”, o optoacoplador vira um pedaço de fio caro e a proteção desaparece por completo. Deixe o lado da entrada com a própria fonte e o lado da saída com o Arduino.

Pinagem e especificações do PC817 e do 4N35

PinoPC817 (DIP-4)4N35 (DIP-6)
1Ânodo (LED +)Ânodo (LED +)
2Cátodo (LED −)Cátodo (LED −)
3EmissorNão conectado
4ColetorEmissor
5Não existeColetor
6Não existeBase (geralmente deixada aberta)
ParâmetroPC8174N35
Tensão direta do LED (VF)Típ. 1,2 V, máx. 1,4 V (a 20 mA)Cerca de 1,2–1,3 V
Corrente máxima do LED50 mA60 mA
Tensão reversa do LEDMáx. 6 VMáx. 6 V
CTR50–600% (a 5 mA, 5 V; depende da classe)No mínimo 100% (a 10 mA, 10 V)
Tensão coletor-emissor (VCEO)35 V70 V
Corrente de coletorMáx. 50 mAMáx. 50 mA
Tempo de chaveamentoTíp. 3–4 µs (com resistor de carga baixo)Cerca de 10 µs
Tensão de isolação5000 V rms5000 V rms

No PC817, o pino 1 é marcado com um ponto; a letra A, B, C ou D depois de “PC817” no encapsulamento indica a classe de CTR. Componentes como EL817, LTV817 e KP1010 são equivalentes do PC817 com a mesma pinagem. O 4N35 tem seis terminais, então o pino da base fica acessível; normalmente você o deixa aberto, e em ambientes muito ruidosos um resistor de valor alto (por exemplo, 1 MΩ) entre base e emissor pode acelerar o desligamento.

O que é CTR e como calcular os resistores?

CTR (Current Transfer Ratio, razão de transferência de corrente) é a razão entre a corrente de coletor que o transistor de saída consegue conduzir e a corrente do LED: CTR = IC / IF × 100%. Por exemplo, num optoacoplador com CTR de 100%, se você passar 5 mA pelo LED, pode puxar no máximo cerca de 5 mA da saída. O CTR muda com a temperatura, cai ao longo dos anos conforme o LED envelhece e varia bastante até entre peças do mesmo modelo. Por isso, você sempre projeta com base no valor mais baixo do datasheet.

Classe do PC817Faixa de CTR (IF = 5 mA)Corrente de saída com 5 mA no LED
PC817A80–160%4–8 mA
PC817B130–260%6,5–13 mA
PC817C200–400%10–20 mA
PC817D300–600%15–30 mA
Sem letra50–600%2,5–30 mA (considere o pior caso)

Resistor do LED: o lado da entrada é calculado exatamente como um LED: R = (Valim − VF) / IF. Para passar 10 mA a partir do pino de 5 V de um Arduino Uno, você obtém (5 − 1,2) / 0,010 = 380 Ω; um resistor padrão de 330 Ω dá cerca de 11,5 mA, e um de 390 Ω, cerca de 9,7 mA. No ESP32, (3,3 − 1,2) / 0,010 = 210 Ω, então você usa 220 Ω. Os pinos do Raspberry Pi Pico vêm configurados por padrão com capacidade de corrente de 4 mA; aqui, cerca de 4,5 mA com 470 Ω é suficiente. Se não quiser fazer a conta à mão, use a ferramenta Resistor para LED.

Resistor de saída (pull-up): para o transistor conduzir totalmente (saturar), a corrente puxada pelo pull-up precisa ser menor do que o CTR permite. Um pull-up de 10 kΩ ligado a 5 V precisa de apenas 0,5 mA. Num PC817 sem letra, o CTR no pior caso é 50%, então 1 mA no LED bastaria para 0,5 mA; usando 5–10 mA, você deixa uma margem de pelo menos cinco vezes. O pull-up interno do Arduino (cerca de 20–50 kΩ) também é ideal para isso. Um pull-up menor deixa o sinal mais rápido, mas exige mais corrente; um maior exige menos corrente, mas faz o transistor desligar mais devagar.

CasoTensão de alimentaçãoCorrente desejada no LEDResistor sugeridoPotência do resistor
Acionando por um pino do Arduino Uno5 V~10 mA330 Ω1/4 W é suficiente
Acionando por um pino do ESP323,3 V~10 mA220 Ω1/4 W é suficiente
Acionando por um pino do Raspberry Pi Pico3,3 V~4,5 mA470 Ω1/4 W é suficiente
Leitura de sinal de 12 V12 V~5 mA2,2 kΩ1/4 W (dissipa 0,05 W)
Leitura de sinal de 24 V24 V~5 mA4,7 kΩ1/4 W (dissipa 0,11 W)
Se você precisa ler tanto 12 V quanto 24 V na mesma entrada, escolha 4,7 kΩ: passam cerca de 4,8 mA com 24 V e cerca de 2,3 mA com 12 V. Mesmo com CTR de 50%, 2,3 mA fica bem acima dos 0,1–0,25 mA de que o pull-up interno precisa, então o mesmo circuito funciona de forma confiável nas duas tensões.

Tabela de ligação: Arduino Uno, ESP32 e Raspberry Pi Pico

Pino do PC817FunçãoArduino UnoESP32Raspberry Pi Pico
1 (Ânodo), isolação de saídaA placa aciona o LEDD9 → 330 Ω → pino 1GPIO 25 → 220 Ω → pino 1GP15 → 470 Ω → pino 1
2 (Cátodo), isolação de saídaRetorno do LEDGNDGNDGND
4 (Coletor), leitura de entradaA placa lê o sinalD2 (INPUT_PULLUP)GPIO 27 (INPUT_PULLUP)GP14 (PULL_UP)
3 (Emissor), leitura de entradaGND do lado da leituraGNDGNDGND
1 e 2, leitura de entradaSinal externo (12/24 V)Vai para a fonte externa, não para a placaVai para a fonte externa, não para a placaVai para a fonte externa, não para a placa
O erro mais comum é ligar o LED sem resistor: aplicar 5 V direto nos pinos 1 e 2 queima o LED em segundos. O segundo mais comum é encaixar o componente invertido; o LED só suporta 6 V reversos, então 12 V ou 24 V ligados ao contrário o destroem. Colocar um diodo 1N4148 invertido na entrada (cátodo no ânodo) elimina esse risco.

Isolando uma saída do Arduino

Nesta montagem, o Arduino acende o LED do optoacoplador, e o transistor de saída fecha a entrada de outro circuito como uma chave. Assim você pode acionar com segurança, por exemplo, a entrada de “disparo” de um aparelho de 12 V, a entrada de disparador remoto de uma câmera, uma entrada de CLP ou outro microcontrolador que funcione em outra tensão. Como o transistor de saída é limitado a 35 V e 50 mA, ele não consegue acionar diretamente a bobina de um relé, um motor ou uma fita de LED; para cargas assim, você usa um transistor ou um MOSFET do outro lado.

C++ (Arduino IDE)
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}

No lado da saída, você liga o coletor (pino 4) ao lado positivo ou à entrada do outro circuito e o emissor (pino 3) ao GND desse circuito; se a polaridade estiver invertida, o transistor não conduz. Como o PC817 leva de alguns a algumas dezenas de microssegundos para ligar e desligar, um sinal PWM que passa por ele começa a se deformar acima de alguns kHz. Para sinais rápidos (UART, MIDI, PWM de alta frequência), prefira optoacopladores de alta velocidade como o 6N137 ou CIs isoladores digitais.

Lendo sinais de 12/24 V com segurança

Você não pode ligar diretamente a um pino do Arduino os sinais de sensores indutivos industriais, saídas de CLP, contatos de porta, a chave de ignição de um carro ou um botão de campainha de 12 V. A solução é fazer o sinal passar pelo LED do optoacoplador: você coloca um resistor de 4,7 kΩ em série com o LED para 24 V e de 2,2 kΩ para 12 V, e o transistor de saída trabalha com o pull-up interno do Arduino. Quando há tensão, o LED acende, o transistor conduz e o pino do Arduino lê LOW. Ou seja, a lógica é invertida, e você leva isso em conta no código.

  1. Ligue o positivo da fonte de 24 V ao pino 1 (ânodo) do PC817 através de um resistor de 4,7 kΩ.
  2. Ligue o negativo da fonte do sinal (GND de 24 V) ao pino 2 (cátodo). Não ligue esse GND ao Arduino.
  3. Se quiser, coloque um diodo 1N4148 invertido entre os pinos 1 e 2 (cátodo no pino 1); ele protege contra ligação invertida.
  4. Ligue o pino 4 (coletor) do PC817 ao pino D2 do Arduino e o pino 3 (emissor) ao GND do Arduino.
  5. Carregue o código abaixo e abra o Monitor Serial a 9600 baud. Ao aplicar 24 V, você deve ver “24V VAR / present”.
C++ (Arduino IDE)
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}

O código inclui um debounce simples que só aceita leituras que permanecem iguais por 20 ms; isso é obrigatório para sinais vindos de contatos mecânicos ou relés. Como lemos com millis() em vez de delay(), o Arduino pode fazer outras coisas enquanto isso. Na parte elétrica de um carro, a linha de 12 V sobe para 14,4 V com o motor ligado e aparecem picos curtos e altos; aumentar o resistor para 3,3 kΩ e adicionar um diodo TVS na entrada é uma boa precaução nesse caso.

Optoacopladores com ESP32 e Raspberry Pi Pico

Como o ESP32 e o Pico funcionam com 3,3 V, eles não devem ser ligados diretamente nem a sinais de 5 V. Aí está a beleza do optoacoplador: o transistor de saída é de coletor aberto, então a tensão de saída é definida apenas pela tensão à qual o pull-up está ligado. Com o pull-up interno, a saída fica automaticamente em 3,3 V; mesmo com 24 V no lado da entrada, chegam no máximo 3,3 V ao ESP32. O código de ESP32 abaixo conta, com uma interrupção, os pulsos de um sensor indutivo ou de um medidor de vazão de 24 V:

C++ (Arduino IDE)
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}

O IRAM_ATTR antes da função de interrupção coloca o código na memória rápida; ele é recomendado para funções de interrupção no ESP32. O filtro de 2 ms elimina pulsos falsos causados pelo desligamento lento do optoacoplador ou por ruído no cabo. Para saber mais sobre interrupções, dê uma olhada no post interrupções no Arduino. No Raspberry Pi Pico, você faz o mesmo com MicroPython assim; enquanto lê a entrada, este exemplo também envia um sinal isolado para o outro lado através de um segundo PC817:

MicroPython
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)

Detecção da rede elétrica: H11AA1 e segurança

A tensão da rede de 230 V pode matar. Se você não tem experiência, não monte por conta própria um circuito ligado à rede elétrica; use módulos de detecção AC prontos, fechados e certificados. Nunca coloque o lado da rede numa protoboard, não toque em nada com o circuito energizado e coloque todo o circuito numa caixa isolante, junto com um fusível.

Para saber se uma tomada ou um circuito de lâmpada está energizado, ou para encontrar os instantes de passagem por zero da rede, usam-se optoacopladores com entrada AC, como o H11AA1. Dentro dele há dois LEDs ligados em antiparalelo, então ele gera luz nos dois semiciclos da corrente alternada e não tem problema de tensão reversa. Para 230 V rms, colocam-se dois resistores de 47 kΩ em série com a entrada: pelo total de 94 kΩ passam cerca de 2,4 mA rms (3,5 mA no pico) e cada resistor dissipa cerca de 0,28 W. Por isso, escolha resistores de pelo menos 0,5 W, de preferência 1 W; usar dois resistores também divide pela metade a tensão sobre cada um. No lado da saída, com um pull-up de 10 kΩ ligado a 5 V, o transistor conduz na maior parte do tempo enquanto há tensão; só perto das passagens por zero, quando os LEDs apagam, aparece um pulso HIGH curto. Numa rede de 50 Hz, você verá cerca de 100 pulsos por segundo.

C++ (Arduino IDE)
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}

O código fornece duas informações: se a saída foi a LOW pelo menos uma vez nos últimos 40 ms, a rede está presente; e metade dos pulsos contados pela interrupção dá a frequência da rede. Pontos de atenção em módulos prontos e na sua própria placa: deixe pelo menos 6–8 mm de distância (distância de escoamento) entre as trilhas da rede e o lado de baixa tensão, coloque um fusível na entrada da rede, nunca passe uma trilha entre os dois lados do optoacoplador e use o circuito dentro de uma caixa fechada.

O optoacoplador dos módulos relé e o jumper JD-VCC

Módulo relé com entrada por optoacoplador
Muitos módulos relé têm um optoacoplador PC817 no lado da entrada; para ter isolação total, é preciso remover o jumper JD-VCC.

A maioria dos módulos relé de 1, 2, 4 e 8 canais à venda tem um PC817 na entrada de cada canal. A corrente do pino VCC passa por um resistor e por um LED indicador até o LED do optoacoplador; quando o pino IN vai a LOW, o circuito se fecha e o relé arma. Por isso, esses módulos geralmente funcionam ativos em LOW. Porém, como saem de fábrica, o jumper JD-VCC vem colocado e a bobina do relé é alimentada pelos mesmos VCC e GND: o optoacoplador está lá, mas não há isolação. Você encontra o básico sobre módulos relé no post O que é um módulo relé?.

ConfiguraçãoLigaçãoIsolação
Jumper JD-VCC colocadoArduino 5V → VCC, GND → GND, pino → INNenhuma; o ruído da bobina do relé entra na alimentação do Arduino
Jumper removidoArduino 5V → VCC, pino → IN; GND do Arduino não ligado. Fonte de 5 V separada → JD-VCC e GNDTotal; a única coisa que os dois lados compartilham é a luz dentro do optoacoplador

Uma observação sobre acionar um triac com o MOC3021

Se você quer uma chave AC silenciosa e sem faíscas no lugar de um relé, usa um triac (por exemplo, BT136) e um optoacoplador com saída triac para acioná-lo. O MOC3021 é de fase aleatória: ele dispara o triac no instante em que o LED acende, então, junto com um detector de passagem por zero, serve para montar um dimmer. O MOC3041 e o MOC3063 são modelos com circuito de passagem por zero; só disparam quando a tensão passa por zero, geram menos interferência em aplicações de liga/desliga, mas não podem ser usados como dimmer. O LED do MOC3021 pode precisar de até 15 mA para disparar; a 5 V, 220 Ω (cerca de 17 mA) é um valor adequado, enquanto 330 Ω pode não bastar para algumas peças. Como nos datasheets, coloca-se um resistor de cerca de 360 Ω entre o gate do triac e o MOC3021, e, para cargas indutivas como motores, adiciona-se um snubber RC sobre o triac. Os módulos SSR (relé de estado sólido) prontos têm exatamente essa estrutura por dentro.

Ideias de projetos com optoacoplador

  • Leitor de sensor industrial: conte produtos numa esteira com um sensor de proximidade indutivo de 24 V e mostre a contagem num display LCD.
  • Detector de ignição do carro: acorde o ESP32 quando a ignição for ligada e inicie a câmera do carro ou um registrador de dados.
  • Alarme de falta de energia: com um módulo de detecção AC pronto, toque um buzzer ou envie uma notificação ao celular quando a energia cair.
  • Detector de campainha: leia de forma isolada a linha de campainha de 12 V que já existe e envie uma notificação quando ela tocar.
  • Placa de relé isolada: controle uma lâmpada de 230 V com um módulo relé cujo jumper JD-VCC você removeu e que alimenta com uma fonte separada.
  • Entrada MIDI: leia no Arduino as notas MIDI de um instrumento eletrônico com um 6N138.

Erros comuns e como corrigi-los

SintomaCausa provávelSolução
A saída nunca mudaLED ligado invertido, ou ligado sem resistor e queimadoConfira se o pino 1 é o marcado com o ponto; teste o LED na escala de diodo do multímetro
A lógica funciona invertidaO pino vai a LOW quando há tensão; isso é normalTrate LOW como “presente” no código
A saída não vai totalmente a LOW (fica em 1–2 V)Corrente do LED muito baixa, CTR insuficiente ou pull-up pequeno demaisDiminua o resistor do LED ou aumente o pull-up (por exemplo, 10 kΩ)
O sinal PWM se deformaO PC817 é lento demais acima de alguns kHzDiminua o pull-up ou use um optoacoplador rápido como o 6N137
O Arduino reinicia mesmo com isolaçãoOs GNDs dos dois lados foram unidosSepare o GND do lado da entrada do Arduino; remova o jumper JD-VCC do módulo relé
Disparos falsos aleatóriosCabo longo, ruído, repique dos contatosFaça debounce no software, encurte o cabo, coloque um capacitor de 100 nF sobre o LED
O jeito mais fácil de testar um optoacoplador: alimente o lado do LED com 5 V através de 330 Ω e ligue um multímetro na escala de resistência entre coletor e emissor. Você deve ver uma resistência baixa com o LED aceso e muito alta com ele apagado. Com esse teste simples, você identifica uma peça com defeito antes de ela ir para o circuito.

O optoacoplador é o jeito mais barato de tirar um projeto Arduino da mesa e deixá-lo conversar com segurança com os sinais de 12 V, 24 V e 230 V do mundo real: um componente que custa centavos separa sua placa e seu computador da alta tensão. No app BlueGrays você encontra os projetos de controle de uma lâmpada de 230 V com relé, iluminação inteligente e irrigação, passo a passo, com esquemas do circuito e código.

Perguntas frequentes

Para que serve um optoacoplador?

O optoacoplador leva um sinal de um circuito a outro com luz, sem nenhuma conexão elétrica. Assim, ele isola um circuito de alta tensão ou ruidoso de um microcontrolador sensível como o Arduino. É usado na leitura de sensores industriais, em módulos relé e em circuitos de detecção da rede elétrica.

Qual é a pinagem do PC817?

O PC817 tem quatro terminais: o pino 1, no canto com o ponto, é o ânodo do LED, e o pino 2 é o cátodo. Do lado oposto, o pino 3 é o emissor do fototransistor e o pino 4 é o coletor.

Que resistor devo usar com um optoacoplador?

O resistor é calculado com R = (tensão de alimentação − 1,2 V) / corrente do LED. Bons valores iniciais são 330 Ω para um pino de 5 V do Arduino, 220 Ω para o ESP32, 2,2 kΩ para um sinal de 12 V e 4,7 kΩ para um sinal de 24 V.

O que é CTR num optoacoplador?

CTR (razão de transferência de corrente) é a razão entre a corrente que o transistor de saída consegue conduzir e a corrente do LED. Num optoacoplador com CTR de 100%, 5 mA no LED permitem puxar no máximo cerca de 5 mA da saída. Sempre projete com base no menor CTR do datasheet.

Qual é a diferença entre o PC817 e o 4N35?

Os dois são optoacopladores com saída por fototransistor. O PC817 tem quatro terminais e é barato, com CTR de 50–600% conforme a classe. O 4N35 tem seis terminais, deixa o pino da base acessível e suporta tensões de coletor de até 70 V.

Um optoacoplador consegue detectar a rede de 230 V?

Sim, optoacopladores com entrada AC, como o H11AA1, com resistores em série de potência adequada, conseguem detectar a tensão da rede e as passagens por zero. Mas a tensão da rede pode matar; se você não tem experiência, use módulos de detecção AC prontos e fechados.

Ver todos os projetos
Acender uma lâmpada de 220V com botão de pressão
#19Avançado
Premium

Acender uma lâmpada de 220V com botão de pressão

Enquanto você mantém o botão pressionado, uma lâmpada de 220 volts fica acesa e apaga assim que você solta. O sinal fraco do Arduino não consegue acender a lâmpada diretamente, então um relé, que é um

4.4(30)
38
Ligar e desligar uma lâmpada de 220V com botão
#20Avançado
Premium

Ligar e desligar uma lâmpada de 220V com botão

Quer ligar e desligar uma lâmpada de casa com um pequeno botão? Ao pressionar o botão, o Arduino aciona um relé e a lâmpada acende; ao pressionar novamente, ela apaga. O relé funciona como intermediár

4.5(33)
44
Acender uma lâmpada de 220V com controle remoto
#21Avançado
Premium

Acender uma lâmpada de 220V com controle remoto

Ligue e desligue uma lâmpada de casa com o controle da TV, sem sair do sofá. O Arduino lê o sinal de luz invisível do controle; o botão de ligar aciona o relé e acende a lâmpada, e o botão de silencia

4.4(22)
30
Iluminação inteligente de escadas e corredores
#82Intermediário
Premium

Iluminação inteligente de escadas e corredores

Ao entrar na escada ou no corredor, as luzes acendem uma a uma no sentido em que você caminha. Há um sensor de distância em cada extremidade; ao passar por um deles, os oito LEDs acendem a partir daqu

5.0(35)
51
Iluminação inteligente com ESP32 (PIR + LDR + relé + OLED)
#141Avançado
Premium

Iluminação inteligente com ESP32 (PIR + LDR + relé + OLED)

Transforme a iluminação do corredor, banheiro ou despensa em iluminação inteligente com ESP32! Com um sensor de movimento PIR, um sensor de luz LDR e um módulo relé, montamos o cenário clássico de "acender a luz ao detectar movimento no escuro" — se o ambiente já estiver claro, o movimento NÃO aciona a luz, economizando energia durante o dia. A luz fica acesa por 30 segundos; se o movimento continuar, o temporizador reinicia e a luz permanece acesa por mais tempo.

4.3(6)
11
Estação de irrigação inteligente
#83Avançado
Premium

Estação de irrigação inteligente

Um jardineiro que rega suas plantas sozinho para que elas não sequem enquanto você está de férias. Um sensor de umidade do solo mede o quanto a terra está úmida; quando ela seca, o Arduino aciona a bo

5.0(42)
57
Iluminação automática com ESP32 e sensor de movimento PIR
#121Intermediário
Premium

Iluminação automática com ESP32 e sensor de movimento PIR

Neste projeto, usaremos o sensor de movimento PIR HC-SR501 para detectar quando alguém entra no cômodo e acender o LED automaticamente. Acompanharemos o tempo em que o LED fica aceso com millis(). Cada leitura HIGH do sensor atualizará o instante do último movimento, e o LED apagará pelo menos 10 segundos após a última leitura HIGH. O código atual também espera 50 ms em cada ciclo com delay(50), portanto o laço da aplicação não é totalmente livre de bloqueios.

4.4(24)
38