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
https://helpdev.com.br/zarelli

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

19 pensou em “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?

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

      1. 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!

    1. meu querido, esses 512, 511 é uma tensão residual que o arduíno ler da porta out do sensor, mesmo sem nenhuma carga ligada, o sensor manda do pino out para o pino A0(ou qualquer porta analógica), uma tensão residual que deve ser de ±2vcc, essa tensão que a porta analógica recebe é convertida em bits. se vc tivesse no pino out 5vcc indo pra porta A0 o arduíno entenderia que vc tem 5vcc=1023 bits, mas como tem um residuo de ±2,5vcc chegando, o arduíno converte para 511bits. por isso precisamos desse programa postado aqui no site, ou um biblioteca para fazer operações matemáticas a fim de fazer o arduíno entender que o resíduo tem que ser zerado e a leitura tem que ser feita sem o residuo.

  7. amigão, meu nome é Marcos. estou passando pra te agradecer pois, essa programação foi o mais perto da medição real que consegui até agr. estou programando com o app sketchware for arduíno no Android. esse app tem limitações de programação se comparado ao arduíno, mas com esse app eu consigo rodar meus programas direto no arduíno e tudo isso grátis. o arduinodroid tem que ser cliente Premium para uppar e conectar programa na placa. o fato é que tive que mudar o tipo de variável, pois nesse app só tem double, string e boolean. e tive que alterar as linhas 21, 20 e 15. na linha 15 alterei a quantidade de amostras para 300, na linha 20 dividi por 300 e na 21 alterei de 0,185 para 0,100, pois uso o acs712 20A e a sensibilidade é de 100mA. antes da alteração das linhas 20 e 21, uma carga de ±500mA estava sendo lida como 1,2 – 1,9A, depois da alteração ficou variando entre 0,240A – 0,690A. não entendi pq dessa variação, mas preciso testar outras cargas pra ter ctz, porém até agr foi o melhor resultado que consegui até agr, sua programação está bem mais simplificada se comparado a outras. e o bom é que não precisa de biblioteca, pra mim isso é bom, pois no app sketchware for arduíno não sei como incluir biblioteca. preciso ajustar mais essa programação pra ficar precisa para meu projeto. o delay que usei foi de 2segundos, pois fica melhor pra ler😂😂😂

Deixe uma resposta para César Murilo Cancelar resposta

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

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Rolar para o topo