Medidor de corrente AC com ACS712 e Emonlib 21

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 - [email protected]
 * 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. 

Faça seu comentário

Acesse sua conta e participe

21 Comentários

  1. Eu gostei desse projeto. Parabéns, Haroldo. Queria usá-lo como base para fazer medidas de corrente, porém contínua e não alternada. A faixa será até 5A, porém contínua. Nesse caso, então eu não preciso usar a biblioteca EmonLib? Ou ela é útil também para a medida de corrente contínua? Você tem algum exemplo ou projeto que seja específico para corrente contínua usando o ACS712? Muito obrigado pela atenção, antecipadamente.

  2. Olá! Esse módulo funciona com corrente de 4mA a 20mA?

    1. Lourivaldo,

      Bom, levando em consideração que a resolução é cerca de 185mV e o ruído padrão (pelo datasheet) fica em torno de 21mV, a corrente mínima que talvez ele consiga ler sem uma grande alteração devido ao ruído é algo próximo aos 140mA.

      Abraços!
      Diogo – Equipe MakerHero

  3. Boa tarde. Eu estou com um pequeno probleminha. Eu comprei um acs712 a algum tempo atrás. e não estou sabendo identificar se ele é para 5, 20 ou 30 A. como poderia identificar? alguém pode me ajudar?

    1. Felipe,

      Está escrito no CI. Basta verificar se o CI possui as inscrições “5A / 20A / 30A” 🙂

      Abraços!
      Diogo – Equipe MakerHero

  4. Olá!
    Eu gostaria de adicionar a medição de tensão nesse projeto.

    Qual módulo eu posso usar nesse caso?

    O arduino irá armazenar os dados coletados?

    Eu consigo monitorar as medições através de uma interface web?

    Como eu faço para exportar todas as medições que foram realizadas?

    Obrigado,

    1. Olá Diego,

      – Qual módulo eu posso usar nesse caso?
      Existem alguns sensores de tensão disponíveis no mercado. Mas você também pode fazer isso de maneira indireta, usando o valor da corrente e da carga

      – O arduino irá armazenar os dados coletados?
      Não. Se deseja armazenar os dados apenas, para posterior consulta, você irá precisar de SD Card e um módulo SD Card.

      – Eu consigo monitorar as medições através de uma interface web?
      Sim

      – Como eu faço para exportar todas as medições que foram realizadas?
      Primeiro você precisa escolher que tipo de comunicação deseja usar (bluetooth, RF…)

      Abraço!
      Rosana – Equipe MakerHero

  5. 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.makerhero.com/blog/medidor-de-corrente-sct013-com-arduino/

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

      Abraços!

      André – Equipe MakerHero

  6. 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?

    1. talvez seja possível passar a função por referência, uma espécie de ponteiro para a função.

  7. 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?

  8. 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.

  9. 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.

      1. Estou fazendo um experimento utilizando Arduíno, sensor ACS712 5A e um transformador de corrente não invasivo de 200A/5A para medir o consumo de edifícios, estou utilizando a biblioteca emonlib como no exemplo acima.

        Durante os testes, estou medindo em equipamentos com multímetro e com o Arduíno+emonlib+acs712-5A+TC200A/5A e para validar as medições de 0A ate 200A que eh o máximo do sensor TC200/5A vou adicionando voltas para aumentar as espiras e consequentemente a corrente.

        Por conta do sensor TC200/5A a unica alteração no código foi de multiplicar a Irms por 40 que eh a relação entre a corrente de entrada e a corrente de saída.

        Testando com uma quantidade de espiras, calculei a constante de calibração como explicado no comentário, porem, a cada volta adicionada a diferença entre as leituras do Arduíno e pelo multímetro vão se distanciando.

        E a cada espira adicionada, refaço o calculo da constante e tento ajustar para que as leituras fiquem o mais próximas possível, porem para validação do modelo, essa constante precisa ser a mesma para leituras de 0A ate 200A.

        Alguma luz de como faço isso?

  10. 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 MakerHero