Como medir corrente com Arduino? 47

Agora você pode medir correntes de -30A à +30A utilizando o seu Arduino ou outro microcontrolador de sua preferência. Com o módulo Sensor de Corrente ACS714 da Pololu você tem um dispositivo alimentado por 5v e que permite medir essa faixa de corrente com uma margem de erro de apenas ±1,5%.

Sensor de Corrente ACS714

Esse sensor utiliza um CI Allegro ACS714 com sensor de efeito hall (datasheet) para medição da corrente, o que garante um perfeito isolamento do circuito. Nesse post vamos trabalhar com baixa tensão e corrente, mas o ACS714 suporte tensões de até 2.1 kV RMS. Confira o tutorial abaixo!

Medindo corrente e tensão

Antes de mostrarmos de mostrar como medir corrente com Arduino, vamos ver de uma maneira resumida a diferença de procedimento entre medir tensão e medir corrente, já que uma ligação incorreta pode danificar o circuito ou até mesmo o aparelho medidor.

Para medir tensão, veja este exemplo usando um multiteste (multímetro), um circuito com uma lâmpada e uma bateria. Devemos colocar o multiteste na escala de tensão (V), e medir dessa maneira, com as pontas de prova em paralelo ao circuito:

Medição Tensão

Já para a medição da corrente, que é o assunto desse post, devemos ligar um multiteste em série com o circuito, na escala de Ampéres:

Medição Corrente

Ligação do Sensor de Corrente com Arduino

Vamos testar o sensor utilizando um motor DC de 5v, ligado em SÉRIE com o Sensor de Corrente ACS714. O sensor irá enviar os dados ao Arduino por meio do pino analógico A3. A alimentação do sensor é feita pelo próprio Arduino (5v), e para a alimentação do motor utilizamos pilhas comuns. Assim, podemos mostrar o isolamento do circuito do motor em relação ao Arduino e o restante dos componentes:

Circuito Sensor de corrente ACS714

No display LCD 20×4, teremos as informações do valor “puro” lido do sensor (entre 0 e 1024) e o valor da amperagem calculada pelo programa abaixo. A cada ampere de variação na entrada do sensor, a tensão de saída varia 66mV. A atualização é feita a cada 1 segundo.

//Programa : Teste sensor ACS714 corrente com Arduino
//Alteracoes e adaptacoes : MakerHero

//Carrega a biblioteca do LCD
#include <LiquidCrystal.h>

//Inicializa o LCD
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//Define o pino analogico usado pelo ACS714
int AnalogInputPin = 3;


void setup()
{  
  //Define o LCD com 20 colunas e 4 linhas
  lcd.begin(20, 4);
  //Informacoes iniciais no display
  lcd.setCursor(1,0);
  lcd.print("--- MakerHero ---");
  lcd.setCursor(0,1);
  lcd.print("Sensor : ");
  lcd.setCursor(0,2);
  lcd.print("Amp :");

  Serial.begin(9600);
}

void loop()
{
  //Chama rotina que calcula a corrente
  double Current = currentSensor(analogRead(AnalogInputPin));  
  //Imprime as informacoes no display e na serial
  Serial.print(" Amp : "); 
  printDouble(Current, 2);                                     
  Serial.print(" A");
  Serial.println("");
  lcd.setCursor(11,2);
  lcd.print("A");
  delay(1000);
}

void printDouble(double val, byte precision) 
{
  Serial.print (int(val));
  if( precision > 0) 
  {    
    Serial.print(".");
    lcd.setCursor(7,2);
    lcd.print(".");
    unsigned long frac, mult = 1;
    byte padding = precision -1;
    while(precision--) mult *=10;
    if(val >= 0) frac=(val-int(val))*mult;
     else frac=(int(val)-val)*mult;
    unsigned long frac1 = frac;
    while(frac1 /= 10) padding--;
    while(padding--) Serial.print("0");
    lcd.setCursor(6,2);
    lcd.print("0");
    Serial.print(frac,DEC) ;
    lcd.setCursor(8,2);
    lcd.print(frac, DEC);
  }
}

long readInternalVcc() 
{
  long result;
  ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  delay(2);                          // Wait for Vref to settle
  ADCSRA |= _BV(ADSC);               // Convert
  while (bit_is_set(ADCSRA,ADSC));
  result = ADCL;
  result |= ADCH<<8;
  result = 1126400L / result;       // Back-calculate AVcc in mV
  return result;
}


// Calculate current with Allegro ACS714
double currentSensor(int RawADC) 
{
  int    Sensitivity    = 66; // mV/A
  long   InternalVcc    = readInternalVcc();
  double ZeroCurrentVcc = InternalVcc / 2;
  double SensedVoltage  = (RawADC * InternalVcc) / 1024;
  double Difference     = SensedVoltage - ZeroCurrentVcc;
  double SensedCurrent  = Difference / Sensitivity;
  Serial.print("Sen: ");
  Serial.print(RawADC);
  Serial.print("/1024");
  lcd.setCursor(9,1);
  lcd.print(RawADC);
  return SensedCurrent;            
}

Para utilização do programa sem precisar de um LCD, os resultados são impressos também na serial, e você pode checar os valores no serial monitor:

Sensor de corrente - Serial Monitor

Gostou? Deixe seu comentário logo abaixo.

Faça seu comentário

Acesse sua conta e participe

47 Comentários

  1. boa tarde adilson, como consigo colocar esse sensor de corrente junto a um osciloscopio nesse circuito?

  2. Nao mede corrente abaixo d 1mA?

    1. Olá Thiago,

      A resolução é de 0,8mA.

      Abraço!
      Rosana – Equipe MakerHero

  3. Olá. Vocês conhecem algum módulo para Arduino similar a esse que meça corrente contínua até um máximo de 60A?

    Vi no datasheet do componente que existe um CI da mesma família desse que mede de -50A a +50A, mas ainda não me atende, pois no cenário que eu o utilizarei o meu pior caso possível é 60A.

    Obrigado!

  4. ola. como podemos crir um sensor anti esmagamento, para carros? AO identificar um obstaculo no vidro, ele, para e volta.
    Obrigado

  5. este sensor mede correntes na faixa de 0 a 100 mA?

  6. Amigo, seria possível substituir o Arduino por um ESP? Quais seriam as modificações?

  7. Qual simulador foi usado ?

    1. Não sei qual foi utilizado, porem uso esse https://circuits.io/ ele tem uma grande variedade de componentes

  8. gostaria de saber como faria a programação com corrente alternada

  9. Boa tarde, a não estou a conseguir mostrar a programação no meu display OSEPP LCD and keypad shield, consigo fazer a simulação através de arduino e está tudo correto.
    Que alternativa de programação posso utilizar?

  10. Qual tensão máxima que o sensor suporta?

    1. Nesse post vamos trabalhar com baixa tensão e corrente, mas o ACS714 suporte tensões de até 2.1 kV RMS.
      http://www.pololu.com/file/download/ACS714-Datasheet.pdf?file_id=0J196

  11. Qual a tensão máxima que o sensor suporta?

  12. boa noite , pode me ajudar a visualizar a corrente medida com este codigo num lcd 16*2 ?

  13. Boa Noite !

    Sou iniciante no assunto.

    Gostaria de saber como faço para incrementar os valores lidos em amperes em uma variável para poder tirar a média da produção de corrente continua por um painel solar. isso a cada 30 min.
    e como transformo os dados lidos em Amperes? uso um sensor de corrente ACS712 30A. O painel solar é de 5V.
    Não sei se deu pra entender direito, mas se puder de alguma forma me ajudar..
    Desde já agradeço !!

  14. Uma dúvida: se o sensor queimar por causa de passagem de corrente maior que 30A ou por qualquer outro motivo, ele continua passando corrente entre o IP+ e IP- ou ele vira um contato aberto?
    Att Leonardo”

  15. boa tarde , esse codigo serveria tb se eu estivesse usando em corrente alternada ?

    1. Amigo, para corrente alternada não daria pra usar esse circuito, nesse caso seria necessário um sensor de efeito hall.

  16. bom dia, estou com um projeto para controlar 2 motores DC mas quando chega no final do curso programado eu precisaria saber da corrente. Então eu não sei se uso essa placa ou o shild do 298N, pois n sei qual mede a corrente e me dá o valor da corrente. Obs: tenho q usar arduino.
    se alguém puder me ajuda ficarei imensamente grato.

    1. Oi João, Estou com um projeto similar, você conseguiu solucionar seu problema?

  17. olá,
    Conseguir fazer a leitura da corrento, com uma ótima precisão, mas preciso de ajuda em um detalhe.
    quando o Vout do sensor não estar conectado na porta A1 do Arduíno, no display aparece uns valores flutuantes., quero saber se tem como fazer com quer exiba no display o valor 0 ( zero) no momento em que o Vout do sensor acs712-5a esteja desconectado?

  18. Olá Amigos !!! Não consigo fazer essa livraria funcionar. Fui no link cliquei em download zip e extrai para a pasta libraries do arduino, porém a livraria não é reconhecida. O que estou fazendo de errado ? Abraços !!!

  19. Boa noite gostaria de saber se esse sensor consegue realizar leituras em milésimos de segundos e manter a precisão da leitura

    Grato

    1. Boa tarde Vitoriano,

      Não fizemos testes nessa configuração. Neste caso, peço que verifique as informações que constam no datasheet: https://www.pololu.com/file/download/ACS714-Datasheet.pdf?file_id=0J196

      Abraço

      Adilson – Equipe MakerHero

  20. Esse sensor mede corrente apenas em RMS?

  21. Show de bola teus projetos. Esse Sensor de Corrente ACS714 pode ser usado também para medir tensão? Senão, qual posso usar?

    1. Boa tarde Giovan,

      Obrigado. Infelizmente ainda não temos sensores de tensão na nossa loja.

      Abraço.

      Adilson – Equipe MakerHero

  22. Bom dia. Eu preciso medir a corrente de um aparelho “Y” para automaticamente acionar um aparelho “X”. Por Exemplo: O aparelho “X” será ligado a tomada, o aparelho “Y” será ligado no aparelho”X”, então o aparelho “X” ficará em “stand by” aguardando o aparelho “Y” ser acionado para então entrar em funcionamento e trabalhar em conjunto com o aparelho “X”. Estava pensando em desenvolver algum circuito para fazer isso eletronicamente, utilizando algum microcontrolador 8051 ou PIC. Alguém pode me ajudar?

  23. Bom dia, estou precisando saber como utilizar o sensor não invasivo de 100A , mas não não consigo encontrar a relação de transformação. Você poderia me ajudar?

  24. Preciso fazer monitoramento remoto de grupo gerador, preciso de sensor que mede tensão e outro que mede corrente ambos alternados, tensão 220v e 115A.
    Qual sensor posso utilizar

  25. Boa tarde meu caro!

    Bem bacana o projeto. Usarei o ACS712.
    Não usarei um display, mas usarei o valor da corrente para outras contas.

    Preciso ler 06 desses simultâneos e cada uma das 06 correntes usar em contas distintas.

    Pode me dar uma dica, por favor, de como replicar isso para as 06 unidades?
    long readInternalVcc()
    {
    long result;
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
    delay(2); // Wait for Vref to settle
    ADCSRA |= _BV(ADSC); // Convert
    while (bit_is_set(ADCSRA,ADSC));
    result = ADCL;
    result |= ADCH<<8;
    result = 1126400L / result; // Back-calculate AVcc in mV
    return result;
    }

    // Calculate current with Allegro ACS714
    double currentSensor(int RawADC)
    {
    int Sensitivity = 66; // mV/A
    long InternalVcc = readInternalVcc();
    double ZeroCurrentVcc = InternalVcc / 2;
    double SensedVoltage = (RawADC * InternalVcc) / 1024;
    double Difference = SensedVoltage – ZeroCurrentVcc;
    double SensedCurrent = Difference / Sensitivity;
    Serial.print("Sen: ");
    Serial.print(RawADC);
    Serial.print("/1024");
    lcd.setCursor(9,1);
    lcd.print(RawADC);
    return SensedCurrent;
    }

    Muito obrigado.

    Abs,
    Lucas

    1. Lucas tambem estou usando o mesmo sensor entrarem contato comigo que trocamos mais ideais

  26. boa tarde caro, estou projetando um circuito que mede corrente contínua no modo não invasivo, e o meu interesse maior seria nas variação de corrente que ocorre a partir do quarto dígito, por exemplo numa leitura de corrente de 2,0034566 A, me interessa o valor 34566, pergunto eu… seria possível configurar esse tipo de leitura? e para a medição qual sensor você recomendaria? pelo que pesquisei só encontrei este sensor “Sensor de Corrente Não Invasivo 20A SCT-013” e se não me engano é somente da AC.
    Grato
    Lincoln

    1. Boa noite Lincoln,

      Sim, você pode alterar a programação para trabalhar apenas com os dígitos que você precisa. No momento temos apenas o sensor de 20A.

      Grato.

      Adilson – Equipe MakerHero

    2. Sim é possivel. Tudo permaneçe o mesmo (na leitura da corrente) porém se você quer, de acordo com exemplo que vc passou, os valores apartir de (10^-2) de 2,0034566, por exemplo, vc poderia multiplicar o valor medido por 10^7 e, apartir desse resultado, usar a operação de resto ‘%’, ou seja: (2,0034566 * 10000000) % 100000). É isso!

  27. Bacana o projeto. Precisava fazer algo semelhante para medir correntes até 400A, qual sensor utilizo?
    O circuito seria semelhante?

    1. Boa noite Claudio,

      Depende do sensor que você vai utilizar. Esse do post gera na saída uma variação de tensão de acordo com a corrente medida, e outros sensores geram uma variação de corrente. Nesse caso haveria alteração no circuito.

      Abraço.

      Adilson – Equipe MakerHero

      1. Olá parabéns pelo excelente trabalho.
        Estou interessado no sensor de corrente não invasivo da loja, seria muito complicado conseguir que o armazenamento dos valores de corrente sejam “guardados” num Sd card, vinculados a hora real para posterior leitura e analise?

    2. use primeiro um trasformador de corrente para instrumento tipo 1/20 depois use o sensor da materia.

  28. Eu gostaria de um sensor capaz de medir com boa precisão corrente da ordem de mA, alguma indicação?

  29. Boa tarde Felipe,

    Este sensor mede corrente alternada (AC) também? Qual tensão máxima?

    Att;

    1. Boa tarde Jairo,

      Ja vi projetos que medem corrente alternada, mas ainda não foi testado por aqui.

      Grato.

      Adilson – Equipe MakerHero

  30. Olá
    Como posso fazer para medir a corrente de um chuveiro.
    Obrigado

    1. Boa noite Luciano,

      Lançaremos em breve um post sobre o sensor de corrente 20A para Arduino, talvez te ajude. Acompanhe as nossas publicações, por favor.

      Grato.

      Adilson – Equipe MakerHero

  31. BOM DIA SÓ MEDE CORRENTE CONTINUA

    1. Luiz Cypriano, o módulo mede corrente contínua ou alternada.