Arduino Nano ESP32 - Optoacoplador PC817: Monitore Sinais de Entrada DC de 12V/24V

Muitos equipamentos que acabam em uma pequena instalação de automação residencial ou off-grid já trabalham com 12V ou 24V: um controlador de carga solar com uma linha de status "carga ligada", um transformador de campainha de 12V, um controlador de portão ou garagem, a saída de sirene de uma central de alarme. Ligar qualquer um deles direto em um pino do Arduino Nano ESP32 acabaria com o projeto na hora. Um módulo optoacoplador PC817 fica no meio e passa a informação como luz, em vez de eletricidade, então a placa pode observar a linha sem nunca encostar nela. Na maioria das vezes, a pergunta real não é "há tensão neste par?", mas "aquilo realmente ligou?" - e a mesma peça responde, porque a linha que você está observando é a linha que alimenta o dispositivo.

Neste guia, vamos aprender a usar o optoacoplador PC817 com o Arduino Nano ESP32. Em detalhes, vamos aprender:

Arduino Nano ESP32 e optoacoplador PC817 para entrada digital isolada de 12V e 24V

Como o Nano ESP32 é pequeno e tem WiFi na própria placa, ele combina bem com um pequeno monitor sempre ligado: coloque-o dentro de um gabinete solar de 12V ou perto de um controlador de portão e faça com que ele avise o seu celular se o motor do portão realmente partiu.

Hardware Necessário

1×Arduino Nano ESP32
1×Cabo USB Tipo-A para Tipo-C (para PC com USB-A)
1×Cabo USB Tipo-C para Tipo-C (para PC com USB-C)
1×PC817 Optocoupler Module, 3-5V input
1×PC817 Optocoupler Module, 12V input
1×Protoboard
1×Fios Jumper
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para Arduino Nano
1×(Recomendado) Placa de Expansão Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentação para Arduino Nano ESP32

Or you can buy the following kits:

1×DIYables Sensor Kit (18 sensors/displays)
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.

Você compra um módulo - aquele cuja tensão de entrada combina com o sinal que você vai observar. A próxima seção explica qual é.

Sobre o Optoacoplador PC817

O PC817, também vendido como fotoacoplador ou opto-isolador, é uma peça DIP de 4 pinos que guarda duas coisas dentro de um único corpo de plástico: um LED infravermelho e um fototransistor, frente a frente, separados por um espaço isolante. Passe uma corrente pelo LED e a luz dele liga o fototransistor. O sinal atravessa como luz, nunca como corrente, e é exatamente por isso que o lado de 12V ou 24V e o lado do Arduino Nano ESP32 ficam eletricamente separados.

Um módulo optoacoplador PC817 é esse chip já montado em uma pequena placa, com o resistor em série instalado de fábrica, bornes de parafuso no lado isolado, um LED de status e pinos de header no lado da placa. Esse resistor instalado é o motivo de os módulos serem vendidos em variantes, e também o motivo de não sobrar nada para você calcular.

Optoacoplador PC817
Encapsulamento DIP de 4 pinos, pino 1 marcado por um ponto ou um entalhe
Tensão direta do LED de entrada cerca de 1.2V típica, 1.4V máx
Corrente direta do LED de entrada faixa normal de 5-20mA, 20mA máx
Tensão coletor-emissor de saída 35V máx
Corrente de coletor de saída 50mA máx
Dissipação de potência do coletor 150mW
Tensão de isolação 5000Vrms por 1 minuto
Relação de Transferência de Corrente 50% a 600% dependendo da classificação
Velocidade de chaveamento cerca de 4us de subida, 3us de descida
Temperatura de operação -30C a +100C

Como Funciona

As duas metades do módulo nunca se tocam. IN+ e IN- pertencem ao circuito externo de 12V ou 24V. VCC, GND e OUT pertencem ao Arduino Nano ESP32.

Com o pull-up interno do Arduino Nano ESP32 ativado no pino ligado ao OUT, as leituras ficam assim:

  • O sinal externo de 12V ou 24V está PRESENTE: o LED interno acende, o fototransistor conduz, puxa o pino para o GND, e o pino lê LOW.
  • O sinal externo de 12V ou 24V está AUSENTE: o LED fica apagado, o fototransistor bloqueia, o pull-up mantém o pino em nível alto, e o pino lê HIGH.

Então a leitura é invertida: LOW significa que a linha está ativa. Isso é física consolidada para o optoacoplador em si, e é como a maioria dos módulos se comporta. Alguns fabricantes, porém, colocam um estágio inversor no lado de saída do módulo para que o OUT siga a entrada em vez de se opor a ela, e nada na embalagem diz qual deles você tem em mãos. Há um teste de um minuto para isso mais adiante, e o sketch muda de modo com uma única constante.

Mantendo os Terras Separados

A isolação só existe enquanto os dois terras ficam separados. NÃO passe um fio do negativo da fonte de 12V ou 24V - o fio que vai no IN- - para o GND do Arduino Nano ESP32. Se você ligar os dois, o módulo ainda chaveia e o sketch ainda imprime a coisa certa, então nada parece errado - mas a barreira que protegia a placa sumiu, e uma falha no lado de 24V agora tem um caminho direto para o Nano ESP32.

O Lado de Saída Funciona a 3.3V

O Arduino Nano ESP32 é uma placa de 3.3V, e seus pinos não toleram 5V como os de um Arduino ATmega clássico. Isso importa menos do que parece aqui, desde que você mantenha duas decisões independentes separadas na cabeça:

  • A variante que você compra é decidida pelo sinal que você está observando. Uma linha de status de controlador solar de 24V pede o módulo de 24V - e isso continua verdadeiro quer a placa que lê funcione a 3.3V, a 5V ou a qualquer outra tensão. O lado de entrada nunca fica sabendo qual placa está do outro lado da barreira.
  • O lado de saída do módulo é sempre alimentado por esta placa. O VCC dele vem do pino 3.3V do Nano ESP32 e o GND dele vem do GND da placa, qualquer que seja a variante de entrada que você comprou.

A segunda regra importa porque o fototransistor é uma chave simples para o GND: seja o que for que o lado de entrada esteja carregando - 12V, 24V - a maior tensão que o OUT pode apresentar é aquela com que o lado de saída é alimentado. Se você tirar isso dos 3.3V, o pino fica seguro por construção. Alimente o VCC do módulo com um trilho de 5V e o OUT vai apresentar 5V e estressar o Nano ESP32, mesmo que o lado de entrada esteja perfeitamente bem - comprar a variante certa não faz nada para proteger você disso, porque são escolhas separadas. Ativar o pull-up interno no D2 funciona pelo mesmo motivo: ele usa como referência o trilho de 3.3V da própria placa.

Qual Módulo Optoacoplador PC817 Eu Preciso?

O módulo chega com o resistor em série já instalado, e qualquer resistor está correto para somente uma tensão de entrada. É por isso que essas placas são vendidas em três variantes separadas. Aqui nada é calculado - você compra aquela que combina com o sinal que pretende observar.

Sinal que você quer observar Variante do módulo Fontes típicas
Lógica de 3.3V ou 5V Módulo de 3-5V a saída de um sensor, outro microcontrolador, a placa de controle de baixa tensão dentro de um eletrodoméstico
12V DC Módulo de 12V a saída de um controlador de portão ou porta de garagem, um transformador de campainha, circuitos de motorhome e automotivos
24V DC Módulo de 24V uma linha de status de controlador de carga solar, uma saída de central de alarme, uma saída de PLC

Vale conhecer as duas formas de errar isso antes de fazer o pedido:

  • Um módulo de 12V em uma linha de 24V. O resistor dele foi dimensionado para 12V, então passa aproximadamente o dobro da corrente prevista pelo LED interno. O módulo esquenta, perde brilho e acaba falhando. Este é o erro que faz você perder a peça.
  • Um módulo de 24V em uma linha de 12V. Agora o LED é subalimentado. A saída pode chavear tarde, chavear só às vezes ou nunca chavear - e você vai passar a noite culpando o sketch por isso.

Escolher a variante é a versão do módulo para dimensionar um resistor: uma decisão de compra, tomada antes de qualquer ligação, e a única que realmente importa aqui.

Também não ignore a variante de 3-5V só porque 3.3V e 5V são tensões que o Nano ESP32 poderia receber diretamente. Um sinal em nível lógico merece isolação sempre que os dois circuitos funcionam com fontes separadas, ficam em extremidades opostas de um cabo longo, ou um deles tem muito ruído elétrico - um driver de motor, ou a placa de controle de baixa tensão enterrada dentro de um eletrodoméstico ligado à rede. Isolação é sobre quebrar o caminho de terra entre dois circuitos, não somente sobre sobreviver a uma tensão alta.

Diagrama de Ligação

Ligando o Módulo Optoacoplador PC817

Diagrama de ligação do módulo de isolação com optoacoplador PC817 e o Arduino Nano ESP32

This image is created using Fritzing. Click to enlarge image

Prenda o sinal externo de 12V ou 24V no borne IN+ e o terra desse mesmo circuito externo no borne IN-. No lado da placa, ligue o VCC do módulo ao 3.3V, o GND ao GND e o OUT ao pino D2 do Arduino Nano ESP32. Não há resistor para adicionar e nada para recalcular - a variante que você escolheu já traz o resistor certo. Módulos de 2, 4 ou 8 canais funcionam do mesmo jeito: um par de bornes de entrada e um pino OUT por canal, cada canal isolado por conta própria.

Ligando o Módulo em Paralelo com o Dispositivo, Nunca em Série

O diagrama acima supõe que o sinal de 12V ou 24V já está em um par de fios livre, esperando para ser lido. Em uma instalação real isso raramente acontece - o sinal é o fio que já aciona alguma coisa, e esse fio está ocupado. Pegue um controlador de portão ou porta de garagem de 12V: o controlador fecha a saída, 12V aparecem no par que vai para o motor, e o portão funciona. O trabalho é deixar o Arduino Nano ESP32 ver esse momento sem mudar nada nele. A linha é de 12V, então este é o módulo de 12V.

A entrada do módulo vai ATRAVÉS do dispositivo, em paralelo com ele. Nada é cortado, nada é redirecionado, a ligação existente fica exatamente onde está - você só pendura dois fios extras em bornes que já estão lá:

  • O borne positivo, chaveado, do dispositivo → IN+ no módulo.
  • O borne negativo, de retorno, do dispositivo → IN- no módulo.

Nenhum resistor em série entra nessa derivação. O resistor do próprio módulo já está no caminho, e é exatamente por isso que a variante precisa combinar com a tensão em que o dispositivo funciona.

O que você não pode fazer é colocar o módulo em série com o dispositivo. Em série, toda a corrente de carga daquele motor de portão teria que passar espremida pelo LED interno, e uma peça especificada para 20mA seria destruída no instante em que o controlador disparasse. Paralelo é o único arranjo correto.

Através dos bornes, a derivação consome cerca de 10mA. Isso não é nada perto do que uma bobina de relé, um solenoide, uma lâmpada ou um motor puxa, então o controlador do portão continua funcionando exatamente como antes - a medição é somente de leitura e não invasiva.

Dois detalhes decidem se a derivação sobrevive ao primeiro ciclo de chaveamento:

  • A polaridade importa. O lado de entrada é um LED e conduz em uma direção só. Se você trocar IN+ e IN-, nada quebra, mas nada funciona também - o módulo simplesmente nunca liga, e o LED de status dele fica apagado. Descubra qual lado da derivação é o positivo antes de ligar.
  • Cargas indutivas precisam de um diodo de grampeamento. Uma bobina de relé, contator, solenoide, válvula ou motor gera um grande pico de tensão reversa no momento em que desliga, e o LED de entrada do PC817 é especificado para apenas 6V no sentido reverso. Instale um diodo comum em paralelo reverso diretamente nos bornes de entrada - catodo do diodo no IN+, anodo do diodo no IN-. Em operação normal esse diodo fica polarizado reversamente e não faz nada; num pico ele conduz e grampeia a tensão reversa para bem abaixo de um volt. Um 1N4148 atende uma derivação pequena, um 1N4007 uma mais pesada.

Um limite para ter em mente: a entrada do PC817 é um único LED, então responde a uma só polaridade e é a peça errada para detectar uma linha AC - isso exige um optoacoplador cujo estágio de entrada tenha dois LEDs em oposição. E se os bornes que você está derivando pertencem a uma saída de estado sólido, e não a um contato seco ou a um relé, leia o item sobre fuga de corrente na seção de Solução de Problemas abaixo antes de confiar na leitura.

Monitorando se o Controlador do Portão Está Realmente Ligado ou Desligado

Como a derivação fica através do dispositivo, e não no caminho que o comanda, o que o Arduino Nano ESP32 lê é o estado real do dispositivo, e não a sua intenção para ele. Alguém abre o portão com um controle de mão, e a leitura acompanha. A central de alarme aciona a sirene por conta própria sem perguntar a ninguém, e a leitura acompanha isso também. E quando o controlador recebe ordem de disparar mas nada aparece na saída dele, a leitura continua em repouso - é assim que você descobre que o portão nunca partiu. Essa diferença entre "um comando foi enviado" e "a coisa realmente funcionou" é o que faz valer a pena construir isto: contadores de horas de funcionamento, registros de tempo ocioso de máquinas e um alerta de "realmente partiu?" enviado por WiFi.

Seja claro, porém, sobre o que a leitura realmente significa. Ela diz que o dispositivo está energizado, não que ele está funcionando - um motor de portão travado ou uma resistência de aquecimento queimada ainda consomem energia e ainda aparecem como ligados.

Se Você Prefere Montar com o Chip Puro

Pinagem do optoacoplador PC817 para entrada isolada do Arduino Nano ESP32
image source: diyables.io

O chip puro de 4 pinos e um resistor dão o mesmo circuito sem os bornes de parafuso - só que o dimensionamento fica por sua conta. Segure o chip com o ponto ou entalhe no canto superior esquerdo e conte no sentido anti-horário: o pino 1 anodo e o pino 2 catodo são o LED de entrada, o pino 3 emissor e o pino 4 coletor são o lado de saída. O sinal passa pelo resistor para o pino 1, o pino 2 volta somente ao terra do circuito externo, o pino 3 vai ao GND do Arduino Nano ESP32, o pino 4 vai ao pino D2. Dimensione o resistor por R = (Vin - 1.2) / 0.01, cerca de 10mA pelo LED: 220 ohm a 3.3V, 390 ohm a 5V, 1 kohm a 12V, 2.2 kohm a 24V - o último de 1/2 W, os demais de 1/4 W. Se você deixar um de 1 kohm no lugar ao passar de 12V para 24V, o LED recebe cerca de 23mA, acima do máximo de 20mA, e ele vai perder brilho e falhar: a versão com chip puro de instalar a variante errada. Todo o resto desta página vale sem mudanças.

Seu Módulo Optoacoplador É Ativo em Nível Baixo ou em Nível Alto?

Os dois tipos estão à venda, parecem idênticos na bancada, e o anúncio em que você comprou quase certamente não disse qual é. Resolva isso com a própria placa antes de escrever qualquer lógica em cima da leitura:

  • Ligue o módulo como acima e faça o upload do sketch da seção abaixo, deixando os bornes de entrada sem sinal por enquanto.
  • Observe o Serial Monitor por algumas linhas e anote o que ele imprime enquanto não há sinal na entrada.
  • Energize os bornes de entrada. O LED de status da placa do módulo acende sempre que o lado de entrada está consumindo corrente, então use esse LED como verificação cruzada - ele diz que a entrada realmente está energizada, seja lá o que o pino achar.
  • Anote o que o Serial Monitor imprime agora. O que aparecer enquanto o LED de status está aceso é o estado ativo do seu módulo.

Se a impressão acompanha o LED - em repouso enquanto ele está apagado, presente enquanto está aceso - seu módulo é ativo em nível baixo e o sketch já está certo. Se os dois andam exatamente em sentidos opostos, seu módulo inverte na própria placa. Abra o sketch, defina MODULE_ACTIVE_LOW como false e faça o upload de novo. Essa constante é a única coisa que muda; a ligação está certa e o resto do código não se importa.

Como Programar para o Optoacoplador PC817

  • Use o rótulo do pino impresso na placa. A serigrafia do Arduino Nano ESP32 mostra D0, D1, D2 e assim por diante, e esses números não são os números GPIO brutos do ESP32-S3 que está por baixo. Escreva D2 no sketch, e não 2, e o core do Arduino mapeia para o GPIO certo para você.
  • Configure esse pino como entrada com o pull-up interno usando pinMode(). Por exemplo, o pino D2:
pinMode(D2, INPUT_PULLUP);
int raw = digitalRead(D2);
  • Transforme esse nível bruto em um simples verdadeiro ou falso por meio de uma constante, para que um módulo que lê no sentido oposto custe uma única edição em vez de uma reescrita.
const bool MODULE_ACTIVE_LOW = true; bool signal_active = MODULE_ACTIVE_LOW ? (raw == LOW) : (raw == HIGH);
  • Dispense a busca por biblioteca. Não existe biblioteca para o PC817 e nenhuma é necessária - isto é leitura de entrada digital comum.

Código para Arduino Nano ESP32 - Optoacoplador PC817

/* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-pc817-optocoupler-monitor-12v-24v-dc-input-signal */ #define PC817_PIN D2 // The Arduino Nano ESP32 pin D2 connected to the PC817 module's OUT pin // (or the bare chip's collector, pin 4) // Use the printed Dx label, not the raw ESP32-S3 GPIO number // Most PC817 modules pull the output LOW when the input signal is present. // If your module works the other way round, change this to false. const bool MODULE_ACTIVE_LOW = true; bool signal_active; // true when the external 12V/24V signal is present void setup() { // Initialize the Serial to communicate with the Serial Monitor. Serial.begin(9600); // Enable the internal pull-up so the pin sits at 3.3V while the optocoupler is off pinMode(PC817_PIN, INPUT_PULLUP); } void loop() { int raw = digitalRead(PC817_PIN); // The optocoupler pulls the pin to GND while its internal LED is lit, // so the reading is normally inverted: LOW means the external signal is present signal_active = MODULE_ACTIVE_LOW ? (raw == LOW) : (raw == HIGH); if (signal_active) Serial.println("[isolated input D2] 12V PRESENT"); else Serial.println("[isolated input D2] idle"); delay(500); }

Passos Rápidos

Siga estas instruções passo a passo:

  • Se esta é a primeira vez que você usa o Arduino Nano ESP32, veja como configurar o ambiente para o Arduino Nano ESP32 no Arduino IDE.
  • Ligue o módulo ao Arduino Nano ESP32 como mostrado no diagrama de ligação do módulo acima, usando a variante que combina com o seu sinal: o módulo de 3-5V para um sinal em nível lógico, o módulo de 12V para uma linha de 12V, o módulo de 24V para uma linha de 24V.
  • Confira duas vezes que o terra do circuito de 12V ou 24V não chega nem perto do GND do Arduino Nano ESP32.
  • Conecte o Arduino Nano ESP32 ao seu computador com o cabo USB.
  • Abra o Arduino IDE no seu computador.
  • Selecione a placa Arduino Nano ESP32 e a porta COM correspondente.
  • Copie o código acima e cole no Arduino IDE, depois clique no botão Upload.
  • Abra o Serial Monitor e ligue e desligue o sinal externo de 12V ou 24V.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano ESP32
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
New Line
9600 baud
[isolated input D2] idle [isolated input D2] idle [isolated input D2] idle [isolated input D2] 12V PRESENT [isolated input D2] 12V PRESENT [isolated input D2] 12V PRESENT [isolated input D2] 12V PRESENT [isolated input D2] idle [isolated input D2] idle
Ln 11, Col 1
Arduino Nano ESP32 on COM15
2
  • Se essas linhas andam no sentido oposto ao do LED de status do módulo, o seu é do tipo ativo em nível alto: defina MODULE_ACTIVE_LOW como false e faça o upload de novo.

A partir daqui, o sketch é fácil de ampliar. Faça com que ele acione um relé quando a linha isolada ficar ativa, conte quantas vezes um controlador de portão dispara durante a noite, ou envie o estado por WiFi de dentro de um gabinete solar.

Solução de Problemas

Se a leitura não acompanha o sinal externo, passe por estas verificações:

  • Nada nunca muda e o LED de status nunca acende: o lado de entrada não está sendo acionado de forma alguma. IN+ e IN- provavelmente estão trocados - a entrada é um LED e conduz em um sentido só - ou a variante está errada para a linha, já que um módulo de 24V em um circuito de 12V é subalimentado e pode nunca chavear. No chip puro, o mesmo sintoma significa que o chip está instalado ao contrário; o pino 1 é o que fica ao lado do ponto ou entalhe.
  • A leitura está exatamente invertida - em repouso enquanto o dispositivo funciona, presente enquanto ele está desligado: nada está ligado errado. Você tem um dos módulos que invertem no lado de saída, então o OUT segue a entrada em vez de se opor a ela. Confirme com o LED de status usando a verificação da seção "Seu Módulo Optoacoplador É Ativo em Nível Baixo ou em Nível Alto?" acima, depois defina MODULE_ACTIVE_LOW como false no sketch e faça o upload de novo.
  • A leitura fica presa em presente mesmo com os bornes de entrada desconectados: o lado da placa está ligado errado. Confirme se o OUT realmente está no D2 e o VCC no 3.3V. No chip puro, o pino 3 e o pino 4 estão trocados - o emissor (pino 3) vai no GND e o coletor (pino 4) no D2.
  • A leitura oscila: O pull-up interno provavelmente não está ativado. Confirme que o sketch usa INPUT_PULLUP e não somente INPUT; uma entrada flutuante varia por conta própria, exatamente como acontece com um botão.
  • A leitura nunca volta para repouso: A coisa que você derivou provavelmente é uma saída de estado sólido - uma saída transistorizada de PLC, uma saída com triac, um driver de lâmpada LED - e essas deixam vazar uma pequena corrente mesmo desligadas. Fuga suficiente acende parcialmente o LED interno, e a placa continua informando o dispositivo como ligado muito depois de ele parar. Instale um resistor de sangria de cerca de 4.7 kohm a 10 kohm em paralelo com a entrada do módulo, entre IN+ e IN-, para que a fuga escoe por ele em vez de pelo optoacoplador.
  • O módulo esquenta, ou a leitura fica pouco confiável ao longo de semanas: a tensão de entrada está acima daquela para a qual a variante foi feita - tipicamente um módulo de 12V deixado em uma linha de 24V. Instale a variante de 24V no lugar. No chip puro, o resistor em série é pequeno demais; confira de novo com os valores da seção do chip puro.
  • Você precisa da tensão real, não só de presente ou ausente: Um optoacoplador só informa ligado ou desligado. Para ler um nível, veja Arduino Nano ESP32 - Medir Tensão.

Vídeo

Referências de Funções

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!