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:
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:
DataSheat, Site 1, Site 2
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.
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.
Otima dica, vou testar sim, obrigado.
Foi testado?
Qual foi o resultado?
Sim eu testei, chegou em um valor aproximado porem diferente do real, talvez a média quadratica feita não seja a melhor maneira, mais foi a maneira de chegar mais próximo do valor.
Por que o 1023 é dividido por 2?
Porcausa da formula! presente no DataSheat. No post explica.
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!!!!
Clovis, muito bom, realmente não sabia disso a fonte aonde peguei tal informação diz o que eu disse, e tornou-se ‘aceitavel’ no meu caso. Mais obrigado pela informação. Atualizarei.
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.
Por que subtrai 511 na linha 16?
sensorValue_aux = (analogRead(sensorPin) -511);
Exatamente não sei dizer, acredito que consta no datasheat pois ao pesquisar informava que o valor lido do sensor no pino analogico A0 e ajustado ja que a saída do sensor é vcc/2 para corrente = 0
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.
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″).
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!
Tente usar o metodo do post, usando so o analogRead você nao vai ter um valo preciso pois ele retorna um int, também nao sei porque nao da certo, mais deve ser feito um tratamento para uma melhor sensibilidade.