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