ESP8266 - Optoacoplador PC817: Monitorar Sinal de Entrada DC de 12V/24V
Um módulo optoacoplador PC817 permite que o ESP8266 observe uma linha de 12V ou 24V sem nunca tocá-la eletricamente, o que importa muito em uma placa cujos pinos são especificados apenas para 3.3V. Este tutorial ensina você a usar o ESP8266 para ler uma entrada digital isolada construída em torno do PC817, e como ligar essa entrada em um equipamento para que a placa responda à pergunta que realmente importa: aquele dispositivo está funcionando agora, ou não? Em detalhes, vamos aprender:
- O que é um módulo optoacoplador PC817 e o que cada um dos seus terminais faz.
- Qual das três variantes do módulo - 12V, 24V ou 3-5V - combina com a linha que você quer observar, e o que dá errado se você comprar a outra.
- Como conectar um módulo optoacoplador PC817 ao ESP8266, e como montar a mesma entrada a partir do chip simples de quatro pinos.
- Como ligar o módulo em paralelo com o dispositivo que você quer observar, sem cortar nem desviar um único fio existente.
- Quais pinos GPIO do ESP8266 são seguros para este trabalho, e por que os pinos de boot-strapping não são.
- Como descobrir se o seu módulo informa ativo em nível BAIXO ou ativo em nível ALTO, e como inverter o sketch com uma única constante.

Nós sugerimos:
Hardware Necessário
Or you can buy the following kits:
| 1 | × | DIYables Sensor Kit (18 sensors/displays) |
Sobre o Optoacoplador PC817
O PC817 é um chip de quatro pinos que leva um sinal digital de um circuito a outro usando luz em vez de um fio. Dentro do corpo de plástico há um LED infravermelho de frente para um fototransistor, separados por uma folga isolante: quando a corrente passa pelo LED, a luz dele liga o transistor, então o sinal atravessa como luz em vez de eletricidade. Essa folga é o motivo pelo qual os dois lados continuam eletricamente separados, e ela é especificada para 5000 Vrms por um minuto.
Para o ESP8266, essa separação não é um luxo. O ESP8266 funciona a 3.3V e seus pinos GPIO não toleram 5V, então um fio de 12V ou 24V encostado diretamente em um pino destrói o chip. Com um PC817 no meio, o lado de 24V e o lado de 3.3V nunca compartilham um único condutor.
Quase ninguém solda o chip simples para esse trabalho hoje em dia. Um módulo de isolação com optoacoplador PC817 coloca o mesmo chip em uma pequena placa junto com o seu resistor em série, um LED de estado, bornes de parafuso para o lado perigoso e um header para o lado do ESP8266, de modo que toda a entrada isolada se resume a três fios e dois parafusos. Este tutorial é construído em torno desse módulo; o chip simples fica mais abaixo para quem preferir montar por conta própria.
Especificações do PC817 dentro do módulo:
| Item | Valor |
|---|---|
| Encapsulamento | DIP de 4 pinos, pino 1 marcado por um ponto ou um entalhe |
| Tensão direta do LED de entrada (Vf) | cerca de 1.2 V típico, 1.4 V máx |
| Corrente direta do LED de entrada (If) | 20 mA contínuos máx, 5-20 mA normal, 10 mA é uma boa meta |
| Tensão coletor-emissor da saída (VCEO) | 35 V máx |
| Corrente de coletor da saída (IC) | 50 mA máx |
| Dissipação de potência do coletor | 150 mW |
| Tensão de isolação | 5000 Vrms por 1 minuto |
| Razão de Transferência de Corrente (CTR) | 50% a 600% dependendo da classe (A 80-160%, B 130-260%, C 200-400%, D 300-600%) |
| Velocidade de chaveamento | tempo de subida cerca de 4 us, tempo de descida cerca de 3 us |
| Temperatura de operação | -30 C a +100 C |
Pinagem do Módulo Optoacoplador PC817
O módulo tem um lado de entrada e um lado de saída, e nada elétrico passa entre eles.
- Terminal IN+ (ou +) - o positivo do lado de entrada. O positivo chaveado da linha de 12V ou 24V que você quer observar deve ser conectado a este borne de parafuso.
- Terminal IN- (ou -) - o negativo do lado de entrada. Ele deve ser conectado ao retorno desse mesmo circuito externo, NÃO ao GND do ESP8266.
- Pino VCC - a alimentação do estágio de saída. Ele deve ser conectado ao pino 3.3V do ESP8266.
- Pino GND - o terra do lado de saída. Ele deve ser conectado ao pino GND do ESP8266.
- Pino OUT (rotulado DO, ou OUT1..OUTn em placas de vários canais) - a saída isolada. Ele deve ser conectado a um pino de entrada digital do ESP8266 que tenha um pull-up interno utilizável.
※ Nota:
A disposição dos pinos dos módulos de isolação com optoacoplador varia entre fabricantes. Algumas placas colocam o VCC no meio, algumas invertem GND e OUT, e algumas serigrafam os terminais de entrada como IN e GND em vez de + e -. Sempre leia as etiquetas impressas na placa que você realmente comprou, em vez de copiar uma foto. A tensão de entrada para a qual a placa foi feita geralmente também está impressa ali, ao lado ou embaixo dos bornes de parafuso, e essa é a forma mais rápida de confirmar que você recebeu a variante que pediu.
Qual Módulo Optoacoplador Eu Preciso Para Uma Linha de 12V ou 24V?
Esta é a única decisão de compra que importa, então tome-a antes de fazer o pedido. O resistor em série já vem montado no módulo, e esse resistor é dimensionado para UMA tensão de entrada - e é exatamente por isso que essas placas são vendidas em três variantes separadas:
- Módulo de 12V - para um sinal DC de 12V. Esta é a variante para o exemplo da caldeira e do aquecedor de imersão ao qual esta página volta o tempo todo.
- Módulo de 24V - para um sinal DC de 24V: a saída de sirene de um painel de alarme, uma saída de CLP de 24V, um circuito de solenoide ou contator de 24V.
- Módulo de 3-5V - para sinais lógicos de 3.3V e 5V. Vale a pena ter sempre que os dois circuitos funcionam com fontes separadas, ficam longe um do outro em um cabo longo, ou um deles tem muito ruído elétrico - um driver de motor de passo, um controlador de motor, ou a placa de controle de baixa tensão escondida dentro de um aparelho ligado na rede elétrica. Isolação é sobre quebrar o caminho do terra, não apenas sobre sobreviver a uma tensão alta.
Compre o que combina com a sua linha, e somente esse. As variantes NÃO são intercambiáveis:
- Um módulo de 12V alimentado por uma linha de 24V recebe aproximadamente o dobro da corrente de LED para a qual foi feito, e o seu LED de entrada será danificado.
- Um módulo de 24V alimentado por uma linha de 12V subalimenta o seu LED, então a saída pode chavear tarde, chavear de forma pouco confiável, ou nunca chavear - a pior das duas falhas, porque ela pode passar em um teste de bancada e depois perder eventos silenciosamente no painel.
Note também que a entrada do PC817 se importa com a corrente, não com quanto a fonte poderia fornecer: um trilho de 12 V capaz de muitos amperes não é mais pesado para o LED do que um capaz de miliamperes, porque o resistor da placa fixa a corrente do LED de qualquer forma. Com um módulo não há nada para calcular - escolher a variante É o cálculo do resistor, já feito para você na fábrica.
Como Funciona
As duas metades do módulo não fazem nada além de trocar luz:
- Sinal externo de 12V/24V PRESENTE: a corrente flui no LED de entrada, o LED de estado da placa acende, e o fototransistor conduz.
- Sinal externo de 12V/24V AUSENTE: o LED de entrada fica apagado, o LED de estado fica apagado, e o fototransistor fica desligado.
O que isso faz com o pino OUT, e portanto com o valor que o ESP8266 lê, é o assunto da próxima seção.
Seu Módulo Optoacoplador é Ativo em Nível Alto ou Ativo em Nível Baixo?
No chip simples isso é física estabelecida. O fototransistor só consegue puxar um pino para BAIXO, então com o pull-up do ESP8266 mantendo o pino em HIGH, uma linha externa viva lê LOW e uma linha morta lê HIGH - a leitura é INVERTIDA.
Em um módulo você precisa verificar, porque a polaridade da saída do módulo varia entre fabricantes. Muitas placas levam o coletor do fototransistor direto para fora, então o OUT se comporta como o chip simples e vai para LOW quando a entrada está energizada. Outras o invertem na placa, então o OUT SEGUE a entrada e vai para HIGH quando a entrada está energizada. Os dois tipos são vendidos, às vezes com a mesma foto de produto, então a única resposta confiável é a que a sua própria placa dá.
O teste leva menos de um minuto:
- Ligue o módulo ao ESP8266 como mostrado abaixo e faça o upload do sketch deste tutorial.
- Abra o Serial Monitor sem nada conectado a IN+ e IN-, e anote o que ele imprime.
- Energize a linha externa, e anote o que ele imprime agora.
- O estado que aparecer ENQUANTO o sinal está presente é o nível ativo do seu módulo.
- Use o LED de estado da placa como verificação cruzada. Ele acende sempre que o lado de entrada está energizado, então se o LED estiver claramente aceso e o Serial Monitor ainda disser IDLE, a sua suposição de polaridade está ao contrário.
Corrigir isso é uma edição, não uma reescrita. O sketch abaixo traz uma única constante:
Deixe-a true para um módulo cuja saída vai para LOW enquanto o sinal está presente, defina-a como false para um módulo cuja saída vai para HIGH, e todo o resto se ajusta.
Montando a Entrada Isolada a Partir do Chip PC817 Simples (Opcional)
Se você preferir montá-la a partir do chip simples, o PC817 é um DIP de 4 pinos com o pino 1 no canto marcado por um ponto ou um entalhe, numerado no sentido anti-horário visto de cima.
- Pino 1 - Ânodo (A) e Pino 2 - Cátodo (K): o LED de entrada. O positivo externo deve ser conectado ao pino 1 por meio de um resistor em série, e o pino 2 deve ser conectado SOMENTE ao terra do circuito externo.
- Pino 3 - Emissor (E): deve ser conectado ao pino GND do ESP8266.
- Pino 4 - Coletor (C): deve ser conectado ao pino de entrada do ESP8266, que fornece o pull-up.

Aqui a corrente do LED fica por sua conta, com R = (Vin - 1.2) / 0.01 para uma meta de 10 mA: 220 ohm a 3.3 V, 390 ohm a 5 V, 1 kohm a 12 V, e 2.2 kohm a 24 V - o último deles dissipa cerca de 0.24 W, então use uma peça de 1/2 W. O chip simples é sempre ativo em nível BAIXO, então deixe MODULE_ACTIVE_LOW definido como true.
A Regra da Isolação
NÃO conecte o terra do circuito de 12V/24V ao pino GND do ESP8266, e não o conecte também ao pino GND do header do módulo. Esses dois terras devem ficar separados, e essa separação é a razão de ser do PC817. Se você os ligar juntos, o optoacoplador continua chaveando e tudo parece funcionar, mas a isolação se foi e uma falha no lado de 24V agora tem um caminho direto para a sua placa de 3.3V.
Diagrama de Ligação
O sketch deste tutorial usa o pino D7 (GPIO13) para a entrada isolada. No ESP8266, essa escolha não é arbitrária: o D7 é um dos GPIOs simples e seguros para o boot e tem um pull-up interno utilizável, que é exatamente o que a saída de um optoacoplador ativo em nível BAIXO precisa. O pino D0 (GPIO16) é o único pino que não tem pull-up interno, e os pinos D3 (GPIO0), D4 (GPIO2) e D8 (GPIO15) são pinos de boot-strapping cujo nível na hora de ligar decide como o chip inicia. Use os rótulos Dx do NodeMCU no seu sketch em vez dos números GPIO puros, porque em uma placa NodeMCU o D7 se resolve para GPIO13 por você, enquanto escrever 13 literalmente significa GPIO13 e não corresponde à serigrafia.
- Diagrama de ligação entre o ESP8266 e um módulo de isolação com optoacoplador PC817

This image is created using Fritzing. Click to enlarge image
Para mais informações, veja Pinagem do ESP8266 e como alimentar o ESP8266 e outros componentes.
Ligue a linha externa nos bornes de parafuso IN+ e IN-, depois conecte o VCC do módulo ao pino 3.3V do ESP8266, o GND ao pino GND do ESP8266, e o OUT ao D7 do ESP8266. Alimente o lado de saída do módulo com 3.3V em vez de 5V ou Vin, porque o que alimenta o estágio de saída do módulo é o que aparece no pino do ESP8266, e o ESP8266 não tolera 5V. Não há resistor para colocar nem corrente para calcular - isso foi resolvido quando você escolheu a variante de 12V, 24V ou 3-5V. Depois de ligado, execute o teste de um minuto acima para descobrir em que sentido está a saída do seu módulo.
- Diagrama de ligação entre o ESP8266 e o chip PC817 simples
No caminho do chip simples, o positivo do sinal de 12V ou 24V passa pelo resistor em série (1 kohm para 12 V, 2.2 kohm para 24 V) até o pino 1, e o pino 2 retorna ao terra apenas daquele circuito externo. No lado de saída, o pino 4 vai ao D7 do ESP8266 e o pino 3 vai ao GND do ESP8266. O pull-up é ativado por software, então não é preciso nenhum resistor extra no lado de 3.3V.
Ligando o PC817 em Paralelo Para Monitorar Se um Dispositivo Está Ligado ou Desligado
Os dois diagramas acima mostram um sinal simples de 12V ou 24V, mas em uma instalação real esse sinal já pertence a alguma coisa. No exemplo de aquecimento ao qual esta página volta o tempo todo, é a linha de pedido de aquecimento que um termostato de ambiente fecha para ligar uma caldeira ou um aquecedor de imersão. Para observar essa linha, a entrada do módulo vai ATRAVÉS dela, em paralelo com o dispositivo, e nunca em série com ele. Um optoacoplador colocado em série carregaria toda a corrente da carga - a bobina do contator da caldeira, ou em um circuito de imersão direto o próprio elemento - por um LED infravermelho especificado para 20 mA, e o PC817 seria destruído na primeira vez que o termostato pedisse aquecimento.
A derivação são dois parafusos, e não corta nada:
- O terminal positivo chaveado do dispositivo vai ao terminal IN+ do módulo.
- O terminal negativo ou de retorno do dispositivo vai ao terminal IN- do módulo.
- Todo fio existente fica exatamente onde o instalador o deixou.
Nada entra no meio. O resistor em série que o chip simples precisaria já está na placa, dimensionado para a variante que você comprou, e essa é toda a conveniência do módulo: uma derivação em paralelo vira duas conexões de parafuso e nenhuma aritmética.
A derivação consome apenas cerca de 10 mA, o que não é nada perto de uma bobina de contator, uma válvula, uma lâmpada ou um motor de bomba, então o dispositivo continua funcionando exatamente como antes de ser observado. Isso mantém a medição somente de leitura, e também a mantém honesta: como o optoacoplador fica ao longo do dispositivo em vez de na frente dele, a leitura segue o estado do próprio dispositivo, não importa quem o comandou. Um temporizador de caldeira, um termostato anticongelamento, um termostato de cilindro ou uma mão no controle de parede aparecem no Serial Monitor, e o mesmo vale para um pedido que sai e não recebe resposta nenhuma. Contadores de horas de funcionamento, registros de tempo ocioso e alertas de "ele realmente ligou?" surgem todos dessa única derivação em paralelo.
Três detalhes decidem se funciona na primeira tentativa:
- Polaridade da derivação. O lado de entrada é um LED simples e conduz em um único sentido. Se você trocar IN+ e IN-, nada é danificado, mas o optoacoplador simplesmente nunca liga e o LED de estado nunca acende, então descubra qual lado da derivação é o positivo antes de descascar qualquer isolação.
- Fuga. Algumas saídas a transistor de CLP, saídas a triac e drivers de lâmpada LED deixam passar uma pequena corrente mesmo desligados, e o suficiente dela acende parcialmente o LED do PC817. O sintoma é inconfundível: a leitura vai para ENERGISED e nunca volta para IDLE. Coloque um resistor de descarga de cerca de 4.7 kohm a 10 kohm entre os terminais IN+ e IN- do módulo, para que a fuga passe pelo resistor em vez de pelo LED.
- Somente DC. A entrada do PC817 é um único LED, então ela responde a uma única polaridade; detectar uma linha AC exige um optoacoplador cujo estágio de entrada tenha dois LEDs em oposição.
※ Nota:
Qualquer carga indutiva - uma bobina de relé ou contator, um solenoide, uma válvula motorizada, uma bomba de circulação - produz um grande pico de tensão reversa ao desligar, e o LED de entrada do PC817 suporta apenas 6 V em reverso. Coloque um diodo comum em anti-paralelo diretamente nos terminais de entrada do módulo, com o cátodo do diodo no IN+ e o ânodo do diodo no IN-. Enquanto o dispositivo funciona, esse diodo fica polarizado reversamente e não faz absolutamente nada; em um pico, ele conduz e limita a tensão reversa a bem menos de um volt. Um 1N4148 atende derivações pequenas, e um 1N4007 as mais pesadas.
O Que uma Leitura Energizada Prova, e o Que Ela Não Prova
Uma limitação merece ser dita com clareza: a derivação diz que o dispositivo está energizado, não que ele está fazendo o seu trabalho. Um aquecedor de imersão com o elemento queimado ainda puxa a sua linha de pedido de aquecimento e ainda é lido como LIGADO, exatamente como uma bomba travada ou um ventilador parado. O que o ESP8266 pode fazer com isso é comparar causa e efeito - duas horas energizado sem nada para mostrar é um alarme útil por si só, desde que você lembre que é uma inferência e não uma medição.
Como Programar para o Optoacoplador PC817
O primeiro passo é configurar o pino escolhido do ESP8266 como entrada com o pull-up interno ativado, que é o que mantém o pino em um HIGH definido enquanto a saída de um optoacoplador ativo em nível BAIXO está em repouso:
O segundo passo é ler o pino com a função digitalRead():
O terceiro passo é transformar esse nível bruto em um significado, usando a única constante que carrega a polaridade do seu módulo:
O passo final é agir sobre esse booleano. Compará-lo com a leitura anterior, em vez de imprimir a cada passagem do loop(), mantém o Serial Monitor legível e dá uma linha para cada mudança real na linha de 12V/24V.
Código ESP8266 para o Optoacoplador PC817
Passos Rápidos
Para começar com o ESP8266 no Arduino IDE, siga estes passos:
- Confira o tutorial como configurar o ambiente para o ESP8266 no Arduino IDE se esta for a sua primeira vez usando o ESP8266.
- Verifique se a variante do seu módulo combina com a sua tensão de entrada: o módulo de 12V em uma linha de 12V, o módulo de 24V em uma linha de 24V, o módulo de 3-5V em um sinal de nível lógico.
- Ligue os componentes como mostrado no diagrama, mantendo o terra de 12V/24V longe do GND do ESP8266.
- Conecte a placa ESP8266 ao seu computador usando um cabo USB.
- Abra o Arduino IDE no seu computador.
- Escolha a placa ESP8266 correta (e.g. NodeMCU 1.0 (ESP-12E Module)), e a respectiva porta COM.
- Copie o código acima e abra-o no Arduino IDE.
- Clique no botão Upload no Arduino IDE para compilar e carregar o código no ESP8266.
- Abra o Serial Monitor.
- Ligue e desligue a linha externa de 12V/24V algumas vezes.
- Confira o resultado no Serial Monitor.
Se o Serial Monitor informa o oposto do que o LED de estado do módulo está fazendo, você tem um módulo ativo em nível ALTO: defina MODULE_ACTIVE_LOW como false e faça o upload novamente.
Como o ESP8266 só vê um transistor aberto ou fechado, o mesmo sketch e a mesma ligação funcionam para uma fonte de 12 V e para uma fonte de 24 V. A única coisa que muda entre elas é a variante do módulo que você comprou.
Dois projetos para os quais este circuito é adequado:
- Um monitor de aquecimento barato e sempre ligado: um módulo de 12V observa a linha de pedido de aquecimento de 12 V entre um termostato de ambiente e uma caldeira ou um aquecedor de imersão, e o ESP8266 registra quantos minutos por dia o calor está realmente sendo pedido, sem nenhuma modificação na própria fiação do aquecimento.
- Um vigia de sirene de alarme de 24 V: um módulo de 24V fica ao longo da saída de sirene de 24 V de um painel de alarme, para que o ESP8266 saiba no momento em que o painel dispara, e o painel mantém o seu próprio terra isolado.
- Um monitor geral de liga/desliga de dispositivos: derivado em paralelo em qualquer bomba, válvula, contator ou lâmpada alimentada em DC, o mesmo circuito se torna um contador de horas de funcionamento, um registro de tempo ocioso da máquina, e um alerta de "o controlador pediu mas nada começou".
Explicação do Código
Confira a explicação linha por linha contida nos comentários do código-fonte!
Vídeo
Conhecimento Adicional
Escolher o pino é a parte deste projeto que é específica do ESP8266, e vale a pena acertar antes de apertar qualquer parafuso.
O ESP8266 expõe cerca de onze pinos GPIO utilizáveis, e eles não são intercambiáveis. Cinco deles se comportam como entradas digitais comuns com um pull-up interno funcional: D1 (GPIO5), D2 (GPIO4), D5 (GPIO14), D6 (GPIO12) e D7 (GPIO13). Qualquer um deles é um bom lar para a saída de um optoacoplador.
Outros três são pinos de boot-strapping. GPIO0 (D3) e GPIO2 (D4) devem estar em HIGH quando a placa é ligada, e GPIO15 (D8) deve estar em LOW. Um optoacoplador cuja linha externa esteja viva no instante em que você liga a energia mantém a sua saída em LOW, então colocá-lo no D3 ou D4 pode jogar a placa no modo de gravação (flash) em vez de rodar o seu sketch. A falha parece aleatória, porque depende de a linha de 12V/24V estar energizada na hora de ligar, o que a torna um bug miserável de perseguir.
O GPIO16 (D0) falha por um motivo diferente. Ele é um pino separado no chip e, ao contrário dos outros, não tem pull-up interno: INPUT_PULLUP não está disponível nele, apenas INPUT_PULLDOWN_16. Como um fototransistor simples só consegue puxar um pino para baixo, um pino que não pode ser puxado para cima não tem de onde ser puxado para baixo, e a leitura flutua. Se você realmente precisa usar o D0 com o chip simples, adicione um resistor externo de 10 kohm do pino ao 3.3V e configure o pino como um INPUT simples.
Usar um módulo em vez do chip simples move esses dois problemas em direções opostas. Um módulo cujo estágio de saída já tem o seu próprio pull-up aciona o pino pelos dois lados e não depende do pull-up interno do ESP8266 de forma alguma, o que suaviza a objeção ao D0 - mas só depois que você confirmar, pela própria placa, que a sua foi feita assim, já que muitos módulos levam o coletor simples direto ao header. Os pinos de boot-strapping não ganham esse alívio. GPIO0 (D3) e GPIO2 (D4) precisam estar em HIGH quando o chip inicia, então uma saída de módulo em LOW naquele instante pode impedir a placa de inicializar normalmente, e o GPIO15 (D8) precisa estar em LOW, então uma saída de módulo em HIGH ali pode fazer o mesmo. Se a saída está em LOW ou HIGH na hora de ligar depende da polaridade do módulo e de a linha externa estar viva, e nenhuma das duas coisas pode ser arranjada pelo software. Mantenha D3, D4 e D8 fora deste circuito, seja qual for o tipo de módulo que você tenha.
O valor do pull-up em si é generoso. O pull-up interno do ESP8266 fica na casa das dezenas de quilo-ohms, o que pede apenas algumas dezenas de microamperes do fototransistor, muito abaixo dos 50 mA que ele consegue drenar e facilmente alcançados até por um PC817 de CTR baixo funcionando a 10 mA no lado do LED. Um resistor externo de 10 kohm ao 3.3V funciona igualmente bem e é um pouco mais resistente ao ruído elétrico em cabos longos, o que vale a pena considerar quando o módulo está a metros de distância em um painel de controle.
É evidente que o arranjo mais seguro nesta placa é um dos pinos simples numerados com D com INPUT_PULLUP ativado por software, referido pelo seu rótulo Dx para que o sketch corresponda à serigrafia. Todo o resto sobre o PC817 é igual em qualquer microcontrolador; a escolha do pino é a única decisão que o ESP8266 toma por você.