Arduino – Sensor de Corrente ACS712 em AC e DC (Monitoring Current with Arduino and ACS712)

modulo-de-sensor-de-corrente-acs712-modulo

O ACS712 é um sensor de corrente AC e DC, de acordo com seu datasheat ele é fabricado em três versões : ACS712ELCTR-05B, ACS712ELCTR-20A, ACS712ELCTR-30A. O que difere é sua corrente máxima suportada.

Abaixo vamos mostrar como utiliza-lo junto a um arduino:


Como ligar ao arduino:

arduino_ACS712

 

Codificando para AC:

Primeiramente devemos saber algumas informações importantes do sensor. A saída do sensor é (1023)Vcc/2 para corrente = 0. Cada sensor tem uma sensibilidade de tenção por amper, no datasheat (AQUI)  você vai encontrar esses dados, mas para facilitar, o sensor de 30A é 66mV/A o de 20A é 100mV/A e o de 5A é 185mV/A.

Para calcularmos a corrente do sensor devemos ajustar o valor lido para Volts.
Como trabalhamos na escala de 0-1023 no arduino e trabalhamos na faixa dos 5V, vamos retirar a tenção por unidade fazendo 5/1023 que é igual a: 0.004887586.

Agora nossa corrente é calculada da seguinte maneira:

(valorSensor-(Vcc/2)) * tenção_por_unidade / sensibilidade_de_tenção

simplificando:

(valorSensor-(1023/2)) * 0.004887586 / 0.185

Pronto a conta é essa, mas o complicado pelo que andei estudando é como capturar o valor do sensor, pois o analogRead nos retorna um inteiro e não teremos precisão suficiente com um dado inteiro para pegarmos valores em mA em AC. Pesquisando sobre o problema achei neste forum (aqui) uma maneira eficas até aonde testei. Ele realiza um laço de x interações capturando o valor do sensor e com o dado capturado faz o expoente a 2 e vai somando em uma variável, no termino do laço ele tira a média e realiza a raiz quadrada do valor (pois fez o expoente a 2). Feito isso temos o dado do valor do sensor em um float bem preciso.

Vamos ao código:

int sensorPin =A0;

int sensorValue_aux = 0;
float sensorValue = 0;
float currentValue = 0;
float voltsporUnidade = 0.004887586;// 5%1023

void setup() {
  Serial.begin(9600);
  pinMode(sensorPin, INPUT);
}

void loop() {

  for(int i=100; i>0; i--){
    sensorValue_aux = (analogRead(sensorPin) -511); // le o sensor na pino analogico A0 e ajusta o valor lido ja que a saída do sensor é (1023)vcc/2 para corrente =0
    sensorValue += pow(sensorValue_aux,2); // somam os quadrados das leituras.
  }

  sensorValue = (sqrt(sensorValue/ 100)) * voltsporUnidade; // finaliza o calculo da méida quadratica e ajusta o valor lido para volts
  currentValue = (sensorValue/0.185); // calcula a corrente considerando a sensibilidade do sernsor (185 mV por amper)

  // mostra o resultado no terminal
  Serial.print(currentValue,3);
  Serial.print(" A \n" ); 

  sensorValue =0;

  delay(100);

}

Codificando para DC:

Em DC dizem que basta tirar a média quadratica do código acima, porem não achei conveniente, e de acordo com meus testes o mesmo código AC funciona em DC.

Fontes:
DataSheatSite 1Site 2

Help DEV – Analista desenvolvedor Java / Android

http://helpdev.com.br/zarelli

17 thoughts on “Arduino – Sensor de Corrente ACS712 em AC e DC (Monitoring Current with Arduino and ACS712)

  1. Boa tarde, estou utilizando o seu código para montar o circuito apresentado, para medir a corrente de uma lâmpada incandescente de 100 W, e coloquei um multímetro em série com o circuito para medir a corrente e comparar com o circuito do arduino. Tive uma leitura de ~0,41 A no multímetro e ~0,16 no Arduino+sensor. Gostaria de saber pq tenho esse erro tão grande no valor e se teria como corrigir o mesmo?

    • Realmente não sei corrigir este problema, o programa descrito no post deu certo porem com uma variação também, eu acabo utilizando mais para saber se o circuito está ativado ou não. Caso solucione gostaria de saber como você fez. Desculpe.

  2. Guilherme, vi solução mais simples para a precisão, já que o AnalogRead retorna, normalmente, um inteiro. Basta vc forçar que a leitura retorne um float, acumulado logicamente num float. Ficaria assim:

    flot leitura = (float) analogRead(pino_sensor_acs712);

    Se puder testar, verificará que funciona bem.
    Abraço.

  3. A conta que vocês diz com os quadrados não é para aumentar a precisão. A precisão já é de dezenas de miliamperes já que a escala é de 0 a 1023 e se está medindo até 30A (que em AC seria apenas até 10A).

    Essa conta é para conseguir medir corrente alternada usando sensor de corrente instantânea!!!!

  4. obs. se você tentar apresentar os valores sem fazer essa espécie de “média”, e dependendo da velocidade de amostragem, você verá o valor ficar variando muito e talvez você consiga obter uma senóide de 60Hz.

      • Os valores que saem do sensor são de 2,5V a 5V. Se subtrai metade da tensão para se obter 2,5V como tensão minima e 5V como máxima, assim pode se fazer os cálculos. Se não subtrair o arduino irá entender que 0V será a tensão mínima e não ira funcionar.

  5. Ejá tentei medir corrente alternada com este sensor, mas ele retorna o numero inteiro, sendo que eh o valor instantâneo da corrente e no caso de corrente alternada como sabemos esse valor muda se a frequência das leituras for diferente da frequência da rede elétrica.

    Curiosidade:
    -O sensor ler valores de correntes numa faixa simétrica do seu valor máximo (exemplo: o sensor de 30A é capaz de ler -15A à +15A; o sensor de 20A ler -10A à +10A “por isso o zero eh na metade de 1023″).

  6. Boa tarde amigo,

    Estou com um problema com a medição dos sensores de corrente 5A pelo Arduino. Estou utilizando o seguinte código:

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

    }
    void loop() {

    int sensorValue = analogRead(3);
    Serial.print(“Sensor: “);
    Serial.println(sensorValue);

    delay(1000);

    }

    Como pode ver é algo bem simples, pois só quero saber qual valor ele está recebendo, porém o valor só fica entre 510 e 513:
    Sensor: 511
    Sensor: 511
    Sensor: 513
    Sensor: 512
    Sensor: 511
    Sensor: 511
    Sensor: 512

    Já testei os outros sensores também e a medida é a mesma, por que será?
    Minha fonte é de corrente contínua de 12V e 1A. Mas também já medi em outra fonte DC de 18V.

    Desde já agradeço pela colaboração!

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>