Arduino - Optoacoplador PC817: Monitorar Sinal de Entrada 12V/24V DC
Um pino de entrada do Arduino foi feito para 5V e nada mais, então ligar uma linha de 12V ou 24V diretamente nele vai destruir o pino. O optoacoplador PC817 resolve isso de forma segura: ele passa o sinal através de uma barreira isolante na forma de luz, de modo que o Arduino consegue saber se a tensão externa está presente sem nunca tocá-la eletricamente.
A forma mais fácil de usá-lo é com um módulo de isolamento optoacoplador PC817 pronto: o resistor e um LED de status já estão na placa, e os fios externos entram em bornes de parafuso. Este tutorial usa o módulo como caminho principal.
Neste tutorial, vamos aprender:
- Como o optoacoplador PC817 funciona
- Como escolher o módulo certo para um sinal de 3.3V, 5V, 12V ou 24V
- Como ligar o módulo ao Arduino
- Como conectar a um dispositivo em paralelo para ver se ele está funcionando
- Como saber se o seu módulo lê em ativo-LOW ou ativo-HIGH
- Como programar o Arduino para ler a entrada isolada

Esta é a forma padrão de detectar com segurança um sinal de 12V DC ou monitorar uma saída de 24V de um CLP com uma placa de baixa tensão. Também é a resposta mais simples para uma pergunta que surge o tempo todo em uma oficina ou em uma sala de máquinas: aquela bomba, aquecedor, lâmpada ou motor está realmente funcionando agora? O Arduino só precisa ver se a energia está chegando ao dispositivo, e o PC817 permite que ele veja isso a uma distância segura.
Hardware Necessário
Or you can buy the following kits:
| 1 | × | DIYables STEM V3 Starter Kit (Arduino included) | |
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Você só precisa de UM módulo: aquele que corresponde à tensão do sinal que você quer monitorar.
Sobre o Optoacoplador PC817
O PC817 é um optoacoplador de 4 pinos, também chamado de fotoacoplador ou opto-isolador. Dentro dele há um LED infravermelho voltado para um fototransistor através de uma barreira isolante: quando a corrente passa pelo LED, sua luz liga o transistor, de modo que o sinal atravessa como luz em vez de eletricidade, e é por isso que os dois lados permanecem eletricamente separados.
Essa barreira é especificada para 5000 Vrms de isolamento durante um minuto, então uma falha no lado de 12V ou 24V não consegue chegar ao Arduino.
Um módulo de isolamento optoacoplador PC817 é esse chip em uma pequena PCB com o resistor em série já instalado, um LED de status, bornes de parafuso para o sinal externo e barras de pinos para o Arduino. Os módulos existem em versões de 1, 2, 4 e 8 canais.
Os números úteis do datasheet do PC817:
- Tensão direta do LED (Vf): cerca de 1.2V típico, 1.4V máx
- Corrente direta do LED (If): 20mA contínuos máx, 5mA a 20mA é a faixa normal, 10mA é um bom alvo
- Tensão coletor-emissor de saída (VCEO): 35V máx
- Corrente de coletor de saída (IC): 50mA máx
- Dissipação de potência do coletor: 150mW
- Tensão de isolamento: 5000 Vrms durante 1 minuto
- Taxa de Transferência de Corrente (CTR): 50% a 600% dependendo da classe (classe A 80-160%, B 130-260%, C 200-400%, D 300-600%)
- Velocidade de chaveamento: tempo de subida de cerca de 4us, tempo de descida de cerca de 3us
- Temperatura de operação: -30 a +100 graus Celsius
De Qual Módulo Optoacoplador Eu Preciso?
Esta é a única decisão que você precisa acertar antes de comprar. O resistor do módulo já está instalado e é dimensionado para uma única tensão de entrada, por isso o módulo é vendido em três variantes separadas. Veja o sinal que você quer monitorar e compre a variante correspondente:
| Sinal que você quer monitorar | Módulo a comprar |
|---|---|
| Lógica de 3.3V ou 5V | Módulo 3-5V |
| 12V DC | Módulo 12V |
| 24V DC | Módulo 24V |
Com um módulo, você nunca calcula um resistor. Escolher a variante É a decisão do resistor, já tomada para você.
WARNING
Não use um módulo na tensão errada. Um módulo de 12V alimentado por uma linha de 24V recebe aproximadamente o dobro da corrente prevista através do seu LED interno e será danificado. Um módulo de 24V alimentado por uma linha de 12V fica com corrente insuficiente, então a saída pode chavear com atraso, chavear de forma não confiável ou nunca chavear. Nenhum dos dois erros se anuncia: você simplesmente acaba com um módulo queimado ou com uma leitura em que não pode confiar.
※ Nota:
Também vale a pena isolar um sinal de 5V ou 3.3V. O isolamento serve para interromper o caminho do terra, não apenas para lidar com alta tensão, então ele se justifica sempre que os dois circuitos funcionam com fontes de alimentação separadas, ficam em extremidades opostas de um cabo longo, ou um deles é eletricamente ruidoso, como um driver de motor ou a placa de controle de baixa tensão dentro de um aparelho ligado à rede elétrica. Esse é o trabalho do módulo 3-5V.
Como Funciona
- Quando o sinal externo está presente nos bornes de entrada, a corrente passa pelo resistor do módulo e pelo LED interno. O LED acende e liga o fototransistor, e o pino OUT do módulo muda de estado.
- Quando o sinal externo está ausente, o LED fica apagado, o fototransistor fica desligado e o OUT volta ao seu estado de repouso.
O LED de status do módulo acende junto com o LED interno, então você pode ver o lado da entrada funcionando com seus próprios olhos.
O PC817 não mede a tensão. Ele apenas informa ao Arduino se o sinal externo está presente ou não. Se você precisar do valor real em vez de uma resposta sim/não, veja Arduino - Medir Tensão.
Diagrama de Ligação
Ligando o Módulo Optoacoplador PC817 ao Arduino
O módulo tem dois lados, e esse é justamente o objetivo: os bornes de parafuso pertencem ao circuito externo, a barra de pinos pertence ao Arduino, e nada passa entre eles.
- O sinal externo de 12V/24V precisa ser conectado ao borne de parafuso IN+
- O terra do circuito externo precisa ser conectado ao borne de parafuso IN-
- O pino VCC do módulo precisa ser conectado ao pino 5V do Arduino
- O pino GND do módulo precisa ser conectado ao pino GND do Arduino
- O pino OUT do módulo precisa ser conectado ao pino D2 do Arduino

This image is created using Fritzing. Click to enlarge image
Não há nenhum resistor em série para adicionar nesta ligação. O módulo já o possui.
※ Nota:
NÃO conecte o terra do circuito de 12V/24V ao GND do Arduino. O borne IN- e o pino GND do módulo devem permanecer separados, e essa separação é exatamente o que protege o Arduino. Se você os unir, o módulo ainda chaveia, mas o isolamento desaparece e não faz mais sentido usar um optoacoplador.
Conectando o PC817 em Paralelo com o Dispositivo que Você Quer Monitorar
Na maioria das vezes, ninguém entrega a você um fio de sinal sobrando. Você tem um dispositivo que já está ligado e já funcionando, e quer que o Arduino saiba quando ele está ligado. Nesse caso, a entrada do módulo vai sobre o dispositivo, em paralelo com ele, da mesma forma que um voltímetro ficaria sobre ele. Nada no circuito existente é cortado, movido ou redirecionado.
Tome como exemplo a bobina de um relé de 12V, o que torna isso um trabalho para o módulo de 12V. A bobina já tem um terminal positivo que fica energizado quando o relé é acionado e um terminal negativo que retorna ao terra da fonte de 12V. A derivação são apenas dois fios extras:
- Do terminal positivo (chaveado) da bobina ao borne IN+ do módulo.
- Do terminal negativo (retorno) da bobina ao borne IN- do módulo.
- VCC, GND e OUT continuam indo para o 5V, o GND e o D2 do Arduino, exatamente como na ligação acima.
A derivação consome cerca de 10mA. Uma bobina de relé de 12V sozinha puxa algo em torno de 30 a 80mA, então os 10mA extras não mudam nada e o relé continua funcionando exatamente como antes. Esta é uma medição somente de leitura: o PC817 observa a bobina, ele não a chaveia.
WARNING
Nunca coloque o módulo em série com o dispositivo. Em série, toda a corrente de carga da bobina do relé, da lâmpada ou do motor teria que passar pelo minúsculo LED dentro do PC817, que é especificado para 20mA, e o optoacoplador seria destruído no momento em que você ligasse o dispositivo. A entrada sempre vai sobre o dispositivo, nunca em linha com ele.
Como a derivação fica sobre a bobina em vez de em um fio de saída do Arduino, a leitura acompanha o que o dispositivo está realmente fazendo. Se um termostato, um temporizador, um CLP ou uma pessoa ligar o relé, o Arduino vê isso. Se o relé for comandado para ligar, mas nunca for energizado porque um fusível queimou ou um fio se soltou, o Arduino também vê isso. É isso que faz valer a pena montar este circuito para contadores de horas de funcionamento, registros de tempo ocioso e alertas de "ele realmente ligou?". Seja honesto sobre o que ele mede, porém: ele informa que o dispositivo está energizado, não que está fazendo seu trabalho, então um motor travado ou uma resistência de aquecedor queimada ainda consome energia e ainda aparece como ON.
Três coisas para verificar antes de energizar a derivação:
- Polaridade. O lado da entrada é um LED, então ele conduz em apenas um sentido. Se IN+ e IN- estiverem invertidos, o módulo simplesmente nunca liga. Descubra qual lado da derivação é o positivo antes de fazer a ligação.
- Saídas com fuga. Algumas saídas a transistor de CLP, saídas a triac e drivers de lâmpadas LED deixam passar uma pequena corrente mesmo quando estão desligadas. Essa fuga pode acender parcialmente o LED do PC817, e o Arduino então informa o dispositivo como ON quando ele está na verdade OFF. O sintoma é fácil de reconhecer: a leitura nunca volta para ABSENT. A solução é um resistor de dreno de cerca de 4.7 kohm a 10 kohm entre os bornes IN+ e IN-, para que a fuga passe pelo resistor em vez de passar pelo LED.
- Linhas AC. A entrada do PC817 é um único LED, então ele responde a apenas uma polaridade e é a peça errada para detectar uma linha AC, que precisa de um optoacoplador cujo estágio de entrada tenha dois LEDs em antiparalelo.
WARNING
A bobina de um relé é uma carga indutiva. Quando ela desliga, o colapso do seu campo magnético produz um pico de tensão reversa sobre a bobina muitas vezes maior que os 12V que a alimentavam, e o LED de entrada do PC817 é especificado para apenas 6V em reverso. Instale um diodo comum em antiparalelo diretamente entre os bornes IN+ e IN-: o catodo do diodo no IN+, o anodo do diodo no IN-. Em operação normal, esse diodo fica polarizado reversamente e não faz absolutamente nada, mas quando o pico chega ele conduz e limita a tensão reversa a bem menos de um volt. Um 1N4148 é suficiente para uma derivação pequena como esta, e um 1N4007 para as mais pesadas. O mesmo vale para solenoides, contatores, válvulas e motores.
Seu Módulo Optoacoplador é Ativo-HIGH ou Ativo-LOW?
No chip isolado, isso é física bem definida. Com o pull-up interno ativado, o fototransistor puxa o pino para baixo quando o LED está aceso, então:
- Sinal externo PRESENTE: o pino do Arduino lê LOW
- Sinal externo AUSENTE: o pino do Arduino lê HIGH
Os módulos não são tão previsíveis. A maioria deles se comporta exatamente como o chip isolado, mas alguns fabricantes invertem a saída na placa para que o OUT acompanhe a entrada. Os dois tipos estão à venda e você não consegue diferenciá-los só de olhar, então verifique o seu. Leva menos de um minuto:
- Ligue o módulo como acima e carregue o sketch abaixo sem alterar nada.
- Sem nada conectado aos bornes de entrada, olhe o Serial Monitor e anote o que ele imprime.
- Agora aplique o sinal externo e anote o que ele imprime.
- O que o pino ler enquanto o sinal estiver presente é o nível ativo do seu módulo.
- Confira com o LED de status do módulo: ele acende enquanto o lado da entrada está energizado. Se esse LED estiver aceso, mas o Serial Monitor ainda disser ABSENT, o seu módulo é do outro tipo.
Se as leituras saírem invertidas, não reescreva nada. Mude a única linha const bool MODULE_ACTIVE_LOW = true; no topo do código para false e carregue novamente.
O caso ativo-LOW é o mesmo padrão que você obtém de um botão ou de uma chave de fim de curso ligados com pull-up.
Opcional: Montando com o Chip PC817 Isolado
Se você preferir montar a entrada por conta própria, o chip isolado de 4 pinos faz o mesmo trabalho por alguns centavos, mas agora é você quem dimensiona o resistor em série. O pino 1 é marcado por um ponto ou um entalhe no chip.
- Pino 1 - Anodo (A): o sinal externo precisa ser conectado aqui através do resistor em série
- Pino 2 - Catodo (K): precisa ser conectado ao terra do circuito externo, NÃO ao GND do Arduino
- Pino 3 - Emissor (E): precisa ser conectado ao GND do Arduino
- Pino 4 - Coletor (C): precisa ser conectado ao pino D2 do Arduino

Dimensione o resistor para cerca de 10mA com R = (Vin - 1.2) / 0.01, o que dá 220 ohm para 3.3V, 390 ohm para 5V, 1 kohm para 12V e 2.2 kohm para 24V. Um resistor de 1/4W serve até 12V; use 1/2W em 24V.
Todo o resto desta página - a derivação em paralelo, o diodo de proteção, o código - funciona da mesma forma.
Como Programar o PC817
- Configura um pino do Arduino no modo de entrada digital com o pull-up interno usando a função pinMode(). Por exemplo, o pino 2:
- Lê o estado desse pino usando a função digitalRead():
- Transforma essa leitura em uma resposta sim/não. Uma única constante decide o sentido, para que você possa adaptar ao seu próprio módulo sem mexer em mais nada:
Nenhuma biblioteca é necessária para este projeto.
Código Arduino - Optoacoplador PC817
Passos Rápidos
- Conecte o Arduino ao PC via cabo USB
- Faça a ligação conforme o diagrama de ligação do módulo acima
- Abra o Arduino IDE, selecione a placa e a porta corretas
- Copie o código acima e abra-o com o Arduino IDE
- Clique no botão Upload no Arduino IDE para carregar o código no Arduino
- Ligue e desligue o sinal externo de 12V/24V
- Veja o resultado no Serial Monitor.
Se PRESENT e ABSENT aparecerem trocados, o seu módulo é do tipo ativo-HIGH: defina MODULE_ACTIVE_LOW como false e carregue novamente.
A partir daqui, o mesmo circuito cobre muitas aplicações: monitorar a linha da lâmpada de funcionamento ou de falha de uma máquina de 24V, verificar se um circuito de 12V de um veículo, como a ignição ou os faróis, está energizado, ou ver quando a bobina de um solenoide de 24V é energizada. Assim que o Arduino souber o estado, você pode agir com um relé, um buzzer ou um registro: contar as horas de funcionamento de uma bomba, emitir um alerta quando uma máquina recebeu o comando para ligar mas não ligou, ou registrar por quanto tempo uma linha de produção ficou parada.