Detectando status de lâmpada com optoacoplador 4N25 e Arduino

Introdução

Esse post será um pouco diferente aos normalmente vistos aqui. Ele foi inspirado em um projeto do nosso amigo Marcelo Oliveira, que entrou em contato comigo compartilhando sua dúvida em seu sistema de automação residencial que está desenvolvendo. Esse post será bastante breve e com foco em apresentar e resolver o problema encontrado.

Inicialmente Marcelo, quero lhe parabenizar pela iniciativa e estudo. É muito legal ver o Arduino sendo usado no dia a dia para resolver problemas cotidianos.

O problema

O Marcelo fez um sistema de acionamento das luzes de sua casa com a porta serial do computador + PHP, muito interessante! Ele já consegue ligar e desligar as lâmpadas, o seu problema está em saber se ela está ou não ligada (caso esse que ocorre quando há interferência do usuário diretamente na chave em que o Arduino está atuando).

Aviso Importante!

Em caso de reprodução do que será visto neste tutorial, o maluco indivíduo deve estar ciente que caso morra se machuque é sua e APENAS SUA a responsabilidade. Sério: muito cuidado ao fazer qualquer teste com energia elétrica de alta tensão.

A solução

Como sabemos, o Arduino não pode ser ligado diretamente em uma lâmpada, tanto para acioná-la, quanto para checar seu status. Para ligar ou desligar uma lâmpada, precisamos usar uma “etapa driver”, normalmente composta por um transistor e um relé.

Para saber se uma lâmpada está ligada ou não, ou seja, identificar se em um fio de corrente alternada com 220v está passando energia, precisamos antes reduzí-la,  isolá-la do Arduino e só então verificar seu estado.

Como fazemos para reduzir sua tensão e a isolar?

Simples: o optoacoplador 4N25. Mais detalhes sobre o optoacoplador ou acoplador óptico, você pode conferir no maravilhoso site do incrível Newton C. Braga. Eu usei o 4N25, mas aqueles de fontes chaveadas de computadores (figura 25) também podem ser utilizados.

Como detectar energia da tomada usando o acoplador óptico 4N25?

Muito simples! Partindo do ponto de vista que dentro do isolador óptico temos um LED em um lado e um Sensor de luz do outro, podemos usar um LED comum em seu lugar e verificar o funcionamento!

O teste exibido abaixo mostra um LED ligado à 220 volts através de 2 resistores de 100k em série. Para tensão de 120 volts você pode usar somente um resistor. Se o LED ligar, significa que o acoplador “transmitirá” ao seu sensor o estado 1, ou seja, existe energia presente.

Led ligado diretamente a 220v com resistores de 100k

De maneira bastante simples, o que fiz nas fotos abaixo foi substituir o LED pelos pinos 1 e 2 do optoacoplador. Desta forma, seu LED interno irá ligar e excitar os pinos 4 e 5. Imagine que os pinos 4 e 5 deste dispositivo entram em curto toda vez que você aplica 5 volts ao pino 1 e 2 ok?

Tendo em mente seu funcionamento (qualquer dúvida leia o post do Newton C Braga citado acima), veja que a solução se torna bastante simples. O Arduino na foto abaixo serviu apenas como fonte de 5 volts para ligar o LED (que não queima pois a linha oscila seu sinal trabalhando como um PWM em 50% de carga). Neste ponto, a linha de 220 volts já está isolada da rede elétrica. Assim todo mundo fica feliz :)

Optoacoplador ligado a 220v e LED ligando por consequencia
Optoacoplador ligado a 220v e LED ligando por consequencia – visao superior

O isolamento visto acima é o mesmo usado no Dimmer futurístico que o Vinicius Senger apresenta aqui.

Pergunta: E se no lugar do LED colocássemos um pino analógico do Arduino? A mágica está feita!

Nas fotos abaixo você verifica o circuito completo com a lâmpada (que será explicado abaixo) e o Arduino recebendo dados do 4N25 (fio verde). Se você não sabe o porquê de eu ter utilizado aquele resistor de 10k entre o GND e o fio verde (pino 4 do optoacoplador), estude “resistores pull-down” em minha aula “Entrada de dados com botões” do curso de robótica com Arduino encontrado aqui no meu blog.

Sistema de testes com optoacoplador 4n25 e Arduino
Sistema de testes com optoacoplador 4n25 e Arduino visão lateral
Sistema de testes com optoacoplador 4n25 e Arduino – Detalhe nas conexões

Uma vez que o Arduino está conectado ao acoplador óptico, basta apenas programar!

Visualizando o sinal recebido pelo Arduino do acoplador óptico 4N25

O próximo passo é criar um software que interprete os dados vintos da porta analógica A0. O programa abaixo apenas lê a porta analógica e exibe seu valor via serial. Isto permite-nos ver o que o Arduino “está vendo” sacou?

Repare na simplicidade do código fonte. Só estamos vendo o estado do pino analógico A0. Veja também que quando a tomada está conectada à rede elétrica de 220v, o sinal varia de 0 à 974. Agora ficou fácil: qualquer valor acima de 300 garante-nos que a tomada está conectada à energia elétrica.

Pergunto para você leitor: Por que o Arduino recebe o valor 0, 376, 974 e então 0 novamente?
Quem responder primeiro deixarei o nome aqui como melhor resposta, estilo yahoo hehe. (não vale engenheiro elétrico)

Update 27-01-13
Como o Marcelo postou abaixo, essa variação ocorre pois estamos recebendo corrente alternada, ou seja, recebendo um sinal analógico senoidal, que possui representações em vários pontos diferentes em um gráfico. Assim os valores 0, 376 e 974 são partes dessas representações. A variação desses valores não é muita pois o CI 4N25 consegue “captar” somente meia onda do sinal.

valores do optoacoplador conectado ao Arduino com tomada desligada
valores do optoacoplador conectado ao Arduino com tomada ligada

Como vemos, quando ligamos a tomada na luz, o Arduino passa a receber os valores 0 376 (ou próximo) 974 (ou próximo) e retorna para zero (alguém vai explicar o porquê disto certo?).

Vamos supor que criei uma função que verifica se a luz está ligada. Algo como visto abaixo. O que ocorre se a função for chamada quando o Arduino estiver lendo o valor 0? Lembrando que ele recebe o zero mesmo quando a lâmpada está ligada, como visto na figura acima.

// Verifica se a energia está online. Qualquer coisa diferente de 0 é true ok?
boolean isOnline(){
return analogRead(A0);
}

Como você deve ter imaginado, o sistema vai apresentar um “falso negativo”. Mas fique tranquilo, pois aqui você encontra o código funcional! hehe.

Veja a solução simples que desenvolvi. Lembrando, esse código não é feito para produção, é um código simples e que pode ser melhorado (usando interrupções externas por exemplo), mas serve para brincar.

void setup() {
Serial.begin(9600);
}

// Verifica se o sistema esta online
boolean isOnline(){
// Faz ate 100 leituras procurando valor acima de 300
for (int i = 0; i < 100; i++){
// A partir de 300 considera-se ligada
if (analogRead(A0) > 300){
return true;
}
}

// Se em 100 leituras nao leu 1, entao esta desligada
return false;
}

void loop() {
String statusLine = (isOnline()) ? "online" : "offline";
Serial.print("status energia: ");
Serial.println(statusLine);
}

E aqui você pode conferir este código funcionando:

Arduino detectando energia no sistema – lâmpada ligada
Arduino detectando falta de energia no sistema – lâmpada desligada

Veja que considerei a lâmpada ligada somente à partir do valor 300. Recomendo que faça testes!

Considerações finais

Não entrei em detalhes de como instalar o circuito devido a sua simplicidade. O que importa é que o pino 1 ou 2 do 4N25 esteja conectado ao  NEUTRO e o seguinte na FASE que vai para a lâmpada, simples assim.

Se gostou, tem alguma dúvida ou observação, comente abaixo. Obrigado!

Agradecimento

Obrigado Marcelo por compartilhar sua dificuldade comigo e inspirar este post!

Links úteis

http://www.newtoncbraga.com.br/index.php/como-funciona/872-acopladores-e-chaves-opticas-art120.html

http://www.clubedohardware.com.br/printpage/Anatomia-das-Fontes-de-Alimentacao-Chaveadas/1218

http://blog.eletronlivre.com.br/2010/09/dimmer-futuristico-automacao.html

49 Comments

  1. So tenho a agradecer a pessoas como você que estão sempre dispostas a ajudar. Nunca imaginei que chegaria tao longe, quando comecei a fazer as luzinhas do Arduino piscar pela primeira vez.

    O caminho é difícil, afinal se fosse fácil não teria graça! hehehe

    Agora sim me sinto seguro para fazer os testes sem queimar meu Arduino! =)

    Vou melhorar aquele meu código, e postar uma atualização em breve! Obrigado camarada, mais uma vez!

    E quanto a sua pergunta, pelo meu pouco conhecimento em elétrica e eletrônica, os valores alternam dessa forma, justamente por você estar trabalhando com “Corrente Alternada”, não?

    E aos leitores deste excelente site, estou deixando aqui os videos que fiz, que detalham exatamente meu problema, e a solução descrita acima pelo Paulo.

    Abraços!

    Automação Residencial Simples – Lampadas – Parte 01:
    http://www.youtube.com/watch?v=e8l0oJxkPtw

    Automação Residencial Simples – Lampadas – Parte 02:
    http://www.youtube.com/watch?v=DYXfZiAUFx0

    1. Oi Marcelo!

      isso aí, se fosse fácil não teria graça hehe. Que bom que está seguro para iniciar seus testes, mas lembre-se: cuidado com a rede elétrica. Ela pode parecer inofensiva às vezes, mas é pura enganação ok?

      Opa, quero ver sua nova versão do código então, se puder me mandar depois agradeço.

      E é isso mesmo, a resposta é a corrente alternada, que é representada por diferentes valores em escala de subida e descida (sinal analógico mesmo).

      Valeu por compartilhar seus videos, o pessoal vai gostar.

    2. Olá, Marcelo!
      Primeiramente gostaria de agradecer por compartilhar conosco o seu trabalho.
      Quanto a detecção que procura, não seria interessante verificar a possibilidade de utilizar um circuito simples que identifica a presença ou não de luz com um LDR (light dependent resistor)?

      O mesmo poderia ser acoplado próximo à lampada, um circuito ainda mais simples ligado ao Arduino seria responsável por detectar a presença ou ausência de luz.

      Claro que isso é apenas para uma solução simples, por exemplo, se quiser detectar se existe alguma lâmpada queimada em um lustre de 12 lâmpadas, o mesmo não seria tão útil hahaha
      Apenas uma sugestão, fiz um trabalho semestre passado em que eu verificava a existencia de luz, vou procurar os codigos, etc e vou enviar para o pessoal do site e pra você, caso se interessem. :)

  2. Não costumo comentar (o que certamente é egoismo da minha parte), porém, o pouco (1 ou 2 posts aqui do site) que vi já me deixou impressionado. Quero agradecer a toda equipe, vocês estão de parabéns! Estou no último ano de Engenharia Elétrica e garanto que vocês serão citados em meus trabalhos, pois a ajuda que estou tendo (isso sem entrar em contato com vocês, apenas lendo) está sendo demais!
    Comecei a pouco tempo trabalhar com Arduino e estou adorando. Obrigado! :)

  3. Paulo, boa tarde.

    Parabéns, excelente tutorial.
    Estou com algumas dificuldades e gostaria de saber se você pode me ajudar.

    Eu criei uma página html e a mesma fica hospedada no cartão SD do Shield W5100.
    Sabe como posso demonstrar o valor do sensor na tela em uma página hospedada no cartão SD?

    Obrigado!!

    1. Oi Alexandre,
      desculpa a demora em lhe responder e obrigado pelo retorno!

      Sobre seu problema, procure nos exemplos (dentro de examples -> SD) que já vem juntos com a IDE do Arduino e verás que um deles mostra exatamente isso que você está pedindo.

      Abraços

  4. Prezado Paulo Trentin,
    Meus parabéns pelo excelente artigo.
    Você foi a única pessoa que vi tratar o problema com paciência e seriedade.
    Testei o projeto, com os componentes e código Arduino sugeridos, com absoluto sucesso.
    Muito obrigado.

  5. Olá Paulo, primeiramente parabéns pela simplicidade da solução. Tenho algo parecido, mas utilizando sensores de corrente, mas que oscilam bastante quando se está consumindo pouca amperagem . Achei esta sua solução melhor.
    Como você tem um bom conhecimento em eletrônica, daria para postar como retificar está corrente com diodos para termos um valor sem o ZERO?

    1. Oi Leandro, obrigado pelas considerações!
      Acabei demorando um século para responder, mas aqui estamos nós! hehe

      Então, a solução que proponho para resolver o problema da alternância dos dados é via software. Sua ideia de usar uma ponte retificadora, é bem interessante, mas aumentaria o hardware necessário.

      Se quiser implementar com ela, basta conectar sua saída na entrada no 4N25 e pronto! Veja aqui o desenho de funcionamento da ponte retificadora para mais detalhes de conexão: http://www.electronica-pt.com/imagens/ponte-retificadora.gif

      1. Olá Paulo,
        Abusando um pouquinho de você, teria como me vender ele montado em um circuito impresso? Somente o 4n25, 1 resistor de 100k (vou trabalhar com 120v) , 1 borne 2 pinos para entrada da energia e uma barrinha de 3 pinos para ligação com o arduino?
        Precisaria de 10 unidades.
        É que em minha cidade é difícil conseguir quem monte o circuito impresso.
        Abraço!

  6. Boa tarde galera, ótimo post muito bem detalhado.
    É o seguinte, sou novo com o Arduíno e estou com problemas na parte de verificar o status da lâmpada, o meu circuito eu tenho um relê shield , ethernet shield e a lâmpada, está ligando e desligando pela internet e pelo interruptor, porém esse opto acoplador da pra usa no meu circuito com o interruptor? Grato

    1. Oi David, obrigado pelas considerações!

      Fica difícil lhe ajudar com os detalhes que passou, mas sim, pode ligar o opto acoplador com outros hardwares diferentes do visto aqui.
      Se quiser mais ajuda, peço que mande mais informações como fotos, esquemas de conexões e tal aí posso lhe ajudar melhor.

      Abraços

  7. Olá Paulo! Parabéns pela iniciativa e pela matéria!
    Estou pesquisando a respeito do 4N25 pois pretendo utilizá-lo na leitura de um sensor hall pelo PIC 18F4550 mas nunca usei esse componente.
    Sou nova na montagem desses projetos então queria sua opnião.
    Para a leitura do sinal de saída do sensor Hall, eu poderia ligar o pino out nos botões 1 ou 2 do 4n25, o pino 5 ligado em 5V e o pino 6 ligado à algum pino de entrada analógica do pic? Desta forma o PIC vai ler o sinal de entrada na mesma frequencia em que o sensor hall envia sinais em sua saída?
    Agradeço antecipadamente

    1. Oi Tamires, obrigado pelas considerações!

      Sim, você pode usar este 4n25 com o sensor hall. Lembre-se sempre de usar um resistor pull-down para que quando o sensor não fechar conexão, este resistor entre em ação. Veja esta imagem que mostra a conexão entre o arduino e o 4n25, só fazer igual: http://www.paulotrentin.com.br/wp-content/uploads/2013/01/Sistema-de-testes-com-optoacoplador-4n25-e-Arduino-vis%C3%A3o-lateral.jpg

      Bons estudos!

  8. Boa noite Paulo,

    Estou aqui pensando com meus botões…rs

    Se colocarmos um capacitor em paralelo com a saída do 4n25 que vai pro arduino. Isso não seguraria a tensão a ponto de não deixá-la chegar a zero???
    Isso eliminaria os loops que temos que dar na programação… deixando a resposta do arduino lenta.
    Se puder fazer testes, eu adoraria saber a resposta!

    Abraço!

    1. Oi Eduardo,
      imagino que funcionaria sim, basta descobrir o valor correto do capacitor.

      Infelizmente não tenho como fazer este teste, pois meu tempo para experimentos agora está muito curto.
      Caso faça-o futuramente, adoraria que pudesse compartilhar seu resultado conosco

  9. Boa tarde, Paulo!
    Primeiramente,m parabéns pelo excelente trabalho. Foi com esse seu tutorial, que consegui fazer alguns projetos meus. Um inclusive, para o meu carro.

    Gostaria de te perguntar uma coisa, caso tenha disponibilidade em responder. Estou utilizando quatro 4N25 neste meu projeto do carro. Nestes 4, compartilho o mesmo catodo (massa do carro) e o coletor dos 4, conecto o diretamente nos 5v do Arduino.
    Utilizando apenas um 4n25, consigo perfeitamente obter o status do dispositivo. Porém, quando eu tento obter o status dos 4, obtenho o mesmo valor para todos eles, mesmo que somente o primeiro esteja passando corrente.
    Eu ligo o primeiro e ao invés dos outros 3 continuarem com “0”, eles obtém o mesmo valor do primeiro.

    Sabe onde eu possa estar errando?

    Desde já agradeço por sua atenção e presteza.

    Cordialmente,

    Caio Augusto

    1. Oi Caio, obrigado pelo retorno!

      Para poder lhe ajudar mesmo, precisaria ver o circuito completo que você está montando. Lembre-se que apesar de ter 3 pinos no outro lado do 4n25, somente os pinos 4 e 5 são necessários para detectar seu estado.

      Bons estudos, se eu puder ajudar em algo mais, me envia mais detalhes.

  10. Vejam só. O circuito resistivo que ajusta a tensão de rede (220 ou 110 V) para 1,5 V do LED do opto acoplador, pode ser substituido por um capacitor que pode ser calculado conforme artigo do Newton Cunha Braga de Fontes de Alimentação sem Transformador. Inserir um diodo de proteção ligado de forma reversa ao LED do 2n25 pode evitar a queima deste.

  11. Olá eu gostaria de saber se o mesmo sistema é capaz de detectar se a lampada está queimada, meu problema é saber quando a lampada esta queimada! Desde ja agradeço

  12. O zero “falso positivo” é porque o optoacoplador nada mais é que um led + uma chave sensível a luz, toda vez que o led acende a chave abre. Porem se lembrarmos, a corrente da tomada é alternada, e o led é um diodo, só funciona com uma polaridade. então quando a onda alternada ta em baixa, 0 à – 220v o led não vai acender e a chave vai ta fechada dando o “falso positivo”.

    ps: Não sou engenheiro eletricista , mas não chame nenhum deles de engenheiro elétrico não que eles ficam bravos! kkkk abraços!

  13. Amigo boa noite, primeiro parabéns pela iniciativa, estou tentando achar uma maneira de monitorar o “desarme” de um rele térmico que proteja um motor.A intenção é que “Se o rele abrir recebo um sinal onde este sinal me dirá por exemplo ” Bomba desliga”. Um rele vem com um Comum (contato seco) + NA + NF. Pode me ajudar com este problema? Pelo que vi talvez este circuito com o foto acoplador funcione.

    Muito Obrigado !!!

  14. Olá amigo,
    Com o resistor de 100K em alguns casos pode vir a dar problema na saturação do transistor na saída do 4n25.
    Segundo o datasheet do 4n25 a corrente de chaveamento do LED interno acontece quando a corrente circulante nos pinos 1 e 2 do 4n25 fica entre no minimo 10mA e 50mA no máximo.
    Dessa forma 220V/10mA = resistor de 22K somente e 127V/10mA= resistor de 12K
    Grato

      1. Estou utilizando o 4n25 na minha monografia, porém ainda não fiz o teste com os 220V, foi só um calculo. Mas a idéia de usar resistores altos foi boa, pq diminui total a corrente. Para testar o circuito, acho melhor seria botar um fusível (1A) antes do jump conectado ao protoboard , um curto de 220V não é mole não.

  15. Paulo, boa noite

    Parabéns pelo site e pelo artigo.
    Gostaria de substituir um rele por um optoacoplador, é possível?
    O objetivo é apenas acender uma lampada em um projeto que estou trabalhando

    1. Obrigado Filipe!
      Se a ideia é ligar uma lâmpada, você precisa usar um relé ou um transistor do tipo BTA08 que consegue chavear facilmente 600V com 8A. O optoacoplador somente “separa os mundos” entre o circuito de acionamento (arduino) e a carga (lâmpada). Ele é fundamental para deixar o circuito mais estável e profissional.

  16. Boa noite, muito bom esse projeto!!! Pretendo usar na minha automação, gostaria de saber usando esta msm programação um método eficiente para acrescentar mais portas ,,exemplo A1 , A2 etc..

  17. Deve ser uma pergunta idiota, mas porque não utilizar um transformador bivolt 110/220 para 5v (carregador de celular) com a alimentação na lâmpada e a saída (5v) para uma entrada do arduino ?

    1. Olá Elson, é uma pergunta interessante.
      É possível detectar se há energia em uma lâmpada usando um transformador de celular conectado e ao conectar ele no arduino precisaríamos apenas um resistor adequado. No entanto, isso ocuparia muito mais espaço num circuito, e para cada lâmpada para se detectar, precisaríamos de mais um carregador. Vale lembrar também que há uma diferença significativa de custo entre um 4n25 e um carregador de celular e que sem um 4n25 você não protege seu arduino com o isolamento optico.

  18. legal é fazer uma ponte com 4 diodos, para transformar alternada em continua, assim evita falhas de leituras que dependendo do cloque exato pode pegar valor zero mesmo estando com corrente

Leave a Reply