ESP32 - Optoacoplador PC817: Monitorar Sinal de Entrada DC de 12V/24V
Este tutorial ensina como usar o ESP32 para saber se um dispositivo de 12V ou 24V - uma válvula, uma bomba, um aquecedor, uma máquina - está realmente funcionando neste momento, observando a própria alimentação dele por meio de um módulo optoacoplador PC817 que não compartilha nenhuma conexão elétrica com o ESP32, e imprimindo o resultado no Serial Monitor. Usamos o módulo pronto na variante de 3-5V, 12V ou 24V que combina com o seu sinal, e deixamos o chip simples de quatro pinos para o final, para quem preferir montar a entrada por conta própria.
Hardware Necessário
Or you can buy the following kits:
| 1 | × | DIYables ESP32 Starter Kit (ESP32 included) | |
| 1 | × | DIYables ESP32 S3 Starter Kit (ESP32 S3 included) | |
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Você não precisa de mais de um módulo. Compre apenas a variante que combina com a tensão que você vai monitorar, como explicado na próxima seção.
Sobre o Optoacoplador PC817
O PC817 é um optoacoplador de 4 pinos, também chamado de fotoacoplador ou opto-isolador. Dentro do seu pequeno encapsulamento preto há um LED infravermelho voltado para um fototransistor, separados por um espaço isolante. Quando a corrente passa pelo LED, a luz dele liga o transistor, então o sinal atravessa o espaço como luz, e não como eletricidade. Esse é todo o truque: os dois lados do chip ficam eletricamente separados, e é exatamente isso que permite que um ESP32 de 3,3V observe um circuito de 12V ou 24V sem compartilhar um único fio com ele.
Dois trabalhos que o PC817 faz bem em um projeto com ESP32:
- Observar um sensor de proximidade industrial de 24V ou uma saída de CLP e informar o estado dele pelo WiFi.
- Saber se a válvula solenoide de 12V ou a bobina do contator de uma bomba está energizada no momento.
Nos dois casos, o ESP32 só vê os próprios níveis lógicos de 3,3V, enquanto o lado de 12V ou 24V fica atrás da barreira de isolação.
| Parâmetro | Valor |
|---|---|
| A tensão de isolação | 5000 Vrms (1 minuto) |
| A tensão direta do LED de entrada (Vf) | cerca de 1,2 V típica, 1,4 V máx. |
| A corrente direta do LED de entrada (If) | 20 mA contínua máx., 5-20 mA normal, 10 mA é um bom alvo |
| A tensão coletor-emissor de saída (VCEO) | 35 V máx. |
| A corrente de coletor de saída (IC) | 50 mA máx. |
| A dissipação de potência do coletor | 150 mW |
| A razão de transferência de corrente (CTR) | 50% a 600% dependendo da classificação |
| O tempo de subida / tempo de descida | cerca de 4 us / cerca de 3 us típico |
| A temperatura de operação | -30 C a +100 C |
| O encapsulamento | DIP de 4 pinos, pino 1 marcado por um ponto ou um entalhe |
Qual Módulo Optoacoplador PC817 Eu Preciso?
Um módulo optoacoplador PC817 já vem com o resistor em série instalado, e esse resistor é dimensionado para uma tensão de entrada. Por isso o módulo é vendido em três variantes separadas, e não como uma placa única que aceita qualquer coisa. Combine a variante com o sinal que você pretende monitorar:
| O sinal que você quer monitorar | A variante do módulo a comprar |
|---|---|
| Uma linha de 12V - uma válvula solenoide, uma bobina de contator de bomba, um acessório automotivo | O módulo de 12V |
| Uma linha de 24V - uma saída de CLP, um sensor de proximidade industrial, um sinal de máquina | O módulo de 24V |
| Um sinal lógico de 3,3V ou 5V - outro microcontrolador, uma placa de sensor, uma placa de controle embutida | O módulo de 3-5V |
Esta é a única decisão de compra desta página que pode custar uma peça. Um módulo de 12V ligado a uma linha de 24V faz passar cerca do dobro da corrente prevista pelo LED interno e vai danificá-lo. Um módulo de 24V ligado a uma linha de 12V tem o problema oposto: o LED fica subalimentado, então a saída pode comutar tarde, comutar de forma instável ou nunca comutar. Com um módulo não há nada para calcular - a variante é o resistor, então escolha a variante e o dimensionamento está feito.
Pinagem do Módulo Optoacoplador PC817
O mesmo chip é vendido pronto como módulo de isolação optoacoplador PC817, em versões de 1, 2, 4 e 8 canais. A placa traz o resistor em série da própria variante, geralmente um LED de status por canal, bornes de parafuso no lado da entrada e pinos de header no lado da saída:
- Lado da entrada: um borne de parafuso + (ou IN+) e um - (ou IN-). Conecte esses dois bornes ao sinal que você está monitorando e ao terra desse mesmo circuito isolado, na tensão para a qual a variante foi feita e no sentido correto.
- Lado da saída: pinos de header VCC, GND e OUT (chamado de DO ou OUT1..OUTn em placas multicanal). Conecte este pino VCC ao pino 3.3V do ESP32, este pino GND a um pino GND do ESP32 e este pino OUT a um pino de entrada digital do ESP32.

Recomendamos a forma de módulo para este projeto. O resistor já está correto para a tensão para a qual a variante foi feita, os bornes de parafuso seguram a fiação de campo grossa muito melhor do que uma protoboard, e o LED da placa permite ver o estado da entrada sem ler nenhum código.
Como Descobrir se o Seu Módulo é Ativo em LOW ou Ativo em HIGH
O pino do ESP32 usa o resistor de pull-up interno, então fica em HIGH sozinho e algo precisa puxá-lo para baixo. No chip simples, esse algo é o fototransistor, e o resultado é física certa:
- O sinal externo está PRESENTE, o LED está ligado, o transistor conduz e o pino do ESP32 lê LOW.
- O sinal externo está AUSENTE, o LED está desligado, o transistor está desligado e o pino do ESP32 lê HIGH.
Um módulo é outra história, e é aqui que se perde uma noite. Alguns fabricantes levam o fototransistor direto ao pino OUT, o que dá exatamente o comportamento ativo em LOW acima. Outros adicionam um estágio inversor na placa, então o OUT acompanha a entrada e lê HIGH enquanto o sinal está presente. Os dois tipos estão à venda, são indistinguíveis na foto do produto, e o anúncio raramente diz qual está dentro da embalagem. Então não suponha - descubra. O teste leva menos de um minuto:
- Faça a ligação do módulo como mostrado abaixo e carregue o sketch desta página, que está configurado para um módulo ativo em LOW.
- Deixe os bornes de entrada desconectados e veja o que o Serial Monitor imprime. Esse é o seu estado de repouso.
- Aplique o seu sinal nos bornes de entrada e veja o que ele imprime agora.
- O que o pino informar enquanto o sinal está presente é o nível ativo do seu módulo. Se o Serial Monitor passar de idle para LIVE quando você aplicar o sinal, o seu módulo é ativo em LOW e o sketch já está certo. Se acontecer o contrário, o seu módulo é ativo em HIGH.
- O LED de status do próprio módulo serve de conferência, pois acende sempre que o lado da entrada está energizado. LED aceso, mas o Serial Monitor ainda dizendo idle, é a marca de um módulo ativo em HIGH, e não de um erro de ligação.
Quando for o outro tipo, nada precisa ser reescrito. O sketch mantém uma única constante, MODULE_ACTIVE_LOW, no início do arquivo. Mude para false, carregue de novo, e todas as leituras do programa se invertem junto.
A Regra da Isolação
NÃO conecte o terra do circuito de 12V ou 24V ao GND do ESP32. Em um módulo, isso significa que o borne de entrada - fica no lado de campo e nunca encontra o pino GND do módulo. Os dois terras devem ficar separados. Essa separação é o motivo inteiro de o PC817 estar no circuito: é ela que impede que uma falha no lado de 24V chegue ao ESP32. Se você ligar os terras juntos, o PC817 ainda comuta e o código ainda funciona, mas a isolação se perde e a placa fica exposta de novo.
Escolhendo um Pino GPIO Seguro do ESP32
O ESP32 é uma placa de 3,3V e seus pinos GPIO NÃO toleram 5V, então o lado de saída do módulo PC817 deve ser alimentado pelo pino 3.3V, nunca pelo pino 5V/VIN. Mais duas regras específicas do ESP32 importam neste projeto:
- Evite os pinos somente de entrada GPIO34, GPIO35, GPIO36 e GPIO39. Eles NÃO têm resistor de pull-up interno, então INPUT_PULLUP não faz nada neles e a saída do PC817 ficaria flutuando. Se você realmente precisar de um desses pinos, você mesmo deve adicionar um resistor externo de 10 kohm do pino ao 3.3V.
- Evite os pinos de strapping GPIO0, GPIO2, GPIO12 e GPIO15. O ESP32 os lê durante a inicialização, e um PC817 que puxe um deles para o nível errado na hora de ligar pode impedir a placa de iniciar.
Este tutorial usa o GPIO19, que é um pino de uso geral com pull-up interno funcionando. GPIO4, GPIO13, GPIO16, GPIO17, GPIO18, GPIO21, GPIO22, GPIO23, GPIO25, GPIO26, GPIO27, GPIO32 e GPIO33 são escolhas igualmente boas. Veja o tutorial de pinagem do ESP32 para o quadro completo.
Diagrama de Ligação
Ligando o módulo optoacoplador PC817 ao ESP32
O lado da entrada é o mesmo qualquer que seja a variante comprada: os dois bornes de parafuso vão ao sinal que você está monitorando e ao terra desse mesmo circuito isolado, e nenhum resistor seu é envolvido em lugar nenhum.
| Módulo PC817 | Conecta a |
|---|---|
| Borne IN+ | → o fio de sinal que você está monitorando, na tensão da sua variante |
| Borne IN- | → terra desse mesmo circuito SOMENTE |
| Pino VCC | → 3.3V do ESP32 |
| Pino GND | → GND do ESP32 |
| Pino OUT | → GPIO19 do ESP32 |
No lado da saída você tem duas maneiras de chegar ao ESP32:
- Como conectar o ESP32 e o módulo optoacoplador PC817 usando uma protoboard

This image is created using Fritzing. Click to enlarge image
Se você não sabe como alimentar o ESP32 e outros componentes, veja as instruções no tutorial a seguir: Como alimentar o ESP32.
- Como conectar o ESP32 e o módulo optoacoplador PC817 usando uma placa breakout com bornes de parafuso

A versão com bornes de parafuso é a que se deve usar em uma instalação real. A fiação de campo de uma máquina de 24V é grossa e se mexe, e um contato de protoboard que se solta dá uma leitura fantasma muito difícil de depurar.
Note que esses dois diagramas diferem apenas na forma como os três pinos de saída do módulo chegam ao ESP32. A variante que você comprou decide o que acontece nos bornes de entrada e não muda nada no lado da saída, então são duas opções de ligação e três variantes - não seis coisas diferentes para comprar.
Ligando o PC817 em paralelo com a carga de 12V que você quer monitorar
Tudo acima supõe que você já tem um fio de sinal sobrando para ler. A maioria dos projetos reais não tem. O que eles têm é uma válvula solenoide de 12V, ou a bobina do contator que liga uma bomba, e a pergunta é se essa bobina está energizada neste momento. O PC817 responde - mas só se você o pendurar no circuito do jeito certo.
A entrada do módulo vai sobre o dispositivo, em paralelo com ele, e nunca em série. Se você colocar em série, toda a corrente de carga da válvula ou da bobina do contator passa pelo minúsculo LED dentro do encapsulamento e destrói o PC817 no instante em que o circuito liga. Ligado em paralelo, nada no circuito existente é cortado, desconectado ou desviado; você apenas adiciona dois fios a bornes que já estão lá.
| Ponto de conexão | Conecta a |
|---|---|
| Terminal positivo (chaveado) da bobina | → borne IN+ do módulo de 12V |
| Terminal negativo (retorno) da bobina | → borne IN- do módulo de 12V |
| Pino VCC do módulo | → 3.3V do ESP32 |
| Pino GND do módulo | → GND do ESP32 |
| Pino OUT do módulo | → GPIO19 do ESP32 |
Não há resistor em série para adicionar na derivação - o módulo de 12V já traz o que precisa, e é exatamente por isso que a variante tem de combinar com a tensão da bobina. A derivação consome só a pequena corrente de que o LED de entrada do módulo precisa. Perto das centenas de miliampères que uma válvula solenoide ou uma bobina de contator puxa enquanto se mantém ligada, isso não é nada, então o dispositivo continua funcionando exatamente como antes. Isso é uma medição somente de leitura, não uma intervenção.
A polaridade importa aqui. O lado de entrada do PC817 é um LED e conduz em uma direção apenas, então se os dois bornes de entrada forem trocados, o módulo simplesmente nunca liga, e você vai passar uma noite procurando uma falha que não existe. Descubra qual lado da derivação é o positivo antes de descascar um fio.
Uma válvula solenoide, uma bobina de contator, uma bobina de relé ou um motor é uma carga indutiva, e uma carga indutiva devolve uma grande tensão reversa toda vez que é desligada. O LED de entrada do PC817 suporta apenas 6 V reversos, então esse pico é suficiente para matá-lo.
※ Nota:
Instale um diodo comum em anti-paralelo diretamente nos dois bornes de entrada do módulo - catodo do diodo no IN+, anodo do diodo no IN- (no chip simples, catodo no pino 1 e anodo no pino 2). Em operação normal ele fica polarizado reversamente e não faz nada; em um pico de desligamento ele conduz e limita a tensão reversa a bem menos de um volt. Um 1N4148 serve para uma derivação pequena, um 1N4007 para uma mais pesada.
Mais uma armadilha do lado da máquina: algumas saídas a transistor de CLP, saídas a triac e drivers de lâmpadas de LED vazam um pouco de corrente mesmo desligados. Um vazamento suficiente acende parcialmente o LED do PC817, e o ESP32 passa a informar que a válvula está funcionando enquanto ela está parada. O sintoma é fácil de reconhecer - uma leitura que nunca volta para inativo. A cura é um resistor de drenagem de cerca de 4,7 kohm a 10 kohm instalado em paralelo com os bornes de entrada do módulo, para que o vazamento escoe por ele e não pelo LED.
Por fim, esta é uma técnica somente para DC. A entrada do PC817 é um único LED e responde a uma polaridade, então é a peça errada para detectar uma linha AC - esse trabalho exige um optoacoplador cujo estágio de entrada tenha dois LEDs em oposição.
Opcional - Montando a Mesma Entrada com um Chip PC817 Simples
Se você preferir montar a entrada por conta própria em vez de comprar um módulo, o chip simples de 4 pinos faz o mesmo trabalho - você apenas fornece o resistor que o módulo teria instalado. Segure o chip de modo que o ponto ou entalhe que marca o pino 1 fique no canto superior esquerdo; os pinos seguem no sentido anti-horário a partir dali. Conecte este pino 1 (Anodo) ao fio de sinal através do resistor em série, conecte este pino 2 (Catodo) ao terra do circuito isolado e a nenhum outro lugar, conecte este pino 3 (Emissor) a um pino GND do ESP32 e conecte este pino 4 (Coletor) ao GPIO19. Dimensione o resistor para cerca de 10 mA no LED com R = (Vin - 1,2) / 0,01, o que dá 220 ohm para um sinal de 3,3V, 390 ohm para 5V, 1 kohm para 12V e 2,2 kohm para 24V. Nunca leve o resistor de 12V para uma linha de 24V: 1 kohm ali empurra cerca de 22,8 mA por um LED especificado para 20 mA. Ligado assim, o chip simples é sempre ativo em LOW, então o sketch não precisa de mudança.

O Que a Leitura Diz Sobre o Dispositivo em Funcionamento
Como a derivação fica em paralelo com a válvula ou a bobina do contator, e não no fio de comando, o que o ESP32 lê é o estado real do dispositivo, e não um eco da ordem que você deu. Se um pressostato, um temporizador, um CLP ou uma pessoa no chão de fábrica ligar a bomba, a leitura acompanha. Se você mandou ligar e ela nunca ligou - um fusível queimado, uma sobrecarga desarmada, um fio rompido no campo - a leitura continua inativa e avisa isso. É isso que transforma este pequeno circuito em um contador de horas de funcionamento de uma bomba, um alerta de "a válvula realmente abriu?", ou um registro de tempo ocioso de uma máquina, tudo informado pelo WiFi e sem compartilhar nenhum fio com o lado de 12V.
Seja honesto, porém, sobre o que a leitura prova: ela diz que o dispositivo está energizado, não que está fazendo seu trabalho - um motor de bomba travado ou uma resistência de aquecedor queimada ainda consome energia e ainda será lido como ON.
Como Programar o ESP32 para Ler o PC817
- Configure o pino do ESP32 como entrada digital com o resistor de pull-up interno ativado usando a função pinMode(). O pull-up é o que faz o estado de repouso ser HIGH. Por exemplo, o pino GPIO19:
- Leia o estado bruto do pino usando a função digitalRead().
- Transforme esse nível bruto em um estado do sinal em uma única linha, por meio da constante de polaridade, para que o resto do código seja natural de ler e um módulo do outro tipo custe apenas uma edição, e não uma reescrita.
- Imprima o resultado usando Serial.println(), ou use-o para acionar qualquer outra coisa - por exemplo, um relé.
Código ESP32 - Optoacoplador PC817
Passos Rápidos
- Se esta é a primeira vez que você usa o ESP32, veja como configurar o ambiente do ESP32 no Arduino IDE.
- Faça a ligação como no diagrama de ligação do módulo acima e confira duas vezes que o terra de 12V/24V NÃO está tocando o GND do ESP32.
- Conecte a placa ESP32 ao seu PC por um cabo USB.
- Abra o Arduino IDE no seu PC.
- Selecione a placa ESP32 correta (por exemplo, ESP32 Dev Module) e a porta COM.
- Copie o código acima e cole no Arduino IDE.
- Clique no botão Upload no Arduino IDE para compilar e carregar o código na placa ESP32.
- Abra o Serial Monitor no Arduino IDE.
- Ligue e desligue o sinal externo de 12V ou 24V algumas vezes.
- Compare o que o Serial Monitor diz com o LED de status do módulo. Se os dois discordarem, mude MODULE_ACTIVE_LOW para false no código e carregue de novo.
- Veja o resultado no Serial Monitor. Ele fica assim:
Se o Serial Monitor continuar imprimindo LIVE sem nada conectado, uma de duas coisas está acontecendo. Ou o pino do ESP32 está flutuando - confira se você escolheu um pino que realmente tem pull-up interno, e se o GND do módulo (ou o pino 3 do chip simples) realmente chega a um pino GND do ESP32 - ou o seu módulo é do tipo ativo em HIGH, o que o LED de status mostra em um segundo.
Se você quiser ir além com entradas digitais nesta placa, os tutoriais ESP32 - Botão e ESP32 - Chave Fim de Curso cobrem o mesmo padrão de ler e inverter para contatos mecânicos, e o ESP32 - Medir Tensão cobre o caso em que você precisa do valor real da tensão, e não apenas de presente/ausente.