Medidor de corrente AC com ACS712 e Emonlib 12

Tenho visto um aumento na quantidade de projetos relacionados a medição do consumo de energia elétrica e acho isso muito interessante por dois motivos, primeiramente porque gosto muito dessa área de estudo, e segundo porque as pessoas aparentemente têm se preocupado mais com a eficiência no consumo, seja por questões financeiras, seja por questões ideológicas ou ambas. Dentro do meio maker uma biblioteca que se destacou bastante foi a Emonlib utilizada no projeto Open Energy Monitor. Geralmente os projetos envolvendo essa biblioteca utilizam um transformador de corrente que permite o monitoramento da corrente elétrica, como neste post do blog. Neste artigo demonstrarei como utilizar outro transdutor, o ACS712 da Allegro, usado como um medidor de corrente AC.

Breve introdução

Muitos de vocês já devem ter visto ou utilizado o ACS712 fabricado pela Allegro, um transdutor de corrente baseado no Efeito Hall. Geralmente é utilizado para medição de corrente DC, mas também pode ser utilizado para medição em AC o que o torna muito versátil. Se você quer um transdutor versátil, este é um grande candidato.

Allegro ACS712

No meu primeiro contato com ACS712 tive a seguinte reação: “Não, isso não vai aguentar os (5A, 20A, 30A)”, afinal, é só um pequeno SMD de 8 pinos. Mas ele cumpre muito bem sua função.

Como principais benefícios em se utilizar o ACS712 posso citar:

  • Segurança: Esse componente garante isolamento galvânico entre o circuito que será medido e a sua saída analógica (desde que sejam tomados os devidos cuidados no projeto).
  • Simplicidade: O componente em si depende de poucos componentes adicionais para sua utilização, no nosso caso, não dependemos de nenhum componente já que o módulo possui toda a circuitaria necessária.
  • Linearidade: Possui excelente linearidade em todo range de operação.
  • Versatilidade: Por poder ser utilizado tanto em DC como em AC torna-se muito versátil na sua maleta de sensores/transdutores.

Uma informação importante: Os modelos do ACS712 referem-se a corrente DC suportada continuamente pelo mesmo, ou seja, o ACS712-30A pode suportar até ±30A (bidirecional). Para corrente AC um bom parâmetro da corrente máxima suportada é dividir o valor de pico pela raiz quadrada de 2 (mesmo valor utilizado para obter o valor eficaz de uma onda senoidal), ou seja, em regime senoidal a corrente máxima será de aproximadamente 21,21A.

A biblioteca Emonlib por sua vez possui os recursos necessários para medição das grandezas básicas em corrente alternada. Isso é importante visto que os métodos/algoritmos são bastante diferentes dos aplicados para medição em corrente contínua. A biblioteca implementa um algoritmo RMS para medição da tensão e corrente, o que permite que seus resultados seja muito próximos dos reais, mesmo em formas de onda muito distorcidas (elevado índice de distorção harmônica), como a corrente em uma lâmpada fluorescente compacta.

Principais materiais utilizados

Para este projeto de medidor de corrente AC com o ACS712 vamos utilizar:

Montagem do circuito medidor de corrente AC

LEMBRE-SE, MEXER COM A TENSÃO/CORRENTE DA REDE ELÉTRICA NÃO É UMA BRINCADEIRA, PODENDO SER POTENCIALMENTE DANOSO OU LETAL CASO OS DEVIDOS CUIDADOS NÃO SEJAM TOMADOS!

Utilizaremos um pequeno módulo que contém o ACS712-30A, os bornes para conexão com o circuito elétrico a ser medido, alguns componentes passivos e um barramento com 3 pinos contendo as entradas de alimentação (VCC e GND) e a saída analógica. A alimentação padrão é de 5V, ou seja, compatível com as placas Arduino mais tradicionais (Uno, Nano). A saída analógica do ACS712 fica grampeada sobre uma tensão de aproximadamente VCC/2 (2,5V), quando há corrente circulando a saída irá excursionar sobre este ponto DC.

O módulo deverá ser inserido “dentro” do circuito onde a corrente será medida, ou seja, a corrente deverá atravessar o componente. No caso de corrente alternada não existe uma polaridade definida, mas por questão de segurança indico colocar o módulo na linha do Neutro. Você deve estar pensando, “oras, qual a diferença?’. Caso uma falha ocorra o potencial de tensão é próximo a zero, minimizando os riscos.

Para este projeto de medidor de corrente AC montei uma pequena extensão com um plug 2P (dois pinos) para conectar em uma tomada e uma tomada dupla onde os dispositivos serão conectados. A conexão foi realizada conforme a figura a seguir. Note que o condutor do neutro é interrompido e cada uma das pontas é conectada aos bornes de medição do módulo, ou seja, a corrente consumida pela carga irá passar por dentro do ACS712, conforme a figura abaixo.

O esquema de ligação com o Arduino será bastante simples e minimalista. O pino “VCC” do módulo será conectado a alimentação de 5V fornecida pela fonte para protoboard. O pino “GND será conectado ao GND do circuito. A saída analógica “OUT será conectada ao pino A1 (a biblioteca restringe os pinos que podem ser utilizados). Além disso temos a conexão do display OLED utilizado para apresentar os valores.

É importante utilizar a fonte para protoboard e com isso manter a integridade e estabilidade da linha de alimentação. Neste projeto (e na maioria dos projetos), o Arduino utiliza a linha de Vcc como referência. Se você utilizar a alimentação fornecida pela USB encontrará valores inconsistentes e com certo erro.

A sketch

Antes de partirmos para a sketch do medidor de corrente AC com ACS712 é necessário que instalemos as bibliotecas utilizadas. Para isso a maneira mais simples é utilizar o próprio utilitário da IDE: “Sketch > Incluir Biblioteca > Gerenciar Bibliotecas”. Será necessário instalar as seguintes bibliotecas:

  • Adafruit GFX Library (funções gráficas para o display)
  • Adafruit SSD1306 (driver para o display oled)
  • Emonlib (biblioteca de medição)

Irei apresentar a sketch deste projeto e explicar alguns pontos chave. Por segurança, sempre que trabalhar com um projeto envolvendo a rede elétrica é interessante manter o circuito desconectado da rede enquanto você carrega o código, após completamente carregado você poderá conectar a extensão modificada na tomada.

Como o foco deste artigo é mostrar o ACS712 funcionando iremos considerar a tensão como constante, abordando como medir e condicionar o sinal da tensão em um próximo artigo.

A biblioteca Emonlib foi desenvolvida de uma forma que sensores/transdutores para diversos ranges podem ser utilizados. Quando vamos configurar a instância da biblioteca indicamos qual o canal do ADC utilizado e também a constante de calibração. Para o ACS712-30A essa constante foi obtida de maneira empírica, ou seja, utilizei um multímetro como referência para então calcular a constante que iremos utilizar. O loop de setup irá basicamente inicializar o display e a biblioteca Emonlib.

Dentro do loop chamamos a função emon1.calcIrms(1996) e uma dúvidas mais comuns é de onde vem os valores dentro dos parênteses. Esse número indica a quantidade de amostras utilizadas no algoritmo RMS. Um ponto importante, para que a medição tenha boa exatidão é necessário que o número de pontos seja o equivalente de amostras dentro de N ciclos completos da rede.

Com algumas modificações na biblioteca (usando a função micros()) verifiquei que a função inicia uma conversão do ADC em média a cada 166,86us. Sabendo que um ciclos da rede de 60Hz tem duração de 16,66ms é possível de se calcular que precisamos de 99,84 amostras por ciclos. Quanto mais ciclos completos forem amostrados, mais estáveis serão as medições. Neste caso escolhi 20 ciclos completos, ou seja, aproximadamente 1996 amostras.

A função “emon1.calcIrms( )” irá realizar todo o trabalho de amostrar os sinais, realizar os cálculos e retornar resultado.

Após isso iremos apresentar os dados no display. Além da corrente medida iremos apresentar a potência aparente consumida pela carga, que é o resultado da multiplicação direta entre a corrente medida pela tensão “constante” que você definir, no meu caso 127V. Note que a unidade de medida é VA (Volt-Ampère) e não W (Watts).

Com a sketch rodando você verá no display os valores referentes a corrente RMS e a potência aparente consumidos pelas cargas conectadas na extensão. Veja na foto que a resolução é bastante interessante.

/***************************************************************
 * Medidor de corrente AC utilizando o ACS712-30A
 * 
 * developed by: Haroldo Amaral - agaelema@gmail.com
 * 2017/09/23 - v 1.0
 ***************************************************************/

#include <Wire.h>                           // biblioteca wire (I2C)
#include <Adafruit_GFX.h>                   // biblioteca grafica
#include <Adafruit_SSD1306.h>               // biblioteca para o display OLED

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);       // cria instancia do display OLED


#include "EmonLib.h"                        // inclui a biblioteca
EnergyMonitor emon1;                        // Cria uma instância

#define   SAMPLING_TIME     0.0001668649    // intervalo de amostragem 166,86us
#define   LINE_FREQUENCY    60              // frequencia 60Hz Brasil

#define   VOLTAGE_AC        127.00          // 127 Volts
#define   ACS_MPY           15.41           // ganho/calibracao da corrente

double Irms = 0;

void setup()
{  
  emon1.current(1, ACS_MPY);             // Corrente: pino analógico, calibracao.

  /* inicia o display oled no endereço 0x3c - 128x64 */
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

  /* limpa o buffer e atualiza o display (vazio) */
  display.clearDisplay();

  /* fixa texto no display */
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("ACS712 e Emonlib");
  display.display();
}

void loop()
{
  /* chama função para calculo da corrente */
  Irms = emon1.calcIrms(1996);  // Calculate Irms only

  /* seta parametros do texto */
  display.setTextSize(1);
  display.setTextColor(WHITE, BLACK);
  display.setCursor(0,20);

  /* imprime a corrente no display OLED */
  display.println("Corrente");
  display.print("-> ");   display.print(Irms, 3);   display.println(" A  ");

  /* imprime a potencia aparente no display OLED */
  display.println();
  display.println("Pot. Aparente");
  display.print("-> ");   display.print(Irms * VOLTAGE_AC); display.println(" VA  ");

  /* atualiza a imagem no display */
  display.display();
}

A figura abaixo apresenta uma comparação do medidor de corrente AC com o ACS712 e a realizada por um multímetro, veja que os resultados ficam bastante próximos.

Medidor de corrente AC

Talvez você note que mesmo sem nenhuma carga o display irá apresentar alguns miliamperes de corrente (algo próximo a 75mA). Isto acontece por dois motivos: Primeiro pela resolução do ADC do Atmega 328P juntamente com seu ruído intrínseco, segundo pelo próprio ruído interno do ACS712 (cada modelo possui seus próprios valores que você pode verificar no datasheet). Esse ruído irá afetar percentualmente as medidas com menor corrente, sendo que para cargas com maior consumo o impacto pode ser desprezado.

Chegamos ao final deste artigo sobre o medidor de corrente AC, qualquer dúvida sinta-se a vontade de deixar seus comentários.

Achou este artigo interessante? Deixe seu comentário logo abaixo. Em caso de dúvidas, caso queira trocar uma ideia, ou até mesmo dividir seu projeto, acesse nosso Fórum!

Deixe uma resposta

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

12 Comentários

  1. Gostaria de contribuir ao blog,  o ACS712 foi descontinuado, o substituto dele é o ACS723.

    1. Olá André

      Nós temos aqui ainda o 712!

      Abraços!

      André – Equipe FILIPEFLOP

  2. Gostaria de entender melhor o calculo da constante de calibração.

    #define ACS_MPY 15.41 // ganho/calibracao da corrente

    1. Essa constante é obtida empiricamente (até pode ser calculada, mas no final será necessário aplicar algumas correções).

      Inicialmente adotando o valor “1” você compara a corrente medida pelo projeto com um instrumento de referência, como um multímetro. Aí é calcular a relação entre as duas, o resultado será a constante.

  3. Gostaria de saber, se esse modulo lê correntes baixas de mA? Ou só lê correntes na faixa de 1A para cima? Estou precisando de um sensor de corrente para um projeto de TCC da faculdade.

    1. Com a versão de 5A talvez você consiga medida úteis a partir dos 50mA.

      1. Na verdade vou ter que procurar outro circuito, vou fazer medidas a partir de 30mA pra cima. Obrigado pela dica.

  4. Na descrição do item diz que ele possui 5us de atraso.
    Isso significa que dada uma variação, ele demora 5ms para chegar ao regime permanente?
    e o que acontece entre esse tempo é “perdido”?
    No meu caso, preciso medir a corrente instantânea em em 60Hz.
    Se ele simplesmente deslocar a onda ainda serviria.

    1. De qual atrasado de 5us (ou 5ms) você se refere?

  5. Boa tarde, estou usando uma placa ESP8266 e quando vou declarar no void setup:

    emon1.current(1, ACS_MPY);

    o 1 não existe, pois faz referencia ao pino analógico 1 do arduino correto? Neste caso deveria usar o pino analógico do ESP, mas este já esta sendo usado por uma placa multiplexer para aumentar as entradas analógicas. Eu uso a função getAnalog(1) , onde o 1 é o numero do pino analógico na placa multiplexer. Só que como é uma função acho que não esta funcionando bem dentro do void setup, pois fiz isso.

    emon1.current(getAnalog(1), ACS_MPY);

    não deu certo.

    Alguém pode me ajudar quanto a este problema?

  6. O artigo me ajudou muito. Obrigado por compartilhar vosso conhecimento. Gostaria de ver a continuação abordando como medir e condicionar o sinal da tensão . Abraços .

    1. Olá Gerson!

      Bom que você gostou do conteúdo do nosso blog!

      Você pode dar uma olhada nesse post também:
      https://www.filipeflop.com/blog/medidor-de-corrente-sct013-com-arduino/

      Nele o sinal passa por um pequeno filtro, é algum condicionamento.

      Abraços!

      André – Equipe FilipeFlop