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

Comments

  1. Responder

    • Responder

    • By Fernando Faria

      Responder

  2. By Fernando Faria

    Responder

  3. By Alexandre Yoshikawa

    Responder

    • Responder

  4. By Anderson

    Responder

  5. By Paulo

    Responder

    • Responder

  6. By Flavio

    Responder

  7. By Leandro Lanini

    Responder

    • Responder

      • By Leandro Lanini

        Responder

  8. By David

    Responder

    • Responder

  9. By Tamires Barbosa

    Responder

  10. By Daniel

    Responder

  11. By Caio

    Responder

  12. By Thiago

    Responder

  13. By Eduardo

    Responder

    • Responder

  14. By Caio Augusto

    Responder

    • Responder

  15. By Jose Luiz

    Responder

  16. By Tha

    Responder

  17. By Judson Matias

    Responder

  18. By Pedro

    Responder

    • Responder

  19. By Munir

    Responder

    • Responder

      • By Munir

        Responder

  20. By Filipe Ferreira

    Responder

    • Responder

  21. By Ale

    Responder

    • By Ale

      Responder

Deixe uma resposta para Leandro Lanini Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *